Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add Encod3d-Sec/TORCH --skill hunt-cicdgit clone --depth 1 https://github.com/Encod3d-Sec/TORCHWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/encod3d-sec/torch/hunt-cicd)<a href="https://agentmods.dev/skills/encod3d-sec/torch/hunt-cicd"><img src="https://agentmods.dev/badge/skills/encod3d-sec/torch/hunt-cicd/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/encod3d-sec/torch/hunt-cicd"><img src="https://agentmods.dev/badge/skills/encod3d-sec/torch/hunt-cicd.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00055 | $0.01444 |
| Opus 5.5 | $0.00022 | $0.00578 |
| Sonnet 5.5 | $0.00011 | $0.00289 |
| Haiku 4.5 | $0.00006 | $0.00144 |
Grade A, and why
hunt-cicd scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 61 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Hunt: CI/CD Pipeline Attacks
Assumes hunt-core for the scope gate, two-account rule, confirmation gate, enumeration limits, stop conditions, wiki protocol, FIND output, and Deadends. Do not re-derive any of that here.
Wiki
qmd_query "CI/CD GitHub Actions pull_request_target pwn request script injection self-hosted runner OIDC cache poisoning" via wiki-search MCP
Hub: [[cloud-moc]] (live index). Primary page: [[cicd-github-actions]]. Payload arsenal: wiki/payloads/cicd.md.
Anchors: [[supply-chain-attacks]], [[cloud-oidc-trust-abuse]] (OIDC role assumption off-box), [[cicd-attacks]] (cross-platform CI/CD).
Attack surface (ranked)
- Pwn requests (
pull_request_target/workflow_run) - the highest-value bug. A workflow that runs onpull_request_target, checks out the fork HEAD, and holds secrets executes attacker code in the trusted (secret-bearing) context. Fork, inject a build step, open a PR, exfilenv/ secrets /GITHUB_TOKEN. - Script injection via untrusted
${{ }}-github.event.*values (PR title, branch name, issue body, review comment) interpolated directly into arun:step. Attacker controls the string, so the string becomes shell. - Self-hosted runner takeover - non-ephemeral runners persist state between jobs and are shared across a repo/org pool. A pwn request or script injection landing on one is persistence and cross-repo reach, not a one-shot.
- OIDC-to-cloud token theft -
permissions: id-token: writemints a cloud-assumable JWT. Weak trust-policysubscoping (wildcard repo/ref) lets a fork job assume the role off-box. Chains tohunt-cloud.
Signals to grep the repo for: .github/workflows with pull_request_target/workflow_run; untrusted ${{ github.event.* }} inside run:; self-hosted runner labels; id-token: write; actions/cache restored across trust boundaries.
Methodology
- Enumerate workflows + triggers - gato / Gato-X, octoscan, poutine. Read every workflow end-to-end (each
run:, each referenced action, each reusable-workflowuses:), not a keyword grep - the injectable sink hides in a called composite action. - Pwn request - a
pull_request_target(orworkflow_run) workflow that checks out the fork HEAD and holds secrets: fork, inject a build step, open a PR, exfilenv/ secrets /GITHUB_TOKENto your sink. - Script injection - inject
a"; <cmd>; #(or$(<cmd>)/ backticks per shell) into agithub.event.*value that lands in arun:step. Use a unique canary in the command output, per hunt-core marker discipline, so you can prove YOUR injection ran. - Self-hosted runner - non-ephemeral = persistence between jobs + cross-repo on a shared pool. Once you have execution, confirm the runner type (ephemeral vs long-lived) before claiming persistence.
- Cache poisoning - a fork job writes an
actions/cacheentry that a trusted base job later restores, moving attacker-controlled content across the trust boundary. - OIDC theft - pull
ACTIONS_ID_TOKEN_REQUEST_TOKEN/ACTIONS_ID_TOKEN_REQUEST_URL, request the JWT, assume the cloud role off-box; inspect trust-policysubscoping for over-broad repo/ref wildcards. Hand off tohunt-cloud. - PPE (poisoned pipeline execution) - modify a
Makefile/package.json/ build script the pipeline runs, bypassing CODEOWNERS that only guards the workflow files themselves. - Confirm - see the confirmation gate below.
- Distill (when confirmed) - reusable pwn-request / OIDC-theft / PPE technique, GENERIC, no client repo:
python3 scripts/wiki-stage.py --kind technique --slug <slug> --target-page techniques/cloud/cicd-github-actions.md.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 61 lines · 55 tokens per session scan A 2028ed78884c
hunt-cicd is a skill published in the GitHub repository Encod3d-Sec/TORCH (336 stars, last pushed 1mo ago), licensed MIT. It adds 55 tokens to every session and 1,444 once invoked, about $0.0002 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
chinese-git-workflow
A reference for configuring Git with Chinese code-hosting services such as Gitee, Coding.net, GitLab China, and CNB, including SSH, HTTPS, credentials, CI, and repository mirroring.
atmos-profiles
Atmos profiles: profile directories, --profile and ATMOSPROFILE activation, profile merge behavior, environment switching, and routing profile-specific auth/toolchain/config overrides.
webhook-management
Configure and validate CCAM webhook targets across supported chat, incident, automation, and generic providers. Use when listing provider requirements, creating or updating a target, scoping it to alert rules, sending a test notification, reviewing delivery history, or deleting a target.
monorepo-management
Master monorepo management with Turborepo, Nx, and pnpm workspaces to build efficient, scalable multi-package repositories with optimized builds and dependency management. Use when setting up monorepos, optimizing builds, or managing shared dependencies.
deployment-engineer
Expert deployment engineer specializing in modern CI/CD pipelines, GitOps workflows, and advanced deployment automation. Masters GitHub Actions, ArgoCD/Flux, progressive delivery, container security, and platform engineering. Handles zero-downtime deployments, security scanning, and developer experience optimization.…
ci-fixer
CI failures - read error, minimal fix, verify.