| Malicious or typosquatted dependency |
The Warden score produces a malicious_dependency block, and the reason includes the commit path |
| Tampered build or scan output |
Every stage event is a DSSE envelope (PAE + Ed25519 or HMAC-SHA256). A signature mismatch rejects the envelope and the gate blocks |
| Forged attestation from an untrusted signer |
Only configured keyids are accepted. An unknown key is rejected and the gate blocks |
| Misconfigured gate with no trust root |
The CLI exits 2 and the API answers 503. The public demo key is trusted only with --demo / TRACEGATE_DEMO=1, and a warning is printed |
| Stolen or long-lived signing key |
Keyless mode: CI generates a one-run Ed25519 key and signs its public key with cosign (GitHub OIDC -> Fulcio certificate -> Rekor entry). The gate trusts the key only after cosign verify-blob checks the workflow identity and the transparency-log entry |
| Stripping a stage to hide findings |
Required stages (commit, build, scan) must all be present, otherwise the gate blocks (fail closed) |
| Hiding a finding by leaving its package out of the SBOM (or spelling its version differently) |
A scanner finding that matches no SBOM node is kept as a policy input: rule unattributed_finding blocks on HIGH/CRITICAL and warns on the rest, and the PR comment, CLI JSON and API summary list it. Rows without a PURL are matched by (ecosystem from the Trivy result type, name, version) |
| Malformed or wrongly typed envelopes |
Non-string fields or a non-hex signature are rejected (envelope[i]: malformed), never a crash: the API answers 422 and the CLI gate blocks with the reason |
| Deploying an unsigned image |
kind-admission CI job: an image is applied to the cluster only if cosign verify succeeds against the workflow identity and tracegate gate passes on its signed events |
| Using reachability to hide a vuln |
Static analysis can mark a package unreached, which downgrades a block to a warn; it never suppresses the finding. Runtime facts, when present, override static results. Static analysis is evadable (computed imports such as importlib.import_module("ya" + "ml") look unreached), and the sources it reads are written by the PR under review, so do not rely on static downgrades for untrusted PRs. Known false-unreached cases are listed in ADR 0004 and the results JSON |
| Graph poisoning via cycles |
The DAG rejects cycle-creating edges |
| Oversized or unauthenticated API requests |
Bodies over 10 MB (configurable) get 413, more than 5,000 envelopes get 413. With TRACEGATE_API_TOKEN set, every /v1 route (gate, runs, runs/{rid}/*, demo) requires the bearer token, compared in constant time; demo runs have their own store, so they cannot evict gate runs |
| Crafted repository trees during benchmarking |
materialize() refuses tree paths with .., .git, absolute or drive components and checks that each target stays under the destination |