Skip to content

feat(scanner): reject plugin archive traversal and unadmitted submodules - #1135

Draft
seonghobae wants to merge 4 commits into
feat/claude-plugin-capability-inventory-1099from
feat/claude-plugin-archive-submodule-1099
Draft

feat(scanner): reject plugin archive traversal and unadmitted submodules#1135
seonghobae wants to merge 4 commits into
feat/claude-plugin-capability-inventory-1099from
feat/claude-plugin-archive-submodule-1099

Conversation

@seonghobae

Copy link
Copy Markdown
Contributor

Stacking

Successor of Draft #1134 / Draft #1129 / issue #1099. Targets feat/claude-plugin-capability-inventory-1099 (exact base 0cd4329cf21aed37831863ad91350d0c39d0b689), not develop and not #998.

Does not Close #1099, #1134, or #1129. Does not close #1087, #929, #983, #1106, #1036, or #1133. Does not steal G-06 #1133 or #998. Does not reimplement #1036 homoglyph/injection/exfil/placeholder detectors.

#1134 remains owner of capability inventory, undeclared executables, and capability_inventory_sha256. #1129 remains owner of prior admission rules (floating refs, provider secrets, pipe-to-shell, symlink escape, duplicate JSON, unbounded MCP, missing LICENSE, concealed identity, oversized packages, receipts, source mismatch, LifeOS skip-auth).

Unique delta

  • Fail closed on zip/tar members that escape the extract root (../, absolute POSIX paths, Windows drive/UNC prefixes). Rule id claude-plugin-archive-path-traversal. Traversal members are not extracted; files outside the bounded root are not scanned as plugin content. Snippets are path labels only (no raw archive bytes, secrets, or bidi).
  • Nested .gitmodules / gitlink / submodule path without a recursively admitted immutable 40-character SHA identity fails admission. Rule id claude-plugin-unadmitted-submodule. A full SHA plus a pinned, licensed nested plugin.json is negative only when that nested identity is complete.
  • Existing pinned licensed plugins still scan_result=pass. Capability inventory / undeclared-executable / source-mismatch behavior is unchanged.

Evidence

  • focused plugin tests: 43 passed
  • python -m scripts.ci.verify_module_coverage --module appguardrail_core/claude_plugin_detector.py --test tests/test_claude_plugin_supply_chain.py: 997/997

Relates to #1099. Relates to #1134. Relates to #1129.

RED coverage for issue #1099 TDD item 5: zip/tar path escape must fail
closed, and nested gitmodules without a recursively admitted SHA must
fail admission.

Relates to #1099.
Fail closed on zip/tar members that escape the extract root and on
nested gitmodules/gitlinks without a recursively admitted 40-character
SHA identity.

Relates to #1099.
@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 08:25 UTC records Draft #1135 `81e83f4` stacked on #1134.
- Archive path traversal and unadmitted submodules fail closed.
- #1134 restack head is `0cd4329`; #1133 coverage remains queued.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- #1099 remaining surfaces stay on stacked successors, not Close.

Tests:
- documentation-only; detector evidence lives on #1135 (997/997)

Copy link
Copy Markdown
Contributor Author

Non-force restack onto #1134 cdf79fb / #1129 e53d408 / #998 60cdd3f. New successor head 68a4c957abc48e68861e9ceb29f8915efc634637.

Still Draft. Relates to #1099. Does not close #1087, #929, or #983.

seonghobae added a commit that referenced this pull request Sep 7, 2026
Refresh the 2026-09-07 08:59 UTC snapshot: #998 60cdd3f after Strix
VULN-0001 implicit-shell repair; #1129 e53d408, #1134 cdf79fb, and
#1135 68a4c95 restacked without force. Predecessor Strix GREEN does
not transfer.

Copy link
Copy Markdown
Contributor Author

Stacked successor: Draft #1136 (feat/claude-plugin-receipt-replay-1099) targets this branch for issue #1099 TDD item 12 (stale/wrong receipt replay). It does not Close #1135, #1134, #1129, or #1099, and does not steal archive/submodule ownership from this PR.

seonghobae added a commit that referenced this pull request Sep 7, 2026
Summary:
- Snapshot 09:12 UTC records Draft #1136 `2fe93a1` stacked on #1135.
- Restacked #1135/#1134/#1129/#998 heads are aligned.
- A pass receipt is not admission; replay against mutated trees fails.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- #1099 remaining surfaces stay on stacked successors, not Close.

Tests:
- documentation-only; detector evidence lives on #1136 (1039/1039)

Copy link
Copy Markdown
Contributor Author

Non-force restack onto #1134 36e8f37. New successor head ef28b05343739aa94ee2f2b942d363de52a1fdec. Still Draft.

seonghobae added a commit that referenced this pull request Sep 7, 2026
…bmodule

Carry #1136 unique stale/mismatched receipt replay onto #1135
ef28b05 after the getoutput public-message restack. Do not Close
#1099 or #1135.
seonghobae added a commit that referenced this pull request Sep 7, 2026
Snapshot 2026-09-07 10:12 UTC: #998 8b95c2b Tests GREEN; stack restacked
#1129 c5be73c / #1134 36e8f37 / #1135 ef28b05 / #1136 32dc0fc; unique
#1137 GitHub-write/Docker on #1136. Do not Close #983, #1099, or #1036.
seonghobae added a commit that referenced this pull request Sep 7, 2026
Summary:
- Snapshot 20:26 UTC records Draft #1166 `90cd031` stacked on #1165.
- Archive ratio >100 or nesting deeper than 1 fail closed.
- Bomb members are not extracted; zip-slip stays #1135.

Rationale:
- #999 is the single writer of the product-technical gap baseline.
- #1099 remaining surfaces stay on stacked successors, not Close.

Tests:
- documentation-only; detector evidence lives on #1166 (2201/2201)
@seonghobae seonghobae added enhancement New feature or request priority: medium Normal-priority or P2 work labels Sep 8, 2026 — with ChatGPT Codex Connector
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