Skip to content

feat(scanner): reject plugin checksum files that disagree with the artifact - #1169

Draft
seonghobae wants to merge 2 commits into
feat/claude-plugin-sbom-receipt-1099from
feat/claude-plugin-checksum-mismatch-1099
Draft

feat(scanner): reject plugin checksum files that disagree with the artifact#1169
seonghobae wants to merge 2 commits into
feat/claude-plugin-sbom-receipt-1099from
feat/claude-plugin-checksum-mismatch-1099

Conversation

@seonghobae

Copy link
Copy Markdown
Contributor

Successor of #1168 / issue #1099. Does not Close those. sbom_sha256 stays #1168. Pass is not Noema admission.

Unique delta

Fail closed when a first-party plugin checksum file disagrees with bytes on disk:

  • SHA256SUMS, SHA256SUMS.txt, checksums.sha256, or *.sha256 next to plugin.json
  • GNU sha256sum rows and hex-only sibling plugin.json.sha256 files
  • # comments and blank lines ignored
  • matching checksums and missing checksum files are not this class
  • Cosign, GPG, or network signature checks are not required when no checksum file is present
  • snippets are path labels, not hashes or secrets
  • rule id claude-plugin-checksum-mismatch

sbom_sha256 remains the #1168 CycloneDX receipt digest and still verifies.

Evidence

  • RED c23c4cb then GREEN 226ca73
  • tests/test_claude_plugin_checksum_mismatch.py 27 passed
  • claude_plugin_detector.py statement coverage 2424/2424 on Python 3.13

Relates to #1099. Relates to #1168.

…tifact

Summary:
- RED: SHA256SUMS listing plugin.json with a wrong digest does not fail closed.
- Matching digests, missing checksum files, and # comments must stay silent.

Rationale:
- Issue #1099 signature-bind requires first-party checksum files to match bytes on disk.
- Cosign/GPG network and #1168 sbom_sha256 stay out of this slice.

Tests:
- tests/test_claude_plugin_checksum_mismatch.py (8 fail / 9 pass)
…tifact

Summary:
- First-party SHA256SUMS, SHA256SUMS.txt, checksums.sha256, and *.sha256
  next to plugin.json fail closed when a listed digest disagrees with disk bytes.
- Matching checksums, # comments, and missing checksum files are not this class.
- Snippets are path labels. Cosign/GPG network checks are not required.

Rationale:
- Issue #1099 signature-bind requires checksum evidence to match the scanned artifact.
- sbom_sha256 stays the #1168 CycloneDX receipt digest.

Tests:
- tests/test_claude_plugin_checksum_mismatch.py (27 passed)
- detector statement coverage 2424/2424 on Python 3.13
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

seonghobae added a commit that referenced this pull request Sep 7, 2026
Summary:
- Snapshot 22:18 UTC records Draft #1169 `226ca73` stacked on #1168.
- First-party SHA256SUMS that disagree with disk bytes fail closed.
- Matching checksums and a missing checksum file are not this class.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- Cosign/GPG network is not required for this slice.

Tests:
- documentation-only; detector evidence lives on #1169 (2424/2424)
seonghobae added a commit that referenced this pull request Sep 7, 2026
Live snapshot 2026-09-07 23:11 UTC. Draft #1170 b506b82 stacked on
#1169 226ca73. Do not Close #1099 or #1169.
@seonghobae seonghobae added enhancement New feature or request priority: medium Normal-priority or P2 work labels Sep 8, 2026 — with ChatGPT Codex Connector
seonghobae added a commit that referenced this pull request Sep 8, 2026
Summary:
- Snapshot 2026-09-08 03:09 UTC records Draft #1175 `eb2389e` stacked on #1174.
- Checksum digest rows without a sibling signature fail closed.
- Remaining leftover: deep directory recursion.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- Do not Close #1099, #1174, or #1169.

Tests:
- documentation-only; detector evidence lives on #1175 (416 passed)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority: medium Normal-priority or P2 work

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

1 participant