Conversation
Runs `sscsb init` on this repo for the first time (47 controls, 32 enabled) and fixes every real finding the first verify produced. Policy: strongest-tool-only. * Credential scanning is TruffleHog alone — `controls.secrets.gitleaks = false`. TruffleHog verifies a candidate against the issuing provider, so a finding is a live credential rather than a regex hit; gitleaks-action additionally needs a paid license for org-owned repositories. sscsb's secrets-scan.yml template emits the gitleaks job regardless of that key, so the job is removed by hand and must be removed again after any `sscsb init` re-run. * SAST is CodeQL + OpenGrep, both enabled. The archived semgrep/semgrep-action@v1 job in security.yml is retired; OpenGrep is Semgrep's open fork and resolves the same rulesets, so `p/rust` and `p/security-audit` were added to the OpenGrep run — same coverage, on a pinned cosign-verified binary, with SARIF uploaded to code scanning. Findings fixed: * CODEOWNERS was entirely inert. All ten rules named @grcengineering/security, a team that does not exist — GitHub's codeowners/errors endpoint returned "Unknown owner" for every line, so no rule bound to anyone and the code-owner-review path had nothing behind it. Rules now name @p4gs and cover the new .sscsb/ policy surface. * deny.toml could not be parsed by cargo-deny 0.19.4 at all: `unmaintained` became a scope rather than a severity in the v2 schema, and `vulnerability`, `unlicensed` and `copyleft` were removed. The `deny` job in security.yml — a required status check on main — could therefore never have run. Rewritten to the v2 schema with the same intent, and tightened: unmaintained = "all". * Two Renovate config files (pre-existing renovate.json plus the renovate.json5 sscsb wrote) make Renovate abort with "Found multiple config file names". Merged into renovate.json5; renovate.json deleted. * Dockerfile base images were tag-pinned, not digest-pinned. Both now carry sha256 digests (resolved 2026-09-12). * CodeQL analysed `actions` only, not this workspace's Rust. Added `rust` to the matrix with build-mode none. * release.yml and security.yml: harden-runner added to all ten jobs, persist-credentials: false on every checkout, --locked on cargo install. * security-insights.yml REPLACE-ME administrator filled in. Verify: 23 pass / 3 fail / 3 degraded before, 27 pass / 1 fail / 2 degraded after. Remaining: branch-protection (required signed commits is a repo-admin remote write, left for a human), signing-model (account-level attestations only the maintainer can truthfully make), scorecard (no published results until this lands on the default branch). 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
|
You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool. What Enabling Code Scanning Means:
For more information about GitHub Code Scanning, check out the documentation. |
`sscsb scan --local` writes the checks that are only observable on a developer machine — which key git signs with, whether the installed hooks actually block, what is in the package-trust baseline, which scanners are on PATH — and signs the result in the `sscsb-scan-record` namespace with the repository's own committed trust anchor (.sscsb/policy/allowed_signers). A clone cannot observe any of it, so without this record the public directory scores those controls `unverified` and the repository reads provisional however good its posture is. Signed by the human-class signer this repo commits as approved (SHA256:prXatGO56nl8Or4JdDSzIIcj8hZE1jBxnFaXZOnAPDQ); ssh-keygen -Y verify returns Good for the namespace. Record asserts 28 pass / 1 fail / 1 degraded at 12094c5 — the residual FAIL is branch-protection's missing 'Require signed commits', a repo-admin remote write left for a human. Not submitted to the public directory: `sscsb scan --local --submit` is a separate, deliberate publication step. 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
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.
What
First-time
sscsb initbootstrap of this repository (47 controls, 32 enabled), plus a fix for every real finding the firstsscsb verifyproduced.sscsb verifybefore → after:23 pass / 3 fail / 3 degraded / 3 info→27 pass / 1 fail / 2 degraded / 2 info(15 controls deliberately disabled in both).Strongest-tool-only policy
controls.secrets.gitleaks = false)gitleaks-actionalso needs a paid license for org-owned repos.sscsb's
secrets-scan.ymltemplate emits the Gitleaks job regardless of thegitleaksconfig key, so that job was removed by hand — it must be removed again after anysscsb initre-run (noted in the file header).The archived
semgrep/semgrep-action@v1job insecurity.ymlis retired. OpenGrep is Semgrep's open fork and resolves the same registry rulesets, sop/rustandp/security-auditwere added to the OpenGrep run: same rule coverage, now on a pinned cosign-verified binary with SARIF uploaded to code scanning. Verified locally —Ran 19 rules on 66 files: 0 findings, exit 0.Findings fixed
@grcengineering/security, a team that does not exist.GET /repos/grcengineering/cvm/codeowners/errorsreturnedUnknown ownerfor every line, so no rule bound to anyone — including the branch-protection "require review from Code Owners" path. Rules now name@p4gsand additionally cover the new.sscsb/policy surface. Swap back if a real, publicly-visible@grcengineering/securityteam with write access is ever created.deny.tomlcould not be parsed at all. cargo-deny 0.19.4:error[unexpected-value] ... unmaintained = "warn". The v2 schema turnedunmaintainedinto a scope, and removedvulnerability,unlicensed,copyleft. Thedenyjob — a required status check onmain— could therefore never have run. Rewritten to the v2 schema, same intent, and tightened (unmaintained = "all").cargo deny checknow exits 0.sscsb initwroterenovate.json5next to the pre-existingrenovate.json; Renovate aborts with "Found multiple config file names" when both exist. Merged intorenovate.json5(old cool-down rules preserved,isVulnerabilityAlertmigrated to the modernvulnerabilityAlertsblock);renovate.jsondeleted.cgr.dev/chainguard/rust:latest-devandcgr.dev/chainguard/static:latestnow carry sha256 digests (resolved 2026-09-12).actionsonly — not this workspace's Rust.rustadded to the matrix withbuild-mode: none.release.ymlandsecurity.ymlwere unhardened.harden-runneradded to all ten jobs,persist-credentials: falseon every checkout,--lockedoncargo install.security-insights.ymlREPLACE-MEadministrator placeholder filled in; reporting channel aligned withSECURITY.md.Left open, with reasons
branch-protection— FAIL.mainis missing Require signed commits; everything else already passes (required PRs, force-push block, required checks, deletion protection, stale-review dismissal, 1 approving review, strict up-to-date). This is a repo-admin remote write, deliberately not made by an agent.sscsb harden branch-protection --applyis not the fix here — it only edits rulesets, and this repo uses classic branch protection, so its plan output isno ruleset targets this branch — skipped. The one-line fix is:signing-model— DEGRADED. Remaining items are account-level attestations only the maintainer can truthfully assert (github-webvigilant mode + phishing-resistant MFA, Codespaces GPG verification, Claude GitHub App authorization). Theagent-claude-codelane wants a distinct agent commit identity, which conflicts with this operator's standing one-signer directive — a policy call, not a config gap.scorecard— DEGRADED. No published Scorecard results yet;scorecard.ymlruns on push to the default branch, so this resolves once this PR lands.Merge note
mainrequires a PR and 1 approving review withenforce_admins: true. GitHub does not let an author approve their own PR, so this needs a second reviewer or a temporary protection adjustment by an admin.AI-Assisted: true
AI-Tool: Claude Code
AI-Model: claude-opus-5
AI-Role: draft
🤖 Generated with Claude Code
https://claude.ai/code/session_017N6Qc2T7buVAXHZ9vYa1xm