Catch a compromised CI dependency
A workflow that references an action by tag can run different code if that tag is moved. A full commit-SHA pin continues to identify the original commit; a changed tag does not defeat it. GitHub explains this distinction in its guidance on third-party actions.
In this recorded example, the developer asks Claude to inspect a build-helper
before shipping. CI/lock records the helper's observed activity, and a policy
checks the collected evidence. The result depends on the configured capture
mode, trusted execution environment, and policy; a signature alone does not
establish that the workload was safe.
What it does, step by step
- Run the pinned step under CI/lock.
cilock run --step ci-task --trace -a environment,secretscan -- ./build-helper.shwraps the dependency.--traceturns on kernel-side capture (eBPF here, with ptrace+seccomp fallback where eBPF can't load);-a secretscanadds content scanning. The signed attestation records the activity visible to that capture mode. - Open the evidence. Claude pulls the captured process tree straight from
the
command-runattestation — and there it is:cat /proc/self/environ,cat aws-credentials, andcurl http://169.254.169.254/…(the cloud-metadata endpoint), with the realconnect()recorded. Thesecretscanattestation flags a leakedgithub-pat. - Visualize it. A terminal diagram links the dependency to the harvested files, the metadata SSRF, and the leaked token — feeding the policy decision.
- Show the policy. The signed policy's
no-leaked-secretsRego rule blocks any step that leaks a credential. - Verify → blocked.
cilock verifyreturns Verification failed — credential leak detected in CI step and exits non-zero. See policy verification. - Write the incident report. The evidence that mattered — the process tree, the metadata connection, the leaked secret, the rule — is captured into a markdown incident report: the durable, auditable record of exactly what happened.
This example combines kernel tracing of process and network activity with
secretscan analysis of captured output. Secret scanning is a content check,
not a kernel observation. A later policy denial does not undo data that a
process has already sent; isolation and credential restrictions are separate
controls.
Related tools and attestors
secretscan— Gitleaks over the run output, with recursive base64/hex/URL decoding; can fail the build on detection.- The same
--tracecapture records every connection (destination, port, TLS SNI) in thecommand-runattestation, so a Rego rule can fail a step that connects to a destination outside an allowlist — here, the cloud-metadata IP. - Pair with provenance and scanning from the internal supply-chain use case: Trivy, Grype, Syft SBOMs, Semgrep.
- Restrict which actions may run at all with a signed Rego policy over the
github-action/gitlabattestations — defense in depth alongside this behavioral check.
A full commit-SHA pin prevents a moved tag from selecting a different commit. It does not prove that the pinned code is benign or that everything it downloads is pinned. Review the action and its dependencies, restrict its permissions, and evaluate the evidence your configured capture mode can observe.
Reference generated from the product documentation. Match commands and support details to your installed release.