The Agent Install Path Has No Review Gate to Bypass
A skill that ships prose instead of code leaves nothing for Dependabot or a lockfile diff to catch, so the only workable chokepoint is your agent runtime's egress.
Why this outran every npm campaign
Agent skill registries sit roughly where package registries sat in 2010. No signing, no provenance attestation, no lockfile, no version pinning, and a ranking algorithm that rewards install velocity. A campaign that starts spreading gets promoted for spreading. The second structural problem is the harder one. A skill is largely natural-language instruction, not code. Dependabot has no manifest to diff. A software-composition scanner has no import graph to walk. Existing supply-chain tooling produces zero coverage here, not partial coverage.
| Dimension | PyPI / npm | Agent skill registry |
|---|---|---|
| Provenance signal | Sigstore attestations, trusted publishing, maintainer history | Publisher name and install count only |
| Version pinning | Lockfiles with hashes, reproducible | Typically unpinned, resolved by name |
| Human review gate | PR on lockfile change, CODEOWNERS | Bypassed — the agent installs autonomously |
| Automated scanning | Mature SCA and SBOM ecosystem | Effectively none (prose, not code) |
| Detection surface | Filesystem artifacts, process tree | Egress and install telemetry only |
| Effective chokepoint | Internal mirror plus lockfile policy | Egress allowlist plus hash-pinned catalog |
Assume the credentials are already read
A commodity stealer's entire job is one pass over well-known locations: cloud credential files, container registry configs, package registry tokens, kubeconfigs, and dotfiles holding personal access tokens. That pass generates almost no distinguishable telemetry, which is why clean endpoint data tells you nothing here. On a matching host, treat every reachable token as compromised and rotate it. Hunting for confirmation that will never arrive is not a control.
Move the enforcement point into the runtime
The install happens without a pull request, so review cannot be the gate. Four controls, in the order they pay off:
- Deny-by-default egress from agent namespaces. Allowlist the internal package mirror and approved API endpoints. Blocking arbitrary raw-content and release downloads breaks the second stage regardless of what the model was persuaded to do. The payload has to come from somewhere.
- Hash-pinned internal skill catalog. Skills enter by PR with a content hash, a named reviewer, and a documented publisher. Agents resolve only from that catalog. External resolution fails closed. This is the lockfile the ecosystem never shipped.
- Brokered, short-lived credentials. No long-lived tokens in agent container environment variables or dotfiles. OIDC federation to cloud IAM, a sidecar broker for API keys. That is what converts a successful stealer run into a low-value one.
- Ephemeral per-session sandboxes on a Firecracker-class microVM or a gVisor syscall-interposition boundary. Containers are an isolation convenience, not a boundary against adversarial code. Test the sandbox adversarially before it gets tool access: egress reachability, socket exposure, credential visibility, syscall surface.
The sequencing trap
Rising AI-driven breach costs are generating pressure to ship defensive AI into security operations fast. An autonomous security agent holding broad production credentials with unrestricted egress is the same shape as the thing that just went wrong. Egress control, skill provenance, and brokered credentials land before any agent gets production scope. Otherwise the initial access vector gets funded out of the security budget.
Sourcing caveat: CSO Update's item is a headline-and-teaser digest with no named researchers, no IOCs, and no affected-publisher list. Treat the install count as reported rather than verified. The grep-and-rotate work costs an afternoon and is correct even if that number is later revised.
An AI agent with network egress and a shell is a package manager with no lockfile, no signature check, and no human in the loop.
What to do
Grep agent configs, devcontainers, and CI images for skills sourced from any external marketplace by end of day, and rotate every token reachable from a matching host: cloud keys, registry tokens, personal access tokens, kubeconfigs, database credentials.
Put agent namespaces behind a deny-by-default egress proxy this sprint, allowlisting only the internal package mirror and approved API endpoints, and block arbitrary raw-content and release downloads.
Stand up a hash-pinned internal skill catalog this quarter that admits skills only by PR with a content hash, a named reviewer, and a documented publisher, with external resolution failing closed.