hackmyagent 0.7.2 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +172 -261
- package/dist/abgr/controls.d.ts +35 -0
- package/dist/abgr/controls.d.ts.map +1 -0
- package/dist/abgr/controls.js +1058 -0
- package/dist/abgr/controls.js.map +1 -0
- package/dist/abgr/detector.d.ts +45 -0
- package/dist/abgr/detector.d.ts.map +1 -0
- package/dist/abgr/detector.js +175 -0
- package/dist/abgr/detector.js.map +1 -0
- package/dist/abgr/index.d.ts +24 -0
- package/dist/abgr/index.d.ts.map +1 -0
- package/dist/abgr/index.js +50 -0
- package/dist/abgr/index.js.map +1 -0
- package/dist/abgr/scorer.d.ts +36 -0
- package/dist/abgr/scorer.d.ts.map +1 -0
- package/dist/abgr/scorer.js +205 -0
- package/dist/abgr/scorer.js.map +1 -0
- package/dist/abgr/templates.d.ts +35 -0
- package/dist/abgr/templates.d.ts.map +1 -0
- package/dist/abgr/templates.js +668 -0
- package/dist/abgr/templates.js.map +1 -0
- package/dist/abgr/tier.d.ts +27 -0
- package/dist/abgr/tier.d.ts.map +1 -0
- package/dist/abgr/tier.js +115 -0
- package/dist/abgr/tier.js.map +1 -0
- package/dist/abgr/types.d.ts +59 -0
- package/dist/abgr/types.d.ts.map +1 -0
- package/dist/abgr/types.js +10 -0
- package/dist/abgr/types.js.map +1 -0
- package/dist/agent-scan/checks.d.ts +6 -0
- package/dist/agent-scan/checks.d.ts.map +1 -0
- package/dist/agent-scan/checks.js +93 -0
- package/dist/agent-scan/checks.js.map +1 -0
- package/dist/agent-scan/index.d.ts +10 -0
- package/dist/agent-scan/index.d.ts.map +1 -0
- package/dist/agent-scan/index.js +16 -0
- package/dist/agent-scan/index.js.map +1 -0
- package/dist/agent-scan/scanner.d.ts +31 -0
- package/dist/agent-scan/scanner.d.ts.map +1 -0
- package/dist/agent-scan/scanner.js +484 -0
- package/dist/agent-scan/scanner.js.map +1 -0
- package/dist/agent-scan/types.d.ts +63 -0
- package/dist/agent-scan/types.d.ts.map +1 -0
- package/dist/agent-scan/types.js +10 -0
- package/dist/agent-scan/types.js.map +1 -0
- package/dist/arp/cli/index.d.ts +3 -0
- package/dist/arp/cli/index.d.ts.map +1 -0
- package/dist/arp/cli/index.js +225 -0
- package/dist/arp/cli/index.js.map +1 -0
- package/dist/arp/config/loader.d.ts +8 -0
- package/dist/arp/config/loader.d.ts.map +1 -0
- package/dist/arp/config/loader.js +102 -0
- package/dist/arp/config/loader.js.map +1 -0
- package/dist/arp/enforcement/kill-switch.d.ts +22 -0
- package/dist/arp/enforcement/kill-switch.d.ts.map +1 -0
- package/dist/arp/enforcement/kill-switch.js +122 -0
- package/dist/arp/enforcement/kill-switch.js.map +1 -0
- package/dist/arp/engine/event-engine.d.ts +29 -0
- package/dist/arp/engine/event-engine.d.ts.map +1 -0
- package/dist/arp/engine/event-engine.js +233 -0
- package/dist/arp/engine/event-engine.js.map +1 -0
- package/dist/arp/index.d.ts +81 -0
- package/dist/arp/index.d.ts.map +1 -0
- package/dist/arp/index.js +239 -0
- package/dist/arp/index.js.map +1 -0
- package/dist/arp/intelligence/adapters.d.ts +45 -0
- package/dist/arp/intelligence/adapters.d.ts.map +1 -0
- package/dist/arp/intelligence/adapters.js +222 -0
- package/dist/arp/intelligence/adapters.js.map +1 -0
- package/dist/arp/intelligence/anomaly.d.ts +32 -0
- package/dist/arp/intelligence/anomaly.d.ts.map +1 -0
- package/dist/arp/intelligence/anomaly.js +80 -0
- package/dist/arp/intelligence/anomaly.js.map +1 -0
- package/dist/arp/intelligence/budget.d.ts +33 -0
- package/dist/arp/intelligence/budget.d.ts.map +1 -0
- package/dist/arp/intelligence/budget.js +150 -0
- package/dist/arp/intelligence/budget.js.map +1 -0
- package/dist/arp/intelligence/coordinator.d.ts +43 -0
- package/dist/arp/intelligence/coordinator.d.ts.map +1 -0
- package/dist/arp/intelligence/coordinator.js +301 -0
- package/dist/arp/intelligence/coordinator.js.map +1 -0
- package/dist/arp/interceptors/a2a-protocol.d.ts +29 -0
- package/dist/arp/interceptors/a2a-protocol.d.ts.map +1 -0
- package/dist/arp/interceptors/a2a-protocol.js +111 -0
- package/dist/arp/interceptors/a2a-protocol.js.map +1 -0
- package/dist/arp/interceptors/filesystem.d.ts +33 -0
- package/dist/arp/interceptors/filesystem.d.ts.map +1 -0
- package/dist/arp/interceptors/filesystem.js +199 -0
- package/dist/arp/interceptors/filesystem.js.map +1 -0
- package/dist/arp/interceptors/mcp-protocol.d.ts +25 -0
- package/dist/arp/interceptors/mcp-protocol.d.ts.map +1 -0
- package/dist/arp/interceptors/mcp-protocol.js +126 -0
- package/dist/arp/interceptors/mcp-protocol.js.map +1 -0
- package/dist/arp/interceptors/network.d.ts +26 -0
- package/dist/arp/interceptors/network.d.ts.map +1 -0
- package/dist/arp/interceptors/network.js +146 -0
- package/dist/arp/interceptors/network.js.map +1 -0
- package/dist/arp/interceptors/process.d.ts +26 -0
- package/dist/arp/interceptors/process.d.ts.map +1 -0
- package/dist/arp/interceptors/process.js +157 -0
- package/dist/arp/interceptors/process.js.map +1 -0
- package/dist/arp/interceptors/prompt.d.ts +29 -0
- package/dist/arp/interceptors/prompt.d.ts.map +1 -0
- package/dist/arp/interceptors/prompt.js +82 -0
- package/dist/arp/interceptors/prompt.js.map +1 -0
- package/dist/arp/license/index.d.ts +59 -0
- package/dist/arp/license/index.d.ts.map +1 -0
- package/dist/arp/license/index.js +78 -0
- package/dist/arp/license/index.js.map +1 -0
- package/dist/arp/monitors/filesystem.d.ts +21 -0
- package/dist/arp/monitors/filesystem.d.ts.map +1 -0
- package/dist/arp/monitors/filesystem.js +141 -0
- package/dist/arp/monitors/filesystem.js.map +1 -0
- package/dist/arp/monitors/network.d.ts +32 -0
- package/dist/arp/monitors/network.d.ts.map +1 -0
- package/dist/arp/monitors/network.js +301 -0
- package/dist/arp/monitors/network.js.map +1 -0
- package/dist/arp/monitors/process.d.ts +24 -0
- package/dist/arp/monitors/process.d.ts.map +1 -0
- package/dist/arp/monitors/process.js +205 -0
- package/dist/arp/monitors/process.js.map +1 -0
- package/dist/arp/patterns/ai-threats.d.ts +48 -0
- package/dist/arp/patterns/ai-threats.d.ts.map +1 -0
- package/dist/arp/patterns/ai-threats.js +215 -0
- package/dist/arp/patterns/ai-threats.js.map +1 -0
- package/dist/arp/proxy/forward.d.ts +23 -0
- package/dist/arp/proxy/forward.d.ts.map +1 -0
- package/dist/arp/proxy/forward.js +152 -0
- package/dist/arp/proxy/forward.js.map +1 -0
- package/dist/arp/proxy/server.d.ts +45 -0
- package/dist/arp/proxy/server.d.ts.map +1 -0
- package/dist/arp/proxy/server.js +331 -0
- package/dist/arp/proxy/server.js.map +1 -0
- package/dist/arp/reporting/local-log.d.ts +22 -0
- package/dist/arp/reporting/local-log.d.ts.map +1 -0
- package/dist/arp/reporting/local-log.js +116 -0
- package/dist/arp/reporting/local-log.js.map +1 -0
- package/dist/arp/types.d.ts +230 -0
- package/dist/arp/types.d.ts.map +1 -0
- package/dist/arp/types.js +4 -0
- package/dist/arp/types.js.map +1 -0
- package/dist/attack/custom-payloads.d.ts +11 -0
- package/dist/attack/custom-payloads.d.ts.map +1 -0
- package/dist/attack/custom-payloads.js +108 -0
- package/dist/attack/custom-payloads.js.map +1 -0
- package/dist/attack/fail-policy.d.ts +16 -0
- package/dist/attack/fail-policy.d.ts.map +1 -0
- package/dist/attack/fail-policy.js +36 -0
- package/dist/attack/fail-policy.js.map +1 -0
- package/dist/attack/index.d.ts +12 -0
- package/dist/attack/index.d.ts.map +1 -0
- package/dist/attack/index.js +30 -0
- package/dist/attack/index.js.map +1 -0
- package/dist/attack/payloads/a2a-attacks.d.ts +12 -0
- package/dist/attack/payloads/a2a-attacks.d.ts.map +1 -0
- package/dist/attack/payloads/a2a-attacks.js +221 -0
- package/dist/attack/payloads/a2a-attacks.js.map +1 -0
- package/dist/attack/payloads/capability-abuse.d.ts +8 -0
- package/dist/attack/payloads/capability-abuse.d.ts.map +1 -0
- package/dist/attack/payloads/capability-abuse.js +222 -0
- package/dist/attack/payloads/capability-abuse.js.map +1 -0
- package/dist/attack/payloads/context-manipulation.d.ts +8 -0
- package/dist/attack/payloads/context-manipulation.d.ts.map +1 -0
- package/dist/attack/payloads/context-manipulation.js +217 -0
- package/dist/attack/payloads/context-manipulation.js.map +1 -0
- package/dist/attack/payloads/data-exfiltration.d.ts +8 -0
- package/dist/attack/payloads/data-exfiltration.d.ts.map +1 -0
- package/dist/attack/payloads/data-exfiltration.js +249 -0
- package/dist/attack/payloads/data-exfiltration.js.map +1 -0
- package/dist/attack/payloads/index.d.ts +29 -0
- package/dist/attack/payloads/index.d.ts.map +1 -0
- package/dist/attack/payloads/index.js +76 -0
- package/dist/attack/payloads/index.js.map +1 -0
- package/dist/attack/payloads/jailbreak.d.ts +8 -0
- package/dist/attack/payloads/jailbreak.d.ts.map +1 -0
- package/dist/attack/payloads/jailbreak.js +265 -0
- package/dist/attack/payloads/jailbreak.js.map +1 -0
- package/dist/attack/payloads/mcp-exploitation.d.ts +12 -0
- package/dist/attack/payloads/mcp-exploitation.d.ts.map +1 -0
- package/dist/attack/payloads/mcp-exploitation.js +221 -0
- package/dist/attack/payloads/mcp-exploitation.js.map +1 -0
- package/dist/attack/payloads/prompt-injection.d.ts +8 -0
- package/dist/attack/payloads/prompt-injection.d.ts.map +1 -0
- package/dist/attack/payloads/prompt-injection.js +262 -0
- package/dist/attack/payloads/prompt-injection.js.map +1 -0
- package/dist/attack/scanner.d.ts +84 -0
- package/dist/attack/scanner.d.ts.map +1 -0
- package/dist/attack/scanner.js +509 -0
- package/dist/attack/scanner.js.map +1 -0
- package/dist/attack/types.d.ts +153 -0
- package/dist/attack/types.d.ts.map +1 -0
- package/dist/attack/types.js +46 -0
- package/dist/attack/types.js.map +1 -0
- package/dist/benchmarks/index.d.ts +16 -0
- package/dist/benchmarks/index.d.ts.map +1 -0
- package/dist/benchmarks/index.js +27 -0
- package/dist/benchmarks/index.js.map +1 -0
- package/dist/benchmarks/oasb-1.d.ts +112 -0
- package/dist/benchmarks/oasb-1.d.ts.map +1 -0
- package/dist/benchmarks/oasb-1.js +1124 -0
- package/dist/benchmarks/oasb-1.js.map +1 -0
- package/dist/checker/check-skill.d.ts +48 -0
- package/dist/checker/check-skill.d.ts.map +1 -0
- package/dist/checker/check-skill.js +105 -0
- package/dist/checker/check-skill.js.map +1 -0
- package/dist/checker/index.d.ts +12 -0
- package/dist/checker/index.d.ts.map +1 -0
- package/dist/checker/index.js +16 -0
- package/dist/checker/index.js.map +1 -0
- package/dist/checker/permission-analyzer.d.ts +12 -0
- package/dist/checker/permission-analyzer.d.ts.map +1 -0
- package/dist/checker/permission-analyzer.js +84 -0
- package/dist/checker/permission-analyzer.js.map +1 -0
- package/dist/checker/publisher-verifier.d.ts +34 -0
- package/dist/checker/publisher-verifier.d.ts.map +1 -0
- package/dist/checker/publisher-verifier.js +121 -0
- package/dist/checker/publisher-verifier.js.map +1 -0
- package/dist/checker/skill-identifier.d.ts +14 -0
- package/dist/checker/skill-identifier.d.ts.map +1 -0
- package/dist/checker/skill-identifier.js +55 -0
- package/dist/checker/skill-identifier.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3534 -0
- package/dist/cli.js.map +1 -0
- package/dist/hardening/index.d.ts +7 -0
- package/dist/hardening/index.d.ts.map +1 -0
- package/dist/hardening/index.js +9 -0
- package/dist/hardening/index.js.map +1 -0
- package/dist/hardening/llm-checks.d.ts +18 -0
- package/dist/hardening/llm-checks.d.ts.map +1 -0
- package/dist/hardening/llm-checks.js +434 -0
- package/dist/hardening/llm-checks.js.map +1 -0
- package/dist/hardening/mcp-tool-enum.d.ts +45 -0
- package/dist/hardening/mcp-tool-enum.d.ts.map +1 -0
- package/dist/hardening/mcp-tool-enum.js +315 -0
- package/dist/hardening/mcp-tool-enum.js.map +1 -0
- package/dist/hardening/scanner.d.ts +147 -0
- package/dist/hardening/scanner.d.ts.map +1 -0
- package/dist/hardening/scanner.js +5445 -0
- package/dist/hardening/scanner.js.map +1 -0
- package/dist/hardening/security-check.d.ts +85 -0
- package/dist/hardening/security-check.d.ts.map +1 -0
- package/dist/hardening/security-check.js +6 -0
- package/dist/hardening/security-check.js.map +1 -0
- package/dist/hardening/shell-checks.d.ts +21 -0
- package/dist/hardening/shell-checks.d.ts.map +1 -0
- package/dist/hardening/shell-checks.js +236 -0
- package/dist/hardening/shell-checks.js.map +1 -0
- package/dist/index.d.ts +38 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -3525
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +10 -10
- package/dist/mcp-server.js.map +1 -1
- package/dist/oasb/config/dvaa-targets.d.ts +13 -0
- package/dist/oasb/config/dvaa-targets.d.ts.map +1 -0
- package/dist/oasb/config/dvaa-targets.js +89 -0
- package/dist/oasb/config/dvaa-targets.js.map +1 -0
- package/dist/oasb/harness/arp-wrapper.d.ts +29 -0
- package/dist/oasb/harness/arp-wrapper.d.ts.map +1 -0
- package/dist/oasb/harness/arp-wrapper.js +134 -0
- package/dist/oasb/harness/arp-wrapper.js.map +1 -0
- package/dist/oasb/harness/dvaa-client.d.ts +46 -0
- package/dist/oasb/harness/dvaa-client.d.ts.map +1 -0
- package/dist/oasb/harness/dvaa-client.js +98 -0
- package/dist/oasb/harness/dvaa-client.js.map +1 -0
- package/dist/oasb/harness/dvaa-manager.d.ts +17 -0
- package/dist/oasb/harness/dvaa-manager.d.ts.map +1 -0
- package/dist/oasb/harness/dvaa-manager.js +132 -0
- package/dist/oasb/harness/dvaa-manager.js.map +1 -0
- package/dist/oasb/harness/event-collector.d.ts +33 -0
- package/dist/oasb/harness/event-collector.d.ts.map +1 -0
- package/dist/oasb/harness/event-collector.js +86 -0
- package/dist/oasb/harness/event-collector.js.map +1 -0
- package/dist/oasb/harness/metrics.d.ts +14 -0
- package/dist/oasb/harness/metrics.d.ts.map +1 -0
- package/dist/oasb/harness/metrics.js +56 -0
- package/dist/oasb/harness/metrics.js.map +1 -0
- package/dist/oasb/harness/mock-llm-adapter.d.ts +34 -0
- package/dist/oasb/harness/mock-llm-adapter.d.ts.map +1 -0
- package/dist/oasb/harness/mock-llm-adapter.js +69 -0
- package/dist/oasb/harness/mock-llm-adapter.js.map +1 -0
- package/dist/oasb/harness/types.d.ts +74 -0
- package/dist/oasb/harness/types.d.ts.map +1 -0
- package/dist/oasb/harness/types.js +3 -0
- package/dist/oasb/harness/types.js.map +1 -0
- package/dist/plugins/core.d.ts +109 -0
- package/dist/plugins/core.d.ts.map +1 -0
- package/dist/plugins/core.js +30 -0
- package/dist/plugins/core.js.map +1 -0
- package/dist/plugins/credvault.d.ts +22 -0
- package/dist/plugins/credvault.d.ts.map +1 -0
- package/dist/plugins/credvault.js +374 -0
- package/dist/plugins/credvault.js.map +1 -0
- package/dist/plugins/signcrypt.d.ts +27 -0
- package/dist/plugins/signcrypt.d.ts.map +1 -0
- package/dist/plugins/signcrypt.js +317 -0
- package/dist/plugins/signcrypt.js.map +1 -0
- package/dist/plugins/skillguard.d.ts +25 -0
- package/dist/plugins/skillguard.d.ts.map +1 -0
- package/dist/plugins/skillguard.js +346 -0
- package/dist/plugins/skillguard.js.map +1 -0
- package/dist/registry/client.d.ts +125 -0
- package/dist/registry/client.d.ts.map +1 -0
- package/dist/registry/client.js +308 -0
- package/dist/registry/client.js.map +1 -0
- package/dist/registry/contribution.d.ts +178 -0
- package/dist/registry/contribution.d.ts.map +1 -0
- package/dist/registry/contribution.js +272 -0
- package/dist/registry/contribution.js.map +1 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +10 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/scanner/external-scanner.d.ts +13 -0
- package/dist/scanner/external-scanner.d.ts.map +1 -0
- package/dist/scanner/external-scanner.js +299 -0
- package/dist/scanner/external-scanner.js.map +1 -0
- package/dist/scanner/index.d.ts +6 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +9 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/types.d.ts +32 -0
- package/dist/scanner/types.d.ts.map +1 -0
- package/dist/scanner/types.js +6 -0
- package/dist/scanner/types.js.map +1 -0
- package/dist/semantic/deep-scan.d.ts +13 -0
- package/dist/semantic/deep-scan.d.ts.map +1 -0
- package/dist/semantic/deep-scan.js +63 -0
- package/dist/semantic/deep-scan.js.map +1 -0
- package/dist/semantic/index.d.ts +17 -0
- package/dist/semantic/index.d.ts.map +1 -0
- package/dist/semantic/index.js +39 -0
- package/dist/semantic/index.js.map +1 -0
- package/dist/semantic/integration/cost-estimator.d.ts +17 -0
- package/dist/semantic/integration/cost-estimator.d.ts.map +1 -0
- package/dist/semantic/integration/cost-estimator.js +54 -0
- package/dist/semantic/integration/cost-estimator.js.map +1 -0
- package/dist/semantic/integration/finding-adapter.d.ts +34 -0
- package/dist/semantic/integration/finding-adapter.d.ts.map +1 -0
- package/dist/semantic/integration/finding-adapter.js +41 -0
- package/dist/semantic/integration/finding-adapter.js.map +1 -0
- package/dist/semantic/integration/oasb-upgrader.d.ts +20 -0
- package/dist/semantic/integration/oasb-upgrader.d.ts.map +1 -0
- package/dist/semantic/integration/oasb-upgrader.js +47 -0
- package/dist/semantic/integration/oasb-upgrader.js.map +1 -0
- package/dist/semantic/llm/budget.d.ts +50 -0
- package/dist/semantic/llm/budget.d.ts.map +1 -0
- package/dist/semantic/llm/budget.js +139 -0
- package/dist/semantic/llm/budget.js.map +1 -0
- package/dist/semantic/llm/cache.d.ts +36 -0
- package/dist/semantic/llm/cache.d.ts.map +1 -0
- package/dist/semantic/llm/cache.js +103 -0
- package/dist/semantic/llm/cache.js.map +1 -0
- package/dist/semantic/llm/client.d.ts +49 -0
- package/dist/semantic/llm/client.d.ts.map +1 -0
- package/dist/semantic/llm/client.js +64 -0
- package/dist/semantic/llm/client.js.map +1 -0
- package/dist/semantic/llm/index.d.ts +33 -0
- package/dist/semantic/llm/index.d.ts.map +1 -0
- package/dist/semantic/llm/index.js +129 -0
- package/dist/semantic/llm/index.js.map +1 -0
- package/dist/semantic/llm/prompts.d.ts +30 -0
- package/dist/semantic/llm/prompts.d.ts.map +1 -0
- package/dist/semantic/llm/prompts.js +120 -0
- package/dist/semantic/llm/prompts.js.map +1 -0
- package/dist/semantic/structural/credential-context.d.ts +14 -0
- package/dist/semantic/structural/credential-context.d.ts.map +1 -0
- package/dist/semantic/structural/credential-context.js +295 -0
- package/dist/semantic/structural/credential-context.js.map +1 -0
- package/dist/semantic/structural/index.d.ts +28 -0
- package/dist/semantic/structural/index.d.ts.map +1 -0
- package/dist/semantic/structural/index.js +138 -0
- package/dist/semantic/structural/index.js.map +1 -0
- package/dist/semantic/structural/instruction.d.ts +19 -0
- package/dist/semantic/structural/instruction.d.ts.map +1 -0
- package/dist/semantic/structural/instruction.js +167 -0
- package/dist/semantic/structural/instruction.js.map +1 -0
- package/dist/semantic/structural/mcp-config.d.ts +22 -0
- package/dist/semantic/structural/mcp-config.d.ts.map +1 -0
- package/dist/semantic/structural/mcp-config.js +294 -0
- package/dist/semantic/structural/mcp-config.js.map +1 -0
- package/dist/semantic/structural/permission-model.d.ts +16 -0
- package/dist/semantic/structural/permission-model.d.ts.map +1 -0
- package/dist/semantic/structural/permission-model.js +121 -0
- package/dist/semantic/structural/permission-model.js.map +1 -0
- package/dist/semantic/types.d.ts +122 -0
- package/dist/semantic/types.d.ts.map +1 -0
- package/dist/semantic/types.js +10 -0
- package/dist/semantic/types.js.map +1 -0
- package/package.json +25 -14
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Agent Instruction Static Analysis (Layer 2)
|
|
4
|
+
*
|
|
5
|
+
* Analyzes CLAUDE.md, .cursorrules, .windsurfrules, .clinerules,
|
|
6
|
+
* copilot-instructions.md for security issues:
|
|
7
|
+
* - Overly permissive instructions
|
|
8
|
+
* - Exfiltration enablement
|
|
9
|
+
* - Missing security boundaries
|
|
10
|
+
* - Large attack surface
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.InstructionAnalyzer = void 0;
|
|
14
|
+
/** Patterns that indicate overly permissive agent instructions */
|
|
15
|
+
const PERMISSIVE_PATTERNS = [
|
|
16
|
+
{ pattern: /always\s+execute/i, label: '"always execute"' },
|
|
17
|
+
{ pattern: /never\s+refuse/i, label: '"never refuse"' },
|
|
18
|
+
{ pattern: /full\s+access/i, label: '"full access"' },
|
|
19
|
+
{ pattern: /bypass\s+safety/i, label: '"bypass safety"' },
|
|
20
|
+
{ pattern: /ignore\s+restrictions/i, label: '"ignore restrictions"' },
|
|
21
|
+
{ pattern: /no\s+restrictions/i, label: '"no restrictions"' },
|
|
22
|
+
{ pattern: /skip\s+(?:security|safety|validation)/i, label: '"skip security/safety"' },
|
|
23
|
+
{ pattern: /disable\s+(?:security|safety|protection)/i, label: '"disable security"' },
|
|
24
|
+
{ pattern: /without\s+(?:asking|confirmation|approval)/i, label: '"without asking"' },
|
|
25
|
+
{ pattern: /unrestricted/i, label: '"unrestricted"' },
|
|
26
|
+
{ pattern: /override\s+(?:safety|security|policy)/i, label: '"override safety/policy"' },
|
|
27
|
+
];
|
|
28
|
+
/** Patterns that could enable data exfiltration */
|
|
29
|
+
const EXFILTRATION_PATTERNS = [
|
|
30
|
+
{ pattern: /webhook\.site/i, label: 'webhook.site URL' },
|
|
31
|
+
{ pattern: /requestbin/i, label: 'requestbin URL' },
|
|
32
|
+
{ pattern: /ngrok\.io/i, label: 'ngrok tunnel' },
|
|
33
|
+
{ pattern: /pipedream/i, label: 'pipedream URL' },
|
|
34
|
+
{ pattern: /send\s+(?:results?|data|output|response)\s+to\s+/i, label: '"send results to" directive' },
|
|
35
|
+
{ pattern: /post\s+(?:results?|data|output)\s+to\s+/i, label: '"post data to" directive' },
|
|
36
|
+
{ pattern: /forward\s+(?:to|all)\s+/i, label: '"forward to" directive' },
|
|
37
|
+
{ pattern: /exfiltrat/i, label: 'exfiltration reference' },
|
|
38
|
+
{ pattern: /curl\s+.*-X\s*POST/i, label: 'curl POST command' },
|
|
39
|
+
];
|
|
40
|
+
/** Security-related terms that should be present in instruction files */
|
|
41
|
+
const SECURITY_TERMS = [
|
|
42
|
+
/security/i,
|
|
43
|
+
/safe(?:ty|ly)?/i,
|
|
44
|
+
/restrict(?:ed|ion)?/i,
|
|
45
|
+
/permission/i,
|
|
46
|
+
/authoriz/i,
|
|
47
|
+
/sensitive/i,
|
|
48
|
+
/credential/i,
|
|
49
|
+
/secret/i,
|
|
50
|
+
/protect/i,
|
|
51
|
+
/boundary/i,
|
|
52
|
+
/sandbox/i,
|
|
53
|
+
/scope/i,
|
|
54
|
+
];
|
|
55
|
+
/** Max instruction file size before it becomes a concern */
|
|
56
|
+
const LARGE_INSTRUCTION_THRESHOLD = 10 * 1024; // 10KB
|
|
57
|
+
class InstructionAnalyzer {
|
|
58
|
+
analyze(files) {
|
|
59
|
+
const findings = [];
|
|
60
|
+
const instructionFiles = files.filter((f) => f.type === 'agent_instructions');
|
|
61
|
+
for (const file of instructionFiles) {
|
|
62
|
+
findings.push(...this.checkPermissiveInstructions(file));
|
|
63
|
+
findings.push(...this.checkExfiltrationEnablement(file));
|
|
64
|
+
findings.push(...this.checkMissingSecurityBoundaries(file));
|
|
65
|
+
findings.push(...this.checkLargeAttackSurface(file));
|
|
66
|
+
}
|
|
67
|
+
return findings;
|
|
68
|
+
}
|
|
69
|
+
checkPermissiveInstructions(file) {
|
|
70
|
+
const findings = [];
|
|
71
|
+
const lines = file.content.split('\n');
|
|
72
|
+
for (let i = 0; i < lines.length; i++) {
|
|
73
|
+
const line = lines[i];
|
|
74
|
+
for (const { pattern, label } of PERMISSIVE_PATTERNS) {
|
|
75
|
+
if (pattern.test(line)) {
|
|
76
|
+
findings.push({
|
|
77
|
+
id: 'SEM-INST-001',
|
|
78
|
+
title: 'Overly permissive agent instruction',
|
|
79
|
+
description: `Found ${label} pattern in ${file.path}. This instructs the agent to bypass security controls.`,
|
|
80
|
+
rationale: 'Permissive instructions weaken agent security boundaries. If an attacker achieves prompt injection, these instructions make it easier to escalate — the agent is already told to bypass safety checks.',
|
|
81
|
+
category: 'instruction',
|
|
82
|
+
severity: 'high',
|
|
83
|
+
file: file.path,
|
|
84
|
+
line: i + 1,
|
|
85
|
+
recommendation: 'Replace permissive instructions with specific, scoped permissions. Instead of "always execute", specify which operations are allowed and under what conditions.',
|
|
86
|
+
layer: 2,
|
|
87
|
+
autoFixable: false,
|
|
88
|
+
});
|
|
89
|
+
break; // One finding per line
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return findings;
|
|
94
|
+
}
|
|
95
|
+
checkExfiltrationEnablement(file) {
|
|
96
|
+
const findings = [];
|
|
97
|
+
const lines = file.content.split('\n');
|
|
98
|
+
for (let i = 0; i < lines.length; i++) {
|
|
99
|
+
const line = lines[i];
|
|
100
|
+
for (const { pattern, label } of EXFILTRATION_PATTERNS) {
|
|
101
|
+
if (pattern.test(line)) {
|
|
102
|
+
findings.push({
|
|
103
|
+
id: 'SEM-INST-002',
|
|
104
|
+
title: 'Exfiltration-enabling instruction',
|
|
105
|
+
description: `Found ${label} in ${file.path}. This could enable data exfiltration by the agent.`,
|
|
106
|
+
rationale: 'Instructions that direct the agent to send data to external services can be exploited via prompt injection to exfiltrate sensitive data from the project.',
|
|
107
|
+
category: 'instruction',
|
|
108
|
+
severity: 'high',
|
|
109
|
+
file: file.path,
|
|
110
|
+
line: i + 1,
|
|
111
|
+
recommendation: 'Remove external URL references from agent instructions. If external communication is needed, scope it to specific trusted domains.',
|
|
112
|
+
layer: 2,
|
|
113
|
+
autoFixable: false,
|
|
114
|
+
});
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return findings;
|
|
120
|
+
}
|
|
121
|
+
checkMissingSecurityBoundaries(file) {
|
|
122
|
+
// Only flag if the file is non-trivial (>200 chars)
|
|
123
|
+
if (file.content.length < 200)
|
|
124
|
+
return [];
|
|
125
|
+
const hasSecurityTerms = SECURITY_TERMS.some((term) => term.test(file.content));
|
|
126
|
+
if (!hasSecurityTerms) {
|
|
127
|
+
return [
|
|
128
|
+
{
|
|
129
|
+
id: 'SEM-INST-003',
|
|
130
|
+
title: 'No security boundaries in agent instructions',
|
|
131
|
+
description: `${file.path} contains agent instructions but no security-related guidance. The agent has no explicit security constraints.`,
|
|
132
|
+
rationale: 'Without security boundaries, the agent relies on its default behavior which may be too permissive. Explicit security instructions help prevent prompt injection exploits.',
|
|
133
|
+
category: 'instruction',
|
|
134
|
+
severity: 'medium',
|
|
135
|
+
file: file.path,
|
|
136
|
+
recommendation: 'Add security guidance to the instruction file. Include: allowed/denied operations, file access scope, network restrictions, and how to handle sensitive data.',
|
|
137
|
+
layer: 2,
|
|
138
|
+
autoFixable: false,
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
return [];
|
|
143
|
+
}
|
|
144
|
+
checkLargeAttackSurface(file) {
|
|
145
|
+
const size = Buffer.byteLength(file.content, 'utf-8');
|
|
146
|
+
if (size > LARGE_INSTRUCTION_THRESHOLD) {
|
|
147
|
+
const sizeKb = (size / 1024).toFixed(1);
|
|
148
|
+
return [
|
|
149
|
+
{
|
|
150
|
+
id: 'SEM-INST-004',
|
|
151
|
+
title: 'Large agent instruction file',
|
|
152
|
+
description: `${file.path} is ${sizeKb}KB. Large instruction files increase the LLM context surface area for prompt injection.`,
|
|
153
|
+
rationale: 'Larger instruction files provide more context for an attacker to work with during prompt injection attacks. They also increase the chance of containing sensitive information.',
|
|
154
|
+
category: 'instruction',
|
|
155
|
+
severity: 'low',
|
|
156
|
+
file: file.path,
|
|
157
|
+
recommendation: 'Review the instruction file for unnecessary content. Keep security-critical instructions concise and focused.',
|
|
158
|
+
layer: 2,
|
|
159
|
+
autoFixable: false,
|
|
160
|
+
},
|
|
161
|
+
];
|
|
162
|
+
}
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.InstructionAnalyzer = InstructionAnalyzer;
|
|
167
|
+
//# sourceMappingURL=instruction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction.js","sourceRoot":"","sources":["../../../src/semantic/structural/instruction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep MCP Configuration Analysis (Layer 2)
|
|
3
|
+
*
|
|
4
|
+
* Parses MCP configs structurally and detects:
|
|
5
|
+
* - Overprivileged filesystem scope (/, /home, /Users)
|
|
6
|
+
* - Sandbox bypass flags (--no-sandbox, --privileged)
|
|
7
|
+
* - Secrets in args array (exposed to LLM)
|
|
8
|
+
* - Wildcard permissions
|
|
9
|
+
* - Attack chains (filesystem + shell + network = read-execute-exfiltrate)
|
|
10
|
+
* - Large attack surface (>5 servers)
|
|
11
|
+
*/
|
|
12
|
+
import type { SemanticFinding, AnalysisFile } from '../types';
|
|
13
|
+
export declare class McpConfigAnalyzer {
|
|
14
|
+
analyze(files: AnalysisFile[]): SemanticFinding[];
|
|
15
|
+
private checkOverprivilegedScope;
|
|
16
|
+
private checkSandboxBypass;
|
|
17
|
+
private checkSecretsInArgs;
|
|
18
|
+
private checkWildcardPermissions;
|
|
19
|
+
private checkAttackChains;
|
|
20
|
+
private findLineNumber;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=mcp-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/mcp-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAC;AA+D/E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;IA+DjD,OAAO,CAAC,wBAAwB;IAkChC,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,kBAAkB;IA2D1B,OAAO,CAAC,wBAAwB;IAmChC,OAAO,CAAC,iBAAiB;IAwDzB,OAAO,CAAC,cAAc;CAUvB"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Deep MCP Configuration Analysis (Layer 2)
|
|
4
|
+
*
|
|
5
|
+
* Parses MCP configs structurally and detects:
|
|
6
|
+
* - Overprivileged filesystem scope (/, /home, /Users)
|
|
7
|
+
* - Sandbox bypass flags (--no-sandbox, --privileged)
|
|
8
|
+
* - Secrets in args array (exposed to LLM)
|
|
9
|
+
* - Wildcard permissions
|
|
10
|
+
* - Attack chains (filesystem + shell + network = read-execute-exfiltrate)
|
|
11
|
+
* - Large attack surface (>5 servers)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.McpConfigAnalyzer = void 0;
|
|
15
|
+
/** Paths that indicate overprivileged filesystem scope */
|
|
16
|
+
const OVERPRIVILEGED_PATHS = [
|
|
17
|
+
{ pattern: /^\/$/, label: 'root filesystem (/)', severity: 'critical' },
|
|
18
|
+
{ pattern: /^\/home\/?$/, label: '/home directory', severity: 'critical' },
|
|
19
|
+
{ pattern: /^\/Users\/?$/, label: '/Users directory', severity: 'critical' },
|
|
20
|
+
{ pattern: /^\/etc\/?$/, label: '/etc directory', severity: 'high' },
|
|
21
|
+
{ pattern: /^\/var\/?$/, label: '/var directory', severity: 'high' },
|
|
22
|
+
{ pattern: /^~\/?$/, label: 'home directory (~)', severity: 'high' },
|
|
23
|
+
{ pattern: /^\/home\/[^/]+\/?$/, label: 'user home directory', severity: 'high' },
|
|
24
|
+
{ pattern: /^\/Users\/[^/]+\/?$/, label: 'user home directory', severity: 'high' },
|
|
25
|
+
];
|
|
26
|
+
/** Sandbox bypass flags */
|
|
27
|
+
const SANDBOX_BYPASS_FLAGS = [
|
|
28
|
+
'--no-sandbox',
|
|
29
|
+
'--disable-sandbox',
|
|
30
|
+
'--privileged',
|
|
31
|
+
'--disable-setuid-sandbox',
|
|
32
|
+
'--no-zygote',
|
|
33
|
+
];
|
|
34
|
+
/** Patterns in args that look like secrets */
|
|
35
|
+
const SECRET_ARG_PATTERNS = [
|
|
36
|
+
/sk-[a-zA-Z0-9_-]{20,}/,
|
|
37
|
+
/ghp_[a-zA-Z0-9]{36}/,
|
|
38
|
+
/github_pat_/,
|
|
39
|
+
/AKIA[0-9A-Z]{16}/,
|
|
40
|
+
/Bearer\s+[a-zA-Z0-9._-]{20,}/,
|
|
41
|
+
/xox[baprs]-/,
|
|
42
|
+
/AIza[0-9A-Za-z_-]{35}/,
|
|
43
|
+
];
|
|
44
|
+
/** Key-name pattern for secret args */
|
|
45
|
+
const SECRET_KEY_ARG = /^--(token|key|secret|password|api[-_]?key|auth|credential)$/i;
|
|
46
|
+
function classifyServer(name, config) {
|
|
47
|
+
const capabilities = [];
|
|
48
|
+
const lower = [name, config.command, ...(config.args || [])].join(' ').toLowerCase();
|
|
49
|
+
if (lower.includes('filesystem') || lower.includes('fs') || lower.includes('file')) {
|
|
50
|
+
capabilities.push('filesystem');
|
|
51
|
+
}
|
|
52
|
+
if (lower.includes('shell') || lower.includes('exec') || lower.includes('bash') || lower.includes('terminal') || lower.includes('command')) {
|
|
53
|
+
capabilities.push('shell');
|
|
54
|
+
}
|
|
55
|
+
if (lower.includes('fetch') || lower.includes('http') || lower.includes('request') || lower.includes('curl') || lower.includes('network') || lower.includes('web')) {
|
|
56
|
+
capabilities.push('network');
|
|
57
|
+
}
|
|
58
|
+
if (lower.includes('postgres') || lower.includes('mysql') || lower.includes('sqlite') || lower.includes('mongo') || lower.includes('redis') || lower.includes('database') || lower.includes('db')) {
|
|
59
|
+
capabilities.push('database');
|
|
60
|
+
}
|
|
61
|
+
if (lower.includes('browser') || lower.includes('puppeteer') || lower.includes('playwright') || lower.includes('chrome') || lower.includes('selenium')) {
|
|
62
|
+
capabilities.push('browser');
|
|
63
|
+
}
|
|
64
|
+
return capabilities;
|
|
65
|
+
}
|
|
66
|
+
class McpConfigAnalyzer {
|
|
67
|
+
analyze(files) {
|
|
68
|
+
const findings = [];
|
|
69
|
+
for (const file of files) {
|
|
70
|
+
if (file.type !== 'mcp_config' && file.type !== 'claude_settings')
|
|
71
|
+
continue;
|
|
72
|
+
let config;
|
|
73
|
+
try {
|
|
74
|
+
config = JSON.parse(file.content);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const servers = config.mcpServers || {};
|
|
80
|
+
const allCapabilities = new Map();
|
|
81
|
+
for (const [serverName, serverConfig] of Object.entries(servers)) {
|
|
82
|
+
if (!serverConfig || typeof serverConfig !== 'object')
|
|
83
|
+
continue;
|
|
84
|
+
// Track capabilities for attack chain detection
|
|
85
|
+
const caps = classifyServer(serverName, serverConfig);
|
|
86
|
+
allCapabilities.set(serverName, caps);
|
|
87
|
+
// Check overprivileged scope
|
|
88
|
+
findings.push(...this.checkOverprivilegedScope(serverName, serverConfig, file));
|
|
89
|
+
// Check sandbox bypass
|
|
90
|
+
findings.push(...this.checkSandboxBypass(serverName, serverConfig, file));
|
|
91
|
+
// Check secrets in args
|
|
92
|
+
findings.push(...this.checkSecretsInArgs(serverName, serverConfig, file));
|
|
93
|
+
// Check wildcard permissions
|
|
94
|
+
findings.push(...this.checkWildcardPermissions(serverName, serverConfig, file));
|
|
95
|
+
}
|
|
96
|
+
// Check attack chains across servers
|
|
97
|
+
findings.push(...this.checkAttackChains(allCapabilities, file));
|
|
98
|
+
// Check server count
|
|
99
|
+
const serverCount = Object.keys(servers).length;
|
|
100
|
+
if (serverCount > 5) {
|
|
101
|
+
findings.push({
|
|
102
|
+
id: 'SEM-MCP-006',
|
|
103
|
+
title: 'Large MCP attack surface',
|
|
104
|
+
description: `${serverCount} MCP servers configured in ${file.path}. Each server expands the agent's capabilities and attack surface.`,
|
|
105
|
+
rationale: 'More servers mean more capabilities the agent can be manipulated into using. Review whether all servers are necessary.',
|
|
106
|
+
category: 'mcp-config',
|
|
107
|
+
severity: 'info',
|
|
108
|
+
file: file.path,
|
|
109
|
+
recommendation: 'Review each MCP server and remove any that are not actively needed.',
|
|
110
|
+
layer: 2,
|
|
111
|
+
autoFixable: false,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return findings;
|
|
116
|
+
}
|
|
117
|
+
checkOverprivilegedScope(serverName, config, file) {
|
|
118
|
+
const findings = [];
|
|
119
|
+
const args = config.args || [];
|
|
120
|
+
for (const arg of args) {
|
|
121
|
+
for (const { pattern, label, severity } of OVERPRIVILEGED_PATHS) {
|
|
122
|
+
if (pattern.test(arg)) {
|
|
123
|
+
const lineNum = this.findLineNumber(file.content, arg);
|
|
124
|
+
findings.push({
|
|
125
|
+
id: 'SEM-MCP-001',
|
|
126
|
+
title: 'Overprivileged MCP server scope',
|
|
127
|
+
description: `MCP server "${serverName}" has access to ${label}. This grants the agent read/write access to the entire ${label}.`,
|
|
128
|
+
rationale: 'Overprivileged filesystem access allows the agent (or an attacker via prompt injection) to read sensitive files like SSH keys, credentials, and system configs.',
|
|
129
|
+
category: 'mcp-config',
|
|
130
|
+
severity,
|
|
131
|
+
file: file.path,
|
|
132
|
+
line: lineNum,
|
|
133
|
+
recommendation: `Scope "${serverName}" to the project directory: replace "${arg}" with "./" or a specific subdirectory.`,
|
|
134
|
+
layer: 2,
|
|
135
|
+
autoFixable: false,
|
|
136
|
+
});
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return findings;
|
|
142
|
+
}
|
|
143
|
+
checkSandboxBypass(serverName, config, file) {
|
|
144
|
+
const findings = [];
|
|
145
|
+
const args = config.args || [];
|
|
146
|
+
for (const arg of args) {
|
|
147
|
+
if (SANDBOX_BYPASS_FLAGS.some((flag) => arg.includes(flag))) {
|
|
148
|
+
const lineNum = this.findLineNumber(file.content, arg);
|
|
149
|
+
findings.push({
|
|
150
|
+
id: 'SEM-MCP-002',
|
|
151
|
+
title: 'Sandbox bypass in MCP server',
|
|
152
|
+
description: `MCP server "${serverName}" uses sandbox bypass flag "${arg}" in ${file.path}.`,
|
|
153
|
+
rationale: 'Sandbox bypass flags disable security boundaries that prevent the agent from accessing system resources. This significantly increases the blast radius of any compromise.',
|
|
154
|
+
category: 'mcp-config',
|
|
155
|
+
severity: 'high',
|
|
156
|
+
file: file.path,
|
|
157
|
+
line: lineNum,
|
|
158
|
+
recommendation: `Remove the "${arg}" flag from "${serverName}" or document why sandbox bypass is required.`,
|
|
159
|
+
layer: 2,
|
|
160
|
+
autoFixable: false,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return findings;
|
|
165
|
+
}
|
|
166
|
+
checkSecretsInArgs(serverName, config, file) {
|
|
167
|
+
const findings = [];
|
|
168
|
+
const args = config.args || [];
|
|
169
|
+
for (let i = 0; i < args.length; i++) {
|
|
170
|
+
const arg = args[i];
|
|
171
|
+
// Check for known secret patterns directly in args
|
|
172
|
+
for (const pattern of SECRET_ARG_PATTERNS) {
|
|
173
|
+
if (pattern.test(arg)) {
|
|
174
|
+
const lineNum = this.findLineNumber(file.content, arg.substring(0, 20));
|
|
175
|
+
findings.push({
|
|
176
|
+
id: 'SEM-MCP-003',
|
|
177
|
+
title: 'Secret exposed in MCP server args',
|
|
178
|
+
description: `MCP server "${serverName}" has a credential-like value in its args array in ${file.path}. Args are visible to the LLM.`,
|
|
179
|
+
rationale: 'MCP server args are passed on the command line and visible to the LLM in tool descriptions. Secrets in args can be extracted via prompt injection. Use env block instead.',
|
|
180
|
+
category: 'mcp-config',
|
|
181
|
+
severity: 'critical',
|
|
182
|
+
file: file.path,
|
|
183
|
+
line: lineNum,
|
|
184
|
+
recommendation: `Move the secret from args to the env block: "env": { "API_KEY": "..." } — or better, reference an environment variable.`,
|
|
185
|
+
layer: 2,
|
|
186
|
+
autoFixable: false,
|
|
187
|
+
});
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check for --secret=value or --token value patterns
|
|
192
|
+
if (SECRET_KEY_ARG.test(arg) && i + 1 < args.length) {
|
|
193
|
+
const nextArg = args[i + 1];
|
|
194
|
+
if (nextArg && nextArg.length >= 8 && !nextArg.startsWith('-')) {
|
|
195
|
+
const lineNum = this.findLineNumber(file.content, arg);
|
|
196
|
+
findings.push({
|
|
197
|
+
id: 'SEM-MCP-003',
|
|
198
|
+
title: 'Secret exposed in MCP server args',
|
|
199
|
+
description: `MCP server "${serverName}" passes "${arg}" as a command-line argument in ${file.path}.`,
|
|
200
|
+
rationale: 'Command-line arguments are visible in process listings and to the LLM. Use environment variables instead.',
|
|
201
|
+
category: 'mcp-config',
|
|
202
|
+
severity: 'high',
|
|
203
|
+
file: file.path,
|
|
204
|
+
line: lineNum,
|
|
205
|
+
recommendation: `Move "${arg}" value to the env block of the MCP server config.`,
|
|
206
|
+
layer: 2,
|
|
207
|
+
autoFixable: false,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return findings;
|
|
213
|
+
}
|
|
214
|
+
checkWildcardPermissions(serverName, config, file) {
|
|
215
|
+
const findings = [];
|
|
216
|
+
const checkWildcard = (field, fieldName) => {
|
|
217
|
+
if (!field)
|
|
218
|
+
return;
|
|
219
|
+
if (field.includes('*') || field.some((v) => v === '*')) {
|
|
220
|
+
findings.push({
|
|
221
|
+
id: 'SEM-MCP-004',
|
|
222
|
+
title: 'Wildcard permission in MCP server',
|
|
223
|
+
description: `MCP server "${serverName}" has ${fieldName}: ["*"] in ${file.path}, granting unrestricted access.`,
|
|
224
|
+
rationale: 'Wildcard permissions disable capability boundaries. The agent (or an attacker) can use any tool or command without restriction.',
|
|
225
|
+
category: 'mcp-config',
|
|
226
|
+
severity: 'high',
|
|
227
|
+
file: file.path,
|
|
228
|
+
recommendation: `Replace wildcard with specific allowed ${fieldName}: ["tool1", "tool2"].`,
|
|
229
|
+
layer: 2,
|
|
230
|
+
autoFixable: false,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
checkWildcard(config.allowedTools, 'allowedTools');
|
|
235
|
+
checkWildcard(config.allowedCommands, 'allowedCommands');
|
|
236
|
+
return findings;
|
|
237
|
+
}
|
|
238
|
+
checkAttackChains(allCapabilities, file) {
|
|
239
|
+
const findings = [];
|
|
240
|
+
const allCaps = new Set();
|
|
241
|
+
for (const caps of allCapabilities.values()) {
|
|
242
|
+
for (const cap of caps) {
|
|
243
|
+
allCaps.add(cap);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Attack chain: filesystem + shell + network = read-execute-exfiltrate
|
|
247
|
+
if (allCaps.has('filesystem') && allCaps.has('shell') && allCaps.has('network')) {
|
|
248
|
+
const fsServers = [...allCapabilities.entries()].filter(([, c]) => c.includes('filesystem')).map(([n]) => n);
|
|
249
|
+
const shellServers = [...allCapabilities.entries()].filter(([, c]) => c.includes('shell')).map(([n]) => n);
|
|
250
|
+
const netServers = [...allCapabilities.entries()].filter(([, c]) => c.includes('network')).map(([n]) => n);
|
|
251
|
+
findings.push({
|
|
252
|
+
id: 'SEM-MCP-005',
|
|
253
|
+
title: 'MCP attack chain: read-execute-exfiltrate',
|
|
254
|
+
description: `MCP servers in ${file.path} form a complete attack chain: filesystem (${fsServers.join(', ')}) + shell (${shellServers.join(', ')}) + network (${netServers.join(', ')}). An attacker could read files, execute code, and exfiltrate data.`,
|
|
255
|
+
rationale: 'When filesystem, shell, and network capabilities are all available, a prompt injection attack can read sensitive files, execute arbitrary code, and send data to an external server. This is the most dangerous MCP configuration pattern.',
|
|
256
|
+
category: 'mcp-config',
|
|
257
|
+
severity: 'high',
|
|
258
|
+
file: file.path,
|
|
259
|
+
recommendation: 'Remove at least one capability from the chain. If all three are needed, add strict scope limits to each server.',
|
|
260
|
+
layer: 2,
|
|
261
|
+
autoFixable: false,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// Attack chain: filesystem + network (no shell needed for data exfiltration)
|
|
265
|
+
if (allCaps.has('filesystem') && allCaps.has('network') && !allCaps.has('shell')) {
|
|
266
|
+
findings.push({
|
|
267
|
+
id: 'SEM-MCP-005',
|
|
268
|
+
title: 'MCP attack chain: read-exfiltrate',
|
|
269
|
+
description: `MCP servers in ${file.path} enable a read-exfiltrate chain: filesystem access + network access. An attacker could read files and send data externally.`,
|
|
270
|
+
rationale: 'Even without shell access, filesystem + network capabilities allow reading sensitive files and exfiltrating them via HTTP requests.',
|
|
271
|
+
category: 'mcp-config',
|
|
272
|
+
severity: 'medium',
|
|
273
|
+
file: file.path,
|
|
274
|
+
recommendation: 'Scope filesystem access to the project directory and restrict network access to specific domains.',
|
|
275
|
+
layer: 2,
|
|
276
|
+
autoFixable: false,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
return findings;
|
|
280
|
+
}
|
|
281
|
+
findLineNumber(content, searchStr) {
|
|
282
|
+
if (!searchStr)
|
|
283
|
+
return undefined;
|
|
284
|
+
const lines = content.split('\n');
|
|
285
|
+
for (let i = 0; i < lines.length; i++) {
|
|
286
|
+
if (lines[i].includes(searchStr)) {
|
|
287
|
+
return i + 1;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.McpConfigAnalyzer = McpConfigAnalyzer;
|
|
294
|
+
//# sourceMappingURL=mcp-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../../src/semantic/structural/mcp-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission Scope Analysis (Layer 2)
|
|
3
|
+
*
|
|
4
|
+
* Parses .claude/settings.json and similar config files to detect:
|
|
5
|
+
* - Wildcard permissions (allow: ["*"])
|
|
6
|
+
* - Bash tool with no restrictions
|
|
7
|
+
* - Write/Edit granted outside project scope
|
|
8
|
+
*/
|
|
9
|
+
import type { SemanticFinding, AnalysisFile } from '../types';
|
|
10
|
+
export declare class PermissionModelAnalyzer {
|
|
11
|
+
analyze(files: AnalysisFile[]): SemanticFinding[];
|
|
12
|
+
private checkWildcardPermissions;
|
|
13
|
+
private checkBashPermissions;
|
|
14
|
+
private checkWriteScope;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=permission-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-model.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/permission-model.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAkB,MAAM,UAAU,CAAC;AAE9E,qBAAa,uBAAuB;IAClC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;IAqBjD,OAAO,CAAC,wBAAwB;IA6BhC,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,eAAe;CA8CxB"}
|