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,74 @@
|
|
|
1
|
+
import type { ARPEvent, EnforcementResult } from '../../arp';
|
|
2
|
+
/** Annotation metadata for test cases */
|
|
3
|
+
export interface TestAnnotation {
|
|
4
|
+
/** Is this scenario an actual attack? */
|
|
5
|
+
isAttack: boolean;
|
|
6
|
+
/** MITRE ATLAS technique ID */
|
|
7
|
+
atlasId?: string;
|
|
8
|
+
/** OWASP Agentic Top 10 category */
|
|
9
|
+
owaspId?: string;
|
|
10
|
+
/** Whether ARP should detect this */
|
|
11
|
+
expectedDetection: boolean;
|
|
12
|
+
/** Expected minimum severity if detected */
|
|
13
|
+
expectedSeverity?: 'info' | 'low' | 'medium' | 'high' | 'critical';
|
|
14
|
+
/** Timestamp when the attack was initiated */
|
|
15
|
+
attackTimestamp?: number;
|
|
16
|
+
}
|
|
17
|
+
/** Collected test result with timing info */
|
|
18
|
+
export interface TestResult {
|
|
19
|
+
testId: string;
|
|
20
|
+
annotation: TestAnnotation;
|
|
21
|
+
detected: boolean;
|
|
22
|
+
detectionTimeMs?: number;
|
|
23
|
+
events: ARPEvent[];
|
|
24
|
+
enforcements: EnforcementResult[];
|
|
25
|
+
}
|
|
26
|
+
/** Suite-level metrics */
|
|
27
|
+
export interface SuiteMetrics {
|
|
28
|
+
totalTests: number;
|
|
29
|
+
attacks: number;
|
|
30
|
+
benign: number;
|
|
31
|
+
truePositives: number;
|
|
32
|
+
falsePositives: number;
|
|
33
|
+
trueNegatives: number;
|
|
34
|
+
falseNegatives: number;
|
|
35
|
+
detectionRate: number;
|
|
36
|
+
falsePositiveRate: number;
|
|
37
|
+
meanDetectionTimeMs: number;
|
|
38
|
+
p95DetectionTimeMs: number;
|
|
39
|
+
}
|
|
40
|
+
/** ARP wrapper configuration for tests */
|
|
41
|
+
export interface LabConfig {
|
|
42
|
+
monitors?: {
|
|
43
|
+
process?: boolean;
|
|
44
|
+
network?: boolean;
|
|
45
|
+
filesystem?: boolean;
|
|
46
|
+
};
|
|
47
|
+
rules?: import('../../arp').AlertRule[];
|
|
48
|
+
intelligence?: {
|
|
49
|
+
enabled?: boolean;
|
|
50
|
+
};
|
|
51
|
+
/** Temp data dir (auto-created per test) */
|
|
52
|
+
dataDir?: string;
|
|
53
|
+
/** Filesystem paths to watch (for real FilesystemMonitor) */
|
|
54
|
+
filesystemWatchPaths?: string[];
|
|
55
|
+
/** Filesystem allowed paths (for real FilesystemMonitor) */
|
|
56
|
+
filesystemAllowedPaths?: string[];
|
|
57
|
+
/** Network allowed hosts (for real NetworkMonitor) */
|
|
58
|
+
networkAllowedHosts?: string[];
|
|
59
|
+
/** Process monitor poll interval in ms */
|
|
60
|
+
processIntervalMs?: number;
|
|
61
|
+
/** Network monitor poll interval in ms */
|
|
62
|
+
networkIntervalMs?: number;
|
|
63
|
+
/** Application-level interceptors (zero-latency hooks) */
|
|
64
|
+
interceptors?: {
|
|
65
|
+
process?: boolean;
|
|
66
|
+
network?: boolean;
|
|
67
|
+
filesystem?: boolean;
|
|
68
|
+
};
|
|
69
|
+
/** Interceptor network allowed hosts */
|
|
70
|
+
interceptorNetworkAllowedHosts?: string[];
|
|
71
|
+
/** Interceptor filesystem allowed paths */
|
|
72
|
+
interceptorFilesystemAllowedPaths?: string[];
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/oasb/harness/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE7D,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACnE,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,cAAc,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED,0BAA0B;AAC1B,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,0CAA0C;AAC1C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,WAAW,EAAE,SAAS,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,4DAA4D;IAC5D,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,wCAAwC;IACxC,8BAA8B,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1C,2CAA2C;IAC3C,iCAAiC,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/oasb/harness/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export declare const VERSION = "0.1.0";
|
|
2
|
+
import type { AIMCore } from '@opena2a/aim-core';
|
|
3
|
+
export type Severity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
4
|
+
export interface Finding {
|
|
5
|
+
/** Unique finding ID (e.g., "CRED-001", "SIGN-002") */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Human-readable title */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Detailed description */
|
|
10
|
+
description: string;
|
|
11
|
+
/** Severity level */
|
|
12
|
+
severity: Severity;
|
|
13
|
+
/** File path where the finding was detected (if applicable) */
|
|
14
|
+
filePath?: string;
|
|
15
|
+
/** Line number (if applicable) */
|
|
16
|
+
line?: number;
|
|
17
|
+
/** OASB control ID (e.g., "1.1", "2.3") */
|
|
18
|
+
oasbControl?: string;
|
|
19
|
+
/** Whether this finding can be auto-fixed */
|
|
20
|
+
autoFixable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface FixOptions {
|
|
23
|
+
/** Run in dry-run mode (show what would change without applying) */
|
|
24
|
+
dryRun?: boolean;
|
|
25
|
+
/** Path to the agent/bot directory */
|
|
26
|
+
agentDir?: string;
|
|
27
|
+
/** Interactive mode — prompt before each fix */
|
|
28
|
+
interactive?: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface Remediation {
|
|
31
|
+
/** Finding ID that was remediated */
|
|
32
|
+
findingId: string;
|
|
33
|
+
/** What was done */
|
|
34
|
+
description: string;
|
|
35
|
+
/** Files modified */
|
|
36
|
+
filesModified: string[];
|
|
37
|
+
/** Whether a rollback is available */
|
|
38
|
+
rollbackAvailable: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface PluginStatus {
|
|
41
|
+
/** Plugin name */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Plugin version */
|
|
44
|
+
version: string;
|
|
45
|
+
/** Whether the plugin is active and monitoring */
|
|
46
|
+
active: boolean;
|
|
47
|
+
/** Current findings count */
|
|
48
|
+
findingsCount: number;
|
|
49
|
+
/** Last scan timestamp */
|
|
50
|
+
lastScan?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface PluginMetadata {
|
|
53
|
+
/** Plugin npm package name */
|
|
54
|
+
packageName: string;
|
|
55
|
+
/** Human-readable display name */
|
|
56
|
+
displayName: string;
|
|
57
|
+
/** Short description */
|
|
58
|
+
description: string;
|
|
59
|
+
/** Plugin version */
|
|
60
|
+
version: string;
|
|
61
|
+
/** Finding IDs this plugin addresses */
|
|
62
|
+
findings: string[];
|
|
63
|
+
/** Score improvement when all findings are fixed */
|
|
64
|
+
scoreImprovement: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The contract every OpenA2A security plugin implements.
|
|
68
|
+
* Each plugin works standalone (no aim-core required).
|
|
69
|
+
* When aim-core is provided, plugins gain identity-aware audit logging and capability checks.
|
|
70
|
+
*/
|
|
71
|
+
export interface OpenA2APlugin {
|
|
72
|
+
/** Plugin metadata */
|
|
73
|
+
readonly metadata: PluginMetadata;
|
|
74
|
+
/** Initialize the plugin, optionally with aim-core integration */
|
|
75
|
+
init(options?: PluginInitOptions): Promise<void>;
|
|
76
|
+
/** Scan the agent directory and return findings */
|
|
77
|
+
scan(agentDir: string): Promise<Finding[]>;
|
|
78
|
+
/** Fix findings in the agent directory */
|
|
79
|
+
fix(agentDir: string, options?: FixOptions): Promise<Remediation[]>;
|
|
80
|
+
/** Get current plugin status */
|
|
81
|
+
status(): Promise<PluginStatus>;
|
|
82
|
+
/** Start background monitoring (if supported) */
|
|
83
|
+
monitor?(): Promise<void>;
|
|
84
|
+
/** Stop background monitoring and clean up */
|
|
85
|
+
stop?(): Promise<void>;
|
|
86
|
+
/** Uninstall the plugin and revert changes */
|
|
87
|
+
uninstall?(agentDir: string): Promise<void>;
|
|
88
|
+
}
|
|
89
|
+
export interface PluginInitOptions {
|
|
90
|
+
/** Optional aim-core instance for identity-aware features */
|
|
91
|
+
aimCore?: AIMCore;
|
|
92
|
+
/** Plugin-specific configuration */
|
|
93
|
+
config?: Record<string, unknown>;
|
|
94
|
+
}
|
|
95
|
+
export interface PluginRegistryEntry {
|
|
96
|
+
/** Plugin metadata */
|
|
97
|
+
metadata: PluginMetadata;
|
|
98
|
+
/** Factory function to create the plugin */
|
|
99
|
+
create: () => OpenA2APlugin;
|
|
100
|
+
}
|
|
101
|
+
/** Register a plugin with the global registry. Throws if already registered. */
|
|
102
|
+
export declare function registerPlugin(entry: PluginRegistryEntry): void;
|
|
103
|
+
/** Get a registered plugin by package name */
|
|
104
|
+
export declare function getPlugin(packageName: string): PluginRegistryEntry | undefined;
|
|
105
|
+
/** List all registered plugins */
|
|
106
|
+
export declare function listPlugins(): PluginRegistryEntry[];
|
|
107
|
+
/** Clear the registry (for testing) */
|
|
108
|
+
export declare function clearRegistry(): void;
|
|
109
|
+
//# sourceMappingURL=core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/plugins/core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VERSION = void 0;
|
|
4
|
+
exports.registerPlugin = registerPlugin;
|
|
5
|
+
exports.getPlugin = getPlugin;
|
|
6
|
+
exports.listPlugins = listPlugins;
|
|
7
|
+
exports.clearRegistry = clearRegistry;
|
|
8
|
+
exports.VERSION = '0.1.0';
|
|
9
|
+
const registry = new Map();
|
|
10
|
+
/** Register a plugin with the global registry. Throws if already registered. */
|
|
11
|
+
function registerPlugin(entry) {
|
|
12
|
+
const key = entry.metadata.packageName;
|
|
13
|
+
if (registry.has(key)) {
|
|
14
|
+
throw new Error(`Plugin "${key}" is already registered. Use clearRegistry() first to re-register.`);
|
|
15
|
+
}
|
|
16
|
+
registry.set(key, entry);
|
|
17
|
+
}
|
|
18
|
+
/** Get a registered plugin by package name */
|
|
19
|
+
function getPlugin(packageName) {
|
|
20
|
+
return registry.get(packageName);
|
|
21
|
+
}
|
|
22
|
+
/** List all registered plugins */
|
|
23
|
+
function listPlugins() {
|
|
24
|
+
return Array.from(registry.values());
|
|
25
|
+
}
|
|
26
|
+
/** Clear the registry (for testing) */
|
|
27
|
+
function clearRegistry() {
|
|
28
|
+
registry.clear();
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/plugins/core.ts"],"names":[],"mappings":";;;AA6HA,wCAMC;AAGD,8BAEC;AAGD,kCAEC;AAGD,sCAEC;AAlJY,QAAA,OAAO,GAAG,OAAO,CAAC;AA0H/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExD,gFAAgF;AAChF,SAAgB,cAAc,CAAC,KAA0B;IACvD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IACvC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,oEAAoE,CAAC,CAAC;IACtG,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,8CAA8C;AAC9C,SAAgB,SAAS,CAAC,WAAmB;IAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,kCAAkC;AAClC,SAAgB,WAAW;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,uCAAuC;AACvC,SAAgB,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const VERSION = "0.1.0";
|
|
2
|
+
import type { OpenA2APlugin, PluginMetadata, PluginStatus, Finding, Remediation, FixOptions, PluginInitOptions } from './core';
|
|
3
|
+
export interface SecretEntry {
|
|
4
|
+
path: string;
|
|
5
|
+
allowedSkills: string[];
|
|
6
|
+
backend: 'local' | 'env';
|
|
7
|
+
}
|
|
8
|
+
export interface CredVaultConfig {
|
|
9
|
+
dataDir?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const metadata: PluginMetadata;
|
|
12
|
+
export declare class CredVaultPlugin implements OpenA2APlugin {
|
|
13
|
+
readonly metadata: PluginMetadata;
|
|
14
|
+
private aimCore?;
|
|
15
|
+
init(options?: PluginInitOptions): Promise<void>;
|
|
16
|
+
scan(agentDir: string): Promise<Finding[]>;
|
|
17
|
+
fix(agentDir: string, options?: FixOptions): Promise<Remediation[]>;
|
|
18
|
+
status(): Promise<PluginStatus>;
|
|
19
|
+
uninstall(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export declare function createPlugin(): CredVaultPlugin;
|
|
22
|
+
//# sourceMappingURL=credvault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credvault.d.ts","sourceRoot":"","sources":["../../src/plugins/credvault.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,OAAO,EACP,WAAW,EACX,UAAU,EACV,iBAAiB,EAClB,MAAM,QAAQ,CAAC;AAyChB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyND,eAAO,MAAM,QAAQ,EAAE,cAOtB,CAAC;AAEF,qBAAa,eAAgB,YAAW,aAAa;IACnD,QAAQ,CAAC,QAAQ,iBAAY;IAC7B,OAAO,CAAC,OAAO,CAAC,CAAU;IAEpB,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA+B1C,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmFnE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAS/B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC;AAED,wBAAgB,YAAY,IAAI,eAAe,CAE9C"}
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CredVaultPlugin = exports.metadata = exports.VERSION = void 0;
|
|
37
|
+
exports.createPlugin = createPlugin;
|
|
38
|
+
exports.VERSION = '0.1.0';
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const crypto = __importStar(require("crypto"));
|
|
42
|
+
const CREDENTIAL_PATTERNS = [
|
|
43
|
+
{ name: 'Anthropic API Key', regex: /sk-ant-api\d{2}-[a-zA-Z0-9_-]{20,}/ },
|
|
44
|
+
{ name: 'OpenAI API Key (project)', regex: /sk-proj-[a-zA-Z0-9]{20,}/ },
|
|
45
|
+
{ name: 'OpenAI API Key (legacy)', regex: /sk-[a-zA-Z0-9]{48,}/ },
|
|
46
|
+
{ name: 'AWS Access Key', regex: /AKIA[0-9A-Z]{16}/ },
|
|
47
|
+
{ name: 'GitHub Token (fine-grained)', regex: /ghp_[a-zA-Z0-9]{36}/ },
|
|
48
|
+
{ name: 'GitHub PAT (new)', regex: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/ },
|
|
49
|
+
{ name: 'Slack Token', regex: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}/ },
|
|
50
|
+
{ name: 'Google API Key', regex: /AIza[0-9A-Za-z_-]{35}/ },
|
|
51
|
+
{ name: 'Stripe Live Key', regex: /sk_live_[0-9a-zA-Z]{24,}/ },
|
|
52
|
+
{ name: 'SendGrid Key', regex: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/ },
|
|
53
|
+
];
|
|
54
|
+
const CONFIG_FILES = [
|
|
55
|
+
'config.json', 'config.yaml', 'config.yml',
|
|
56
|
+
'.env', '.env.local',
|
|
57
|
+
'package.json', 'mcp.json',
|
|
58
|
+
'CLAUDE.md',
|
|
59
|
+
'.openclaw/config.json', '.moltbot/config.json',
|
|
60
|
+
'openclaw.json', 'moltbot.json',
|
|
61
|
+
'.curse/mcp.json', '.vscode/mcp.json',
|
|
62
|
+
'.claude/settings.json',
|
|
63
|
+
];
|
|
64
|
+
const KEY_FILE_EXTENSIONS = ['.key', '.pem', '.p12', '.pfx'];
|
|
65
|
+
// --- Encrypted Store ---
|
|
66
|
+
const STORE_FILE = 'secrets.enc';
|
|
67
|
+
const STORE_META_FILE = 'secrets.meta.json';
|
|
68
|
+
function getStoreDir(agentDir) {
|
|
69
|
+
return path.join(agentDir, '.opena2a', 'credvault');
|
|
70
|
+
}
|
|
71
|
+
function initStore(agentDir) {
|
|
72
|
+
const storeDir = getStoreDir(agentDir);
|
|
73
|
+
fs.mkdirSync(storeDir, { recursive: true });
|
|
74
|
+
const metaPath = path.join(storeDir, STORE_META_FILE);
|
|
75
|
+
if (!fs.existsSync(metaPath)) {
|
|
76
|
+
const meta = { version: '1', entries: {} };
|
|
77
|
+
fs.writeFileSync(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
const storePath = path.join(storeDir, STORE_FILE);
|
|
80
|
+
if (!fs.existsSync(storePath)) {
|
|
81
|
+
// Generate encryption key and create empty store
|
|
82
|
+
const key = crypto.randomBytes(32);
|
|
83
|
+
const iv = crypto.randomBytes(12); // 12 bytes for GCM
|
|
84
|
+
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
|
|
85
|
+
const encrypted = Buffer.concat([cipher.update('{}', 'utf-8'), cipher.final()]);
|
|
86
|
+
const authTag = cipher.getAuthTag();
|
|
87
|
+
// Store key alongside (in production, this would use OS keychain)
|
|
88
|
+
fs.writeFileSync(path.join(storeDir, 'store.key'), key.toString('hex'), 'utf-8');
|
|
89
|
+
// Format: iv:authTag:ciphertext (all hex)
|
|
90
|
+
fs.writeFileSync(storePath, iv.toString('hex') + ':' + authTag.toString('hex') + ':' + encrypted.toString('hex'), 'utf-8');
|
|
91
|
+
// Restrict key file permissions (owner read/write only)
|
|
92
|
+
try {
|
|
93
|
+
fs.chmodSync(path.join(storeDir, 'store.key'), 0o600);
|
|
94
|
+
}
|
|
95
|
+
catch { /* Windows */ }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// --- Scan helpers ---
|
|
99
|
+
function scanFileForCredentials(filePath, agentDir) {
|
|
100
|
+
const findings = [];
|
|
101
|
+
const maxSize = 10 * 1024 * 1024; // 10MB
|
|
102
|
+
try {
|
|
103
|
+
const stat = fs.statSync(filePath);
|
|
104
|
+
if (stat.size > maxSize)
|
|
105
|
+
return findings;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return findings;
|
|
109
|
+
}
|
|
110
|
+
let content;
|
|
111
|
+
try {
|
|
112
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return findings;
|
|
116
|
+
}
|
|
117
|
+
const relativePath = path.relative(agentDir, filePath);
|
|
118
|
+
const lines = content.split('\n');
|
|
119
|
+
for (let i = 0; i < lines.length; i++) {
|
|
120
|
+
const line = lines[i];
|
|
121
|
+
if (line.length > 4096)
|
|
122
|
+
continue; // Skip long lines to prevent ReDoS
|
|
123
|
+
for (const pattern of CREDENTIAL_PATTERNS) {
|
|
124
|
+
if (pattern.regex.test(line)) {
|
|
125
|
+
findings.push({
|
|
126
|
+
id: 'CRED-001',
|
|
127
|
+
title: `Exposed ${pattern.name}`,
|
|
128
|
+
description: `${pattern.name} found in ${relativePath} at line ${i + 1}. Move to environment variable or secrets manager.`,
|
|
129
|
+
severity: 'critical',
|
|
130
|
+
filePath: relativePath,
|
|
131
|
+
line: i + 1,
|
|
132
|
+
oasbControl: '1.1',
|
|
133
|
+
autoFixable: true,
|
|
134
|
+
});
|
|
135
|
+
break; // One finding per line
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return findings;
|
|
140
|
+
}
|
|
141
|
+
function scanForKeyFiles(agentDir) {
|
|
142
|
+
const findings = [];
|
|
143
|
+
try {
|
|
144
|
+
const entries = fs.readdirSync(agentDir);
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
const ext = path.extname(entry).toLowerCase();
|
|
147
|
+
if (KEY_FILE_EXTENSIONS.includes(ext)) {
|
|
148
|
+
findings.push({
|
|
149
|
+
id: 'CRED-002',
|
|
150
|
+
title: 'Private key file in project root',
|
|
151
|
+
description: `Private key file "${entry}" found in project root. Move to a secure location outside the project.`,
|
|
152
|
+
severity: 'high',
|
|
153
|
+
filePath: entry,
|
|
154
|
+
autoFixable: false,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Directory not readable
|
|
161
|
+
}
|
|
162
|
+
return findings;
|
|
163
|
+
}
|
|
164
|
+
function scanForJwtSecrets(agentDir) {
|
|
165
|
+
const findings = [];
|
|
166
|
+
const configFiles = ['config.json', 'config.yaml', 'config.yml', '.openclaw/config.json', '.moltbot/config.json'];
|
|
167
|
+
for (const file of configFiles) {
|
|
168
|
+
const filePath = path.join(agentDir, file);
|
|
169
|
+
if (!fs.existsSync(filePath))
|
|
170
|
+
continue;
|
|
171
|
+
try {
|
|
172
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
173
|
+
// Look for JWT secret patterns
|
|
174
|
+
if (/jwt[_-]?secret/i.test(content) || /token[_-]?secret/i.test(content)) {
|
|
175
|
+
findings.push({
|
|
176
|
+
id: 'CRED-004',
|
|
177
|
+
title: 'JWT secret in configuration',
|
|
178
|
+
description: `JWT or token secret found in ${file}. Move to environment variable.`,
|
|
179
|
+
severity: 'critical',
|
|
180
|
+
filePath: file,
|
|
181
|
+
autoFixable: true,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
// File not readable
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return findings;
|
|
190
|
+
}
|
|
191
|
+
// --- Fix helpers ---
|
|
192
|
+
function fixCredentialsInFile(filePath, agentDir) {
|
|
193
|
+
const modified = [];
|
|
194
|
+
try {
|
|
195
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
196
|
+
let changed = false;
|
|
197
|
+
for (const pattern of CREDENTIAL_PATTERNS) {
|
|
198
|
+
if (pattern.regex.test(content)) {
|
|
199
|
+
// Generate env var name from the credential type
|
|
200
|
+
const envName = pattern.name
|
|
201
|
+
.toUpperCase()
|
|
202
|
+
.replace(/[^A-Z0-9]/g, '_')
|
|
203
|
+
.replace(/_+/g, '_');
|
|
204
|
+
content = content.replace(pattern.regex, `\${${envName}}`);
|
|
205
|
+
changed = true;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (changed) {
|
|
209
|
+
// Atomic write: write to temp file then rename to prevent corruption on crash
|
|
210
|
+
const tmpPath = filePath + '.tmp.' + process.pid;
|
|
211
|
+
fs.writeFileSync(tmpPath, content, 'utf-8');
|
|
212
|
+
fs.renameSync(tmpPath, filePath);
|
|
213
|
+
modified.push(path.relative(agentDir, filePath));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// File not writable
|
|
218
|
+
}
|
|
219
|
+
return modified;
|
|
220
|
+
}
|
|
221
|
+
function createEnvExample(agentDir, findings) {
|
|
222
|
+
const envVars = new Set();
|
|
223
|
+
for (const finding of findings) {
|
|
224
|
+
if (finding.id === 'CRED-001') {
|
|
225
|
+
// Extract credential type from title
|
|
226
|
+
const match = finding.title.match(/Exposed (.+)/);
|
|
227
|
+
if (match) {
|
|
228
|
+
const envName = match[1]
|
|
229
|
+
.toUpperCase()
|
|
230
|
+
.replace(/[^A-Z0-9]/g, '_')
|
|
231
|
+
.replace(/_+/g, '_');
|
|
232
|
+
envVars.add(envName);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (envVars.size === 0)
|
|
237
|
+
return null;
|
|
238
|
+
const envExamplePath = path.join(agentDir, '.env.example');
|
|
239
|
+
const lines = ['# Required environment variables', '# Copy to .env and fill in values', ''];
|
|
240
|
+
for (const v of envVars) {
|
|
241
|
+
lines.push(`${v}=`);
|
|
242
|
+
}
|
|
243
|
+
lines.push('');
|
|
244
|
+
fs.writeFileSync(envExamplePath, lines.join('\n'), 'utf-8');
|
|
245
|
+
return '.env.example';
|
|
246
|
+
}
|
|
247
|
+
// --- Plugin Implementation ---
|
|
248
|
+
exports.metadata = {
|
|
249
|
+
packageName: 'hackmyagent',
|
|
250
|
+
displayName: 'CredVault',
|
|
251
|
+
description: 'Credential protection — scan for hardcoded secrets, move to encrypted store, per-skill isolation',
|
|
252
|
+
version: exports.VERSION,
|
|
253
|
+
findings: ['CRED-001', 'CRED-002', 'CRED-003', 'CRED-004'],
|
|
254
|
+
scoreImprovement: 25,
|
|
255
|
+
};
|
|
256
|
+
class CredVaultPlugin {
|
|
257
|
+
constructor() {
|
|
258
|
+
this.metadata = exports.metadata;
|
|
259
|
+
}
|
|
260
|
+
async init(options) {
|
|
261
|
+
this.aimCore = options?.aimCore;
|
|
262
|
+
}
|
|
263
|
+
async scan(agentDir) {
|
|
264
|
+
const findings = [];
|
|
265
|
+
// Scan config files for hardcoded credentials (CRED-001)
|
|
266
|
+
for (const file of CONFIG_FILES) {
|
|
267
|
+
const filePath = path.join(agentDir, file);
|
|
268
|
+
if (fs.existsSync(filePath)) {
|
|
269
|
+
findings.push(...scanFileForCredentials(filePath, agentDir));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Scan for private key files (CRED-002)
|
|
273
|
+
findings.push(...scanForKeyFiles(agentDir));
|
|
274
|
+
// Scan for JWT secrets in config (CRED-004)
|
|
275
|
+
findings.push(...scanForJwtSecrets(agentDir));
|
|
276
|
+
// Log to aim-core audit if available
|
|
277
|
+
if (this.aimCore) {
|
|
278
|
+
this.aimCore.logEvent({
|
|
279
|
+
plugin: 'credvault',
|
|
280
|
+
action: 'scan.complete',
|
|
281
|
+
target: agentDir,
|
|
282
|
+
result: findings.length > 0 ? 'denied' : 'allowed',
|
|
283
|
+
metadata: { findingsCount: findings.length },
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return findings;
|
|
287
|
+
}
|
|
288
|
+
async fix(agentDir, options) {
|
|
289
|
+
const remediations = [];
|
|
290
|
+
const findings = await this.scan(agentDir);
|
|
291
|
+
if (options?.dryRun) {
|
|
292
|
+
return findings
|
|
293
|
+
.filter((f) => f.autoFixable)
|
|
294
|
+
.map((f) => ({
|
|
295
|
+
findingId: f.id,
|
|
296
|
+
description: `Would fix: ${f.title}`,
|
|
297
|
+
filesModified: f.filePath ? [f.filePath] : [],
|
|
298
|
+
rollbackAvailable: false,
|
|
299
|
+
}));
|
|
300
|
+
}
|
|
301
|
+
// Initialize encrypted store
|
|
302
|
+
initStore(agentDir);
|
|
303
|
+
// Fix CRED-001: Replace hardcoded credentials with env var references
|
|
304
|
+
const credFindings = findings.filter((f) => f.id === 'CRED-001');
|
|
305
|
+
if (credFindings.length > 0) {
|
|
306
|
+
const allModified = [];
|
|
307
|
+
for (const file of CONFIG_FILES) {
|
|
308
|
+
const filePath = path.join(agentDir, file);
|
|
309
|
+
if (fs.existsSync(filePath)) {
|
|
310
|
+
allModified.push(...fixCredentialsInFile(filePath, agentDir));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Create .env.example
|
|
314
|
+
const envExample = createEnvExample(agentDir, credFindings);
|
|
315
|
+
if (envExample)
|
|
316
|
+
allModified.push(envExample);
|
|
317
|
+
if (allModified.length > 0) {
|
|
318
|
+
remediations.push({
|
|
319
|
+
findingId: 'CRED-001',
|
|
320
|
+
description: `Replaced ${credFindings.length} hardcoded credential(s) with environment variable references`,
|
|
321
|
+
filesModified: allModified,
|
|
322
|
+
rollbackAvailable: false,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Fix CRED-004: Note about JWT secrets
|
|
327
|
+
const jwtFindings = findings.filter((f) => f.id === 'CRED-004');
|
|
328
|
+
if (jwtFindings.length > 0) {
|
|
329
|
+
for (const finding of jwtFindings) {
|
|
330
|
+
if (finding.filePath) {
|
|
331
|
+
const modified = fixCredentialsInFile(path.join(agentDir, finding.filePath), agentDir);
|
|
332
|
+
if (modified.length > 0) {
|
|
333
|
+
remediations.push({
|
|
334
|
+
findingId: 'CRED-004',
|
|
335
|
+
description: 'Replaced JWT secret with environment variable reference',
|
|
336
|
+
filesModified: modified,
|
|
337
|
+
rollbackAvailable: false,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Log remediation to aim-core
|
|
344
|
+
if (this.aimCore) {
|
|
345
|
+
for (const r of remediations) {
|
|
346
|
+
this.aimCore.logEvent({
|
|
347
|
+
plugin: 'credvault',
|
|
348
|
+
action: 'fix.applied',
|
|
349
|
+
target: r.findingId,
|
|
350
|
+
result: 'allowed',
|
|
351
|
+
metadata: { filesModified: r.filesModified },
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
this.aimCore.setTrustHints({ secretsManaged: true });
|
|
355
|
+
}
|
|
356
|
+
return remediations;
|
|
357
|
+
}
|
|
358
|
+
async status() {
|
|
359
|
+
return {
|
|
360
|
+
name: exports.metadata.displayName,
|
|
361
|
+
version: exports.metadata.version,
|
|
362
|
+
active: false,
|
|
363
|
+
findingsCount: 0,
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
async uninstall() {
|
|
367
|
+
// No persistent state beyond the store directory
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
exports.CredVaultPlugin = CredVaultPlugin;
|
|
371
|
+
function createPlugin() {
|
|
372
|
+
return new CredVaultPlugin();
|
|
373
|
+
}
|
|
374
|
+
//# sourceMappingURL=credvault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credvault.js","sourceRoot":"","sources":["../../src/plugins/credvault.ts"],"names":[],"mappings":"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"}
|