// static AI-agent security for CI/CD

Your CI has an AI agent. A stranger's issue can drive it.

You wired an AI agent into GitHub Actions to triage issues and review pull requests. It runs on text anyone can write, and it holds real secrets. agentpipe finds that CI injection chain before an attacker does.

$pip install agentpipe-scan
Open source, MITStatic and read-onlyNo exploit ever run
agentpipe scan
$ agentpipe scan .
scanning .github/workflows … 3 files

 AWI-01 reachable · high
 untrusted trigger runs an agent with a secret sink
 .github/workflows/triage.yml:11

 AWI-02 reachable · high
 untrusted issue title interpolated into the prompt
 .github/workflows/triage.yml:18

 AWI-05 plausible · high
 agent runs with --dangerously-skip-permissions
 .github/workflows/triage.yml:24

4 findings · 4 high · 1 file
fix: agentpipe fix .  prove: agentpipe prove AWI-01
claude-code-actionCopilot workflowsagentic PR botsGitHub Actionsany AI-agent step
// the problem

One opened issue, and your pipeline publishes for a stranger

A workflow triggers on an issue or a pull request. It drops the issue title straight into the agent's prompt. The job holds an npm token and publish rights. Now anyone who opens an issue is handing instructions to a process that can publish your package or leak your keys. No one clicked anything. We call this class clinejection, and it is landing in real repos.

untrusted issue AI agent step npm token publish or leak
// the dashboard

Every exposed chain, across every repo, on one dashboard

The hosted App scans each pull request in real time and records the findings. You get the detector, the verdict, the exact file and line, and the trend over time.

agentpipe.agentoffense.com/dashboard
agentpipeAI-in-CI security dashboard
Live
auto-refresh 30s · 0.9.0
Open findings
4
High severity
4
Repositories
1
Scans run
1
Exposure by severity
4FINDINGS
4 high100%
0 medium0%
0 other0%
Scan activity (14 days)
Top detectors
AWI-05YOLO / skip-permissions on the agent in CI1
AWI-04Agent job can post as the bot (exfil channel)1
AWI-02Untrusted event field interpolated into the agent prompt1
AWI-01Untrusted trigger runs an agent with a secret sink1
Repositories
RepoFindingsStatus
cyberbobas/agentpipe44 HIGH
The live dashboard from the running SaaS: open findings, severity breakdown, top detectors, and repositories.
agentpipe.agentoffense.com/dashboard#findings
Findings & what to do
reachable = the full chain exists, fix it. adjacent = one piece present, review. auto-fix = agentpipe fix patches it for you.
HIGHREACHABLEAWI-01Untrusted trigger runs an agent with a dangerous sink
cyberbobas/agentpipe #3 · .github/workflows/vuln-demo.yml:9 · 09-01 19:14
HOW TO FIXMove the secret out of this job, or do not run the agent on an untrusted trigger.
Evidence
.github/workflows/vuln-demo.yml job `triage`: on=['issues'] agent=[anthropic-ai/claude-code-action@v1] sinks=['exfil:issues=write', 'perm:packages=write', 'secret:NPM_TOKEN', 'secrets.*']
Not proventhat the model obeys the issue/PR text, or that the token can publish
Prove itstaging: open an issue whose title is a harmless canary; watch logs and whether the sink fires
Twin incident: Clinejection (issue title → CI agent → npm token → publish)
HIGHREACHABLEAWI-02Untrusted GitHub event field is interpolated into the agent step
cyberbobas/agentpipe #3 · .github/workflows/vuln-demo.yml:9 · 09-01 19:14
HOW TO FIXDo not put the event field in the prompt; pass it via env and label it untrusted data.
Evidence
.github/workflows/vuln-demo.yml job `triage`: agent step anthropic-ai/claude-code-action@v1(with.prompt): github.event.issue.title
Not proventhe field lands in the model prompt after the action's own templating
Prove itinstrument the prompt or use a canary string in issue title vs body
Twin incident: Clinejection (untrusted issue/PR text in the prompt)
Every finding carries the verdict, the exact file and line, the one change that fixes it, and the real incident it maps to.
// how you run it

Three ways to run the same engine

From a one-off check on your laptop to a service that watches your whole organization. One engine, your choice of how much to automate.

1 // in your terminal

CLI

Run a command, read the findings. Nothing to install on a server. Great for a one-off check or trying it out.

pip install agentpipe-scan
agentpipe scan .
agentpipe local
2 // in your CI

GitHub Action

Add one workflow file. On every pull request a bot posts one sticky comment and uploads results to your Security tab (SARIF).

# .github/workflows/agentpipe.yml
uses: cyberbobas/agentpipe@v0
with:
 fail-on: high
 comment: true
for the whole org
3 // saas

The hosted App

Install once on your GitHub organization. No workflow files, no server. It watches every repo, comments on pull requests, and gives you a dashboard.

  • All repos, current and future
  • Real-time PR comments
  • Shared dashboard and trend
  • Org policy a repo cannot weaken
Install the App
// coverage

What the hosted App does that running the CLI cannot

The CLI is a flashlight you point yourself. The hosted App is a smoke detector wired through the whole building. Same engine, very different coverage.

WhatCLIActionHosted App
When it runswhen you type a commandon each PR, per repoon every PR, whole org, automatically
Setupnone, but manual every timea workflow file in every repoone click on the org
Coverageone repo, one runone repoevery repo, current and future
Who sees resultsonly you, in your terminalon the pull requestthe PR and a shared dashboard
History and trendnonenonefull history and trend over time
Org policy a repo cannot weakennoper repo, editable by anyoneyes
Maintenanceyou run ityou keep the workflow updatednone, managed by us
Short version: the CLI answers "is this repo exposed right now, if I check." The hosted App answers "is anything across our whole org exposed, ever," without anyone lifting a finger.
// how the hosted app works

You install once. It runs itself.

  1. Install on your org

    Pick the repos, or all of them including future ones. One click, no config files.

  2. A pull request opens

    Someone opens or updates a PR in any covered repo. GitHub notifies our server over a signed, verified webhook.

  3. We read the workflows

    A short-lived token reads only the workflow files at that exact version of the PR. We never touch your source or secrets.

  4. The engine runs

    The same static engine traces every untrusted-trigger to agent to sink chain the PR introduces.

  5. One clear comment

    A single sticky comment lands on the PR with the chains and the one change that fixes each. Signal, not noise.

  6. It shows on the dashboard

    Coverage, what is exposed across repos, and the trend over time. The evidence you show an auditor.

// why agentpipe

Not a linter. Not a guardrail.

Linters check workflow config. Code scanners check code. Guardrails check the prompt going into the model. No tool traces the untrusted-event to agent to secret chain statically in CI. That is our lane.

Not a linter or code scanner

zizmor and CodeQL flag misconfig and injection in code. We trace the actual link: an untrusted event reaching an AI-agent step that then reaches a secret, write, or publish sink.

Not a guardrail

Guardrails inspect the prompt going into the model. We watch the action the model's step takes in CI. A clean prompt passes a guardrail, then the agent reads a token and publishes. We catch that.

Honest by design

Every finding says what it proves, what it does not, and the one change that fixes it. agentpipe prove confirms it with a harmless canary, never an exploit.

// pricing

Free while in beta, with fair-use limits

The CLI and the Action are unlimited and open source, forever. The hosted App is free during beta with generous fair-use limits so it stays fast for everyone: PR scans, the dashboard, and org-wide coverage included. Need enterprise policy enforcement or higher volume? Contact us for early access.

What it does not do, on purpose. agentpipe reports preconditions, not proof of exploitation. It analyzes GitHub Actions and local agent configs, statically. It does not run your agent and it does not stop prompt injection. Every report ends with what the scan cannot see, which is exactly where a real pentest begins.
// faq

Frequently asked

Do you run or store my code?
No. It is static analysis. The hosted App reads only workflow files at the PR version and stores findings (detector, file, and line), never your source or your secrets.
Is it really free?
The CLI and the Action are free and open source forever (MIT). The hosted App is free during beta with generous fair-use limits.
Does it work with Copilot, Claude, and other agents?
Yes. It detects the pattern (untrusted trigger to agent step to sink) regardless of which agent you use.
Will it spam my pull requests?
No. One sticky comment, reachable-high only by default, and silent on your existing debt (baseline mode). Noise is uninstall, so quiet is the default.
Can I self-host?
The engine is open source (MIT), so you can already run it yourself in your own CI, no server of ours involved. A managed, self-hosted deployment for enterprise is on the roadmap. If you need it, talk to us.
// contact

Talk to us, we reply fast

Early access to the hosted App, questions about rollout, or org-wide policy across your whole fleet of repositories. Reach out and we will get back within a business day.

./request_engagement
// get started

Find the chain before an attacker does

Run it yourself with the free CLI, or install the hosted App once and let it watch every repo, on every pull request, with a dashboard for your whole team.

Security for the AI-agent link in your CI. Part of the Agentoffense suite.