Repository navigation
Conversation
…is the only secret scanner `sscsb verify` went 19 PASS / 8 FAIL / 1 DEGRADED -> 27 PASS / 1 FAIL / 1 DEGRADED. Secret scanning is now TruffleHog ONLY. gitleaks is off in .sscsb/config.toml, its CI job is gone from secrets-scan.yml, and .gitleaks.toml is deleted. TruffleHog validates a candidate against the issuing provider, so `verified` means a live credential; gitleaks matches entropy and regex and cannot make that call. Running both bought a second scan and a second allowlist file to keep honest, for no detection the stronger tool did not already make. The same reasoning retires the weaker duplicate TruffleHog job in ci.yml: secrets-scan.yml runs the same tool on a superset of triggers with a newer pinned release and --results=verified,unknown instead of --only-verified, so nothing is lost by deleting the duplicate. SAST keeps THREE engines on purpose. codeql.yml is added (rust + actions, buildless) alongside the existing OpenGrep and Semgrep workflows: CodeQL does interprocedural taint tracking over a compiled database and surfaces classes an OpenGrep default ruleset does not express at all. That is not the kind of redundancy gitleaks was. Five controls (secrets, commit-signing, ai-trailers, ai-dep-gate, package-trust) were failing for one shared reason: core.hooksPath pointed at .git/hooks, which holds only git's samples, so NO sscsb hook had been running. The shims were also tracked mode 0644 — git silently skips a non-executable hook, so a fresh clone would have had the same silent no-op even with the path set. Both fixed; the shims are 0755 now. dependency-pinning: the parity job's `pip install pyyaml` becomes a hash-locked `--require-hashes` install, and both Dockerfile stages are digest-pinned. Pinning stage 2 surfaced a live break — cgr.dev/chainguard/cc-dynamic is no longer anonymously pullable (403 FORBIDDEN on the anonymous pull token), so that build could not have succeeded on a runner without Chainguard credentials. Swapped to glibc-dynamic, which is anonymously pullable and carries everything this stage needs (verified in the image: libc.so.6, libgcc_s.so.1, ld-linux, ca-certificates.crt). Also: release.yml's top-level write grants no longer leak into `build` and `sbom`, and `attestations: write` is dropped outright because no job in that workflow uses actions/attest*. LICENSE (Apache-2.0) is added — Cargo.toml and README both declared it and README linked to a file that did not exist. SECURITY.md is added, which security-insights.yml already pointed at. The stale "REPLACE-ME / TODO" note is removed from security-insights.yml (there were no placeholders left), flipping it INFO -> PASS. What is NOT closed, with reasons, is written down in .sscsb/POSTURE.md rather than left to be scrolled past: - branch-protection FAILs because a ruleset lives in GitHub's settings, not the tree, and `sscsb harden` cannot write this one (it looks for a ruleset naming the branch literally; ours targets ~DEFAULT_BRANCH). The three missing rules are checked in as an importable ruleset under .github/rulesets/, with the gh command beside it. - signing-model stays DEGRADED. Three lanes need an owner attestation of GitHub web settings that have no read API. The agent-claude-code lane is deliberately NOT converged: it asks for a distinct agent identity, and this owner runs one-signer, everywhere, with AI involvement recorded through commit trailers instead. Verified, not assumed: sscsb verify 27/1/1; sscsb sast 0 findings; sscsb scan 1 low (Dockerfile HEALTHCHECK, below the `high` fail threshold); the hash-locked pip install resolved and installed in a clean venv; both image digests resolved from the live registries; the glibc-dynamic layer contents were listed, not assumed. AI-Assisted: true AI-Tool: Claude Code AI-Model: claude-opus-5 AI-Role: draft Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017N6Qc2T7buVAXHZ9vYa1xm
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
…coverage GitHub's default CodeQL setup scanned actions, python and rust. This advanced config replaces it (default setup is now off, since the two cannot coexist), so scripts/hth_parity.py would otherwise drop out of CodeQL coverage. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
rustls 0.23.37 -> 0.23.45 and rustls-webpki 0.103.13 -> 0.103.15. The advisory was published after this branch's last CI run, so cargo-deny, cargo-audit and osv-scanner went red on the next one. cargo-vet: imports.lock refreshed from audit sources this repo already imports, which now carry a Bytecode Alliance delta audit for rustls 0.23.37 -> 0.23.45. No exemptions added. audits.toml loses one comment line via cargo vet fmt, because the refreshed imports no longer carry that publisher's display name. AI-Assisted: true AI-Tool: Claude Code AI-Model: Opus 5.5 AI-Role: draft AI-Dependency-Review: approved Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
This PR had switched secret scanning to TruffleHog-only. Per owner decision, Gitleaks is restored to run alongside TruffleHog: Gitleaks catches generic secrets and unverifiable credentials that TruffleHog's --results=verified,unknown filter drops, so the two scanners are complementary rather than redundant. AI-Assisted: true AI-Tool: Claude Code AI-Model: Sonnet 5 AI-Role: draft Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
…n the ruleset Follows the restore of Gitleaks alongside TruffleHog. POSTURE.md and the ci.yml comment no longer describe TruffleHog-only as the goal, and the checked-in main-branch ruleset now lists `gitleaks` as a required check next to `trufflehog`, so a Gitleaks finding blocks a merge once the ruleset is applied. AI-Assisted: true AI-Tool: Claude Code AI-Model: Opus 5.5 AI-Role: draft Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
8daf695 added `gitleaks` to main-branch-protection.json, but the README next to it still said 13 checks, all taken from the 34117a7 pull request. Say 14, and where the added one came from. AI-Assisted: true AI-Tool: Claude Code AI-Model: Opus 5.5 AI-Role: draft Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
The comments said a TruffleHog finding means a live credential, or called the filter verified-only. With --results=verified,unknown it also reports results whose verification errored, which nobody has confirmed live. Separately, it never reports generic secrets, since it has no detector for them, or keys it cannot verify. Wording only; no scanner, rule or job changes. AI-Assisted: true AI-Tool: Claude Code AI-Model: Opus 5.5 AI-Role: draft Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk
7 tasks done
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Update (2026-10-06): Gitleaks is back, by owner decision — it runs alongside TruffleHog rather than being replaced by it. TruffleHog only finds credentials for providers it has a detector for, and with
--results=verified,unknownit reports a match only when the provider confirms it live or the verification attempt errors; it drops matches it could not verify, including those from detectors that have no verifier. Gitleaks matches on shape, so it also catches generic secrets such as passwords, internal tokens and keys for services TruffleHog has no detector for.c29097arestores the Gitleaks CI job, the.sscsb/config.tomltoggle, and.gitleaks.toml, and updatesSECURITY.md,.sscsb/POSTURE.md, and the best-practices badge line;8daf695updates.sscsb/POSTURE.mdagain, theci.ymlcomment, and the checked-in branch ruleset — addinggitleaksas a required status check next totrufflehog;06295a4then corrects the ruleset's README, which still said 13 required checks, to 14. The Secret scanning section below reflects all of that. The CodeQL section also reflects074a85b(python added to the matrix after GitHub default setup was turned off), and3fe5566patchesrustlsfor RUSTSEC-2026-0285 (see Also).What this does
sscsb verifyon this repo went from 19 PASS / 8 FAIL / 1 DEGRADED to 27 PASS / 1 FAIL / 1 DEGRADED, measured onb50b020(2026-09-12). That count was not re-run on the current head (aef7fc3), which also carries074a85b(CodeQL python),3fe5566(rustls RUSTSEC-2026-0285 patch), and the Gitleaks restore and follow-up docs (c29097a,8daf695,06295a4,aef7fc3).Secret scanning: TruffleHog + Gitleaks, same as
mainThis branch briefly made TruffleHog the only secret scanner (2026-09-12): gitleaks off in
.sscsb/config.toml, its CI job gone fromsecrets-scan.yml,.gitleaks.tomldeleted. The owner reversed that call on 2026-10-06. TruffleHog only finds credentials for providers it has a detector for, and with--results=verified,unknownit reports a match only when the provider confirms it live or the verification attempt errors; it drops matches it could not verify, including those from detectors that have no verifier. Gitleaks matches on shape, so it also catches generic secrets such as passwords, internal tokens and keys for services TruffleHog has no detector for — which is why the two run together instead of one replacing the other. Net againstmain, the scanners themselves are unchanged:secrets-scan.yml,.gitleaks.toml, and the[controls.secrets]block in.sscsb/config.tomlare byte-identical tomain. The secret-scanning changes are theci.ymlduplicate-job removal below, a wording update to the best-practices-badge line (TruffleHog + Gitleaks→TruffleHog, verified+unknown, + Gitleaks), the ruleset entries, a new Secret scanning bullet inSECURITY.md, and the secret-scanning content in.sscsb/POSTURE.md(the "Known sscsb defect" section and the "Deliberate tool choices" bullet).What does change, and stays changed, is removing the duplicate TruffleHog job in
ci.yml:secrets-scan.ymlruns the same tool on a superset of triggers (push to main + every PR, vs push to main + only PRs targeting main for theci.ymljob) and with--results=verified,unknowninstead of--only-verified, so a candidate whose verification attempt errored (statusunknown) is also reported — the one extra class this picks up over--only-verified. The action wrapper is also pinned to a newer release (v3.95.9 vs v3.95.2), though both default to pulling thelatestTruffleHog Docker image — so the scanner binary itself isn't actually older on either side, only the action commit is. Nothing is lost by deleting the duplicate.The checked-in ruleset (
.github/rulesets/main-branch-protection.json) lists both secrets-scan.yml jobs,trufflehogandgitleaks, as required status checks, so once it is applied a finding from either blocks a merge.SAST keeps three engines on purpose
codeql.ymlis added (rust + actions + python, buildless) alongside the existing OpenGrep and Semgrep workflows. CodeQL does interprocedural taint tracking over a compiled database and surfaces classes an OpenGrep default ruleset does not express at all — complementary coverage, the same shape as running TruffleHog and Gitleaks together for secrets rather than picking one.Five controls were failing for one shared reason
secrets,commit-signing,ai-trailers,ai-dep-gateandpackage-trustall failed becausecore.hooksPathpointed at.git/hooks, which holds only git's samples — so no sscsb hook had ever run. The shims were also tracked at mode0644, and git silently skips a non-executable hook, so a fresh clone would have hit the same silent no-op even with the path set. Both fixed; the shims are0755in the tree now.dependency-pinning
pip install pyyamlin theparityjob → hash-lockedpip install --require-hashes -r scripts/requirements-parity.txt.Dockerfilestages digest-pinned.Pinning stage 2 surfaced a live break:
cgr.dev/chainguard/cc-dynamicis no longer anonymously pullable (403 FORBIDDEN on the anonymous pull token), so that build could not have succeeded on a runner without Chainguard credentials. Swapped toglibc-dynamic, which is anonymously pullable and carries everything this stage needs — verified by listing the image layers:libc.so.6,libgcc_s.so.1,ld-linux-*.so,ca-certificates.crt.Also
release.yml: top-level write grants no longer leak intobuildandsbom;attestations: writedropped outright (no job in that workflow usesactions/attest*).LICENSE(Apache-2.0) added —Cargo.tomlandREADME.mdboth declared it and the README linked to a file that did not exist.SECURITY.mdadded —security-insights.ymlalready pointed at it.security-insights.yml(there were no placeholders left), flipping it INFO → PASS..sscsb/out/gitignored (generated SBOM/scan output).rustls0.23.37 → 0.23.45 andrustls-webpki0.103.13 → 0.103.15 for RUSTSEC-2026-0285 (3fe5566).cargo-vetimports.lockrefreshed from audit sources already imported; no exemptions added.What is NOT closed
Written down in
.sscsb/POSTURE.mdrather than left to be scrolled past.branch-protectionFAILs. A ruleset lives in GitHub's settings, not the tree, andsscsb harden branch-protectioncannot write this one — it looks for a ruleset naming the branch literally, and ours targets the~DEFAULT_BRANCHalias, so the planner reports "no ruleset targets this branch" and changes nothing. The three missing rules (required PRs, required signed commits, required status checks) are checked in as an importable ruleset:signing-modelstays DEGRADED. Three lanes need an owner attestation of GitHub web settings that have no read API. Theagent-claude-codelane is deliberately not converged: it asks for a distinct agent identity, and this owner runs one-signer-everywhere with AI involvement recorded through commit trailers instead.Gitleaks can false-positive on a brand-new branch's first push. Under
sscsb0.4.0, the pre-push range scan treats a branch with no remote counterpart as having no lower bound, so it scans the tip's entire history instead of just the commits being pushed. On this repository that reported 16 findings, every one a false positive in code that had already been onmainfor months, while the actual outgoing range was clean under both scanners. Fixed upstream inp4gs/sscs-bootstrapper#77, not yet merged.Verified, not assumed
Measured on
b50b020(2026-09-12); not re-run on the current head (aef7fc3), which also carries074a85b(CodeQL python),3fe5566(rustls RUSTSEC-2026-0285 patch), and the Gitleaks restore and follow-up docs (c29097a,8daf695,06295a4,aef7fc3):sscsb verify27 PASS / 1 FAIL / 1 DEGRADED / 3 INFO / 15 disabledsscsb sast— 0 findingssscsb scan— 1 low (DS-0026, Dockerfile HEALTHCHECK), below thehighfail thresholdglibc-dynamiclayer contents were listed, not assumedOn the current head (
aef7fc3): the Secret Scan run passed bothtrufflehogandgitleaks, and the CodeQL run passedAnalyze (actions)/Analyze (python)/Analyze (rust).🤖 Generated with Claude Code
https://claude.ai/code/session_012hwWMsTiv9Uf2gNbMh75uk