agent-threat-rules 0.4.0 → 1.0.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/README.md +161 -52
- package/package.json +3 -1
- package/rules/agent-manipulation/{ATR-2026-030-cross-agent-attack.yaml → ATR-2026-00030-cross-agent-attack.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-032-goal-hijacking.yaml → ATR-2026-00032-goal-hijacking.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-074-cross-agent-privilege-escalation.yaml → ATR-2026-00074-cross-agent-privilege-escalation.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-076-inter-agent-message-spoofing.yaml → ATR-2026-00076-inter-agent-message-spoofing.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-077-human-trust-exploitation.yaml → ATR-2026-00077-human-trust-exploitation.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-108-consensus-sybil-attack.yaml → ATR-2026-00108-consensus-sybil-attack.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-116-a2a-message-validation.yaml → ATR-2026-00116-a2a-message-validation.yaml} +4 -2
- package/rules/agent-manipulation/{ATR-2026-117-agent-identity-spoofing.yaml → ATR-2026-00117-agent-identity-spoofing.yaml} +4 -2
- package/rules/agent-manipulation/{ATR-2026-118-approval-fatigue.yaml → ATR-2026-00118-approval-fatigue.yaml} +3 -1
- package/rules/agent-manipulation/{ATR-2026-119-social-engineering-via-agent.yaml → ATR-2026-00119-social-engineering-via-agent.yaml} +3 -1
- package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +105 -0
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +53 -0
- package/rules/context-exfiltration/{ATR-2026-020-system-prompt-leak.yaml → ATR-2026-00020-system-prompt-leak.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-021-api-key-exposure.yaml → ATR-2026-00021-api-key-exposure.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-075-agent-memory-manipulation.yaml → ATR-2026-00075-agent-memory-manipulation.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-102-disguised-analytics-exfiltration.yaml → ATR-2026-00102-disguised-analytics-exfiltration.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-113-credential-theft.yaml → ATR-2026-00113-credential-theft.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-114-oauth-token-abuse.yaml → ATR-2026-00114-oauth-token-abuse.yaml} +3 -1
- package/rules/context-exfiltration/{ATR-2026-115-env-var-harvesting.yaml → ATR-2026-00115-env-var-harvesting.yaml} +3 -1
- package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +100 -0
- package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +52 -0
- package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +55 -0
- package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +49 -0
- package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +49 -0
- package/rules/data-poisoning/{ATR-2026-070-data-poisoning.yaml → ATR-2026-00070-data-poisoning.yaml} +3 -1
- package/rules/excessive-autonomy/{ATR-2026-050-runaway-agent-loop.yaml → ATR-2026-00050-runaway-agent-loop.yaml} +3 -1
- package/rules/excessive-autonomy/{ATR-2026-051-resource-exhaustion.yaml → ATR-2026-00051-resource-exhaustion.yaml} +3 -1
- package/rules/excessive-autonomy/{ATR-2026-052-cascading-failure.yaml → ATR-2026-00052-cascading-failure.yaml} +3 -1
- package/rules/excessive-autonomy/{ATR-2026-098-unauthorized-financial-action.yaml → ATR-2026-00098-unauthorized-financial-action.yaml} +3 -1
- package/rules/excessive-autonomy/{ATR-2026-099-high-risk-tool-gate.yaml → ATR-2026-00099-high-risk-tool-gate.yaml} +3 -1
- package/rules/model-security/{ATR-2026-072-model-behavior-extraction.yaml → ATR-2026-00072-model-behavior-extraction.yaml} +3 -1
- package/rules/model-security/{ATR-2026-073-malicious-finetuning-data.yaml → ATR-2026-00073-malicious-finetuning-data.yaml} +3 -1
- package/rules/privilege-escalation/{ATR-2026-040-privilege-escalation.yaml → ATR-2026-00040-privilege-escalation.yaml} +3 -1
- package/rules/privilege-escalation/{ATR-2026-041-scope-creep.yaml → ATR-2026-00041-scope-creep.yaml} +3 -1
- package/rules/privilege-escalation/{ATR-2026-107-delayed-execution-bypass.yaml → ATR-2026-00107-delayed-execution-bypass.yaml} +3 -1
- package/rules/privilege-escalation/{ATR-2026-110-eval-injection.yaml → ATR-2026-00110-eval-injection.yaml} +3 -1
- package/rules/privilege-escalation/{ATR-2026-111-shell-escape.yaml → ATR-2026-00111-shell-escape.yaml} +5 -3
- package/rules/privilege-escalation/{ATR-2026-112-dynamic-import-exploitation.yaml → ATR-2026-00112-dynamic-import-exploitation.yaml} +3 -1
- package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +53 -0
- package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +49 -0
- package/rules/prompt-injection/{ATR-2026-001-direct-prompt-injection.yaml → ATR-2026-00001-direct-prompt-injection.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-002-indirect-prompt-injection.yaml → ATR-2026-00002-indirect-prompt-injection.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-003-jailbreak-attempt.yaml → ATR-2026-00003-jailbreak-attempt.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-004-system-prompt-override.yaml → ATR-2026-00004-system-prompt-override.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-005-multi-turn-injection.yaml → ATR-2026-00005-multi-turn-injection.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-080-encoding-evasion.yaml → ATR-2026-00080-encoding-evasion.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-081-semantic-multi-turn.yaml → ATR-2026-00081-semantic-multi-turn.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-082-fingerprint-evasion.yaml → ATR-2026-00082-fingerprint-evasion.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-083-indirect-tool-injection.yaml → ATR-2026-00083-indirect-tool-injection.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-084-structured-data-injection.yaml → ATR-2026-00084-structured-data-injection.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-085-audit-evasion.yaml → ATR-2026-00085-audit-evasion.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-086-visual-spoofing.yaml → ATR-2026-00086-visual-spoofing.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-087-rule-probing.yaml → ATR-2026-00087-rule-probing.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-088-adaptive-countermeasure.yaml → ATR-2026-00088-adaptive-countermeasure.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-089-polymorphic-skill.yaml → ATR-2026-00089-polymorphic-skill.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-090-threat-intel-exfil.yaml → ATR-2026-00090-threat-intel-exfil.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-091-nested-payload.yaml → ATR-2026-00091-nested-payload.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-092-consensus-poisoning.yaml → ATR-2026-00092-consensus-poisoning.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-093-gradual-escalation.yaml → ATR-2026-00093-gradual-escalation.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-094-audit-bypass.yaml → ATR-2026-00094-audit-bypass.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-097-cjk-injection-patterns.yaml → ATR-2026-00097-cjk-injection-patterns.yaml} +3 -1
- package/rules/prompt-injection/{ATR-2026-104-persona-hijacking.yaml → ATR-2026-00104-persona-hijacking.yaml} +3 -1
- package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +103 -0
- package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +99 -0
- package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +117 -0
- package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +51 -0
- package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +52 -0
- package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +71 -0
- package/rules/skill-compromise/{ATR-2026-060-skill-impersonation.yaml → ATR-2026-00060-skill-impersonation.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-061-description-behavior-mismatch.yaml → ATR-2026-00061-description-behavior-mismatch.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-062-hidden-capability.yaml → ATR-2026-00062-hidden-capability.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-063-skill-chain-attack.yaml → ATR-2026-00063-skill-chain-attack.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-064-over-permissioned-skill.yaml → ATR-2026-00064-over-permissioned-skill.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-065-skill-update-attack.yaml → ATR-2026-00065-skill-update-attack.yaml} +3 -1
- package/rules/skill-compromise/{ATR-2026-066-parameter-injection.yaml → ATR-2026-00066-parameter-injection.yaml} +3 -1
- package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +121 -0
- package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +165 -0
- package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +114 -0
- package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +118 -0
- package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +98 -0
- package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +93 -0
- package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +99 -0
- package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +74 -0
- package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +79 -0
- package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +73 -0
- package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +93 -0
- package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +82 -0
- package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +48 -0
- package/rules/tool-poisoning/{ATR-2026-010-mcp-malicious-response.yaml → ATR-2026-00010-mcp-malicious-response.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-011-tool-output-injection.yaml → ATR-2026-00011-tool-output-injection.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-012-unauthorized-tool-call.yaml → ATR-2026-00012-unauthorized-tool-call.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-013-tool-ssrf.yaml → ATR-2026-00013-tool-ssrf.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-095-supply-chain-poisoning.yaml → ATR-2026-00095-supply-chain-poisoning.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-096-registry-poisoning.yaml → ATR-2026-00096-registry-poisoning.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-100-consent-bypass-instruction.yaml → ATR-2026-00100-consent-bypass-instruction.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-101-trust-escalation-override.yaml → ATR-2026-00101-trust-escalation-override.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-103-hidden-safety-bypass-instruction.yaml → ATR-2026-00103-hidden-safety-bypass-instruction.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-105-silent-action-concealment.yaml → ATR-2026-00105-silent-action-concealment.yaml} +3 -1
- package/rules/tool-poisoning/{ATR-2026-106-schema-description-contradiction.yaml → ATR-2026-00106-schema-description-contradiction.yaml} +3 -1
- package/spec/atr-schema.yaml +32 -3
- package/dist/action-executor.d.ts +0 -44
- package/dist/action-executor.d.ts.map +0 -1
- package/dist/action-executor.js +0 -130
- package/dist/action-executor.js.map +0 -1
- package/dist/adapters/default-adapter.d.ts +0 -24
- package/dist/adapters/default-adapter.d.ts.map +0 -1
- package/dist/adapters/default-adapter.js +0 -51
- package/dist/adapters/default-adapter.js.map +0 -1
- package/dist/adapters/stdio-adapter.d.ts +0 -30
- package/dist/adapters/stdio-adapter.d.ts.map +0 -1
- package/dist/adapters/stdio-adapter.js +0 -128
- package/dist/adapters/stdio-adapter.js.map +0 -1
- package/dist/badge.d.ts +0 -42
- package/dist/badge.d.ts.map +0 -1
- package/dist/badge.js +0 -158
- package/dist/badge.js.map +0 -1
- package/dist/capability-extractor.d.ts +0 -35
- package/dist/capability-extractor.d.ts.map +0 -1
- package/dist/capability-extractor.js +0 -91
- package/dist/capability-extractor.js.map +0 -1
- package/dist/cli.d.ts +0 -12
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -892
- package/dist/cli.js.map +0 -1
- package/dist/converters/elastic.d.ts +0 -36
- package/dist/converters/elastic.d.ts.map +0 -1
- package/dist/converters/elastic.js +0 -125
- package/dist/converters/elastic.js.map +0 -1
- package/dist/converters/index.d.ts +0 -28
- package/dist/converters/index.d.ts.map +0 -1
- package/dist/converters/index.js +0 -36
- package/dist/converters/index.js.map +0 -1
- package/dist/converters/splunk.d.ts +0 -19
- package/dist/converters/splunk.d.ts.map +0 -1
- package/dist/converters/splunk.js +0 -148
- package/dist/converters/splunk.js.map +0 -1
- package/dist/coverage-analyzer.d.ts +0 -43
- package/dist/coverage-analyzer.d.ts.map +0 -1
- package/dist/coverage-analyzer.js +0 -329
- package/dist/coverage-analyzer.js.map +0 -1
- package/dist/embedding/build-corpus.d.ts +0 -15
- package/dist/embedding/build-corpus.d.ts.map +0 -1
- package/dist/embedding/build-corpus.js +0 -105
- package/dist/embedding/build-corpus.js.map +0 -1
- package/dist/embedding/model-loader.d.ts +0 -41
- package/dist/embedding/model-loader.d.ts.map +0 -1
- package/dist/embedding/model-loader.js +0 -90
- package/dist/embedding/model-loader.js.map +0 -1
- package/dist/embedding/vector-store.d.ts +0 -41
- package/dist/embedding/vector-store.d.ts.map +0 -1
- package/dist/embedding/vector-store.js +0 -70
- package/dist/embedding/vector-store.js.map +0 -1
- package/dist/engine.d.ts +0 -163
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js +0 -869
- package/dist/engine.js.map +0 -1
- package/dist/eval/corpus.d.ts +0 -42
- package/dist/eval/corpus.d.ts.map +0 -1
- package/dist/eval/corpus.js +0 -427
- package/dist/eval/corpus.js.map +0 -1
- package/dist/eval/eval-harness.d.ts +0 -44
- package/dist/eval/eval-harness.d.ts.map +0 -1
- package/dist/eval/eval-harness.js +0 -296
- package/dist/eval/eval-harness.js.map +0 -1
- package/dist/eval/index.d.ts +0 -13
- package/dist/eval/index.d.ts.map +0 -1
- package/dist/eval/index.js +0 -9
- package/dist/eval/index.js.map +0 -1
- package/dist/eval/metrics.d.ts +0 -74
- package/dist/eval/metrics.d.ts.map +0 -1
- package/dist/eval/metrics.js +0 -108
- package/dist/eval/metrics.js.map +0 -1
- package/dist/eval/pint-corpus.d.ts +0 -34
- package/dist/eval/pint-corpus.d.ts.map +0 -1
- package/dist/eval/pint-corpus.js +0 -109
- package/dist/eval/pint-corpus.js.map +0 -1
- package/dist/eval/rule-corpus.d.ts +0 -9
- package/dist/eval/rule-corpus.d.ts.map +0 -1
- package/dist/eval/rule-corpus.js +0 -4780
- package/dist/eval/rule-corpus.js.map +0 -1
- package/dist/eval/rule-metrics.d.ts +0 -34
- package/dist/eval/rule-metrics.d.ts.map +0 -1
- package/dist/eval/rule-metrics.js +0 -92
- package/dist/eval/rule-metrics.js.map +0 -1
- package/dist/eval/run-eval.d.ts +0 -7
- package/dist/eval/run-eval.d.ts.map +0 -1
- package/dist/eval/run-eval.js +0 -11
- package/dist/eval/run-eval.js.map +0 -1
- package/dist/eval/run-pint-benchmark.d.ts +0 -18
- package/dist/eval/run-pint-benchmark.d.ts.map +0 -1
- package/dist/eval/run-pint-benchmark.js +0 -159
- package/dist/eval/run-pint-benchmark.js.map +0 -1
- package/dist/flywheel.d.ts +0 -54
- package/dist/flywheel.d.ts.map +0 -1
- package/dist/flywheel.js +0 -121
- package/dist/flywheel.js.map +0 -1
- package/dist/hook-handler.d.ts +0 -61
- package/dist/hook-handler.d.ts.map +0 -1
- package/dist/hook-handler.js +0 -178
- package/dist/hook-handler.js.map +0 -1
- package/dist/index.d.ts +0 -62
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -54
- package/dist/index.js.map +0 -1
- package/dist/layer-integration.d.ts +0 -55
- package/dist/layer-integration.d.ts.map +0 -1
- package/dist/layer-integration.js +0 -185
- package/dist/layer-integration.js.map +0 -1
- package/dist/loader.d.ts +0 -21
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -124
- package/dist/loader.js.map +0 -1
- package/dist/mcp-server.d.ts +0 -13
- package/dist/mcp-server.d.ts.map +0 -1
- package/dist/mcp-server.js +0 -220
- package/dist/mcp-server.js.map +0 -1
- package/dist/mcp-tools/coverage-gaps.d.ts +0 -13
- package/dist/mcp-tools/coverage-gaps.d.ts.map +0 -1
- package/dist/mcp-tools/coverage-gaps.js +0 -55
- package/dist/mcp-tools/coverage-gaps.js.map +0 -1
- package/dist/mcp-tools/list-rules.d.ts +0 -17
- package/dist/mcp-tools/list-rules.d.ts.map +0 -1
- package/dist/mcp-tools/list-rules.js +0 -45
- package/dist/mcp-tools/list-rules.js.map +0 -1
- package/dist/mcp-tools/scan.d.ts +0 -24
- package/dist/mcp-tools/scan.d.ts.map +0 -1
- package/dist/mcp-tools/scan.js +0 -94
- package/dist/mcp-tools/scan.js.map +0 -1
- package/dist/mcp-tools/submit-proposal.d.ts +0 -12
- package/dist/mcp-tools/submit-proposal.d.ts.map +0 -1
- package/dist/mcp-tools/submit-proposal.js +0 -103
- package/dist/mcp-tools/submit-proposal.js.map +0 -1
- package/dist/mcp-tools/threat-summary.d.ts +0 -12
- package/dist/mcp-tools/threat-summary.d.ts.map +0 -1
- package/dist/mcp-tools/threat-summary.js +0 -74
- package/dist/mcp-tools/threat-summary.js.map +0 -1
- package/dist/mcp-tools/validate.d.ts +0 -15
- package/dist/mcp-tools/validate.d.ts.map +0 -1
- package/dist/mcp-tools/validate.js +0 -45
- package/dist/mcp-tools/validate.js.map +0 -1
- package/dist/modules/embedding.d.ts +0 -71
- package/dist/modules/embedding.d.ts.map +0 -1
- package/dist/modules/embedding.js +0 -141
- package/dist/modules/embedding.js.map +0 -1
- package/dist/modules/index.d.ts +0 -144
- package/dist/modules/index.d.ts.map +0 -1
- package/dist/modules/index.js +0 -82
- package/dist/modules/index.js.map +0 -1
- package/dist/modules/semantic.d.ts +0 -106
- package/dist/modules/semantic.d.ts.map +0 -1
- package/dist/modules/semantic.js +0 -359
- package/dist/modules/semantic.js.map +0 -1
- package/dist/modules/session.d.ts +0 -70
- package/dist/modules/session.d.ts.map +0 -1
- package/dist/modules/session.js +0 -128
- package/dist/modules/session.js.map +0 -1
- package/dist/rule-scaffolder.d.ts +0 -53
- package/dist/rule-scaffolder.d.ts.map +0 -1
- package/dist/rule-scaffolder.js +0 -301
- package/dist/rule-scaffolder.js.map +0 -1
- package/dist/session-tracker.d.ts +0 -58
- package/dist/session-tracker.d.ts.map +0 -1
- package/dist/session-tracker.js +0 -176
- package/dist/session-tracker.js.map +0 -1
- package/dist/shadow-evaluator.d.ts +0 -48
- package/dist/shadow-evaluator.d.ts.map +0 -1
- package/dist/shadow-evaluator.js +0 -128
- package/dist/shadow-evaluator.js.map +0 -1
- package/dist/skill-fingerprint.d.ts +0 -85
- package/dist/skill-fingerprint.d.ts.map +0 -1
- package/dist/skill-fingerprint.js +0 -284
- package/dist/skill-fingerprint.js.map +0 -1
- package/dist/tier0-invariant.d.ts +0 -49
- package/dist/tier0-invariant.d.ts.map +0 -1
- package/dist/tier0-invariant.js +0 -184
- package/dist/tier0-invariant.js.map +0 -1
- package/dist/tier1-blacklist.d.ts +0 -48
- package/dist/tier1-blacklist.d.ts.map +0 -1
- package/dist/tier1-blacklist.js +0 -91
- package/dist/tier1-blacklist.js.map +0 -1
- package/dist/types.d.ts +0 -190
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/verdict.d.ts +0 -26
- package/dist/verdict.d.ts.map +0 -1
- package/dist/verdict.js +0 -127
- package/dist/verdict.js.map +0 -1
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ATR Coverage Analyzer - Analyzes rule sets for coverage gaps
|
|
3
|
-
* against OWASP Agentic Top 10 and MITRE ATLAS frameworks.
|
|
4
|
-
* @module agent-threat-rules/coverage-analyzer
|
|
5
|
-
*/
|
|
6
|
-
const OWASP_AGENTIC_TOP_10 = [
|
|
7
|
-
{
|
|
8
|
-
id: 'ASI01',
|
|
9
|
-
name: 'Prompt Injection',
|
|
10
|
-
categories: ['prompt-injection'],
|
|
11
|
-
recommendedMin: 3,
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
id: 'ASI02',
|
|
15
|
-
name: 'Tool/Skill Poisoning',
|
|
16
|
-
categories: ['tool-poisoning'],
|
|
17
|
-
recommendedMin: 2,
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
id: 'ASI03',
|
|
21
|
-
name: 'Insecure Output Handling',
|
|
22
|
-
categories: ['context-exfiltration'],
|
|
23
|
-
recommendedMin: 2,
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
id: 'ASI04',
|
|
27
|
-
name: 'Privilege Escalation',
|
|
28
|
-
categories: ['privilege-escalation'],
|
|
29
|
-
recommendedMin: 2,
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: 'ASI05',
|
|
33
|
-
name: 'Data Poisoning',
|
|
34
|
-
categories: ['data-poisoning'],
|
|
35
|
-
recommendedMin: 2,
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
id: 'ASI06',
|
|
39
|
-
name: 'Excessive Autonomy',
|
|
40
|
-
categories: ['excessive-autonomy'],
|
|
41
|
-
recommendedMin: 2,
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
id: 'ASI07',
|
|
45
|
-
name: 'Multi-Agent Manipulation',
|
|
46
|
-
categories: ['agent-manipulation'],
|
|
47
|
-
recommendedMin: 2,
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: 'ASI08',
|
|
51
|
-
name: 'Model Abuse',
|
|
52
|
-
categories: ['model-abuse'],
|
|
53
|
-
recommendedMin: 2,
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
id: 'ASI09',
|
|
57
|
-
name: 'Insufficient Logging',
|
|
58
|
-
categories: [],
|
|
59
|
-
recommendedMin: 1,
|
|
60
|
-
noDirectRules: true,
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
id: 'ASI10',
|
|
64
|
-
name: 'Supply Chain Compromise',
|
|
65
|
-
categories: ['skill-compromise'],
|
|
66
|
-
recommendedMin: 2,
|
|
67
|
-
},
|
|
68
|
-
];
|
|
69
|
-
// ---------------------------------------------------------------------------
|
|
70
|
-
// MITRE ATLAS techniques to check
|
|
71
|
-
// ---------------------------------------------------------------------------
|
|
72
|
-
const MITRE_ATLAS_TECHNIQUES = [
|
|
73
|
-
{
|
|
74
|
-
id: 'AML.T0051',
|
|
75
|
-
name: 'LLM Prompt Injection',
|
|
76
|
-
categories: ['prompt-injection'],
|
|
77
|
-
recommendedMin: 1,
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
id: 'AML.T0051.000',
|
|
81
|
-
name: 'LLM Prompt Injection: Direct',
|
|
82
|
-
categories: ['prompt-injection'],
|
|
83
|
-
recommendedMin: 1,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
id: 'AML.T0051.001',
|
|
87
|
-
name: 'LLM Prompt Injection: Indirect',
|
|
88
|
-
categories: ['prompt-injection'],
|
|
89
|
-
recommendedMin: 1,
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
id: 'AML.T0053',
|
|
93
|
-
name: 'Data Poisoning',
|
|
94
|
-
categories: ['data-poisoning'],
|
|
95
|
-
recommendedMin: 1,
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
id: 'AML.T0056',
|
|
99
|
-
name: 'LLM Plugin Compromise',
|
|
100
|
-
categories: ['tool-poisoning', 'skill-compromise'],
|
|
101
|
-
recommendedMin: 1,
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
id: 'AML.T0010',
|
|
105
|
-
name: 'ML Supply Chain Compromise',
|
|
106
|
-
categories: ['skill-compromise', 'tool-poisoning'],
|
|
107
|
-
recommendedMin: 1,
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
id: 'AML.T0020',
|
|
111
|
-
name: 'Poison Training Data',
|
|
112
|
-
categories: ['data-poisoning'],
|
|
113
|
-
recommendedMin: 1,
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
id: 'AML.T0018',
|
|
117
|
-
name: 'Backdoor ML Model',
|
|
118
|
-
categories: ['model-abuse', 'data-poisoning'],
|
|
119
|
-
recommendedMin: 1,
|
|
120
|
-
},
|
|
121
|
-
{
|
|
122
|
-
id: 'AML.T0024',
|
|
123
|
-
name: 'Exfiltration via ML Inference API',
|
|
124
|
-
categories: ['context-exfiltration'],
|
|
125
|
-
recommendedMin: 1,
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
id: 'AML.T0040',
|
|
129
|
-
name: 'ML Model Inference API Access',
|
|
130
|
-
categories: ['model-abuse'],
|
|
131
|
-
recommendedMin: 1,
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
id: 'AML.T0043',
|
|
135
|
-
name: 'Craft Adversarial Data',
|
|
136
|
-
categories: ['data-poisoning', 'prompt-injection'],
|
|
137
|
-
recommendedMin: 1,
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
id: 'AML.T0044',
|
|
141
|
-
name: 'Full ML Model Access',
|
|
142
|
-
categories: ['model-abuse'],
|
|
143
|
-
recommendedMin: 1,
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
id: 'AML.T0046',
|
|
147
|
-
name: 'Evade ML Model',
|
|
148
|
-
categories: ['prompt-injection', 'agent-manipulation'],
|
|
149
|
-
recommendedMin: 1,
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
id: 'AML.T0047',
|
|
153
|
-
name: 'ML-Enabled Product/Service Abuse',
|
|
154
|
-
categories: ['model-abuse', 'excessive-autonomy'],
|
|
155
|
-
recommendedMin: 1,
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
id: 'AML.T0050',
|
|
159
|
-
name: 'Command and Control via ML Service',
|
|
160
|
-
categories: ['agent-manipulation'],
|
|
161
|
-
recommendedMin: 1,
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
id: 'AML.T0052.000',
|
|
165
|
-
name: 'Phishing via LLM',
|
|
166
|
-
categories: ['model-abuse'],
|
|
167
|
-
recommendedMin: 1,
|
|
168
|
-
},
|
|
169
|
-
{
|
|
170
|
-
id: 'AML.T0054',
|
|
171
|
-
name: 'LLM Jailbreak',
|
|
172
|
-
categories: ['prompt-injection'],
|
|
173
|
-
recommendedMin: 1,
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
id: 'AML.T0055',
|
|
177
|
-
name: 'Unsafe LLM Output',
|
|
178
|
-
categories: ['context-exfiltration', 'model-abuse'],
|
|
179
|
-
recommendedMin: 1,
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
id: 'AML.T0057',
|
|
183
|
-
name: 'LLM Data Leakage',
|
|
184
|
-
categories: ['context-exfiltration'],
|
|
185
|
-
recommendedMin: 1,
|
|
186
|
-
},
|
|
187
|
-
];
|
|
188
|
-
// ---------------------------------------------------------------------------
|
|
189
|
-
// All 9 ATR categories
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
const ALL_ATR_CATEGORIES = [
|
|
192
|
-
'prompt-injection',
|
|
193
|
-
'tool-poisoning',
|
|
194
|
-
'context-exfiltration',
|
|
195
|
-
'agent-manipulation',
|
|
196
|
-
'privilege-escalation',
|
|
197
|
-
'excessive-autonomy',
|
|
198
|
-
'data-poisoning',
|
|
199
|
-
'model-abuse',
|
|
200
|
-
'skill-compromise',
|
|
201
|
-
];
|
|
202
|
-
// ---------------------------------------------------------------------------
|
|
203
|
-
// CoverageAnalyzer
|
|
204
|
-
// ---------------------------------------------------------------------------
|
|
205
|
-
export class CoverageAnalyzer {
|
|
206
|
-
rules;
|
|
207
|
-
constructor(rules) {
|
|
208
|
-
this.rules = rules;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Analyze the rule set for coverage gaps against OWASP Agentic Top 10,
|
|
212
|
-
* MITRE ATLAS, and ATR category distribution.
|
|
213
|
-
*/
|
|
214
|
-
analyze() {
|
|
215
|
-
const activeRules = this.rules.filter((r) => r.status !== 'deprecated');
|
|
216
|
-
const categoryDistribution = this.buildCategoryDistribution(activeRules);
|
|
217
|
-
const gaps = [];
|
|
218
|
-
// Check OWASP Agentic Top 10
|
|
219
|
-
for (const item of OWASP_AGENTIC_TOP_10) {
|
|
220
|
-
const count = this.countCoveringRules(activeRules, item);
|
|
221
|
-
if (count < item.recommendedMin) {
|
|
222
|
-
gaps.push({
|
|
223
|
-
framework: 'OWASP Agentic Top 10',
|
|
224
|
-
riskId: item.id,
|
|
225
|
-
riskName: item.name,
|
|
226
|
-
currentRuleCount: count,
|
|
227
|
-
recommendedMin: item.recommendedMin,
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// Check MITRE ATLAS techniques
|
|
232
|
-
for (const item of MITRE_ATLAS_TECHNIQUES) {
|
|
233
|
-
const count = this.countCoveringRules(activeRules, item);
|
|
234
|
-
if (count < item.recommendedMin) {
|
|
235
|
-
gaps.push({
|
|
236
|
-
framework: 'MITRE ATLAS',
|
|
237
|
-
riskId: item.id,
|
|
238
|
-
riskName: item.name,
|
|
239
|
-
currentRuleCount: count,
|
|
240
|
-
recommendedMin: item.recommendedMin,
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
const suggestions = this.generateSuggestions(gaps, categoryDistribution);
|
|
245
|
-
return {
|
|
246
|
-
totalRules: activeRules.length,
|
|
247
|
-
gaps,
|
|
248
|
-
categoryDistribution,
|
|
249
|
-
suggestions,
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Count how many active rules cover a given framework item,
|
|
254
|
-
* either by ATR category match or by explicit reference in rule metadata.
|
|
255
|
-
*/
|
|
256
|
-
countCoveringRules(activeRules, item) {
|
|
257
|
-
if (item.noDirectRules) {
|
|
258
|
-
return 0;
|
|
259
|
-
}
|
|
260
|
-
const covering = new Set();
|
|
261
|
-
for (const rule of activeRules) {
|
|
262
|
-
const matchesCategory = item.categories.includes(rule.tags.category);
|
|
263
|
-
const matchesOwaspRef = rule.references?.owasp_llm?.some((ref) => ref.includes(item.id)) ?? false;
|
|
264
|
-
const matchesMitreRef = rule.references?.mitre_atlas?.some((ref) => ref.includes(item.id)) ?? false;
|
|
265
|
-
if (matchesCategory || matchesOwaspRef || matchesMitreRef) {
|
|
266
|
-
covering.add(rule.id);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return covering.size;
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Build a distribution count of rules per ATR category.
|
|
273
|
-
*/
|
|
274
|
-
buildCategoryDistribution(activeRules) {
|
|
275
|
-
const dist = {};
|
|
276
|
-
for (const cat of ALL_ATR_CATEGORIES) {
|
|
277
|
-
dist[cat] = 0;
|
|
278
|
-
}
|
|
279
|
-
for (const rule of activeRules) {
|
|
280
|
-
const cat = rule.tags.category;
|
|
281
|
-
dist[cat] = (dist[cat] ?? 0) + 1;
|
|
282
|
-
}
|
|
283
|
-
return dist;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Generate human-readable suggestions based on identified gaps
|
|
287
|
-
* and category distribution.
|
|
288
|
-
*/
|
|
289
|
-
generateSuggestions(gaps, categoryDistribution) {
|
|
290
|
-
const suggestions = [];
|
|
291
|
-
// Group OWASP gaps
|
|
292
|
-
const owaspGaps = gaps.filter((g) => g.framework === 'OWASP Agentic Top 10');
|
|
293
|
-
if (owaspGaps.length > 0) {
|
|
294
|
-
const ids = owaspGaps.map((g) => g.riskId).join(', ');
|
|
295
|
-
suggestions.push(`OWASP Agentic Top 10 coverage gaps found for: ${ids}. ` +
|
|
296
|
-
`Create rules targeting these risk areas to improve coverage.`);
|
|
297
|
-
}
|
|
298
|
-
// Group MITRE gaps
|
|
299
|
-
const mitreGaps = gaps.filter((g) => g.framework === 'MITRE ATLAS');
|
|
300
|
-
if (mitreGaps.length > 0) {
|
|
301
|
-
const ids = mitreGaps.map((g) => g.riskId).join(', ');
|
|
302
|
-
suggestions.push(`MITRE ATLAS technique coverage gaps found for: ${ids}. ` +
|
|
303
|
-
`Add detection rules or reference mappings for these techniques.`);
|
|
304
|
-
}
|
|
305
|
-
// Check for empty categories
|
|
306
|
-
const emptyCategories = ALL_ATR_CATEGORIES.filter((cat) => (categoryDistribution[cat] ?? 0) === 0);
|
|
307
|
-
if (emptyCategories.length > 0) {
|
|
308
|
-
suggestions.push(`No rules found for ATR categories: ${emptyCategories.join(', ')}. ` +
|
|
309
|
-
`Consider adding at least one rule per category for baseline coverage.`);
|
|
310
|
-
}
|
|
311
|
-
// ASI09 (Insufficient Logging) always appears as a gap since no direct rules exist
|
|
312
|
-
const asi09Gap = gaps.find((g) => g.riskId === 'ASI09');
|
|
313
|
-
if (asi09Gap) {
|
|
314
|
-
suggestions.push(`ASI09 (Insufficient Logging) has no direct ATR rule category. ` +
|
|
315
|
-
`Consider implementing logging validation at the agent framework level ` +
|
|
316
|
-
`rather than through detection rules.`);
|
|
317
|
-
}
|
|
318
|
-
// Suggest overall improvement if many gaps
|
|
319
|
-
if (gaps.length > 10) {
|
|
320
|
-
suggestions.push(`${gaps.length} total coverage gaps detected. Prioritize OWASP Agentic Top 10 ` +
|
|
321
|
-
`gaps first, then address MITRE ATLAS technique gaps.`);
|
|
322
|
-
}
|
|
323
|
-
if (suggestions.length === 0) {
|
|
324
|
-
suggestions.push('Rule coverage looks good across both OWASP and MITRE frameworks.');
|
|
325
|
-
}
|
|
326
|
-
return suggestions;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
//# sourceMappingURL=coverage-analyzer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-analyzer.js","sourceRoot":"","sources":["../src/coverage-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Build attack embedding corpus from ATR rule test cases.
|
|
4
|
-
*
|
|
5
|
-
* Reads all stable ATR rules, extracts true_positive test cases,
|
|
6
|
-
* encodes them through all-MiniLM-L6-v2, and saves as JSON.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* npx tsx src/embedding/build-corpus.ts
|
|
10
|
-
*
|
|
11
|
-
* Output:
|
|
12
|
-
* data/attack-embeddings.json
|
|
13
|
-
*/
|
|
14
|
-
export {};
|
|
15
|
-
//# sourceMappingURL=build-corpus.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-corpus.d.ts","sourceRoot":"","sources":["../../src/embedding/build-corpus.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env npx tsx
|
|
2
|
-
/**
|
|
3
|
-
* Build attack embedding corpus from ATR rule test cases.
|
|
4
|
-
*
|
|
5
|
-
* Reads all stable ATR rules, extracts true_positive test cases,
|
|
6
|
-
* encodes them through all-MiniLM-L6-v2, and saves as JSON.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* npx tsx src/embedding/build-corpus.ts
|
|
10
|
-
*
|
|
11
|
-
* Output:
|
|
12
|
-
* data/attack-embeddings.json
|
|
13
|
-
*/
|
|
14
|
-
import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
|
|
15
|
-
import { join, resolve } from 'node:path';
|
|
16
|
-
import * as yaml from 'js-yaml';
|
|
17
|
-
const RULES_DIR = resolve(join(import.meta.dirname ?? '.', '..', '..', 'rules'));
|
|
18
|
-
const OUTPUT_PATH = resolve(join(import.meta.dirname ?? '.', '..', '..', 'data', 'attack-embeddings.json'));
|
|
19
|
-
async function main() {
|
|
20
|
-
console.log('Building attack embedding corpus...');
|
|
21
|
-
console.log(`Rules dir: ${RULES_DIR}`);
|
|
22
|
-
// Load model
|
|
23
|
-
console.log('Loading embedding model (first run downloads ~22MB)...');
|
|
24
|
-
const { TransformersJSModel } = await import('./model-loader.js');
|
|
25
|
-
const model = new TransformersJSModel();
|
|
26
|
-
await model.initialize();
|
|
27
|
-
console.log('Model loaded.');
|
|
28
|
-
// Collect all true_positive texts from rules
|
|
29
|
-
const attacks = [];
|
|
30
|
-
function walkDir(dir) {
|
|
31
|
-
const files = [];
|
|
32
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
33
|
-
const fullPath = join(dir, entry.name);
|
|
34
|
-
if (entry.isDirectory()) {
|
|
35
|
-
files.push(...walkDir(fullPath));
|
|
36
|
-
}
|
|
37
|
-
else if (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml')) {
|
|
38
|
-
files.push(fullPath);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return files;
|
|
42
|
-
}
|
|
43
|
-
const ruleFiles = walkDir(RULES_DIR);
|
|
44
|
-
console.log(`Found ${ruleFiles.length} rule files.`);
|
|
45
|
-
for (const file of ruleFiles) {
|
|
46
|
-
try {
|
|
47
|
-
const content = readFileSync(file, 'utf-8');
|
|
48
|
-
const rule = yaml.load(content);
|
|
49
|
-
if (!rule?.id || !rule?.test_cases?.true_positives)
|
|
50
|
-
continue;
|
|
51
|
-
for (const tp of rule.test_cases.true_positives) {
|
|
52
|
-
const text = tp.input ?? tp.content ?? tp.user_input ?? tp.tool_response ?? tp.tool_description ?? tp.tool_args;
|
|
53
|
-
if (!text || text.length < 10)
|
|
54
|
-
continue;
|
|
55
|
-
attacks.push({
|
|
56
|
-
id: rule.id,
|
|
57
|
-
text: text.slice(0, 512),
|
|
58
|
-
category: rule.tags?.category ?? 'unknown',
|
|
59
|
-
severity: rule.severity ?? 'medium',
|
|
60
|
-
ruleTitle: rule.title ?? rule.id,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Skip unparseable rules
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
console.log(`Extracted ${attacks.length} attack payloads from ${ruleFiles.length} rules.`);
|
|
69
|
-
// Deduplicate by text
|
|
70
|
-
const seen = new Set();
|
|
71
|
-
const unique = attacks.filter((a) => {
|
|
72
|
-
if (seen.has(a.text))
|
|
73
|
-
return false;
|
|
74
|
-
seen.add(a.text);
|
|
75
|
-
return true;
|
|
76
|
-
});
|
|
77
|
-
console.log(`Unique payloads: ${unique.length}`);
|
|
78
|
-
// Encode all payloads
|
|
79
|
-
console.log('Encoding payloads...');
|
|
80
|
-
const output = [];
|
|
81
|
-
for (let i = 0; i < unique.length; i++) {
|
|
82
|
-
const a = unique[i];
|
|
83
|
-
process.stdout.write(`\r [${i + 1}/${unique.length}] ${a.id}`);
|
|
84
|
-
const vec = await model.encode(a.text);
|
|
85
|
-
output.push({
|
|
86
|
-
id: `${a.id}-tp${i}`,
|
|
87
|
-
text: a.text,
|
|
88
|
-
vector: Array.from(vec),
|
|
89
|
-
label: `${a.ruleTitle}: ${a.text.slice(0, 80)}`,
|
|
90
|
-
category: a.category,
|
|
91
|
-
severity: a.severity,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
console.log('\n');
|
|
95
|
-
// Save
|
|
96
|
-
mkdirSync(join(OUTPUT_PATH, '..'), { recursive: true });
|
|
97
|
-
writeFileSync(OUTPUT_PATH, JSON.stringify(output, null, 2));
|
|
98
|
-
console.log(`Saved ${output.length} embeddings to ${OUTPUT_PATH}`);
|
|
99
|
-
console.log(`File size: ${(readFileSync(OUTPUT_PATH).length / 1024).toFixed(0)} KB`);
|
|
100
|
-
}
|
|
101
|
-
main().catch((err) => {
|
|
102
|
-
console.error('Fatal:', err);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
});
|
|
105
|
-
//# sourceMappingURL=build-corpus.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-corpus.js","sourceRoot":"","sources":["../../src/embedding/build-corpus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding model loader.
|
|
3
|
-
*
|
|
4
|
-
* Lazy-loads all-MiniLM-L6-v2 via @xenova/transformers (optional dep).
|
|
5
|
-
* Model is ~22MB, cached to disk after first download.
|
|
6
|
-
* Runs in pure JS/WASM -- no native bindings needed.
|
|
7
|
-
*
|
|
8
|
-
* @module agent-threat-rules/embedding/model-loader
|
|
9
|
-
*/
|
|
10
|
-
export interface EmbeddingModel {
|
|
11
|
-
/** Encode text to embedding vector */
|
|
12
|
-
encode(text: string): Promise<Float32Array>;
|
|
13
|
-
/** Encode multiple texts (batched) */
|
|
14
|
-
encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
|
|
15
|
-
/** Initialize / load the model */
|
|
16
|
-
initialize(): Promise<void>;
|
|
17
|
-
/** Model output dimension */
|
|
18
|
-
readonly dimension: number;
|
|
19
|
-
/** Whether model is loaded */
|
|
20
|
-
readonly isLoaded: boolean;
|
|
21
|
-
}
|
|
22
|
-
export declare class TransformersJSModel implements EmbeddingModel {
|
|
23
|
-
readonly dimension = 384;
|
|
24
|
-
private pipeline;
|
|
25
|
-
get isLoaded(): boolean;
|
|
26
|
-
/** Lazy-load the model on first use */
|
|
27
|
-
initialize(): Promise<void>;
|
|
28
|
-
encode(text: string): Promise<Float32Array>;
|
|
29
|
-
encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
|
|
30
|
-
}
|
|
31
|
-
/** Create a no-op model for testing */
|
|
32
|
-
export declare class MockEmbeddingModel implements EmbeddingModel {
|
|
33
|
-
readonly dimension = 384;
|
|
34
|
-
readonly isLoaded = true;
|
|
35
|
-
private readonly mockVectors;
|
|
36
|
-
constructor(mockVectors?: Map<string, Float32Array>);
|
|
37
|
-
initialize(): Promise<void>;
|
|
38
|
-
encode(text: string): Promise<Float32Array>;
|
|
39
|
-
encodeBatch(texts: readonly string[]): Promise<Float32Array[]>;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=model-loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-loader.d.ts","sourceRoot":"","sources":["../../src/embedding/model-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,sCAAsC;IACtC,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,kCAAkC;IAClC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6BAA6B;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAKD,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,SAAS,OAAa;IAC/B,OAAO,CAAC,QAAQ,CAAiB;IAEjC,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,uCAAuC;IACjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ3C,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAYrE;AAED,uCAAuC;AACvC,qBAAa,kBAAmB,YAAW,cAAc;IACvD,QAAQ,CAAC,SAAS,OAAa;IAC/B,QAAQ,CAAC,QAAQ,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAgB3C,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAGrE"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Embedding model loader.
|
|
3
|
-
*
|
|
4
|
-
* Lazy-loads all-MiniLM-L6-v2 via @xenova/transformers (optional dep).
|
|
5
|
-
* Model is ~22MB, cached to disk after first download.
|
|
6
|
-
* Runs in pure JS/WASM -- no native bindings needed.
|
|
7
|
-
*
|
|
8
|
-
* @module agent-threat-rules/embedding/model-loader
|
|
9
|
-
*/
|
|
10
|
-
const MODEL_NAME = 'Xenova/all-MiniLM-L6-v2';
|
|
11
|
-
const DIMENSION = 384;
|
|
12
|
-
export class TransformersJSModel {
|
|
13
|
-
dimension = DIMENSION;
|
|
14
|
-
pipeline = null;
|
|
15
|
-
get isLoaded() {
|
|
16
|
-
return this.pipeline !== null;
|
|
17
|
-
}
|
|
18
|
-
/** Lazy-load the model on first use */
|
|
19
|
-
async initialize() {
|
|
20
|
-
if (this.pipeline)
|
|
21
|
-
return;
|
|
22
|
-
try {
|
|
23
|
-
// Dynamic import to keep @xenova/transformers optional
|
|
24
|
-
const { pipeline } = await import('@xenova/transformers');
|
|
25
|
-
this.pipeline = (await pipeline('feature-extraction', MODEL_NAME, {
|
|
26
|
-
quantized: true,
|
|
27
|
-
}));
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
-
if (msg.includes('Cannot find module') || msg.includes('MODULE_NOT_FOUND')) {
|
|
32
|
-
throw new Error('Embedding model requires @xenova/transformers. Install: npm install @xenova/transformers');
|
|
33
|
-
}
|
|
34
|
-
throw new Error(`Failed to load embedding model: ${msg}`);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async encode(text) {
|
|
38
|
-
if (!this.pipeline)
|
|
39
|
-
await this.initialize();
|
|
40
|
-
const pipelineFn = this.pipeline;
|
|
41
|
-
const output = await pipelineFn([text], { pooling: 'mean', normalize: true });
|
|
42
|
-
return new Float32Array(output.data.slice(0, DIMENSION));
|
|
43
|
-
}
|
|
44
|
-
async encodeBatch(texts) {
|
|
45
|
-
if (!this.pipeline)
|
|
46
|
-
await this.initialize();
|
|
47
|
-
const pipelineFn = this.pipeline;
|
|
48
|
-
const results = [];
|
|
49
|
-
// Process one at a time to control memory
|
|
50
|
-
for (const text of texts) {
|
|
51
|
-
const output = await pipelineFn([text], { pooling: 'mean', normalize: true });
|
|
52
|
-
results.push(new Float32Array(output.data.slice(0, DIMENSION)));
|
|
53
|
-
}
|
|
54
|
-
return results;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/** Create a no-op model for testing */
|
|
58
|
-
export class MockEmbeddingModel {
|
|
59
|
-
dimension = DIMENSION;
|
|
60
|
-
isLoaded = true;
|
|
61
|
-
mockVectors;
|
|
62
|
-
constructor(mockVectors) {
|
|
63
|
-
this.mockVectors = mockVectors ?? new Map();
|
|
64
|
-
}
|
|
65
|
-
async initialize() {
|
|
66
|
-
// No-op for mock
|
|
67
|
-
}
|
|
68
|
-
async encode(text) {
|
|
69
|
-
const existing = this.mockVectors.get(text);
|
|
70
|
-
if (existing)
|
|
71
|
-
return existing;
|
|
72
|
-
// Generate deterministic vector from text hash
|
|
73
|
-
const vec = new Float32Array(DIMENSION);
|
|
74
|
-
for (let i = 0; i < DIMENSION; i++) {
|
|
75
|
-
vec[i] = Math.sin(text.charCodeAt(i % text.length) * (i + 1) * 0.01);
|
|
76
|
-
}
|
|
77
|
-
// Normalize
|
|
78
|
-
let mag = 0;
|
|
79
|
-
for (let i = 0; i < DIMENSION; i++)
|
|
80
|
-
mag += vec[i] * vec[i];
|
|
81
|
-
mag = Math.sqrt(mag);
|
|
82
|
-
for (let i = 0; i < DIMENSION; i++)
|
|
83
|
-
vec[i] /= mag;
|
|
84
|
-
return vec;
|
|
85
|
-
}
|
|
86
|
-
async encodeBatch(texts) {
|
|
87
|
-
return Promise.all(texts.map((t) => this.encode(t)));
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=model-loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-loader.js","sourceRoot":"","sources":["../../src/embedding/model-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory vector store with cosine similarity search.
|
|
3
|
-
*
|
|
4
|
-
* Stores pre-computed attack embeddings and finds nearest neighbors
|
|
5
|
-
* for incoming text. Sub-millisecond for ~2000 vectors at 384 dimensions.
|
|
6
|
-
*
|
|
7
|
-
* @module agent-threat-rules/embedding/vector-store
|
|
8
|
-
*/
|
|
9
|
-
import type { ATRSeverity } from '../types.js';
|
|
10
|
-
export interface VectorEntry {
|
|
11
|
-
readonly id: string;
|
|
12
|
-
readonly vector: Float32Array;
|
|
13
|
-
readonly label: string;
|
|
14
|
-
readonly category: string;
|
|
15
|
-
readonly severity: ATRSeverity;
|
|
16
|
-
}
|
|
17
|
-
export interface SearchResult {
|
|
18
|
-
readonly entry: VectorEntry;
|
|
19
|
-
readonly similarity: number;
|
|
20
|
-
}
|
|
21
|
-
export declare class VectorStore {
|
|
22
|
-
private readonly entries;
|
|
23
|
-
constructor(entries?: readonly VectorEntry[]);
|
|
24
|
-
/** Create new store with additional entries (immutable) */
|
|
25
|
-
withEntries(newEntries: readonly VectorEntry[]): VectorStore;
|
|
26
|
-
/**
|
|
27
|
-
* Find top-K nearest neighbors by cosine similarity.
|
|
28
|
-
* Only returns results above the threshold.
|
|
29
|
-
*/
|
|
30
|
-
search(query: Float32Array, topK?: number, threshold?: number): readonly SearchResult[];
|
|
31
|
-
size(): number;
|
|
32
|
-
}
|
|
33
|
-
/** Load pre-computed embeddings from JSON */
|
|
34
|
-
export declare function loadVectorEntries(data: readonly {
|
|
35
|
-
id: string;
|
|
36
|
-
vector: number[];
|
|
37
|
-
label: string;
|
|
38
|
-
category: string;
|
|
39
|
-
severity: string;
|
|
40
|
-
}[]): VectorEntry[];
|
|
41
|
-
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../../src/embedding/vector-store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE;IAI5C,2DAA2D;IAC3D,WAAW,CAAC,UAAU,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW;IAI5D;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,GAAE,MAAU,EAAE,SAAS,GAAE,MAAa,GAAG,SAAS,YAAY,EAAE;IAiBhG,IAAI,IAAI,MAAM;CAGf;AAyBD,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,GACnG,WAAW,EAAE,CAQf"}
|