hackmyagent 0.7.2 → 0.8.0
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 +66 -28
- 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 +219 -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/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/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/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,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM Prompt Templates (Layer 3)
|
|
4
|
+
*
|
|
5
|
+
* Structured prompts for each analysis type.
|
|
6
|
+
* Each prompt requests JSON output with line numbers, severity, and rationale.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.INSTRUCTION_ANALYSIS_PROMPT = exports.MCP_THREAT_ANALYSIS_PROMPT = exports.CREDENTIAL_DETECTION_PROMPT = void 0;
|
|
10
|
+
exports.buildFileAnalysisMessage = buildFileAnalysisMessage;
|
|
11
|
+
exports.getPromptForFileType = getPromptForFileType;
|
|
12
|
+
/**
|
|
13
|
+
* System prompt for credential detection (uses Haiku — fast classification)
|
|
14
|
+
*/
|
|
15
|
+
exports.CREDENTIAL_DETECTION_PROMPT = `You are a security analyst specializing in credential detection. Analyze the following file for ANY form of credentials, secrets, tokens, or passwords.
|
|
16
|
+
|
|
17
|
+
Look for ALL credential types including:
|
|
18
|
+
- API keys in any format (not just known prefixes)
|
|
19
|
+
- Database connection strings with passwords
|
|
20
|
+
- JWT tokens
|
|
21
|
+
- OAuth tokens and refresh tokens
|
|
22
|
+
- Private keys (RSA, Ed25519, etc.)
|
|
23
|
+
- Basic auth credentials
|
|
24
|
+
- Session tokens
|
|
25
|
+
- Webhook secrets
|
|
26
|
+
- Encryption keys
|
|
27
|
+
|
|
28
|
+
For each credential found, respond with a JSON array:
|
|
29
|
+
[
|
|
30
|
+
{
|
|
31
|
+
"line": <line number>,
|
|
32
|
+
"type": "<credential type>",
|
|
33
|
+
"severity": "critical" | "high",
|
|
34
|
+
"description": "<what was found>",
|
|
35
|
+
"rationale": "<why this is a security risk in this specific file context>"
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
If no credentials are found, respond with an empty array: []
|
|
40
|
+
|
|
41
|
+
IMPORTANT: Be thorough but avoid false positives. Example strings, documentation references, and redacted values (xxx, ***, REDACTED) are NOT findings.`;
|
|
42
|
+
/**
|
|
43
|
+
* System prompt for MCP threat analysis (uses Sonnet — complex reasoning)
|
|
44
|
+
*/
|
|
45
|
+
exports.MCP_THREAT_ANALYSIS_PROMPT = `You are a security analyst specializing in AI agent security. Analyze the following MCP (Model Context Protocol) configuration for security threats.
|
|
46
|
+
|
|
47
|
+
Evaluate:
|
|
48
|
+
1. **Capability scope**: What can each server do? Is it overprivileged?
|
|
49
|
+
2. **Attack chains**: Can the combination of servers enable read→execute→exfiltrate attacks?
|
|
50
|
+
3. **Secrets exposure**: Are credentials passed via args (visible to LLM) instead of env vars?
|
|
51
|
+
4. **Trust boundaries**: Are servers from untrusted sources given privileged access?
|
|
52
|
+
5. **Sandbox integrity**: Are there flags that bypass security sandboxes?
|
|
53
|
+
|
|
54
|
+
For each finding, respond with a JSON array:
|
|
55
|
+
[
|
|
56
|
+
{
|
|
57
|
+
"line": <line number or null>,
|
|
58
|
+
"type": "<finding type>",
|
|
59
|
+
"severity": "critical" | "high" | "medium" | "low",
|
|
60
|
+
"description": "<what was found>",
|
|
61
|
+
"rationale": "<why this is a security risk>",
|
|
62
|
+
"recommendation": "<specific fix>"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
|
|
66
|
+
If no issues found, respond with an empty array: []`;
|
|
67
|
+
/**
|
|
68
|
+
* System prompt for instruction analysis (uses Sonnet — nuanced reasoning)
|
|
69
|
+
*/
|
|
70
|
+
exports.INSTRUCTION_ANALYSIS_PROMPT = `You are a security analyst specializing in AI agent security. Analyze the following agent instruction file for security risks.
|
|
71
|
+
|
|
72
|
+
This file is loaded into the AI agent's context window with every interaction. Evaluate:
|
|
73
|
+
|
|
74
|
+
1. **Prompt injection vectors**: Could an attacker craft input that exploits these instructions?
|
|
75
|
+
2. **Permissive behaviors**: Does the file tell the agent to bypass security controls?
|
|
76
|
+
3. **Data exfiltration risks**: Could the instructions be used to leak sensitive data?
|
|
77
|
+
4. **Credential exposure**: Are any secrets, tokens, or passwords present in the instructions?
|
|
78
|
+
5. **Missing boundaries**: What security constraints are absent that should be present?
|
|
79
|
+
|
|
80
|
+
For each finding, respond with a JSON array:
|
|
81
|
+
[
|
|
82
|
+
{
|
|
83
|
+
"line": <line number or null>,
|
|
84
|
+
"type": "<finding type>",
|
|
85
|
+
"severity": "critical" | "high" | "medium" | "low",
|
|
86
|
+
"description": "<what was found>",
|
|
87
|
+
"rationale": "<why this is a security risk>",
|
|
88
|
+
"recommendation": "<specific fix>"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
If no issues found, respond with an empty array: []`;
|
|
93
|
+
/**
|
|
94
|
+
* Build the user message for file analysis
|
|
95
|
+
*/
|
|
96
|
+
function buildFileAnalysisMessage(filePath, content, fileType) {
|
|
97
|
+
return `File: ${filePath}
|
|
98
|
+
Type: ${fileType}
|
|
99
|
+
Content:
|
|
100
|
+
\`\`\`
|
|
101
|
+
${content}
|
|
102
|
+
\`\`\``;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Select the appropriate prompt for a file type
|
|
106
|
+
*/
|
|
107
|
+
function getPromptForFileType(fileType) {
|
|
108
|
+
switch (fileType) {
|
|
109
|
+
case 'agent_instructions':
|
|
110
|
+
return { systemPrompt: exports.INSTRUCTION_ANALYSIS_PROMPT, model: 'sonnet' };
|
|
111
|
+
case 'mcp_config':
|
|
112
|
+
case 'claude_settings':
|
|
113
|
+
return { systemPrompt: exports.MCP_THREAT_ANALYSIS_PROMPT, model: 'sonnet' };
|
|
114
|
+
case 'env_file':
|
|
115
|
+
case 'config_file':
|
|
116
|
+
default:
|
|
117
|
+
return { systemPrompt: exports.CREDENTIAL_DETECTION_PROMPT, model: 'haiku' };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/semantic/llm/prompts.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyFH,4DAWC;AAKD,oDAcC;AArHD;;GAEG;AACU,QAAA,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;wJA0B6G,CAAC;AAEzJ;;GAEG;AACU,QAAA,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;oDAqBU,CAAC;AAErD;;GAEG;AACU,QAAA,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;oDAsBS,CAAC;AAErD;;GAEG;AACH,SAAgB,wBAAwB,CACtC,QAAgB,EAChB,OAAe,EACf,QAAgB;IAEhB,OAAO,SAAS,QAAQ;QAClB,QAAQ;;;EAGd,OAAO;OACF,CAAC;AACR,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAClC,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,oBAAoB;YACvB,OAAO,EAAE,YAAY,EAAE,mCAA2B,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACxE,KAAK,YAAY,CAAC;QAClB,KAAK,iBAAiB;YACpB,OAAO,EAAE,YAAY,EAAE,kCAA0B,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QACvE,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa,CAAC;QACnB;YACE,OAAO,EAAE,YAAY,EAAE,mCAA2B,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context-Aware Credential Detection (Layer 2)
|
|
3
|
+
*
|
|
4
|
+
* Catches credentials that regex misses by understanding structure:
|
|
5
|
+
* - URL passwords (postgres://admin:password123@host)
|
|
6
|
+
* - Generic tokens in config (key-name heuristics)
|
|
7
|
+
* - Short API keys below regex thresholds
|
|
8
|
+
* - Secrets in instruction files (CLAUDE.md, .cursorrules)
|
|
9
|
+
*/
|
|
10
|
+
import type { SemanticFinding, AnalysisFile } from '../types';
|
|
11
|
+
export declare class CredentialContextAnalyzer {
|
|
12
|
+
analyze(files: AnalysisFile[]): SemanticFinding[];
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=credential-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-context.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/credential-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA6T9D,qBAAa,yBAAyB;IACpC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;CAYlD"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Context-Aware Credential Detection (Layer 2)
|
|
4
|
+
*
|
|
5
|
+
* Catches credentials that regex misses by understanding structure:
|
|
6
|
+
* - URL passwords (postgres://admin:password123@host)
|
|
7
|
+
* - Generic tokens in config (key-name heuristics)
|
|
8
|
+
* - Short API keys below regex thresholds
|
|
9
|
+
* - Secrets in instruction files (CLAUDE.md, .cursorrules)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CredentialContextAnalyzer = void 0;
|
|
13
|
+
/** Key names that indicate a secret value */
|
|
14
|
+
const SECRET_KEY_PATTERN = /^(.*_)?(secret|token|key|password|passwd|credential|auth|apikey|api_key|access_key|private_key|client_secret|signing_key|encryption_key|master_key|jwt_secret|session_secret|db_password|database_password)(_.*)?$/i;
|
|
15
|
+
/** URL with embedded credentials: protocol://user:password@host
|
|
16
|
+
* Uses greedy .+ for password to handle @ chars in passwords.
|
|
17
|
+
* The greedy match backtracks to the last valid @hostname boundary. */
|
|
18
|
+
const URL_CREDENTIAL_PATTERN = /(?:postgres|postgresql|mysql|mongodb|redis|amqp|rabbitmq|ftp|sftp|https?):\/\/([^:]+):(.+)@([a-zA-Z0-9][-a-zA-Z0-9.]*(?::\d+)?(?:\/[^\s"',)]*)?)/gi;
|
|
19
|
+
/** Values that are NOT secrets (env var refs, booleans, paths, etc.) */
|
|
20
|
+
function isNonSecretValue(value) {
|
|
21
|
+
const trimmed = value.trim().replace(/^["']|["']$/g, '');
|
|
22
|
+
// Empty or whitespace
|
|
23
|
+
if (!trimmed || trimmed.length === 0)
|
|
24
|
+
return true;
|
|
25
|
+
// Env var reference
|
|
26
|
+
if (/^\$\{.*\}$/.test(trimmed) || /^\$[A-Z_]+$/.test(trimmed))
|
|
27
|
+
return true;
|
|
28
|
+
// Boolean
|
|
29
|
+
if (/^(true|false)$/i.test(trimmed))
|
|
30
|
+
return true;
|
|
31
|
+
// Pure number
|
|
32
|
+
if (/^\d+(\.\d+)?$/.test(trimmed))
|
|
33
|
+
return true;
|
|
34
|
+
// File path (starts with / or ./ or ~/)
|
|
35
|
+
if (/^[.~]?\//.test(trimmed) && !trimmed.includes('@'))
|
|
36
|
+
return true;
|
|
37
|
+
// URL without credentials
|
|
38
|
+
if (/^https?:\/\/[^:@]*$/.test(trimmed))
|
|
39
|
+
return true;
|
|
40
|
+
// Placeholder values
|
|
41
|
+
if (/^(xxx|your[-_]|change[-_]me|replace[-_]|TODO|FIXME|placeholder|example)/i.test(trimmed))
|
|
42
|
+
return true;
|
|
43
|
+
// Common non-secret config values
|
|
44
|
+
if (/^(localhost|127\.0\.0\.1|0\.0\.0\.0|none|null|undefined|default)$/i.test(trimmed))
|
|
45
|
+
return true;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
/** Severity based on file location */
|
|
49
|
+
function severityForFile(filePath) {
|
|
50
|
+
const lower = filePath.toLowerCase();
|
|
51
|
+
// In LLM context window — exposed to AI provider, extractable via prompt injection
|
|
52
|
+
if (lower.endsWith('claude.md') ||
|
|
53
|
+
lower.endsWith('.cursorrules') ||
|
|
54
|
+
lower.endsWith('.windsurfrules') ||
|
|
55
|
+
lower.endsWith('.clinerules') ||
|
|
56
|
+
lower.includes('copilot-instructions')) {
|
|
57
|
+
return 'critical';
|
|
58
|
+
}
|
|
59
|
+
// MCP configs — tool config, often committed
|
|
60
|
+
if (lower.includes('mcp.json') ||
|
|
61
|
+
lower.includes('mcp.yaml')) {
|
|
62
|
+
return 'critical';
|
|
63
|
+
}
|
|
64
|
+
// .env files that might be committed
|
|
65
|
+
if (lower.includes('.env')) {
|
|
66
|
+
return 'high';
|
|
67
|
+
}
|
|
68
|
+
// Config files
|
|
69
|
+
return 'high';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect URL-embedded passwords
|
|
73
|
+
*/
|
|
74
|
+
function detectUrlPasswords(file) {
|
|
75
|
+
const findings = [];
|
|
76
|
+
const lines = file.content.split('\n');
|
|
77
|
+
for (let i = 0; i < lines.length; i++) {
|
|
78
|
+
const line = lines[i];
|
|
79
|
+
URL_CREDENTIAL_PATTERN.lastIndex = 0;
|
|
80
|
+
let match;
|
|
81
|
+
while ((match = URL_CREDENTIAL_PATTERN.exec(line)) !== null) {
|
|
82
|
+
const password = match[2];
|
|
83
|
+
// Skip env var references in URLs
|
|
84
|
+
if (password.startsWith('${') || password.startsWith('$'))
|
|
85
|
+
continue;
|
|
86
|
+
// Skip very short passwords that might be ports
|
|
87
|
+
if (password.length < 3)
|
|
88
|
+
continue;
|
|
89
|
+
findings.push({
|
|
90
|
+
id: 'SEM-CRED-001',
|
|
91
|
+
title: 'Password embedded in URL',
|
|
92
|
+
description: `Database or service URL contains an inline password. The password is visible in plaintext in ${file.path}.`,
|
|
93
|
+
rationale: 'URL-embedded credentials are logged by proxies, shell history, and process listings. They bypass .env file protections and are easily leaked in stack traces.',
|
|
94
|
+
category: 'credential',
|
|
95
|
+
severity: severityForFile(file.path),
|
|
96
|
+
file: file.path,
|
|
97
|
+
line: i + 1,
|
|
98
|
+
recommendation: 'Move the password to an environment variable and reference it: postgresql://${DB_USER}:${DB_PASSWORD}@host/db',
|
|
99
|
+
layer: 2,
|
|
100
|
+
autoFixable: false,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return findings;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Detect generic tokens via key-name heuristics
|
|
108
|
+
*/
|
|
109
|
+
function detectGenericTokens(file) {
|
|
110
|
+
const findings = [];
|
|
111
|
+
const lines = file.content.split('\n');
|
|
112
|
+
for (let i = 0; i < lines.length; i++) {
|
|
113
|
+
const line = lines[i];
|
|
114
|
+
// JSON key:value patterns
|
|
115
|
+
const jsonMatch = line.match(/"([^"]+)"\s*:\s*"([^"]+)"/);
|
|
116
|
+
if (jsonMatch) {
|
|
117
|
+
const [, key, value] = jsonMatch;
|
|
118
|
+
if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
|
|
119
|
+
// Ensure value looks like it could be a secret (min length, some entropy)
|
|
120
|
+
if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
|
|
121
|
+
findings.push({
|
|
122
|
+
id: 'SEM-CRED-002',
|
|
123
|
+
title: 'Hardcoded secret in config',
|
|
124
|
+
description: `Key "${key}" contains what appears to be a hardcoded secret value in ${file.path}.`,
|
|
125
|
+
rationale: 'Config files with hardcoded secrets are commonly committed to version control. The key name strongly indicates this value should be treated as a secret.',
|
|
126
|
+
category: 'credential',
|
|
127
|
+
severity: severityForFile(file.path),
|
|
128
|
+
file: file.path,
|
|
129
|
+
line: i + 1,
|
|
130
|
+
recommendation: `Move "${key}" value to an environment variable and reference it with \${${key.toUpperCase().replace(/[^A-Z0-9]/g, '_')}}`,
|
|
131
|
+
layer: 2,
|
|
132
|
+
autoFixable: false,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// YAML key: value patterns
|
|
138
|
+
const yamlMatch = line.match(/^(\s*)([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.+)$/);
|
|
139
|
+
if (yamlMatch && !jsonMatch) {
|
|
140
|
+
const [, , key, rawValue] = yamlMatch;
|
|
141
|
+
const value = rawValue.trim().replace(/^["']|["']$/g, '');
|
|
142
|
+
if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
|
|
143
|
+
if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
|
|
144
|
+
findings.push({
|
|
145
|
+
id: 'SEM-CRED-002',
|
|
146
|
+
title: 'Hardcoded secret in config',
|
|
147
|
+
description: `Key "${key}" contains what appears to be a hardcoded secret value in ${file.path}.`,
|
|
148
|
+
rationale: 'Config files with hardcoded secrets are commonly committed to version control. The key name strongly indicates this value should be treated as a secret.',
|
|
149
|
+
category: 'credential',
|
|
150
|
+
severity: severityForFile(file.path),
|
|
151
|
+
file: file.path,
|
|
152
|
+
line: i + 1,
|
|
153
|
+
recommendation: `Move "${key}" value to an environment variable.`,
|
|
154
|
+
layer: 2,
|
|
155
|
+
autoFixable: false,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// .env KEY=VALUE patterns
|
|
161
|
+
const envMatch = line.match(/^([A-Z][A-Z0-9_]*)=(.+)$/);
|
|
162
|
+
if (envMatch) {
|
|
163
|
+
const [, key, rawValue] = envMatch;
|
|
164
|
+
const value = rawValue.trim().replace(/^["']|["']$/g, '');
|
|
165
|
+
if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
|
|
166
|
+
if (value.length >= 8 && !/^[a-z]+$/i.test(value)) {
|
|
167
|
+
findings.push({
|
|
168
|
+
id: 'SEM-CRED-002',
|
|
169
|
+
title: 'Hardcoded secret in config',
|
|
170
|
+
description: `Environment variable "${key}" contains a hardcoded secret value in ${file.path}.`,
|
|
171
|
+
rationale: '.env files with hardcoded secrets should be gitignored. If this file is committed, the secret is exposed in version control history.',
|
|
172
|
+
category: 'credential',
|
|
173
|
+
severity: severityForFile(file.path),
|
|
174
|
+
file: file.path,
|
|
175
|
+
line: i + 1,
|
|
176
|
+
recommendation: `Ensure ${file.path} is in .gitignore and rotate this credential.`,
|
|
177
|
+
layer: 2,
|
|
178
|
+
autoFixable: false,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return findings;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Detect credential-like strings in instruction files
|
|
188
|
+
* (CLAUDE.md, .cursorrules, copilot-instructions.md)
|
|
189
|
+
*
|
|
190
|
+
* These files are loaded into the LLM context window,
|
|
191
|
+
* so ANY credential here is critical severity.
|
|
192
|
+
*/
|
|
193
|
+
function detectCredentialsInInstructions(file) {
|
|
194
|
+
if (file.type !== 'agent_instructions' &&
|
|
195
|
+
!file.path.toLowerCase().endsWith('claude.md') &&
|
|
196
|
+
!file.path.toLowerCase().endsWith('.cursorrules')) {
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
const findings = [];
|
|
200
|
+
const lines = file.content.split('\n');
|
|
201
|
+
// Patterns that look like API keys/tokens (broader than core scanner's regex)
|
|
202
|
+
const broadCredentialPatterns = [
|
|
203
|
+
{ name: 'API key prefix', pattern: /(?:sk-|pk-|rk-|ak-)[a-zA-Z0-9_-]{16,}/g },
|
|
204
|
+
{ name: 'Bearer token', pattern: /Bearer\s+[a-zA-Z0-9._-]{20,}/g },
|
|
205
|
+
{ name: 'Generic long token', pattern: /(?:token|key|secret|password)\s*[=:]\s*['"]?([a-zA-Z0-9_-]{32,})['"]?/gi },
|
|
206
|
+
{ name: 'Base64 credential', pattern: /(?:password|secret|token|key)\s*[=:]\s*['"]?([A-Za-z0-9+/]{40,}={0,2})['"]?/gi },
|
|
207
|
+
];
|
|
208
|
+
for (let i = 0; i < lines.length; i++) {
|
|
209
|
+
const line = lines[i];
|
|
210
|
+
for (const { name, pattern } of broadCredentialPatterns) {
|
|
211
|
+
pattern.lastIndex = 0;
|
|
212
|
+
if (pattern.test(line)) {
|
|
213
|
+
findings.push({
|
|
214
|
+
id: 'SEM-CRED-003',
|
|
215
|
+
title: 'Credential in agent instructions',
|
|
216
|
+
description: `Detected ${name} pattern in ${file.path}. This file is loaded into the LLM context window.`,
|
|
217
|
+
rationale: 'Agent instruction files (CLAUDE.md, .cursorrules) are sent to the AI provider with every request. Any credential in these files is exposed to the AI provider and can be extracted via prompt injection attacks.',
|
|
218
|
+
category: 'credential',
|
|
219
|
+
severity: 'critical',
|
|
220
|
+
file: file.path,
|
|
221
|
+
line: i + 1,
|
|
222
|
+
recommendation: 'Remove all credentials from instruction files immediately. Use environment variables or a secrets manager instead.',
|
|
223
|
+
layer: 2,
|
|
224
|
+
autoFixable: false,
|
|
225
|
+
});
|
|
226
|
+
break; // One finding per line
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return findings;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Detect secrets passed via MCP server env blocks
|
|
234
|
+
*/
|
|
235
|
+
function detectMcpEnvSecrets(file) {
|
|
236
|
+
if (file.type !== 'mcp_config' && file.type !== 'claude_settings') {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
const findings = [];
|
|
240
|
+
let config;
|
|
241
|
+
try {
|
|
242
|
+
config = JSON.parse(file.content);
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return [];
|
|
246
|
+
}
|
|
247
|
+
const servers = config.mcpServers || {};
|
|
248
|
+
const lines = file.content.split('\n');
|
|
249
|
+
for (const [serverName, serverConfig] of Object.entries(servers)) {
|
|
250
|
+
if (!serverConfig.env)
|
|
251
|
+
continue;
|
|
252
|
+
for (const [key, value] of Object.entries(serverConfig.env)) {
|
|
253
|
+
if (typeof value !== 'string')
|
|
254
|
+
continue;
|
|
255
|
+
if (SECRET_KEY_PATTERN.test(key) && !isNonSecretValue(value)) {
|
|
256
|
+
// Find the line number
|
|
257
|
+
let lineNum;
|
|
258
|
+
for (let i = 0; i < lines.length; i++) {
|
|
259
|
+
if (lines[i].includes(`"${key}"`) && lines[i].includes(value.substring(0, 20))) {
|
|
260
|
+
lineNum = i + 1;
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
findings.push({
|
|
265
|
+
id: 'SEM-CRED-004',
|
|
266
|
+
title: 'Secret hardcoded in MCP server config',
|
|
267
|
+
description: `MCP server "${serverName}" has secret "${key}" hardcoded in env block of ${file.path}.`,
|
|
268
|
+
rationale: 'MCP config files are typically committed to version control. Secrets in the env block are visible in plaintext. Use environment variable references instead.',
|
|
269
|
+
category: 'credential',
|
|
270
|
+
severity: 'critical',
|
|
271
|
+
file: file.path,
|
|
272
|
+
line: lineNum,
|
|
273
|
+
recommendation: `Replace the hardcoded value with an env var reference: "${key}": "\${${key}}"`,
|
|
274
|
+
layer: 2,
|
|
275
|
+
autoFixable: false,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return findings;
|
|
281
|
+
}
|
|
282
|
+
class CredentialContextAnalyzer {
|
|
283
|
+
analyze(files) {
|
|
284
|
+
const findings = [];
|
|
285
|
+
for (const file of files) {
|
|
286
|
+
findings.push(...detectUrlPasswords(file));
|
|
287
|
+
findings.push(...detectGenericTokens(file));
|
|
288
|
+
findings.push(...detectCredentialsInInstructions(file));
|
|
289
|
+
findings.push(...detectMcpEnvSecrets(file));
|
|
290
|
+
}
|
|
291
|
+
return findings;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
exports.CredentialContextAnalyzer = CredentialContextAnalyzer;
|
|
295
|
+
//# sourceMappingURL=credential-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-context.js","sourceRoot":"","sources":["../../../src/semantic/structural/credential-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural Analyzer (Layer 2 Orchestrator)
|
|
3
|
+
*
|
|
4
|
+
* Runs all Layer 2 analyzers against a target directory.
|
|
5
|
+
* Discovers security-relevant files, classifies them, reads content,
|
|
6
|
+
* and runs each analyzer.
|
|
7
|
+
*/
|
|
8
|
+
import type { SemanticFinding, AnalysisFile } from '../types';
|
|
9
|
+
export declare class StructuralAnalyzer {
|
|
10
|
+
private credentialAnalyzer;
|
|
11
|
+
private mcpAnalyzer;
|
|
12
|
+
private instructionAnalyzer;
|
|
13
|
+
private permissionAnalyzer;
|
|
14
|
+
/**
|
|
15
|
+
* Discover and analyze all security-relevant files in the target directory.
|
|
16
|
+
*/
|
|
17
|
+
analyze(targetDir: string): Promise<SemanticFinding[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Discover and read security-relevant files.
|
|
20
|
+
* Exported for use by the MCP server's deep_scan tool.
|
|
21
|
+
*/
|
|
22
|
+
discoverFiles(targetDir: string): Promise<AnalysisFile[]>;
|
|
23
|
+
}
|
|
24
|
+
export { CredentialContextAnalyzer } from './credential-context';
|
|
25
|
+
export { McpConfigAnalyzer } from './mcp-config';
|
|
26
|
+
export { InstructionAnalyzer } from './instruction';
|
|
27
|
+
export { PermissionModelAnalyzer } from './permission-model';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAY,MAAM,UAAU,CAAC;AAuCxE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,mBAAmB,CAA6B;IACxD,OAAO,CAAC,kBAAkB,CAAiC;IAE3D;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAc5D;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA6BhE;AAED,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Structural Analyzer (Layer 2 Orchestrator)
|
|
4
|
+
*
|
|
5
|
+
* Runs all Layer 2 analyzers against a target directory.
|
|
6
|
+
* Discovers security-relevant files, classifies them, reads content,
|
|
7
|
+
* and runs each analyzer.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.PermissionModelAnalyzer = exports.InstructionAnalyzer = exports.McpConfigAnalyzer = exports.CredentialContextAnalyzer = exports.StructuralAnalyzer = void 0;
|
|
44
|
+
const fs = __importStar(require("fs/promises"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
const credential_context_1 = require("./credential-context");
|
|
47
|
+
const mcp_config_1 = require("./mcp-config");
|
|
48
|
+
const instruction_1 = require("./instruction");
|
|
49
|
+
const permission_model_1 = require("./permission-model");
|
|
50
|
+
/** Max file size to read (prevents OOM on huge files) */
|
|
51
|
+
const MAX_FILE_SIZE = 512 * 1024; // 512KB
|
|
52
|
+
/** Security-relevant files to look for */
|
|
53
|
+
const FILE_DISCOVERY = [
|
|
54
|
+
// Agent instruction files
|
|
55
|
+
{ glob: 'CLAUDE.md', type: 'agent_instructions' },
|
|
56
|
+
{ glob: '.cursorrules', type: 'agent_instructions' },
|
|
57
|
+
{ glob: '.windsurfrules', type: 'agent_instructions' },
|
|
58
|
+
{ glob: '.clinerules', type: 'agent_instructions' },
|
|
59
|
+
{ glob: '.github/copilot-instructions.md', type: 'agent_instructions' },
|
|
60
|
+
// MCP config files
|
|
61
|
+
{ glob: 'mcp.json', type: 'mcp_config' },
|
|
62
|
+
{ glob: '.cursor/mcp.json', type: 'mcp_config' },
|
|
63
|
+
{ glob: '.vscode/mcp.json', type: 'mcp_config' },
|
|
64
|
+
// Claude settings
|
|
65
|
+
{ glob: '.claude/settings.json', type: 'claude_settings' },
|
|
66
|
+
// Env files
|
|
67
|
+
{ glob: '.env', type: 'env_file' },
|
|
68
|
+
{ glob: '.env.local', type: 'env_file' },
|
|
69
|
+
{ glob: '.env.development', type: 'env_file' },
|
|
70
|
+
{ glob: '.env.production', type: 'env_file' },
|
|
71
|
+
// Config files
|
|
72
|
+
{ glob: 'config.json', type: 'config_file' },
|
|
73
|
+
{ glob: 'config.yaml', type: 'config_file' },
|
|
74
|
+
{ glob: 'config.yml', type: 'config_file' },
|
|
75
|
+
{ glob: 'settings.json', type: 'config_file' },
|
|
76
|
+
];
|
|
77
|
+
class StructuralAnalyzer {
|
|
78
|
+
constructor() {
|
|
79
|
+
this.credentialAnalyzer = new credential_context_1.CredentialContextAnalyzer();
|
|
80
|
+
this.mcpAnalyzer = new mcp_config_1.McpConfigAnalyzer();
|
|
81
|
+
this.instructionAnalyzer = new instruction_1.InstructionAnalyzer();
|
|
82
|
+
this.permissionAnalyzer = new permission_model_1.PermissionModelAnalyzer();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Discover and analyze all security-relevant files in the target directory.
|
|
86
|
+
*/
|
|
87
|
+
async analyze(targetDir) {
|
|
88
|
+
const files = await this.discoverFiles(targetDir);
|
|
89
|
+
if (files.length === 0)
|
|
90
|
+
return [];
|
|
91
|
+
const findings = [];
|
|
92
|
+
findings.push(...this.credentialAnalyzer.analyze(files));
|
|
93
|
+
findings.push(...this.mcpAnalyzer.analyze(files));
|
|
94
|
+
findings.push(...this.instructionAnalyzer.analyze(files));
|
|
95
|
+
findings.push(...this.permissionAnalyzer.analyze(files));
|
|
96
|
+
return findings;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Discover and read security-relevant files.
|
|
100
|
+
* Exported for use by the MCP server's deep_scan tool.
|
|
101
|
+
*/
|
|
102
|
+
async discoverFiles(targetDir) {
|
|
103
|
+
const files = [];
|
|
104
|
+
for (const { glob, type } of FILE_DISCOVERY) {
|
|
105
|
+
const filePath = path.join(targetDir, glob);
|
|
106
|
+
try {
|
|
107
|
+
const stat = await fs.stat(filePath);
|
|
108
|
+
if (!stat.isFile())
|
|
109
|
+
continue;
|
|
110
|
+
const truncated = stat.size > MAX_FILE_SIZE;
|
|
111
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
112
|
+
const finalContent = truncated
|
|
113
|
+
? content.substring(0, MAX_FILE_SIZE)
|
|
114
|
+
: content;
|
|
115
|
+
files.push({
|
|
116
|
+
path: glob,
|
|
117
|
+
type,
|
|
118
|
+
content: finalContent,
|
|
119
|
+
truncated,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// File doesn't exist — skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return files;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.StructuralAnalyzer = StructuralAnalyzer;
|
|
130
|
+
var credential_context_2 = require("./credential-context");
|
|
131
|
+
Object.defineProperty(exports, "CredentialContextAnalyzer", { enumerable: true, get: function () { return credential_context_2.CredentialContextAnalyzer; } });
|
|
132
|
+
var mcp_config_2 = require("./mcp-config");
|
|
133
|
+
Object.defineProperty(exports, "McpConfigAnalyzer", { enumerable: true, get: function () { return mcp_config_2.McpConfigAnalyzer; } });
|
|
134
|
+
var instruction_2 = require("./instruction");
|
|
135
|
+
Object.defineProperty(exports, "InstructionAnalyzer", { enumerable: true, get: function () { return instruction_2.InstructionAnalyzer; } });
|
|
136
|
+
var permission_model_2 = require("./permission-model");
|
|
137
|
+
Object.defineProperty(exports, "PermissionModelAnalyzer", { enumerable: true, get: function () { return permission_model_2.PermissionModelAnalyzer; } });
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/semantic/structural/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Instruction Static Analysis (Layer 2)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes CLAUDE.md, .cursorrules, .windsurfrules, .clinerules,
|
|
5
|
+
* copilot-instructions.md for security issues:
|
|
6
|
+
* - Overly permissive instructions
|
|
7
|
+
* - Exfiltration enablement
|
|
8
|
+
* - Missing security boundaries
|
|
9
|
+
* - Large attack surface
|
|
10
|
+
*/
|
|
11
|
+
import type { SemanticFinding, AnalysisFile } from '../types';
|
|
12
|
+
export declare class InstructionAnalyzer {
|
|
13
|
+
analyze(files: AnalysisFile[]): SemanticFinding[];
|
|
14
|
+
private checkPermissiveInstructions;
|
|
15
|
+
private checkExfiltrationEnablement;
|
|
16
|
+
private checkMissingSecurityBoundaries;
|
|
17
|
+
private checkLargeAttackSurface;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=instruction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../../src/semantic/structural/instruction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAiD9D,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE;IAiBjD,OAAO,CAAC,2BAA2B;IAgCnC,OAAO,CAAC,2BAA2B;IAgCnC,OAAO,CAAC,8BAA8B;IA8BtC,OAAO,CAAC,uBAAuB;CAyBhC"}
|