feat(scanner): inventory Claude plugin capabilities and undeclared executables - #1134
seonghobae wants to merge 5 commits into
Conversation
RED coverage for issue #1099 inventory keys, fail-closed undeclared scripts, and capability_inventory_sha256 over canonical JSON.
…ecutables Record a secret-free capability inventory as evidence, not permission, hash it on the scan receipt, and fail closed on post-inventory extras.
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Summary: - Snapshot 07:21 UTC records Draft #1134 `4404840` stacked on #1129. - Inventory is evidence, not permission; undeclared executables fail admission. Hosted #1133 coverage remains queued, not GREEN. 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 #1134 (638/638)
…ude-plugin-capability-inventory-1099
|
Non-force restack onto #1129 exact head Merged unique #1099 source/ref/path mismatch without replacing this PR's capability-inventory delta. Focused plugin/docs tests 43 passed; Still Draft. Relates to #1099. Does not close #1087, #929, or #983. |
|
Successor Draft #1135 ( This PR (#1134) remains the capability-inventory owner. #1135 does not take inventory/undeclared-executable/ |
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)
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)
…ude-plugin-capability-inventory-1099
|
Non-force restack onto #1129 |
Stacking
Successor of Draft #1129 / issue #1099. Targets
security/cwl-issue-detector-families(exact basecfd5ae6267dfa026db860c1e8c235b5708dacbbf), notdevelopand not #998.Does not Close #1099 or #1129. Does not close #1087, #929, #983, #1106, #1036, or #1133. Does not reimplement #1036 homoglyph/injection/exfil/placeholder detectors — reuse those rule IDs if they fire through the package scanner. Inventory is evidence, not permission.
Unique delta
filesystem_read,filesystem_write,process_spawn,shell_execution,package_install,network_egress,browser_profile_access,credential_access,mcp_server_start,mcp_remote_connect,github_read,github_write,github_review,github_merge,github_release,deployment_write,model_provider_access.shell_execution/process_spawnand stillscan_result=pass.scripts/hidden.pyorcommands/run.pyisclaude-plugin-undeclared-executableand appears on the receipt.capability_inventory_sha256is SHA-256 of the canonical JSON inventory (sorted keys, no secrets). Identical source+policy → identical digest; adding networkcurlto a declared hook changes the digest.#1129 remains owner of prior admission rules (floating refs, provider secrets, pipe-to-shell, undeclared hooks already scanned, symlink escape, duplicate JSON, unbounded MCP, missing LICENSE, concealed identity, oversized packages, receipts, LifeOS skip-auth).
Evidence
python -m scripts.ci.verify_module_coverage --module appguardrail_core/claude_plugin_detector.py --test tests/test_claude_plugin_supply_chain.py: 638/638Relates to #1099. Relates to #1129.