@oculum/scanner 1.0.9 → 1.0.11
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/dist/baseline/diff.d.ts +32 -0
- package/dist/baseline/diff.d.ts.map +1 -0
- package/dist/baseline/diff.js +119 -0
- package/dist/baseline/diff.js.map +1 -0
- package/dist/baseline/index.d.ts +9 -0
- package/dist/baseline/index.d.ts.map +1 -0
- package/dist/baseline/index.js +19 -0
- package/dist/baseline/index.js.map +1 -0
- package/dist/baseline/manager.d.ts +67 -0
- package/dist/baseline/manager.d.ts.map +1 -0
- package/dist/baseline/manager.js +180 -0
- package/dist/baseline/manager.js.map +1 -0
- package/dist/baseline/types.d.ts +91 -0
- package/dist/baseline/types.d.ts.map +1 -0
- package/dist/baseline/types.js +12 -0
- package/dist/baseline/types.js.map +1 -0
- package/dist/formatters/cli-terminal.d.ts +38 -0
- package/dist/formatters/cli-terminal.d.ts.map +1 -1
- package/dist/formatters/cli-terminal.js +365 -42
- package/dist/formatters/cli-terminal.js.map +1 -1
- package/dist/formatters/github-comment.d.ts +1 -1
- package/dist/formatters/github-comment.d.ts.map +1 -1
- package/dist/formatters/github-comment.js +75 -11
- package/dist/formatters/github-comment.js.map +1 -1
- package/dist/formatters/index.d.ts +1 -1
- package/dist/formatters/index.d.ts.map +1 -1
- package/dist/formatters/index.js +4 -1
- package/dist/formatters/index.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +155 -16
- package/dist/index.js.map +1 -1
- package/dist/layer1/config-audit.d.ts.map +1 -1
- package/dist/layer1/config-audit.js +20 -3
- package/dist/layer1/config-audit.js.map +1 -1
- package/dist/layer1/config-mcp-audit.d.ts +20 -0
- package/dist/layer1/config-mcp-audit.d.ts.map +1 -0
- package/dist/layer1/config-mcp-audit.js +239 -0
- package/dist/layer1/config-mcp-audit.js.map +1 -0
- package/dist/layer1/index.d.ts +1 -0
- package/dist/layer1/index.d.ts.map +1 -1
- package/dist/layer1/index.js +9 -1
- package/dist/layer1/index.js.map +1 -1
- package/dist/layer2/ai-agent-tools.d.ts.map +1 -1
- package/dist/layer2/ai-agent-tools.js +303 -0
- package/dist/layer2/ai-agent-tools.js.map +1 -1
- package/dist/layer2/ai-endpoint-protection.d.ts.map +1 -1
- package/dist/layer2/ai-endpoint-protection.js +17 -3
- package/dist/layer2/ai-endpoint-protection.js.map +1 -1
- package/dist/layer2/ai-execution-sinks.d.ts.map +1 -1
- package/dist/layer2/ai-execution-sinks.js +462 -12
- package/dist/layer2/ai-execution-sinks.js.map +1 -1
- package/dist/layer2/ai-fingerprinting.d.ts.map +1 -1
- package/dist/layer2/ai-fingerprinting.js +3 -0
- package/dist/layer2/ai-fingerprinting.js.map +1 -1
- package/dist/layer2/ai-mcp-security.d.ts +17 -0
- package/dist/layer2/ai-mcp-security.d.ts.map +1 -0
- package/dist/layer2/ai-mcp-security.js +679 -0
- package/dist/layer2/ai-mcp-security.js.map +1 -0
- package/dist/layer2/ai-package-hallucination.d.ts +19 -0
- package/dist/layer2/ai-package-hallucination.d.ts.map +1 -0
- package/dist/layer2/ai-package-hallucination.js +696 -0
- package/dist/layer2/ai-package-hallucination.js.map +1 -0
- package/dist/layer2/ai-prompt-hygiene.d.ts.map +1 -1
- package/dist/layer2/ai-prompt-hygiene.js +495 -9
- package/dist/layer2/ai-prompt-hygiene.js.map +1 -1
- package/dist/layer2/ai-rag-safety.d.ts.map +1 -1
- package/dist/layer2/ai-rag-safety.js +372 -1
- package/dist/layer2/ai-rag-safety.js.map +1 -1
- package/dist/layer2/auth-antipatterns.d.ts.map +1 -1
- package/dist/layer2/auth-antipatterns.js +4 -0
- package/dist/layer2/auth-antipatterns.js.map +1 -1
- package/dist/layer2/byok-patterns.d.ts.map +1 -1
- package/dist/layer2/byok-patterns.js +3 -0
- package/dist/layer2/byok-patterns.js.map +1 -1
- package/dist/layer2/dangerous-functions/child-process.d.ts +16 -0
- package/dist/layer2/dangerous-functions/child-process.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/child-process.js +74 -0
- package/dist/layer2/dangerous-functions/child-process.js.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts +29 -0
- package/dist/layer2/dangerous-functions/dom-xss.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/dom-xss.js +179 -0
- package/dist/layer2/dangerous-functions/dom-xss.js.map +1 -0
- package/dist/layer2/dangerous-functions/index.d.ts +13 -0
- package/dist/layer2/dangerous-functions/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/index.js +621 -0
- package/dist/layer2/dangerous-functions/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts +31 -0
- package/dist/layer2/dangerous-functions/json-parse.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/json-parse.js +319 -0
- package/dist/layer2/dangerous-functions/json-parse.js.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts +61 -0
- package/dist/layer2/dangerous-functions/math-random.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/math-random.js +459 -0
- package/dist/layer2/dangerous-functions/math-random.js.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts +21 -0
- package/dist/layer2/dangerous-functions/patterns.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/patterns.js +161 -0
- package/dist/layer2/dangerous-functions/patterns.js.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts +13 -0
- package/dist/layer2/dangerous-functions/request-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/request-validation.js +119 -0
- package/dist/layer2/dangerous-functions/request-validation.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts +23 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js +149 -0
- package/dist/layer2/dangerous-functions/utils/control-flow.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts +31 -0
- package/dist/layer2/dangerous-functions/utils/helpers.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js +124 -0
- package/dist/layer2/dangerous-functions/utils/helpers.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts +9 -0
- package/dist/layer2/dangerous-functions/utils/index.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/index.js +23 -0
- package/dist/layer2/dangerous-functions/utils/index.js.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts +22 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.d.ts.map +1 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js +89 -0
- package/dist/layer2/dangerous-functions/utils/schema-validation.js.map +1 -0
- package/dist/layer2/data-exposure.d.ts.map +1 -1
- package/dist/layer2/data-exposure.js +3 -0
- package/dist/layer2/data-exposure.js.map +1 -1
- package/dist/layer2/framework-checks.d.ts.map +1 -1
- package/dist/layer2/framework-checks.js +3 -0
- package/dist/layer2/framework-checks.js.map +1 -1
- package/dist/layer2/index.d.ts +3 -0
- package/dist/layer2/index.d.ts.map +1 -1
- package/dist/layer2/index.js +61 -2
- package/dist/layer2/index.js.map +1 -1
- package/dist/layer2/logic-gates.d.ts.map +1 -1
- package/dist/layer2/logic-gates.js +4 -0
- package/dist/layer2/logic-gates.js.map +1 -1
- package/dist/layer2/model-supply-chain.d.ts +20 -0
- package/dist/layer2/model-supply-chain.d.ts.map +1 -0
- package/dist/layer2/model-supply-chain.js +376 -0
- package/dist/layer2/model-supply-chain.js.map +1 -0
- package/dist/layer2/risky-imports.d.ts.map +1 -1
- package/dist/layer2/risky-imports.js +4 -0
- package/dist/layer2/risky-imports.js.map +1 -1
- package/dist/layer2/variables.d.ts.map +1 -1
- package/dist/layer2/variables.js +4 -0
- package/dist/layer2/variables.js.map +1 -1
- package/dist/layer3/anthropic/auto-dismiss.d.ts +24 -0
- package/dist/layer3/anthropic/auto-dismiss.d.ts.map +1 -0
- package/dist/layer3/anthropic/auto-dismiss.js +188 -0
- package/dist/layer3/anthropic/auto-dismiss.js.map +1 -0
- package/dist/layer3/anthropic/clients.d.ts +44 -0
- package/dist/layer3/anthropic/clients.d.ts.map +1 -0
- package/dist/layer3/anthropic/clients.js +81 -0
- package/dist/layer3/anthropic/clients.js.map +1 -0
- package/dist/layer3/anthropic/index.d.ts +41 -0
- package/dist/layer3/anthropic/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/index.js +141 -0
- package/dist/layer3/anthropic/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/index.d.ts +8 -0
- package/dist/layer3/anthropic/prompts/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/index.js +14 -0
- package/dist/layer3/anthropic/prompts/index.js.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts +15 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js +169 -0
- package/dist/layer3/anthropic/prompts/semantic-analysis.js.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts +12 -0
- package/dist/layer3/anthropic/prompts/validation.d.ts.map +1 -0
- package/dist/layer3/anthropic/prompts/validation.js +421 -0
- package/dist/layer3/anthropic/prompts/validation.js.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts +21 -0
- package/dist/layer3/anthropic/providers/anthropic.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/anthropic.js +266 -0
- package/dist/layer3/anthropic/providers/anthropic.js.map +1 -0
- package/dist/layer3/anthropic/providers/index.d.ts +8 -0
- package/dist/layer3/anthropic/providers/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/index.js +15 -0
- package/dist/layer3/anthropic/providers/index.js.map +1 -0
- package/dist/layer3/anthropic/providers/openai.d.ts +18 -0
- package/dist/layer3/anthropic/providers/openai.d.ts.map +1 -0
- package/dist/layer3/anthropic/providers/openai.js +340 -0
- package/dist/layer3/anthropic/providers/openai.js.map +1 -0
- package/dist/layer3/anthropic/request-builder.d.ts +20 -0
- package/dist/layer3/anthropic/request-builder.d.ts.map +1 -0
- package/dist/layer3/anthropic/request-builder.js +134 -0
- package/dist/layer3/anthropic/request-builder.js.map +1 -0
- package/dist/layer3/anthropic/types.d.ts +88 -0
- package/dist/layer3/anthropic/types.d.ts.map +1 -0
- package/dist/layer3/anthropic/types.js +38 -0
- package/dist/layer3/anthropic/types.js.map +1 -0
- package/dist/layer3/anthropic/utils/index.d.ts +9 -0
- package/dist/layer3/anthropic/utils/index.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/index.js +24 -0
- package/dist/layer3/anthropic/utils/index.js.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts +21 -0
- package/dist/layer3/anthropic/utils/path-helpers.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/path-helpers.js +69 -0
- package/dist/layer3/anthropic/utils/path-helpers.js.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts +40 -0
- package/dist/layer3/anthropic/utils/response-parser.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/response-parser.js +285 -0
- package/dist/layer3/anthropic/utils/response-parser.js.map +1 -0
- package/dist/layer3/anthropic/utils/retry.d.ts +15 -0
- package/dist/layer3/anthropic/utils/retry.d.ts.map +1 -0
- package/dist/layer3/anthropic/utils/retry.js +62 -0
- package/dist/layer3/anthropic/utils/retry.js.map +1 -0
- package/dist/layer3/index.d.ts +1 -0
- package/dist/layer3/index.d.ts.map +1 -1
- package/dist/layer3/index.js +16 -6
- package/dist/layer3/index.js.map +1 -1
- package/dist/layer3/osv-check.d.ts +75 -0
- package/dist/layer3/osv-check.d.ts.map +1 -0
- package/dist/layer3/osv-check.js +308 -0
- package/dist/layer3/osv-check.js.map +1 -0
- package/dist/rules/framework-fixes.d.ts +48 -0
- package/dist/rules/framework-fixes.d.ts.map +1 -0
- package/dist/rules/framework-fixes.js +439 -0
- package/dist/rules/framework-fixes.js.map +1 -0
- package/dist/rules/index.d.ts +8 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +18 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/metadata.d.ts +43 -0
- package/dist/rules/metadata.d.ts.map +1 -0
- package/dist/rules/metadata.js +734 -0
- package/dist/rules/metadata.js.map +1 -0
- package/dist/suppression/config-loader.d.ts +74 -0
- package/dist/suppression/config-loader.d.ts.map +1 -0
- package/dist/suppression/config-loader.js +424 -0
- package/dist/suppression/config-loader.js.map +1 -0
- package/dist/suppression/hash.d.ts +48 -0
- package/dist/suppression/hash.d.ts.map +1 -0
- package/dist/suppression/hash.js +88 -0
- package/dist/suppression/hash.js.map +1 -0
- package/dist/suppression/index.d.ts +11 -0
- package/dist/suppression/index.d.ts.map +1 -0
- package/dist/suppression/index.js +39 -0
- package/dist/suppression/index.js.map +1 -0
- package/dist/suppression/inline-parser.d.ts +39 -0
- package/dist/suppression/inline-parser.d.ts.map +1 -0
- package/dist/suppression/inline-parser.js +218 -0
- package/dist/suppression/inline-parser.js.map +1 -0
- package/dist/suppression/manager.d.ts +94 -0
- package/dist/suppression/manager.d.ts.map +1 -0
- package/dist/suppression/manager.js +292 -0
- package/dist/suppression/manager.js.map +1 -0
- package/dist/suppression/types.d.ts +151 -0
- package/dist/suppression/types.d.ts.map +1 -0
- package/dist/suppression/types.js +28 -0
- package/dist/suppression/types.js.map +1 -0
- package/dist/tiers.d.ts +1 -1
- package/dist/tiers.d.ts.map +1 -1
- package/dist/tiers.js +27 -0
- package/dist/tiers.js.map +1 -1
- package/dist/types.d.ts +62 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/context-helpers.d.ts +4 -0
- package/dist/utils/context-helpers.d.ts.map +1 -1
- package/dist/utils/context-helpers.js +13 -9
- package/dist/utils/context-helpers.js.map +1 -1
- package/package.json +4 -2
- package/src/__tests__/benchmark/fixtures/layer1/mcp-config-audit.json +31 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-execution-sinks.ts +1489 -82
- package/src/__tests__/benchmark/fixtures/layer2/ai-mcp-security.ts +495 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-package-hallucination.ts +255 -0
- package/src/__tests__/benchmark/fixtures/layer2/ai-prompt-hygiene.ts +300 -1
- package/src/__tests__/benchmark/fixtures/layer2/ai-rag-safety.ts +139 -0
- package/src/__tests__/benchmark/fixtures/layer2/byok-patterns.ts +7 -0
- package/src/__tests__/benchmark/fixtures/layer2/data-exposure.ts +63 -0
- package/src/__tests__/benchmark/fixtures/layer2/excessive-agency.ts +221 -0
- package/src/__tests__/benchmark/fixtures/layer2/index.ts +18 -0
- package/src/__tests__/benchmark/fixtures/layer2/model-supply-chain.ts +204 -0
- package/src/__tests__/benchmark/fixtures/layer2/phase1-enhancements.ts +157 -0
- package/src/__tests__/snapshots/__snapshots__/anthropic-validation-refactor.test.ts.snap +758 -0
- package/src/__tests__/snapshots/__snapshots__/dangerous-functions-refactor.test.ts.snap +503 -0
- package/src/__tests__/snapshots/anthropic-validation-refactor.test.ts +321 -0
- package/src/__tests__/snapshots/dangerous-functions-refactor.test.ts +439 -0
- package/src/baseline/__tests__/diff.test.ts +261 -0
- package/src/baseline/__tests__/manager.test.ts +225 -0
- package/src/baseline/diff.ts +135 -0
- package/src/baseline/index.ts +29 -0
- package/src/baseline/manager.ts +230 -0
- package/src/baseline/types.ts +97 -0
- package/src/formatters/cli-terminal.ts +444 -41
- package/src/formatters/github-comment.ts +79 -11
- package/src/formatters/index.ts +4 -0
- package/src/index.ts +197 -14
- package/src/layer1/config-audit.ts +24 -3
- package/src/layer1/config-mcp-audit.ts +276 -0
- package/src/layer1/index.ts +16 -6
- package/src/layer2/ai-agent-tools.ts +336 -0
- package/src/layer2/ai-endpoint-protection.ts +16 -3
- package/src/layer2/ai-execution-sinks.ts +516 -12
- package/src/layer2/ai-fingerprinting.ts +5 -1
- package/src/layer2/ai-mcp-security.ts +730 -0
- package/src/layer2/ai-package-hallucination.ts +791 -0
- package/src/layer2/ai-prompt-hygiene.ts +547 -9
- package/src/layer2/ai-rag-safety.ts +382 -3
- package/src/layer2/auth-antipatterns.ts +5 -0
- package/src/layer2/byok-patterns.ts +5 -1
- package/src/layer2/dangerous-functions/child-process.ts +98 -0
- package/src/layer2/dangerous-functions/dom-xss.ts +220 -0
- package/src/layer2/dangerous-functions/index.ts +949 -0
- package/src/layer2/dangerous-functions/json-parse.ts +385 -0
- package/src/layer2/dangerous-functions/math-random.ts +537 -0
- package/src/layer2/dangerous-functions/patterns.ts +174 -0
- package/src/layer2/dangerous-functions/request-validation.ts +145 -0
- package/src/layer2/dangerous-functions/utils/control-flow.ts +162 -0
- package/src/layer2/dangerous-functions/utils/helpers.ts +170 -0
- package/src/layer2/dangerous-functions/utils/index.ts +25 -0
- package/src/layer2/dangerous-functions/utils/schema-validation.ts +91 -0
- package/src/layer2/data-exposure.ts +5 -1
- package/src/layer2/framework-checks.ts +5 -0
- package/src/layer2/index.ts +63 -1
- package/src/layer2/logic-gates.ts +5 -0
- package/src/layer2/model-supply-chain.ts +456 -0
- package/src/layer2/risky-imports.ts +5 -0
- package/src/layer2/variables.ts +5 -0
- package/src/layer3/__tests__/osv-check.test.ts +384 -0
- package/src/layer3/anthropic/auto-dismiss.ts +212 -0
- package/src/layer3/anthropic/clients.ts +84 -0
- package/src/layer3/anthropic/index.ts +170 -0
- package/src/layer3/anthropic/prompts/index.ts +14 -0
- package/src/layer3/anthropic/prompts/semantic-analysis.ts +173 -0
- package/src/layer3/anthropic/prompts/validation.ts +419 -0
- package/src/layer3/anthropic/providers/anthropic.ts +310 -0
- package/src/layer3/anthropic/providers/index.ts +8 -0
- package/src/layer3/anthropic/providers/openai.ts +384 -0
- package/src/layer3/anthropic/request-builder.ts +150 -0
- package/src/layer3/anthropic/types.ts +148 -0
- package/src/layer3/anthropic/utils/index.ts +26 -0
- package/src/layer3/anthropic/utils/path-helpers.ts +68 -0
- package/src/layer3/anthropic/utils/response-parser.ts +322 -0
- package/src/layer3/anthropic/utils/retry.ts +75 -0
- package/src/layer3/index.ts +18 -5
- package/src/layer3/osv-check.ts +420 -0
- package/src/rules/__tests__/framework-fixes.test.ts +689 -0
- package/src/rules/__tests__/metadata.test.ts +218 -0
- package/src/rules/framework-fixes.ts +470 -0
- package/src/rules/index.ts +21 -0
- package/src/rules/metadata.ts +831 -0
- package/src/suppression/__tests__/config-loader.test.ts +382 -0
- package/src/suppression/__tests__/hash.test.ts +166 -0
- package/src/suppression/__tests__/inline-parser.test.ts +212 -0
- package/src/suppression/__tests__/manager.test.ts +415 -0
- package/src/suppression/config-loader.ts +462 -0
- package/src/suppression/hash.ts +95 -0
- package/src/suppression/index.ts +51 -0
- package/src/suppression/inline-parser.ts +273 -0
- package/src/suppression/manager.ts +379 -0
- package/src/suppression/types.ts +174 -0
- package/src/tiers.ts +36 -0
- package/src/types.ts +90 -0
- package/src/utils/context-helpers.ts +13 -9
- package/dist/layer2/dangerous-functions.d.ts +0 -7
- package/dist/layer2/dangerous-functions.d.ts.map +0 -1
- package/dist/layer2/dangerous-functions.js +0 -1701
- package/dist/layer2/dangerous-functions.js.map +0 -1
- package/dist/layer3/anthropic.d.ts +0 -87
- package/dist/layer3/anthropic.d.ts.map +0 -1
- package/dist/layer3/anthropic.js +0 -1948
- package/dist/layer3/anthropic.js.map +0 -1
- package/dist/layer3/openai.d.ts +0 -25
- package/dist/layer3/openai.d.ts.map +0 -1
- package/dist/layer3/openai.js +0 -238
- package/dist/layer3/openai.js.map +0 -1
- package/src/layer2/dangerous-functions.ts +0 -1940
- package/src/layer3/anthropic.ts +0 -2257
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-package-hallucination.js","sourceRoot":"","sources":["../../src/layer2/ai-package-hallucination.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-prompt-hygiene.d.ts","sourceRoot":"","sources":["../../src/layer2/ai-prompt-hygiene.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAA;AAQpE;;GAEG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA0BpE;
|
|
1
|
+
{"version":3,"file":"ai-prompt-hygiene.d.ts","sourceRoot":"","sources":["../../src/layer2/ai-prompt-hygiene.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAA;AAQpE;;GAEG;AACH,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CA0BpE;AA6lBD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,aAAa,EAAE,CA0RjB;AAGD,OAAO,EAAE,gBAAgB,EAAE,CAAA"}
|
|
@@ -108,14 +108,88 @@ const UNSAFE_INTERPOLATION_PATTERNS = [
|
|
|
108
108
|
checkDelimiters: true,
|
|
109
109
|
},
|
|
110
110
|
];
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Secret Patterns - Comprehensive provider-specific detection
|
|
113
|
+
// ============================================================================
|
|
114
|
+
/**
|
|
115
|
+
* Provider-specific secret patterns with known prefixes
|
|
116
|
+
* These are high-confidence patterns that don't need context matching
|
|
117
|
+
*/
|
|
118
|
+
const KNOWN_SECRET_PREFIXES = [
|
|
119
|
+
// OpenAI
|
|
120
|
+
{ name: 'OpenAI API Key', pattern: /sk-[a-zA-Z0-9]{20,}/g, severity: 'critical' },
|
|
121
|
+
{ name: 'OpenAI Project Key', pattern: /sk-proj-[a-zA-Z0-9]{48,}/g, severity: 'critical' },
|
|
122
|
+
// Anthropic
|
|
123
|
+
{ name: 'Anthropic API Key', pattern: /sk-ant-[a-zA-Z0-9-]{20,}/g, severity: 'critical' },
|
|
124
|
+
{ name: 'Anthropic Full Key', pattern: /sk-ant-api03-[a-zA-Z0-9_-]{90,}/g, severity: 'critical' },
|
|
125
|
+
// GitHub
|
|
126
|
+
{ name: 'GitHub PAT', pattern: /ghp_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
|
|
127
|
+
{ name: 'GitHub OAuth', pattern: /gho_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
|
|
128
|
+
{ name: 'GitHub App Token', pattern: /ghu_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
|
|
129
|
+
{ name: 'GitHub Refresh Token', pattern: /ghr_[a-zA-Z0-9]{36,}/g, severity: 'critical' },
|
|
130
|
+
{ name: 'GitHub Fine-grained PAT', pattern: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/g, severity: 'critical' },
|
|
131
|
+
// Stripe
|
|
132
|
+
{ name: 'Stripe Live Secret', pattern: /sk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
|
|
133
|
+
{ name: 'Stripe Test Secret', pattern: /sk_test_[a-zA-Z0-9]{24,}/g, severity: 'medium' },
|
|
134
|
+
{ name: 'Stripe Restricted Key', pattern: /rk_live_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
|
|
135
|
+
// AWS
|
|
136
|
+
{ name: 'AWS Access Key', pattern: /AKIA[0-9A-Z]{16}/g, severity: 'critical' },
|
|
137
|
+
{ name: 'AWS Session Token', pattern: /ASIA[0-9A-Z]{16}/g, severity: 'critical' },
|
|
138
|
+
// Google
|
|
139
|
+
{ name: 'Google API Key', pattern: /AIza[0-9A-Za-z-_]{35}/g, severity: 'high' },
|
|
140
|
+
// Slack
|
|
141
|
+
{ name: 'Slack Bot Token', pattern: /xoxb-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
|
|
142
|
+
{ name: 'Slack User Token', pattern: /xoxp-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
|
|
143
|
+
{ name: 'Slack App Token', pattern: /xoxa-[0-9a-zA-Z-]{50,}/g, severity: 'critical' },
|
|
144
|
+
{ name: 'Slack Legacy Token', pattern: /xox[baprs]-[0-9a-zA-Z]{10,}/g, severity: 'critical' },
|
|
145
|
+
// Twilio
|
|
146
|
+
{ name: 'Twilio API Key', pattern: /SK[a-f0-9]{32}/g, severity: 'critical' },
|
|
147
|
+
{ name: 'Twilio Account SID', pattern: /AC[a-f0-9]{32}/g, severity: 'high' },
|
|
148
|
+
// SendGrid
|
|
149
|
+
{ name: 'SendGrid API Key', pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/g, severity: 'critical' },
|
|
150
|
+
// Mailgun
|
|
151
|
+
{ name: 'Mailgun API Key', pattern: /key-[a-zA-Z0-9]{32}/g, severity: 'critical' },
|
|
152
|
+
// NPM/PyPI
|
|
153
|
+
{ name: 'NPM Token', pattern: /npm_[a-zA-Z0-9]{36}/g, severity: 'critical' },
|
|
154
|
+
{ name: 'PyPI Token', pattern: /pypi-[a-zA-Z0-9]{32,}/g, severity: 'critical' },
|
|
155
|
+
// Vercel/Netlify
|
|
156
|
+
{ name: 'Vercel Token', pattern: /vercel_[a-zA-Z0-9]{24,}/g, severity: 'critical' },
|
|
157
|
+
{ name: 'Netlify Token', pattern: /nfp_[a-zA-Z0-9]{40,}/g, severity: 'critical' },
|
|
158
|
+
// Square
|
|
159
|
+
{ name: 'Square Access Token', pattern: /sq0csp-[a-zA-Z0-9-_]{43}/g, severity: 'critical' },
|
|
160
|
+
{ name: 'Square OAuth Secret', pattern: /sq0csp-[a-zA-Z0-9-_]{40,}/g, severity: 'critical' },
|
|
161
|
+
// Shopify
|
|
162
|
+
{ name: 'Shopify Access Token', pattern: /shpat_[a-fA-F0-9]{32}/g, severity: 'critical' },
|
|
163
|
+
{ name: 'Shopify Private App', pattern: /shppa_[a-fA-F0-9]{32}/g, severity: 'critical' },
|
|
164
|
+
// Datadog
|
|
165
|
+
{ name: 'Datadog API Key', pattern: /dd[a-z]{1}[a-f0-9]{39}/g, severity: 'critical' },
|
|
166
|
+
// HuggingFace
|
|
167
|
+
{ name: 'HuggingFace Token', pattern: /hf_[a-zA-Z0-9]{34,}/g, severity: 'critical' },
|
|
168
|
+
// Replicate
|
|
169
|
+
{ name: 'Replicate API Token', pattern: /r8_[a-zA-Z0-9]{37}/g, severity: 'critical' },
|
|
170
|
+
// OpenRouter
|
|
171
|
+
{ name: 'OpenRouter Key', pattern: /sk-or-v1-[a-zA-Z0-9]{64}/g, severity: 'critical' },
|
|
172
|
+
// Cohere
|
|
173
|
+
{ name: 'Cohere API Key', pattern: /[a-zA-Z0-9]{40}(?=.*cohere)/gi, severity: 'high' },
|
|
174
|
+
// Private Keys
|
|
175
|
+
{ name: 'Private Key', pattern: /-----BEGIN\s+(?:RSA\s+|EC\s+|DSA\s+|OPENSSH\s+)?PRIVATE\s+KEY-----/g, severity: 'critical' },
|
|
176
|
+
// JWT Tokens (full format)
|
|
177
|
+
{ name: 'JWT Token', pattern: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g, severity: 'high' },
|
|
178
|
+
// Database URLs with credentials
|
|
179
|
+
{ name: 'Database URL', pattern: /(mongodb|postgres|mysql|redis|amqp)(\+srv)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi, severity: 'critical' },
|
|
180
|
+
// Webhook URLs (often contain secrets)
|
|
181
|
+
{ name: 'Slack Webhook', pattern: /https:\/\/hooks\.slack\.com\/services\/T[a-zA-Z0-9_]+\/B[a-zA-Z0-9_]+\/[a-zA-Z0-9_]+/g, severity: 'high' },
|
|
182
|
+
{ name: 'Discord Webhook', pattern: /https:\/\/discord(?:app)?\.com\/api\/webhooks\/[0-9]+\/[a-zA-Z0-9_-]+/g, severity: 'high' },
|
|
183
|
+
];
|
|
111
184
|
/**
|
|
112
|
-
* B3: Secrets in prompt context patterns
|
|
185
|
+
* B3: Secrets in prompt context patterns (original context-aware patterns)
|
|
186
|
+
* Note: Using [^\n;]* instead of [^;]* to prevent matching across lines
|
|
113
187
|
*/
|
|
114
188
|
const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
115
|
-
// API keys in message content
|
|
189
|
+
// API keys in message content (same line only)
|
|
116
190
|
{
|
|
117
191
|
name: 'API key in prompt content',
|
|
118
|
-
pattern: /(?:messages|prompt|system|content)\s*[=:][
|
|
192
|
+
pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:sk-[a-zA-Z0-9]{20,}|api[_-]?key\s*[:=]\s*['"][^'"]{16,}['"])/gi,
|
|
119
193
|
severity: 'critical',
|
|
120
194
|
description: 'API key appears to be hardcoded in prompt content. Keys in prompts may be logged, cached, or sent to model providers.',
|
|
121
195
|
suggestedFix: 'Never include API keys in prompts. Use environment variables and keep them server-side only.',
|
|
@@ -123,7 +197,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
|
123
197
|
// AWS keys in prompts
|
|
124
198
|
{
|
|
125
199
|
name: 'AWS credentials in prompt',
|
|
126
|
-
pattern: /(?:messages|prompt|system|content)\s*[=:][
|
|
200
|
+
pattern: /(?:messages|prompt|system|content)\s*[=:][^\n;]*(?:AKIA[A-Z0-9]{16}|aws[_-]?(?:secret|access)[_-]?key)/gi,
|
|
127
201
|
severity: 'critical',
|
|
128
202
|
description: 'AWS credentials detected in prompt content.',
|
|
129
203
|
suggestedFix: 'Remove credentials from prompts. Use IAM roles or environment variables instead.',
|
|
@@ -131,7 +205,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
|
131
205
|
// Database URLs with credentials
|
|
132
206
|
{
|
|
133
207
|
name: 'Database credentials in prompt',
|
|
134
|
-
pattern: /(?:messages|prompt|system|content)
|
|
208
|
+
pattern: /(?:messages|prompt|system|content)[^\n]*(?:mongodb|postgres|mysql|redis):\/\/[^:]+:[^@]+@/gi,
|
|
135
209
|
severity: 'critical',
|
|
136
210
|
description: 'Database connection string with credentials in prompt. This exposes database access.',
|
|
137
211
|
suggestedFix: 'Never include connection strings in prompts. Reference data by ID instead.',
|
|
@@ -139,7 +213,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
|
139
213
|
// Passwords in prompt context
|
|
140
214
|
{
|
|
141
215
|
name: 'Password in prompt content',
|
|
142
|
-
pattern: /(?:messages|prompt|content)\s*[=:]
|
|
216
|
+
pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:password|passwd|pwd)\s*[:=]\s*['"`][^'"`]{8,}/gi,
|
|
143
217
|
severity: 'high',
|
|
144
218
|
description: 'Password appears in prompt content. This may be logged or exposed to model providers.',
|
|
145
219
|
suggestedFix: 'Remove passwords from prompts. Use authentication tokens or session references instead.',
|
|
@@ -147,7 +221,7 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
|
147
221
|
// Private keys
|
|
148
222
|
{
|
|
149
223
|
name: 'Private key in prompt',
|
|
150
|
-
pattern: /(?:messages|prompt|content)
|
|
224
|
+
pattern: /(?:messages|prompt|content)[^\n]*(?:-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/gi,
|
|
151
225
|
severity: 'critical',
|
|
152
226
|
description: 'Private key material detected in prompt context.',
|
|
153
227
|
suggestedFix: 'Never include private keys in prompts. Sign data server-side instead.',
|
|
@@ -155,12 +229,300 @@ const SECRETS_IN_PROMPTS_PATTERNS = [
|
|
|
155
229
|
// Generic token patterns
|
|
156
230
|
{
|
|
157
231
|
name: 'Access token in prompt',
|
|
158
|
-
pattern: /(?:messages|prompt|content)\s*[=:]
|
|
232
|
+
pattern: /(?:messages|prompt|content)\s*[=:][^\n]*(?:access[_-]?token|auth[_-]?token|bearer)\s*[:=]\s*['"`][a-zA-Z0-9_.-]{20,}/gi,
|
|
159
233
|
severity: 'high',
|
|
160
234
|
description: 'Access token detected in prompt content. Tokens in prompts risk exposure.',
|
|
161
235
|
suggestedFix: 'Do not include tokens in prompts. Pass token context through secure server-side channels.',
|
|
162
236
|
},
|
|
163
237
|
];
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// Variable Flow Detection - Secrets flowing into prompts
|
|
240
|
+
// ============================================================================
|
|
241
|
+
/**
|
|
242
|
+
* Patterns for detecting secret variable declarations
|
|
243
|
+
*/
|
|
244
|
+
const SECRET_VARIABLE_PATTERNS = [
|
|
245
|
+
// Direct assignment patterns
|
|
246
|
+
/(?:const|let|var)\s+(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*=\s*['"`]([^'"`]{16,})['"`]/gi,
|
|
247
|
+
// Object property patterns
|
|
248
|
+
/(\w*(?:key|token|secret|password|credential|apiKey|authToken|accessToken)\w*)\s*:\s*['"`]([^'"`]{16,})['"`]/gi,
|
|
249
|
+
];
|
|
250
|
+
/**
|
|
251
|
+
* Patterns for detecting prompt variable usage
|
|
252
|
+
*/
|
|
253
|
+
const PROMPT_USAGE_PATTERNS = [
|
|
254
|
+
// Template literal interpolation
|
|
255
|
+
/`[^`]*\$\{(\w+)\}[^`]*`/g,
|
|
256
|
+
// String concatenation
|
|
257
|
+
/\+\s*(\w+)\s*(?:\+|$)/g,
|
|
258
|
+
// f-string interpolation (Python)
|
|
259
|
+
/f['"][^'"]*\{(\w+)\}[^'"]*['"]/g,
|
|
260
|
+
// Format string
|
|
261
|
+
/\.format\s*\([^)]*(\w+)[^)]*\)/g,
|
|
262
|
+
];
|
|
263
|
+
/**
|
|
264
|
+
* Check if a variable name suggests it contains a secret
|
|
265
|
+
*/
|
|
266
|
+
function isSecretVariableName(varName) {
|
|
267
|
+
const secretIndicators = [
|
|
268
|
+
/api[_-]?key/i,
|
|
269
|
+
/secret[_-]?key/i,
|
|
270
|
+
/access[_-]?token/i,
|
|
271
|
+
/auth[_-]?token/i,
|
|
272
|
+
/password/i,
|
|
273
|
+
/credential/i,
|
|
274
|
+
/private[_-]?key/i,
|
|
275
|
+
/bearer/i,
|
|
276
|
+
/jwt/i,
|
|
277
|
+
/oauth/i,
|
|
278
|
+
/^sk_/i,
|
|
279
|
+
/^pk_/i,
|
|
280
|
+
/token$/i,
|
|
281
|
+
/key$/i,
|
|
282
|
+
/secret$/i,
|
|
283
|
+
];
|
|
284
|
+
return secretIndicators.some(p => p.test(varName));
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Detect secrets flowing from variables into prompts (variable indirection)
|
|
288
|
+
*/
|
|
289
|
+
function detectSecretVariableFlow(content, filePath, isTestFile) {
|
|
290
|
+
const vulnerabilities = [];
|
|
291
|
+
const lines = content.split('\n');
|
|
292
|
+
// First pass: collect all secret variable declarations
|
|
293
|
+
const secretVariables = new Map();
|
|
294
|
+
for (let i = 0; i < lines.length; i++) {
|
|
295
|
+
const line = lines[i];
|
|
296
|
+
if ((0, context_helpers_1.isComment)(line))
|
|
297
|
+
continue;
|
|
298
|
+
for (const pattern of SECRET_VARIABLE_PATTERNS) {
|
|
299
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
300
|
+
let match;
|
|
301
|
+
while ((match = regex.exec(line)) !== null) {
|
|
302
|
+
const varName = match[1];
|
|
303
|
+
const value = match[2];
|
|
304
|
+
// Check if variable name suggests it's a secret
|
|
305
|
+
if (isSecretVariableName(varName)) {
|
|
306
|
+
secretVariables.set(varName, { line: i + 1, value });
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Second pass: find where these variables flow into prompts
|
|
312
|
+
const promptContextPatterns = [
|
|
313
|
+
/(?:system|prompt|message|content)\s*[:=]/i,
|
|
314
|
+
/role:\s*['"`](?:system|user|assistant)['"`]/i,
|
|
315
|
+
/\.chat\.completions?\.create/i,
|
|
316
|
+
/\.messages\.create/i,
|
|
317
|
+
/messages\s*:\s*\[/i,
|
|
318
|
+
];
|
|
319
|
+
for (let i = 0; i < lines.length; i++) {
|
|
320
|
+
const line = lines[i];
|
|
321
|
+
if ((0, context_helpers_1.isComment)(line))
|
|
322
|
+
continue;
|
|
323
|
+
// Check if this line or nearby lines are in prompt context
|
|
324
|
+
const contextWindow = lines.slice(Math.max(0, i - 5), Math.min(lines.length, i + 5)).join('\n');
|
|
325
|
+
const isPromptContext = promptContextPatterns.some(p => p.test(contextWindow));
|
|
326
|
+
if (!isPromptContext)
|
|
327
|
+
continue;
|
|
328
|
+
// Check for template interpolation of secret variables
|
|
329
|
+
const templateMatch = line.match(/\$\{(\w+)\}/);
|
|
330
|
+
if (templateMatch) {
|
|
331
|
+
const varName = templateMatch[1];
|
|
332
|
+
if (secretVariables.has(varName)) {
|
|
333
|
+
const secretInfo = secretVariables.get(varName);
|
|
334
|
+
let severity = 'high';
|
|
335
|
+
let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is interpolated into LLM prompt. This exposes the secret to the model provider.`;
|
|
336
|
+
if (isTestFile) {
|
|
337
|
+
severity = 'low';
|
|
338
|
+
description += ' (in test file)';
|
|
339
|
+
}
|
|
340
|
+
vulnerabilities.push({
|
|
341
|
+
id: `secret-flow-${filePath}-${i + 1}-${varName}`,
|
|
342
|
+
filePath,
|
|
343
|
+
lineNumber: i + 1,
|
|
344
|
+
lineContent: line.trim(),
|
|
345
|
+
severity,
|
|
346
|
+
category: 'hardcoded_secret',
|
|
347
|
+
title: `Secret variable '${varName}' in prompt`,
|
|
348
|
+
description,
|
|
349
|
+
suggestedFix: `Remove the secret from the prompt. If the AI needs to use an API, make the call server-side instead of passing credentials to the model.`,
|
|
350
|
+
confidence: 'medium',
|
|
351
|
+
layer: 2,
|
|
352
|
+
requiresAIValidation: true,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Check for string concatenation with secret variables
|
|
357
|
+
for (const [varName] of secretVariables) {
|
|
358
|
+
if (line.includes(`+ ${varName}`) || line.includes(`${varName} +`) || line.includes(`+ ${varName} +`)) {
|
|
359
|
+
const secretInfo = secretVariables.get(varName);
|
|
360
|
+
let severity = 'high';
|
|
361
|
+
let description = `Secret variable '${varName}' (defined at line ${secretInfo.line}) is concatenated into prompt. This exposes the secret to the model provider.`;
|
|
362
|
+
if (isTestFile) {
|
|
363
|
+
severity = 'low';
|
|
364
|
+
description += ' (in test file)';
|
|
365
|
+
}
|
|
366
|
+
vulnerabilities.push({
|
|
367
|
+
id: `secret-concat-${filePath}-${i + 1}-${varName}`,
|
|
368
|
+
filePath,
|
|
369
|
+
lineNumber: i + 1,
|
|
370
|
+
lineContent: line.trim(),
|
|
371
|
+
severity,
|
|
372
|
+
category: 'hardcoded_secret',
|
|
373
|
+
title: `Secret variable '${varName}' concatenated in prompt`,
|
|
374
|
+
description,
|
|
375
|
+
suggestedFix: `Remove the secret from the prompt. If the AI needs to use an API, make the call server-side.`,
|
|
376
|
+
confidence: 'medium',
|
|
377
|
+
layer: 2,
|
|
378
|
+
requiresAIValidation: true,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return vulnerabilities;
|
|
384
|
+
}
|
|
385
|
+
// ============================================================================
|
|
386
|
+
// Phase 2: Indirect Prompt Injection Detection
|
|
387
|
+
// ============================================================================
|
|
388
|
+
/**
|
|
389
|
+
* Check if content filtering/sanitization is present for external content
|
|
390
|
+
*/
|
|
391
|
+
function hasContentFiltering(content, lineNumber) {
|
|
392
|
+
const lines = content.split('\n');
|
|
393
|
+
const contextStart = Math.max(0, lineNumber - 20);
|
|
394
|
+
const contextEnd = Math.min(lines.length, lineNumber + 10);
|
|
395
|
+
const context = lines.slice(contextStart, contextEnd).join('\n');
|
|
396
|
+
const filteringPatterns = [
|
|
397
|
+
/filterContent|sanitizeContent|cleanContent/i,
|
|
398
|
+
/sanitizeContext|filterContext/i,
|
|
399
|
+
/contentModeration|moderateContent/i,
|
|
400
|
+
/stripInstructions|removeInstructions/i,
|
|
401
|
+
/escapePrompt|sanitizePrompt/i,
|
|
402
|
+
/validateInput|inputValidation/i,
|
|
403
|
+
];
|
|
404
|
+
return filteringPatterns.some(p => p.test(context));
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Check if proper delimiters are used for external content
|
|
408
|
+
*/
|
|
409
|
+
function hasExternalContentDelimiters(content, lineNumber) {
|
|
410
|
+
const lines = content.split('\n');
|
|
411
|
+
const contextStart = Math.max(0, lineNumber - 15);
|
|
412
|
+
const contextEnd = Math.min(lines.length, lineNumber + 15);
|
|
413
|
+
const context = lines.slice(contextStart, contextEnd).join('\n');
|
|
414
|
+
const delimiterPatterns = [
|
|
415
|
+
/<context>|<\/context>/i,
|
|
416
|
+
/<document>|<\/document>/i,
|
|
417
|
+
/<retrieved>|<\/retrieved>/i,
|
|
418
|
+
/<external>|<\/external>/i,
|
|
419
|
+
/```[^`]*context|context[^`]*```/i,
|
|
420
|
+
/---\s*(?:context|document|retrieved)/i,
|
|
421
|
+
/\[CONTEXT\]|\[\/CONTEXT\]/i,
|
|
422
|
+
/\[DOCUMENT\]|\[\/DOCUMENT\]/i,
|
|
423
|
+
];
|
|
424
|
+
return delimiterPatterns.some(p => p.test(context));
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Indirect prompt injection patterns - external content flowing to LLM context
|
|
428
|
+
*/
|
|
429
|
+
const INDIRECT_INJECTION_PATTERNS = [
|
|
430
|
+
// ========== External Fetch to Prompt ==========
|
|
431
|
+
{
|
|
432
|
+
name: 'Fetched content in prompt',
|
|
433
|
+
pattern: /fetch\s*\([^)]+\)[\s\S]{0,100}(?:\.then|await)[\s\S]{0,200}(?:prompt|messages|content\s*:)/gi,
|
|
434
|
+
severity: 'high',
|
|
435
|
+
description: 'Content fetched from external URL flows into LLM prompt. Malicious websites can embed instructions that hijack the model\'s behavior (indirect prompt injection).',
|
|
436
|
+
suggestedFix: 'Wrap external content with clear delimiters: <external_content>...</external_content>. Implement content filtering to strip instruction-like patterns.',
|
|
437
|
+
checkDelimiters: true,
|
|
438
|
+
},
|
|
439
|
+
{
|
|
440
|
+
name: 'HTTP response in system prompt',
|
|
441
|
+
pattern: /(?:axios|fetch|got|request)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=+]/gi,
|
|
442
|
+
severity: 'high',
|
|
443
|
+
description: 'HTTP response content used in system prompt. External data in system prompts is especially dangerous as it can override model instructions.',
|
|
444
|
+
suggestedFix: 'Never put external content in system prompts. Use user messages with clear delimiters for context. Implement content sanitization.',
|
|
445
|
+
checkDelimiters: true,
|
|
446
|
+
},
|
|
447
|
+
// ========== RAG Vector Store to Prompt ==========
|
|
448
|
+
{
|
|
449
|
+
name: 'Vector store results in system message',
|
|
450
|
+
pattern: /(?:vectorStore|similaritySearch|query|search|retrieve)[\s\S]{0,200}role:\s*['"`]system['"`]/gi,
|
|
451
|
+
severity: 'high',
|
|
452
|
+
description: 'Vector store search results injected into system message. Poisoned documents in the corpus can hijack model behavior.',
|
|
453
|
+
suggestedFix: 'Place retrieved content in user messages, not system. Use delimiters: <retrieved_context>...</retrieved_context>. Implement document sanitization before indexing.',
|
|
454
|
+
checkDelimiters: true,
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
name: 'RAG retrieval directly in context',
|
|
458
|
+
pattern: /(?:retriever\.invoke|retrieve|getRelevantDocuments)\s*\([^)]*\)[\s\S]{0,150}(?:context|prompt|messages)/gi,
|
|
459
|
+
severity: 'high',
|
|
460
|
+
description: 'Retrieved documents flow directly into LLM context. Adversarial documents can contain prompt injection payloads.',
|
|
461
|
+
suggestedFix: 'Sanitize retrieved content before including in prompt. Use XML tags to clearly separate context from instructions.',
|
|
462
|
+
checkDelimiters: true,
|
|
463
|
+
},
|
|
464
|
+
// ========== Document Loading to LLM ==========
|
|
465
|
+
{
|
|
466
|
+
name: 'Loaded documents in LLM chain',
|
|
467
|
+
pattern: /(?:loadDocuments|DirectoryLoader|TextLoader|PDFLoader)[\s\S]{0,200}(?:chain|llm|invoke|call)/gi,
|
|
468
|
+
severity: 'high',
|
|
469
|
+
description: 'Documents loaded from files flow into LLM chain. Malicious files (PDFs, docs) can contain hidden prompt injection text.',
|
|
470
|
+
suggestedFix: 'Scan loaded documents for instruction-like patterns. Use separate document processing pipeline with content filtering.',
|
|
471
|
+
checkDelimiters: true,
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
name: 'Document content interpolated',
|
|
475
|
+
pattern: /\$\{.*(?:document|doc|file|page)(?:Content|Text|Data).*\}[\s\S]{0,50}(?:prompt|messages|llm)/gi,
|
|
476
|
+
severity: 'medium',
|
|
477
|
+
description: 'Document content interpolated into LLM prompt. Documents may contain adversarial instructions.',
|
|
478
|
+
suggestedFix: 'Wrap document content with delimiters: ```document\\n${content}\\n```. Implement text sanitization.',
|
|
479
|
+
checkDelimiters: true,
|
|
480
|
+
},
|
|
481
|
+
// ========== Web Scraping to Prompt ==========
|
|
482
|
+
{
|
|
483
|
+
name: 'Scraped content in prompt',
|
|
484
|
+
pattern: /(?:scrape|crawl|spider|puppeteer|playwright|cheerio)[\s\S]{0,200}(?:prompt|messages|context|content\s*:)/gi,
|
|
485
|
+
severity: 'high',
|
|
486
|
+
description: 'Web-scraped content flows into LLM prompt. Malicious websites can embed instructions in their HTML content.',
|
|
487
|
+
suggestedFix: 'Sanitize scraped content to remove instruction-like patterns. Use delimiters: <scraped_content url="...">...</scraped_content>',
|
|
488
|
+
checkDelimiters: true,
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
name: 'HTML content in LLM context',
|
|
492
|
+
pattern: /\.(?:html|innerHTML|textContent|innerText)\s*[\s\S]{0,100}(?:prompt|messages|system|context)/gi,
|
|
493
|
+
severity: 'medium',
|
|
494
|
+
description: 'HTML content from web pages used in LLM context. Web pages can contain hidden prompt injection in metadata, comments, or invisible text.',
|
|
495
|
+
suggestedFix: 'Extract only relevant text content. Filter out scripts, comments, and metadata. Use content sanitization.',
|
|
496
|
+
checkDelimiters: true,
|
|
497
|
+
},
|
|
498
|
+
// ========== Email/Message Content to Prompt ==========
|
|
499
|
+
{
|
|
500
|
+
name: 'Email content in prompt',
|
|
501
|
+
pattern: /(?:email|message|inbox)(?:Content|Body|Text)[\s\S]{0,150}(?:prompt|messages|llm|analyze)/gi,
|
|
502
|
+
severity: 'medium',
|
|
503
|
+
description: 'Email or message content flows into LLM prompt. Attackers can craft emails with embedded prompt injection.',
|
|
504
|
+
suggestedFix: 'Sanitize email content before LLM processing. Remove potentially malicious patterns. Use clear delimiters.',
|
|
505
|
+
checkDelimiters: true,
|
|
506
|
+
},
|
|
507
|
+
// ========== Database Content to Prompt ==========
|
|
508
|
+
{
|
|
509
|
+
name: 'Database record in system prompt',
|
|
510
|
+
pattern: /(?:findOne|findById|query|select)[\s\S]{0,150}(?:system|systemPrompt|instructions)\s*[:=]/gi,
|
|
511
|
+
severity: 'medium',
|
|
512
|
+
description: 'Database content used in system prompt. If users can modify database records, they can inject malicious instructions.',
|
|
513
|
+
suggestedFix: 'Keep system prompts static. Place database content in user messages with delimiters. Validate data before use.',
|
|
514
|
+
checkDelimiters: true,
|
|
515
|
+
},
|
|
516
|
+
// ========== Generic External Data Patterns ==========
|
|
517
|
+
{
|
|
518
|
+
name: 'External data concatenation',
|
|
519
|
+
pattern: /(?:externalData|fetchedContent|scrapedData|retrievedText)\s*\+[\s\S]{0,50}(?:prompt|system|instructions)/gi,
|
|
520
|
+
severity: 'medium',
|
|
521
|
+
description: 'External data concatenated with prompt content without clear separation.',
|
|
522
|
+
suggestedFix: 'Use structured prompts with XML/markdown delimiters to separate instructions from external content.',
|
|
523
|
+
checkDelimiters: true,
|
|
524
|
+
},
|
|
525
|
+
];
|
|
164
526
|
/**
|
|
165
527
|
* Missing boundary patterns - prompts without clear user/system separation
|
|
166
528
|
*/
|
|
@@ -278,7 +640,7 @@ function detectAIPromptHygiene(content, filePath) {
|
|
|
278
640
|
});
|
|
279
641
|
}
|
|
280
642
|
}
|
|
281
|
-
// Scan for secrets in prompts (B3)
|
|
643
|
+
// Scan for secrets in prompts (B3) - Original context-aware patterns
|
|
282
644
|
for (const pattern of SECRETS_IN_PROMPTS_PATTERNS) {
|
|
283
645
|
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
284
646
|
let match;
|
|
@@ -292,6 +654,14 @@ function detectAIPromptHygiene(content, filePath) {
|
|
|
292
654
|
const isEnvRef = /process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent);
|
|
293
655
|
if (isEnvRef)
|
|
294
656
|
continue;
|
|
657
|
+
// Skip test variable names
|
|
658
|
+
if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent))
|
|
659
|
+
continue;
|
|
660
|
+
if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent))
|
|
661
|
+
continue;
|
|
662
|
+
// Skip placeholder/example values in the line
|
|
663
|
+
if (/example|sample|demo|placeholder|your[_-]?api[_-]?key/i.test(lineContent))
|
|
664
|
+
continue;
|
|
295
665
|
let severity = pattern.severity;
|
|
296
666
|
let description = pattern.description;
|
|
297
667
|
// Downgrade test files but still flag
|
|
@@ -315,6 +685,71 @@ function detectAIPromptHygiene(content, filePath) {
|
|
|
315
685
|
});
|
|
316
686
|
}
|
|
317
687
|
}
|
|
688
|
+
// ========== NEW: Direct secret detection with known prefixes ==========
|
|
689
|
+
// Scan for any known secret patterns anywhere in prompt-related code
|
|
690
|
+
const seenSecretLines = new Set(); // Avoid duplicates
|
|
691
|
+
for (const secretDef of KNOWN_SECRET_PREFIXES) {
|
|
692
|
+
const regex = new RegExp(secretDef.pattern.source, secretDef.pattern.flags);
|
|
693
|
+
let match;
|
|
694
|
+
while ((match = regex.exec(content)) !== null) {
|
|
695
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
696
|
+
const lineContent = lines[lineNumber - 1]?.trim() || '';
|
|
697
|
+
// Skip if already reported on this line
|
|
698
|
+
const lineKey = `${lineNumber}-${secretDef.name}`;
|
|
699
|
+
if (seenSecretLines.has(lineNumber))
|
|
700
|
+
continue;
|
|
701
|
+
seenSecretLines.add(lineNumber);
|
|
702
|
+
// Skip comments
|
|
703
|
+
if ((0, context_helpers_1.isComment)(lineContent))
|
|
704
|
+
continue;
|
|
705
|
+
// Skip env var references
|
|
706
|
+
if (/process\.env|import\.meta\.env|os\.environ|getenv/i.test(lineContent))
|
|
707
|
+
continue;
|
|
708
|
+
// Skip obvious placeholders/examples in the value
|
|
709
|
+
const matchValue = match[0];
|
|
710
|
+
if (/example|sample|demo|dummy|fake|mock|your[_-]|placeholder/i.test(matchValue))
|
|
711
|
+
continue;
|
|
712
|
+
if (/example|sample|demo|placeholder/i.test(lineContent))
|
|
713
|
+
continue;
|
|
714
|
+
// Skip values that contain "test" right after the prefix (e.g., sk-test..., ghp_test...)
|
|
715
|
+
// These are clearly test/development keys, not production secrets
|
|
716
|
+
if (/^(sk-|ghp_|gho_|sk_live_|sk_test_|xoxb-|SG\.)test/i.test(matchValue))
|
|
717
|
+
continue;
|
|
718
|
+
if (/[-_]test[-_0-9]/i.test(matchValue))
|
|
719
|
+
continue;
|
|
720
|
+
// Skip test variable names (e.g., TEST_API_KEY, MOCK_SECRET)
|
|
721
|
+
if (/(?:const|let|var)\s+(?:TEST|MOCK|EXAMPLE|DUMMY|FAKE|SAMPLE)[_A-Z0-9]*\s*=/i.test(lineContent))
|
|
722
|
+
continue;
|
|
723
|
+
// Skip if variable name contains test/mock/example (broader check)
|
|
724
|
+
if (/(?:const|let|var)\s+\w*(?:test|mock|example|dummy|fake|sample)\w*\s*=/i.test(lineContent))
|
|
725
|
+
continue;
|
|
726
|
+
let severity = secretDef.severity;
|
|
727
|
+
let description = `${secretDef.name} detected in LLM-related code. This secret may be exposed to the model provider, logged, or cached.`;
|
|
728
|
+
// Downgrade test files
|
|
729
|
+
if (isTestFile) {
|
|
730
|
+
severity = severity === 'critical' ? 'medium' : 'low';
|
|
731
|
+
description += ' (in test file)';
|
|
732
|
+
}
|
|
733
|
+
vulnerabilities.push({
|
|
734
|
+
id: `ai-direct-secret-${filePath}-${lineNumber}-${secretDef.name.replace(/\s+/g, '-')}`,
|
|
735
|
+
filePath,
|
|
736
|
+
lineNumber,
|
|
737
|
+
lineContent,
|
|
738
|
+
severity,
|
|
739
|
+
category: 'hardcoded_secret',
|
|
740
|
+
title: `${secretDef.name} in LLM context`,
|
|
741
|
+
description,
|
|
742
|
+
suggestedFix: 'Remove the hardcoded secret. Use environment variables server-side. Never expose secrets to LLM prompts.',
|
|
743
|
+
confidence: 'high',
|
|
744
|
+
layer: 2,
|
|
745
|
+
requiresAIValidation: false,
|
|
746
|
+
});
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
// ========== NEW: Variable flow detection ==========
|
|
750
|
+
// Detect secrets flowing from variables into prompts
|
|
751
|
+
const flowVulns = detectSecretVariableFlow(content, filePath, isTestFile);
|
|
752
|
+
vulnerabilities.push(...flowVulns);
|
|
318
753
|
// Scan for missing boundary patterns (B1 continued)
|
|
319
754
|
for (const pattern of MISSING_BOUNDARY_PATTERNS) {
|
|
320
755
|
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
@@ -351,6 +786,57 @@ function detectAIPromptHygiene(content, filePath) {
|
|
|
351
786
|
});
|
|
352
787
|
}
|
|
353
788
|
}
|
|
789
|
+
// Scan for indirect prompt injection patterns (Phase 2)
|
|
790
|
+
for (const pattern of INDIRECT_INJECTION_PATTERNS) {
|
|
791
|
+
const regex = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
792
|
+
let match;
|
|
793
|
+
while ((match = regex.exec(content)) !== null) {
|
|
794
|
+
const lineNumber = content.substring(0, match.index).split('\n').length;
|
|
795
|
+
const lineContent = lines[lineNumber - 1]?.trim() || '';
|
|
796
|
+
// Skip comments
|
|
797
|
+
if ((0, context_helpers_1.isComment)(lineContent))
|
|
798
|
+
continue;
|
|
799
|
+
let severity = pattern.severity;
|
|
800
|
+
let description = pattern.description;
|
|
801
|
+
// Check for content filtering/sanitization
|
|
802
|
+
const hasFiltering = hasContentFiltering(content, lineNumber);
|
|
803
|
+
const hasDelimiters = hasExternalContentDelimiters(content, lineNumber);
|
|
804
|
+
if (hasFiltering && hasDelimiters) {
|
|
805
|
+
// Both mitigations present - fully mitigated
|
|
806
|
+
severity = 'info';
|
|
807
|
+
description += ' (Content filtering and delimiters detected - mitigated.)';
|
|
808
|
+
}
|
|
809
|
+
else if (hasFiltering) {
|
|
810
|
+
// Partial mitigation - filtering present
|
|
811
|
+
severity = severity === 'high' ? 'medium' : 'low';
|
|
812
|
+
description += ' (Content filtering detected.)';
|
|
813
|
+
}
|
|
814
|
+
else if (hasDelimiters) {
|
|
815
|
+
// Partial mitigation - delimiters present
|
|
816
|
+
severity = severity === 'high' ? 'medium' : 'low';
|
|
817
|
+
description += ' (External content delimiters detected.)';
|
|
818
|
+
}
|
|
819
|
+
// Downgrade test files
|
|
820
|
+
if (isTestFile) {
|
|
821
|
+
severity = 'info';
|
|
822
|
+
description += ' (in test file)';
|
|
823
|
+
}
|
|
824
|
+
vulnerabilities.push({
|
|
825
|
+
id: `ai-indirect-injection-${filePath}-${lineNumber}-${pattern.name.replace(/\s+/g, '-')}`,
|
|
826
|
+
filePath,
|
|
827
|
+
lineNumber,
|
|
828
|
+
lineContent,
|
|
829
|
+
severity,
|
|
830
|
+
category: 'ai_prompt_injection',
|
|
831
|
+
title: pattern.name + ' (Indirect Injection)',
|
|
832
|
+
description,
|
|
833
|
+
suggestedFix: pattern.suggestedFix,
|
|
834
|
+
confidence: severity === 'info' ? 'low' : 'medium',
|
|
835
|
+
layer: 2,
|
|
836
|
+
requiresAIValidation: severity !== 'info',
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
}
|
|
354
840
|
return vulnerabilities;
|
|
355
841
|
}
|
|
356
842
|
//# sourceMappingURL=ai-prompt-hygiene.js.map
|