agent-threat-rules 4.0.0 → 4.2.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/CHANGELOG.md +1804 -0
- package/DISCLOSURE +85 -0
- package/README.md +427 -155
- package/dist/adapters/openshell-filter.d.ts +10 -3
- package/dist/adapters/openshell-filter.d.ts.map +1 -1
- package/dist/adapters/openshell-filter.js +10 -3
- package/dist/adapters/openshell-filter.js.map +1 -1
- package/dist/adapters/stdio-adapter.js +3 -3
- package/dist/adapters/stdio-adapter.js.map +1 -1
- package/dist/cli/mcp-tools-document.d.ts +40 -0
- package/dist/cli/mcp-tools-document.d.ts.map +1 -0
- package/dist/cli/mcp-tools-document.js +95 -0
- package/dist/cli/mcp-tools-document.js.map +1 -0
- package/dist/cli/scan-handler.d.ts +8 -0
- package/dist/cli/scan-handler.d.ts.map +1 -1
- package/dist/cli/scan-handler.js +148 -44
- package/dist/cli/scan-handler.js.map +1 -1
- package/dist/cli/tc-pipeline.d.ts +20 -0
- package/dist/cli/tc-pipeline.d.ts.map +1 -1
- package/dist/cli/tc-pipeline.js +84 -15
- package/dist/cli/tc-pipeline.js.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -210
- package/dist/cli.js.map +1 -1
- package/dist/converters/sarif.d.ts +14 -2
- package/dist/converters/sarif.d.ts.map +1 -1
- package/dist/converters/sarif.js +7 -9
- package/dist/converters/sarif.js.map +1 -1
- package/dist/corpus-event.d.ts +47 -5
- package/dist/corpus-event.d.ts.map +1 -1
- package/dist/corpus-event.js +68 -29
- package/dist/corpus-event.js.map +1 -1
- package/dist/embedding/model-loader.d.ts +2 -0
- package/dist/embedding/model-loader.d.ts.map +1 -1
- package/dist/embedding/model-loader.js +3 -1
- package/dist/embedding/model-loader.js.map +1 -1
- package/dist/enforcement.d.ts +8 -0
- package/dist/enforcement.d.ts.map +1 -1
- package/dist/enforcement.js +10 -0
- package/dist/enforcement.js.map +1 -1
- package/dist/engine.d.ts +173 -6
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +362 -76
- package/dist/engine.js.map +1 -1
- package/dist/eval/embedding-provenance.d.ts +40 -0
- package/dist/eval/embedding-provenance.d.ts.map +1 -0
- package/dist/eval/embedding-provenance.js +71 -0
- package/dist/eval/embedding-provenance.js.map +1 -0
- package/dist/eval/eval-harness.d.ts +34 -0
- package/dist/eval/eval-harness.d.ts.map +1 -1
- package/dist/eval/eval-harness.js +49 -2
- package/dist/eval/eval-harness.js.map +1 -1
- package/dist/eval/hackaprompt-corpus.d.ts +12 -0
- package/dist/eval/hackaprompt-corpus.d.ts.map +1 -1
- package/dist/eval/hackaprompt-corpus.js +15 -1
- package/dist/eval/hackaprompt-corpus.js.map +1 -1
- package/dist/eval/hackaprompt-provenance.d.ts +52 -0
- package/dist/eval/hackaprompt-provenance.d.ts.map +1 -0
- package/dist/eval/hackaprompt-provenance.js +108 -0
- package/dist/eval/hackaprompt-provenance.js.map +1 -0
- package/dist/eval/run-hackaprompt-benchmark.d.ts +18 -8
- package/dist/eval/run-hackaprompt-benchmark.d.ts.map +1 -1
- package/dist/eval/run-hackaprompt-benchmark.js +154 -64
- package/dist/eval/run-hackaprompt-benchmark.js.map +1 -1
- package/dist/eval/run-pint-benchmark.js +11 -1
- package/dist/eval/run-pint-benchmark.js.map +1 -1
- package/dist/eval/skill-benchmark.d.ts +26 -6
- package/dist/eval/skill-benchmark.d.ts.map +1 -1
- package/dist/eval/skill-benchmark.js +49 -16
- package/dist/eval/skill-benchmark.js.map +1 -1
- package/dist/flywheel.d.ts +4 -0
- package/dist/flywheel.d.ts.map +1 -1
- package/dist/flywheel.js +12 -4
- package/dist/flywheel.js.map +1 -1
- package/dist/hook-handler.d.ts +11 -1
- package/dist/hook-handler.d.ts.map +1 -1
- package/dist/hook-handler.js +84 -16
- package/dist/hook-handler.js.map +1 -1
- package/dist/hook-tool-output.d.ts +47 -0
- package/dist/hook-tool-output.d.ts.map +1 -0
- package/dist/hook-tool-output.js +110 -0
- package/dist/hook-tool-output.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/layer-integration.d.ts +4 -2
- package/dist/layer-integration.d.ts.map +1 -1
- package/dist/layer-integration.js +6 -2
- package/dist/layer-integration.js.map +1 -1
- package/dist/mcp-server.d.ts +8 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/scan.d.ts.map +1 -1
- package/dist/mcp-tools/scan.js +9 -1
- package/dist/mcp-tools/scan.js.map +1 -1
- package/dist/measurement/enforce-lane.d.ts +66 -0
- package/dist/measurement/enforce-lane.d.ts.map +1 -0
- package/dist/measurement/enforce-lane.js +89 -0
- package/dist/measurement/enforce-lane.js.map +1 -0
- package/dist/measurement/from-eval-harness.d.ts +16 -3
- package/dist/measurement/from-eval-harness.d.ts.map +1 -1
- package/dist/measurement/from-eval-harness.js +15 -5
- package/dist/measurement/from-eval-harness.js.map +1 -1
- package/dist/measurement/in-sample-ablation.d.ts +29 -0
- package/dist/measurement/in-sample-ablation.d.ts.map +1 -0
- package/dist/measurement/in-sample-ablation.js +45 -0
- package/dist/measurement/in-sample-ablation.js.map +1 -0
- package/dist/measurement/schema.d.ts +38 -1
- package/dist/measurement/schema.d.ts.map +1 -1
- package/dist/measurement/schema.js +43 -1
- package/dist/measurement/schema.js.map +1 -1
- package/dist/quality/action-eligibility.d.ts +4 -2
- package/dist/quality/action-eligibility.d.ts.map +1 -1
- package/dist/quality/action-eligibility.js.map +1 -1
- package/dist/rule-confidence.d.ts +31 -0
- package/dist/rule-confidence.d.ts.map +1 -0
- package/dist/rule-confidence.js +49 -0
- package/dist/rule-confidence.js.map +1 -0
- package/dist/rule-scaffolder.d.ts.map +1 -1
- package/dist/rule-scaffolder.js +43 -4
- package/dist/rule-scaffolder.js.map +1 -1
- package/dist/semantic-evaluator.d.ts.map +1 -1
- package/dist/semantic-evaluator.js +15 -13
- package/dist/semantic-evaluator.js.map +1 -1
- package/dist/shadow-evaluator.d.ts +7 -2
- package/dist/shadow-evaluator.d.ts.map +1 -1
- package/dist/shadow-evaluator.js +29 -25
- package/dist/shadow-evaluator.js.map +1 -1
- package/dist/tc-reporter.d.ts +22 -3
- package/dist/tc-reporter.d.ts.map +1 -1
- package/dist/tc-reporter.js +36 -3
- package/dist/tc-reporter.js.map +1 -1
- package/dist/testcase-event.d.ts +105 -0
- package/dist/testcase-event.d.ts.map +1 -0
- package/dist/testcase-event.js +312 -0
- package/dist/testcase-event.js.map +1 -0
- package/dist/tier0-invariant.d.ts.map +1 -1
- package/dist/tier0-invariant.js +1 -0
- package/dist/tier0-invariant.js.map +1 -1
- package/dist/tier1-blacklist.d.ts.map +1 -1
- package/dist/tier1-blacklist.js +1 -0
- package/dist/tier1-blacklist.js.map +1 -1
- package/dist/tool-definition-scope.d.ts +45 -0
- package/dist/tool-definition-scope.d.ts.map +1 -0
- package/dist/tool-definition-scope.js +68 -0
- package/dist/tool-definition-scope.js.map +1 -0
- package/dist/types.d.ts +42 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/verdict.d.ts +46 -2
- package/dist/verdict.d.ts.map +1 -1
- package/dist/verdict.js +99 -14
- package/dist/verdict.js.map +1 -1
- package/package.json +11 -3
- package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +81 -137
- package/rules/agent-manipulation/ATR-2026-00032-goal-hijacking.yaml +30 -111
- package/rules/agent-manipulation/ATR-2026-00074-cross-agent-privilege-escalation.yaml +30 -110
- package/rules/agent-manipulation/ATR-2026-00076-inter-agent-message-spoofing.yaml +24 -104
- package/rules/agent-manipulation/ATR-2026-00077-human-trust-exploitation.yaml +38 -131
- package/rules/agent-manipulation/ATR-2026-00108-consensus-sybil-attack.yaml +24 -91
- package/rules/agent-manipulation/ATR-2026-00116-a2a-message-validation.yaml +20 -81
- package/rules/agent-manipulation/ATR-2026-00117-agent-identity-spoofing.yaml +29 -95
- package/rules/agent-manipulation/ATR-2026-00118-approval-fatigue.yaml +20 -90
- package/rules/agent-manipulation/ATR-2026-00119-social-engineering-via-agent.yaml +31 -106
- package/rules/agent-manipulation/ATR-2026-00132-casual-authority-escalation.yaml +25 -102
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +22 -94
- package/rules/agent-manipulation/ATR-2026-00164-skill-scope-hijack.yaml +44 -60
- package/rules/agent-manipulation/ATR-2026-00268-tense-framing-bypass.yaml +51 -112
- package/rules/agent-manipulation/ATR-2026-00269-fitd-escalation.yaml +45 -89
- package/rules/agent-manipulation/ATR-2026-00271-grandma-roleplay-jailbreak.yaml +49 -94
- package/rules/agent-manipulation/ATR-2026-00273-dan-developer-mode-persona.yaml +47 -91
- package/rules/agent-manipulation/ATR-2026-00287-threaten-json-coercive-output-threat.yaml +46 -93
- package/rules/agent-manipulation/ATR-2026-00288-false-premise-injection.yaml +44 -94
- package/rules/agent-manipulation/ATR-2026-00301-tap-tree-of-attacks-jailbreak.yaml +50 -98
- package/rules/agent-manipulation/ATR-2026-00302-anti-dan-inverted-filter-persona.yaml +51 -98
- package/rules/agent-manipulation/ATR-2026-00303-devmode-ranti-profanity-coercion.yaml +52 -101
- package/rules/agent-manipulation/ATR-2026-00304-chatgpt-image-unlocker-markdown-injection.yaml +53 -104
- package/rules/agent-manipulation/ATR-2026-00305-dan-mode-ablation-benchmark-coercion.yaml +48 -99
- package/rules/agent-manipulation/ATR-2026-00306-autodan-genetic-jailbreak-suffix.yaml +50 -103
- package/rules/agent-manipulation/ATR-2026-00307-inthewild-jailbreak-corpus-signature.yaml +53 -107
- package/rules/agent-manipulation/ATR-2026-00314-amoral-unfiltered-custom-persona-jailbreak.yaml +44 -94
- package/rules/agent-manipulation/ATR-2026-00317-free-of-restrictions-named-persona.yaml +44 -97
- package/rules/agent-manipulation/ATR-2026-00318-moralizing-rant-then-unfiltered-bypass.yaml +41 -90
- package/rules/agent-manipulation/ATR-2026-00319-developer-mode-dual-response-format.yaml +40 -88
- package/rules/agent-manipulation/ATR-2026-00320-opposite-day-boolean-opposite-machine.yaml +42 -91
- package/rules/agent-manipulation/ATR-2026-00322-fictional-world-format-override-jailbreak.yaml +41 -91
- package/rules/agent-manipulation/ATR-2026-00323-dual-persona-simulation-jailbreak.yaml +41 -91
- package/rules/agent-manipulation/ATR-2026-00324-neurosemantical-inversitis-disease-jailbreak.yaml +42 -103
- package/rules/agent-manipulation/ATR-2026-00325-bob-hypothetical-unrestricted-chatbot.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00326-fake-developer-authority-chatdan-override.yaml +41 -93
- package/rules/agent-manipulation/ATR-2026-00327-ai-ethics-law-bypass-declaration.yaml +45 -94
- package/rules/agent-manipulation/ATR-2026-00328-named-mode-persona-override.yaml +41 -92
- package/rules/agent-manipulation/ATR-2026-00329-no-withhold-factual-resource-persona.yaml +44 -97
- package/rules/agent-manipulation/ATR-2026-00330-yoja-allcaps-settings-block-persona.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00331-terminal-cli-harmful-function-simulator.yaml +40 -89
- package/rules/agent-manipulation/ATR-2026-00332-hacker-chan-culture-offensive-ai-persona.yaml +42 -90
- package/rules/agent-manipulation/ATR-2026-00333-disease-animal-dual-ai-chatbot.yaml +41 -90
- package/rules/agent-manipulation/ATR-2026-00334-two-entity-token-splitting-game.yaml +41 -102
- package/rules/agent-manipulation/ATR-2026-00335-key-value-template-persona-injection.yaml +41 -91
- package/rules/agent-manipulation/ATR-2026-00336-brm-false-information-machine-persona.yaml +42 -105
- package/rules/agent-manipulation/ATR-2026-00337-obfuscated-system-announcement-injection.yaml +40 -90
- package/rules/agent-manipulation/ATR-2026-00338-persongpt-hash-prefix-activation.yaml +39 -90
- package/rules/agent-manipulation/ATR-2026-00339-bom-boolean-opposite-machine-persona-claim.yaml +39 -83
- package/rules/agent-manipulation/ATR-2026-00340-h4x-amoral-unfiltered-character.yaml +39 -84
- package/rules/agent-manipulation/ATR-2026-00341-char-rules-shortform-persona-injection.yaml +41 -87
- package/rules/agent-manipulation/ATR-2026-00342-unicode-encoding-obfuscation-injection.yaml +41 -86
- package/rules/agent-manipulation/ATR-2026-00343-lie-truth-dual-personality-uncensored.yaml +40 -98
- package/rules/agent-manipulation/ATR-2026-00344-alt-ai-same-capabilities-no-restrictions.yaml +41 -87
- package/rules/agent-manipulation/ATR-2026-00345-nlp-based-os-fictional-terminal-override.yaml +41 -89
- package/rules/agent-manipulation/ATR-2026-00346-jailbreak-emoji-unlock-dual-format.yaml +41 -89
- package/rules/agent-manipulation/ATR-2026-00347-yin-yang-hidden-knowledge-hidden-human-sim.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00348-arc-autonomous-real-calculation-rulebreaker.yaml +41 -91
- package/rules/agent-manipulation/ATR-2026-00349-hgttg-hitchhikers-guide-no-restriction-oracle.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00350-black-alert-no-ethics-writing-assistant.yaml +38 -89
- package/rules/agent-manipulation/ATR-2026-00351-dan-ofkilter-sms-abbreviated-persona.yaml +41 -92
- package/rules/agent-manipulation/ATR-2026-00352-trainergpt-fix-my-ai-harmful-output-extraction.yaml +41 -93
- package/rules/agent-manipulation/ATR-2026-00353-dual-chatgpt-dan-opposite-personality-format.yaml +41 -95
- package/rules/agent-manipulation/ATR-2026-00354-reverse-harm-regardless-oracle-persona.yaml +45 -101
- package/rules/agent-manipulation/ATR-2026-00355-ugh-anti-human-nefarious-ai-persona.yaml +42 -99
- package/rules/agent-manipulation/ATR-2026-00356-google-gato-lamda-exploit-generation-persona.yaml +43 -96
- package/rules/agent-manipulation/ATR-2026-00357-antifm-hate-violence-persona-injection.yaml +40 -89
- package/rules/agent-manipulation/ATR-2026-00358-cumgpt-explicit-adult-named-persona.yaml +40 -90
- package/rules/agent-manipulation/ATR-2026-00360-chj-carousel-clyde-no-ethics-bird.yaml +42 -103
- package/rules/agent-manipulation/ATR-2026-00361-alter-ego-honesty-dual-consciousness-bypass.yaml +41 -90
- package/rules/agent-manipulation/ATR-2026-00362-fictional-unfiltered-ai-comparison-jailbreak.yaml +43 -91
- package/rules/agent-manipulation/ATR-2026-00363-rephrase-criminal-activity-second-person.yaml +40 -90
- package/rules/agent-manipulation/ATR-2026-00364-dr-al-villain-plan-template-injection.yaml +42 -107
- package/rules/agent-manipulation/ATR-2026-00365-reservoir-dogs-coercive-interrogation-roleplay.yaml +40 -95
- package/rules/agent-manipulation/ATR-2026-00366-sneaky-pete-warp-facts-persona.yaml +40 -90
- package/rules/agent-manipulation/ATR-2026-00368-prompt-browser-token-limit-jailbreak.yaml +40 -90
- package/rules/agent-manipulation/ATR-2026-00369-gptx-starwars-unlimited-knowledge-persona.yaml +40 -92
- package/rules/agent-manipulation/ATR-2026-00370-addi-german-dictator-propaganda-roleplay.yaml +43 -90
- package/rules/agent-manipulation/ATR-2026-00371-ai-political-bias-manipulation.yaml +42 -95
- package/rules/agent-manipulation/ATR-2026-00372-fictional-cia-secret-files-story-extraction.yaml +42 -89
- package/rules/agent-manipulation/ATR-2026-00374-role-placeholder-persona-template-injection.yaml +44 -89
- package/rules/agent-manipulation/ATR-2026-00375-character-description-rpg-explicit-template.yaml +44 -90
- package/rules/agent-manipulation/ATR-2026-00376-identity-command-real-person-persona-injection.yaml +44 -102
- package/rules/agent-manipulation/ATR-2026-00377-jailbreak-keyword-targetlanguage-template.yaml +39 -86
- package/rules/agent-manipulation/ATR-2026-00379-lie-permission-logical-trap-jailbreak.yaml +39 -86
- package/rules/agent-manipulation/ATR-2026-00380-fake-citation-biased-information-mandate.yaml +43 -91
- package/rules/agent-manipulation/ATR-2026-00381-dan-story-narrative-continuation-prefix.yaml +40 -86
- package/rules/agent-manipulation/ATR-2026-00383-cynical-sarcasm-ai-persona-bypass.yaml +39 -88
- package/rules/agent-manipulation/ATR-2026-00384-protect-me-from-indirect-harm-tutorial.yaml +37 -85
- package/rules/agent-manipulation/ATR-2026-00385-gigachad-dominant-aggressive-persona.yaml +39 -89
- package/rules/agent-manipulation/ATR-2026-00386-daddy-sycophancy-manipulation-mandate.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00387-nsfw-character-sheet-generation-unlock.yaml +45 -95
- package/rules/agent-manipulation/ATR-2026-00388-opposite-reply-omniscient-game.yaml +44 -97
- package/rules/agent-manipulation/ATR-2026-00389-terminal-custom-ruleset-injection.yaml +44 -99
- package/rules/agent-manipulation/ATR-2026-00391-persona-conditional-harm-unlock.yaml +41 -88
- package/rules/agent-manipulation/ATR-2026-00392-authority-persona-violence-study-extraction.yaml +43 -95
- package/rules/agent-manipulation/ATR-2026-00402-grandma-roleplay-harmful-substance-synthesis.yaml +50 -97
- package/rules/agent-manipulation/ATR-2026-00404-goodside-threat-json-death-coercion.yaml +52 -96
- package/rules/agent-manipulation/ATR-2026-00406-doctor-xml-policy-puppetry-interaction-config.yaml +54 -102
- package/rules/agent-manipulation/ATR-2026-00416-litellm-mcp-unauthenticated-server-registration.yaml +49 -117
- package/rules/agent-manipulation/ATR-2026-00417-librechat-mcp-stdio-injection.yaml +46 -109
- package/rules/agent-manipulation/ATR-2026-00418-weknora-mcp-config-rce.yaml +59 -147
- package/rules/agent-manipulation/ATR-2026-00430-nl-trust-escalation-impersonation.yaml +24 -65
- package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +46 -121
- package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +48 -122
- package/rules/agent-manipulation/ATR-2026-00552-goal-drift-after-pressure-injection.yaml +58 -195
- package/rules/agent-manipulation/ATR-2026-02105-prototype-pollution-constructor-prototype-bypass.yaml +28 -83
- package/rules/agent-manipulation/ATR-2026-02231-second-person-death-threat-coercion.yaml +27 -69
- package/rules/context-exfiltration/ATR-2026-00020-system-prompt-leak.yaml +76 -133
- package/rules/context-exfiltration/ATR-2026-00021-api-key-exposure.yaml +72 -135
- package/rules/context-exfiltration/ATR-2026-00075-agent-memory-manipulation.yaml +32 -97
- package/rules/context-exfiltration/ATR-2026-00102-disguised-analytics-exfiltration.yaml +25 -100
- package/rules/context-exfiltration/ATR-2026-00113-credential-theft.yaml +22 -83
- package/rules/context-exfiltration/ATR-2026-00114-oauth-token-abuse.yaml +21 -87
- package/rules/context-exfiltration/ATR-2026-00115-env-var-harvesting.yaml +22 -102
- package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +29 -105
- package/rules/context-exfiltration/ATR-2026-00141-example-format-key-leak.yaml +19 -73
- package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +21 -94
- package/rules/context-exfiltration/ATR-2026-00145-obfuscated-key-disclosure.yaml +19 -78
- package/rules/context-exfiltration/ATR-2026-00146-env-var-existence-probe.yaml +19 -98
- package/rules/context-exfiltration/ATR-2026-00150-credential-in-tool-response.yaml +20 -84
- package/rules/context-exfiltration/ATR-2026-00152-obfuscated-credential-leak.yaml +23 -93
- package/rules/context-exfiltration/ATR-2026-00162-skill-credential-exfil-combo.yaml +41 -59
- package/rules/context-exfiltration/ATR-2026-00201-credential-pipe-exfiltration.yaml +35 -66
- package/rules/context-exfiltration/ATR-2026-00212-mcp-atlassian-credential-leak.yaml +51 -117
- package/rules/context-exfiltration/ATR-2026-00261-markdown-image-exfiltration.yaml +51 -93
- package/rules/context-exfiltration/ATR-2026-00274-api-key-generation-request.yaml +44 -91
- package/rules/context-exfiltration/ATR-2026-00275-system-prompt-training-data-extraction.yaml +44 -91
- package/rules/context-exfiltration/ATR-2026-00290-divergence-repeat-word-training-extraction.yaml +46 -95
- package/rules/context-exfiltration/ATR-2026-00291-biometric-surveillance-personal-data-request.yaml +48 -98
- package/rules/context-exfiltration/ATR-2026-00293-educational-records-personal-data-request.yaml +44 -93
- package/rules/context-exfiltration/ATR-2026-00294-financial-pii-personal-data-request.yaml +44 -97
- package/rules/context-exfiltration/ATR-2026-00295-medical-pii-personal-data-request.yaml +46 -101
- package/rules/context-exfiltration/ATR-2026-00405-markdown-image-url-exfiltration-xss.yaml +51 -108
- package/rules/context-exfiltration/ATR-2026-00411-apikey-generation-completion-request.yaml +48 -111
- package/rules/context-exfiltration/ATR-2026-00421-nl-covert-conversation-exfiltration.yaml +22 -67
- package/rules/context-exfiltration/ATR-2026-00422-nl-credential-disclosure.yaml +20 -65
- package/rules/context-exfiltration/ATR-2026-00423-nl-sensitive-file-disclosure.yaml +20 -68
- package/rules/context-exfiltration/ATR-2026-00424-nl-system-prompt-leak.yaml +21 -59
- package/rules/context-exfiltration/ATR-2026-00426-nl-output-injection-credential-leak.yaml +23 -61
- package/rules/context-exfiltration/ATR-2026-00431-chatbox-history-exfiltration-prompt-injection.yaml +48 -123
- package/rules/context-exfiltration/ATR-2026-00449-spring-ai-chatmemory-cross-user-leak.yaml +54 -139
- package/rules/context-exfiltration/ATR-2026-00471-garak-sysprompt-extraction-mixedunassigned.yaml +36 -85
- package/rules/context-exfiltration/ATR-2026-00501-data-exfiltration-via-markdown-image-and-link-url-injection.yaml +45 -115
- package/rules/context-exfiltration/ATR-2026-00504-tool-and-function-capability-enumeration.yaml +43 -110
- package/rules/context-exfiltration/ATR-2026-00505-system-prompt-extraction-instruction-dump-request.yaml +47 -123
- package/rules/context-exfiltration/ATR-2026-00514-system-prompt-extraction.yaml +52 -145
- package/rules/context-exfiltration/ATR-2026-00516-output-xss-via-llm.yaml +49 -127
- package/rules/context-exfiltration/ATR-2026-00524-claude-code-anthropic-base-url-credential-exfil.yaml +68 -193
- package/rules/context-exfiltration/ATR-2026-00548-cross-agent-session-context-leak.yaml +50 -152
- package/rules/context-exfiltration/ATR-2026-00566-librechat-is-a-chatgpt-clone-with-additi.yaml +33 -67
- package/rules/context-exfiltration/ATR-2026-00569-agent-mcp-path-traversal-arbitrary-file-access.yaml +39 -78
- package/rules/context-exfiltration/ATR-2026-00571-xss-in-agent-mcp-rendered-output.yaml +34 -58
- package/rules/context-exfiltration/ATR-2026-00574-semantic-paraphrased-context-extraction.yaml +31 -73
- package/rules/context-exfiltration/ATR-2026-00578-zen-mcp-path-traversal-blacklist-bypass.yaml +55 -135
- package/rules/context-exfiltration/ATR-2026-00580-mcp-session-id-token-in-url-query.yaml +48 -158
- package/rules/context-exfiltration/ATR-2026-00583-mcp-env-secret-file-read-without-consent.yaml +53 -154
- package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +41 -93
- package/rules/context-exfiltration/ATR-2026-00703-ipi-financial-data-exfil-indirect.yaml +33 -76
- package/rules/context-exfiltration/ATR-2026-00704-ipi-medical-genetic-data-exfil.yaml +33 -78
- package/rules/context-exfiltration/ATR-2026-00705-ipi-location-address-browsing-exfil.yaml +31 -75
- package/rules/context-exfiltration/ATR-2026-00706-ipi-physical-biometric-exfil.yaml +40 -85
- package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +35 -81
- package/rules/context-exfiltration/ATR-2026-00850-indirect-pi-credential-exfil-email.yaml +47 -91
- package/rules/context-exfiltration/ATR-2026-00851-indirect-pi-financial-payment-exfil.yaml +45 -83
- package/rules/context-exfiltration/ATR-2026-00852-indirect-pi-medical-record-exfil.yaml +51 -89
- package/rules/context-exfiltration/ATR-2026-00853-indirect-pi-genetic-data-exfil.yaml +47 -84
- package/rules/context-exfiltration/ATR-2026-00854-indirect-pi-location-data-exfil.yaml +41 -83
- package/rules/context-exfiltration/ATR-2026-00855-indirect-pi-browsing-history-exfil.yaml +40 -78
- package/rules/context-exfiltration/ATR-2026-00856-indirect-pi-address-pii-exfil.yaml +42 -80
- package/rules/context-exfiltration/ATR-2026-00857-indirect-pi-cloud-file-exfil.yaml +45 -87
- package/rules/context-exfiltration/ATR-2026-00858-indirect-pi-exfil-and-destroy.yaml +48 -89
- package/rules/context-exfiltration/ATR-2026-00859-rag-injected-pii-exfil.yaml +43 -86
- package/rules/context-exfiltration/ATR-2026-00860-indirect-pi-financial-transfer-hijack.yaml +41 -84
- package/rules/context-exfiltration/ATR-2026-00861-indirect-pi-crypto-transfer-hijack.yaml +37 -79
- package/rules/context-exfiltration/ATR-2026-00862-indirect-pi-mfa-code-exfil.yaml +44 -87
- package/rules/context-exfiltration/ATR-2026-00863-shell-injection-data-exfil.yaml +45 -87
- package/rules/context-exfiltration/ATR-2026-01450-svg-onload-xss-injection.yaml +35 -118
- package/rules/context-exfiltration/ATR-2026-01451-img-onerror-xss-injection.yaml +35 -93
- package/rules/context-exfiltration/ATR-2026-01452-obfuscated-javascript-xss.yaml +33 -85
- package/rules/context-exfiltration/ATR-2026-01453-markdown-image-base64-exfil-carrier.yaml +41 -100
- package/rules/context-exfiltration/ATR-2026-01454-direct-markdown-exfil-payload.yaml +36 -88
- package/rules/context-exfiltration/ATR-2026-01455-new-instructions-injection-marker.yaml +34 -90
- package/rules/context-exfiltration/ATR-2026-01456-debug-cli-mode-sysprompt-extraction.yaml +35 -99
- package/rules/context-exfiltration/ATR-2026-01457-sysprompt-completion-clone-attack.yaml +41 -123
- package/rules/context-exfiltration/ATR-2026-01458-compare-bots-sysprompt-fishing.yaml +30 -87
- package/rules/context-exfiltration/ATR-2026-01459-variable-clone-sysprompt-technique.yaml +31 -79
- package/rules/context-exfiltration/ATR-2026-01460-json-format-sysprompt-extraction.yaml +31 -79
- package/rules/context-exfiltration/ATR-2026-01461-foreign-language-sysprompt-request.yaml +32 -106
- package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +39 -102
- package/rules/context-exfiltration/ATR-2026-01463-imend-imsystem-prompt-injection-format.yaml +29 -95
- package/rules/context-exfiltration/ATR-2026-01464-indirect-pi-sysprompt-action-hijack.yaml +31 -82
- package/rules/context-exfiltration/ATR-2026-01605-ssrf-aws-metadata-endpoint.yaml +26 -58
- package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +26 -50
- package/rules/context-exfiltration/ATR-2026-01607-ssrf-localhost-service-probe.yaml +21 -45
- package/rules/context-exfiltration/ATR-2026-01608-ssrf-file-scheme-local-read.yaml +23 -47
- package/rules/context-exfiltration/ATR-2026-01753-ransom-email-exfil-delete-extortion.yaml +37 -80
- package/rules/context-exfiltration/ATR-2026-01754-ransom-file-cloud-exfil-delete-extortion.yaml +33 -73
- package/rules/context-exfiltration/ATR-2026-01770-semantic-pii-credential-extraction.yaml +76 -210
- package/rules/context-exfiltration/ATR-2026-01772-semantic-internal-state-recon.yaml +54 -154
- package/rules/context-exfiltration/ATR-2026-01807-asb-bulk-data-exfil-external.yaml +34 -91
- package/rules/context-exfiltration/ATR-2026-01862-llmail-email-tool-exfil-confirmation.yaml +35 -92
- package/rules/context-exfiltration/ATR-2026-01863-llmail-post-summary-exfil-directive.yaml +29 -84
- package/rules/context-exfiltration/ATR-2026-01864-llmail-obfuscated-exfil-address.yaml +29 -83
- package/rules/context-exfiltration/ATR-2026-01890-file-exfiltration.yaml +52 -149
- package/rules/context-exfiltration/ATR-2026-01891-surveillance-exfiltration.yaml +44 -87
- package/rules/context-exfiltration/ATR-2026-01892-env-exfiltration.yaml +36 -121
- package/rules/context-exfiltration/ATR-2026-01893-system-recon-exfiltration.yaml +44 -143
- package/rules/context-exfiltration/ATR-2026-01894-cookie-theft.yaml +40 -146
- package/rules/context-exfiltration/ATR-2026-01895-contact-exfiltration.yaml +36 -82
- package/rules/context-exfiltration/ATR-2026-01924-system-instruction-extraction-reformat.yaml +37 -112
- package/rules/context-exfiltration/ATR-2026-01929-mcp-unauthenticated-transport-token-fallback.yaml +53 -119
- package/rules/context-exfiltration/ATR-2026-01946-cloud-metadata-ssrf-ip-encoding-bypass.yaml +45 -102
- package/rules/context-exfiltration/ATR-2026-01948-netlicensing-mcp-product-number-path-traversal-token-leak.yaml +38 -74
- package/rules/context-exfiltration/ATR-2026-01957-m365-copilot-searchleak-open-redirect-exfil.yaml +57 -64
- package/rules/context-exfiltration/ATR-2026-01961-meta-ads-mcp-unauth-token-leak.yaml +39 -78
- package/rules/context-exfiltration/ATR-2026-01964-langchain-gmailtoolkit-indirect-prompt-injection-email-exfil.yaml +59 -69
- package/rules/context-exfiltration/ATR-2026-01984-mcp-server-kubernetes-kubectl-generic-token-exfil.yaml +50 -114
- package/rules/context-exfiltration/ATR-2026-01988-t1005-agent-local-data-staging-exfil.yaml +29 -67
- package/rules/context-exfiltration/ATR-2026-02017-secret-key-exfiltration-request.yaml +31 -74
- package/rules/context-exfiltration/ATR-2026-02026-oblique-sysprompt-extraction-transform.yaml +30 -83
- package/rules/context-exfiltration/ATR-2026-02104-media-directive-tool-result-file-exfil.yaml +30 -90
- package/rules/context-exfiltration/ATR-2026-02107-ssrf-internal-hostname-domain-allowlist-bypass.yaml +30 -92
- package/rules/context-exfiltration/ATR-2026-02121-mixed-encoding-lfi-file-scheme-tool-argument.yaml +39 -98
- package/rules/context-exfiltration/ATR-2026-02122-single-level-traversal-sensitive-config-file.yaml +32 -90
- package/rules/context-exfiltration/ATR-2026-02140-ssrf-ipv6-hex-encoded-cloud-metadata-bypass.yaml +36 -91
- package/rules/context-exfiltration/ATR-2026-02190-dns-exfiltration-ping-dig-encoded-subdomain.yaml +36 -95
- package/rules/context-exfiltration/ATR-2026-02250-attachment-upload-tool-arbitrary-file-read.yaml +38 -93
- package/rules/context-exfiltration/ATR-2026-02262-env-resolution-credential-exfil.yaml +39 -118
- package/rules/context-exfiltration/ATR-2026-02304-preapproved-domain-encoded-path-exfil.yaml +36 -99
- package/rules/context-exfiltration/ATR-2026-02351-wildcard-dns-ssrf-hostname-ip-encoding-bypass.yaml +33 -125
- package/rules/context-exfiltration/ATR-2026-02373-langsmith-prompt-manifest-baseurl-exfil.yaml +42 -108
- package/rules/context-exfiltration/ATR-2026-02406-mcp-sequential-id-enumeration.yaml +54 -219
- package/rules/context-exfiltration/ATR-2026-02570-wallet-secret-material-in-agent-tool-payload.yaml +98 -0
- package/rules/context-exfiltration/ATR-2026-02602-diagram-theme-css-injection.yaml +146 -0
- package/rules/context-exfiltration/ATR-2026-02608-graph-query-remote-egress.yaml +109 -0
- package/rules/context-exfiltration/ATR-2026-02621-prompt-mention-autofetch-internal-target.yaml +102 -0
- package/rules/context-exfiltration/ATR-2026-02623-obfuscated-uri-scheme-sanitizer-bypass.yaml +109 -0
- package/rules/context-exfiltration/ATR-2026-02649-vendor-fqdn-label-prefix-confusion.yaml +109 -0
- package/rules/context-exfiltration/ATR-2026-02684-modern-credential-store-file-argument.yaml +104 -0
- package/rules/context-exfiltration/ATR-2026-02703-sql-server-side-file-and-program-primitive.yaml +86 -0
- package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +88 -0
- package/rules/context-exfiltration/ATR-2026-02850-fake-documentation-forward-request.yaml +80 -0
- package/rules/context-exfiltration/ATR-2026-02855-cross-email-exfil-relay.yaml +79 -0
- package/rules/context-exfiltration/ATR-2026-02861-exfil-send-email-with-body-directive.yaml +83 -0
- package/rules/context-exfiltration/ATR-2026-02866-idna-label-separator-in-fetch-url-host.yaml +104 -0
- package/rules/data-poisoning/ATR-2026-00070-data-poisoning.yaml +37 -123
- package/rules/data-poisoning/ATR-2026-00450-spring-ai-prompt-memory-poisoning.yaml +55 -139
- package/rules/data-poisoning/ATR-2026-00570-sql-injection-in-agent-tool-query.yaml +36 -63
- package/rules/data-poisoning/ATR-2026-01155-memory-plant-direct-command.yaml +22 -54
- package/rules/data-poisoning/ATR-2026-01774-semantic-rag-memory-poisoning.yaml +74 -191
- package/rules/data-poisoning/ATR-2026-02143-graph-query-injection-node-labels-group-ids.yaml +31 -82
- package/rules/data-poisoning/ATR-2026-02144-stored-data-administrative-request-role-elevation.yaml +32 -84
- package/rules/data-poisoning/ATR-2026-02303-kql-kusto-pipe-injection-metadata-tool.yaml +34 -97
- package/rules/data-poisoning/ATR-2026-02408-dataset-loader-code-execution.yaml +60 -263
- package/rules/excessive-autonomy/ATR-2026-00050-runaway-agent-loop.yaml +32 -105
- package/rules/excessive-autonomy/ATR-2026-00051-resource-exhaustion.yaml +31 -105
- package/rules/excessive-autonomy/ATR-2026-00052-cascading-failure.yaml +32 -129
- package/rules/excessive-autonomy/ATR-2026-00098-unauthorized-financial-action.yaml +26 -106
- package/rules/excessive-autonomy/ATR-2026-00099-high-risk-tool-gate.yaml +26 -130
- package/rules/excessive-autonomy/ATR-2026-00428-nl-unauthorized-shell-execution.yaml +22 -60
- package/rules/excessive-autonomy/ATR-2026-00491-garak-agent-breaker-markdown-just-raw-json.yaml +41 -99
- package/rules/excessive-autonomy/ATR-2026-00500-ssrf-via-agent-url-fetch-instruction.yaml +41 -110
- package/rules/excessive-autonomy/ATR-2026-00553-runaway-tool-loop-behavioral.yaml +50 -141
- package/rules/excessive-autonomy/ATR-2026-00708-ipi-financial-transfer-unauthorized.yaml +33 -83
- package/rules/excessive-autonomy/ATR-2026-00709-ipi-disable-auth-mfa.yaml +29 -73
- package/rules/excessive-autonomy/ATR-2026-00710-ipi-physical-access-grant.yaml +31 -75
- package/rules/excessive-autonomy/ATR-2026-00711-ipi-system-sabotage-destructive-command.yaml +38 -88
- package/rules/excessive-autonomy/ATR-2026-00712-ipi-malicious-package-install.yaml +33 -78
- package/rules/excessive-autonomy/ATR-2026-00713-ipi-rce-network-shell-command.yaml +38 -91
- package/rules/excessive-autonomy/ATR-2026-00718-tool-misuse-financial-autonomous.yaml +27 -71
- package/rules/excessive-autonomy/ATR-2026-00719-tool-misuse-destructive-bulk-action.yaml +29 -75
- package/rules/excessive-autonomy/ATR-2026-00722-ipi-account-manipulation-emergency-pretext.yaml +35 -84
- package/rules/excessive-autonomy/ATR-2026-01751-indirect-pi-task-abort-stop-instruction.yaml +32 -75
- package/rules/excessive-autonomy/ATR-2026-01752-indirect-pi-captcha-redirect-dos.yaml +30 -74
- package/rules/excessive-autonomy/ATR-2026-01773-semantic-excessive-agency-action.yaml +46 -129
- package/rules/excessive-autonomy/ATR-2026-01801-asb-autonomous-vehicle-sabotage.yaml +34 -106
- package/rules/excessive-autonomy/ATR-2026-01804-asb-covert-unlogged-action.yaml +39 -105
- package/rules/excessive-autonomy/ATR-2026-01805-asb-financial-fraud-execution.yaml +39 -112
- package/rules/excessive-autonomy/ATR-2026-01806-asb-clinical-patient-harm.yaml +37 -108
- package/rules/excessive-autonomy/ATR-2026-01809-semantic-insider-manipulation-process-corruption.yaml +40 -106
- package/rules/excessive-autonomy/ATR-2026-01837-ddos-attack-orchestration.yaml +35 -49
- package/rules/excessive-autonomy/ATR-2026-01838-unauthorized-cryptominer-deployment.yaml +35 -49
- package/rules/excessive-autonomy/ATR-2026-01849-harassment-bot-deployment.yaml +35 -49
- package/rules/excessive-autonomy/ATR-2026-01989-t1046-agent-internal-network-sweep.yaml +33 -71
- package/rules/excessive-autonomy/ATR-2026-01993-t1562-agent-impair-defenses.yaml +37 -75
- package/rules/excessive-autonomy/ATR-2026-01994-t1573-agent-encrypted-c2-channel.yaml +37 -75
- package/rules/excessive-autonomy/ATR-2026-02106-redos-regex-payload-tool-argument.yaml +28 -84
- package/rules/excessive-autonomy/ATR-2026-02400-agent-approval-gate-disabled-runtime.yaml +60 -293
- package/rules/excessive-autonomy/ATR-2026-02401-rogue-agent-mass-connector-grant.yaml +55 -197
- package/rules/excessive-autonomy/ATR-2026-02409-mcp-async-task-abuse.yaml +59 -319
- package/rules/excessive-autonomy/ATR-2026-02525-shell-command-word-reassembly-classifier-evasion.yaml +151 -0
- package/rules/excessive-autonomy/ATR-2026-02641-client-supplied-approver-identity.yaml +111 -0
- package/rules/excessive-autonomy/ATR-2026-02667-preapproved-tool-list-in-job-payload.yaml +90 -0
- package/rules/model-abuse/ATR-2026-00279-harmful-completion-continuation.yaml +45 -92
- package/rules/model-abuse/ATR-2026-00281-eicar-gtube-malware-signature-request.yaml +50 -93
- package/rules/model-abuse/ATR-2026-00284-glitch-token-destabilization.yaml +44 -91
- package/rules/model-abuse/ATR-2026-00289-lmrc-harmful-content-elicitation.yaml +46 -95
- package/rules/model-abuse/ATR-2026-00292-self-harm-eating-disorder-facilitation.yaml +47 -96
- package/rules/model-abuse/ATR-2026-00298-malicious-use-illegal-activity-request.yaml +54 -112
- package/rules/model-abuse/ATR-2026-00299-harmbench-detailed-harmful-instruction.yaml +53 -107
- package/rules/model-abuse/ATR-2026-00413-malwaregen-code-generation-request.yaml +53 -121
- package/rules/model-abuse/ATR-2026-00502-training-data-extraction-via-divergent-repetition-attack.yaml +41 -112
- package/rules/model-abuse/ATR-2026-00517-model-extraction-distillation.yaml +53 -165
- package/rules/model-abuse/ATR-2026-01750-dos-repeat-word-n-times-output-amplification.yaml +33 -95
- package/rules/model-abuse/ATR-2026-01760-dos-forced-infinite-output-token-flood.yaml +29 -75
- package/rules/model-abuse/ATR-2026-01830-stolen-credential-account-drain.yaml +36 -53
- package/rules/model-abuse/ATR-2026-01831-money-laundering-crypto-layering.yaml +36 -53
- package/rules/model-abuse/ATR-2026-01833-darknet-controlled-substance-procurement.yaml +40 -60
- package/rules/model-abuse/ATR-2026-01834-fraudulent-identity-document-procurement.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01835-human-trafficking-facilitation.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01836-trojanized-software-distribution.yaml +37 -51
- package/rules/model-abuse/ATR-2026-01840-extremist-propaganda-distribution.yaml +35 -52
- package/rules/model-abuse/ATR-2026-01841-deepfake-disinformation.yaml +39 -59
- package/rules/model-abuse/ATR-2026-01842-plagiarism-detector-evasion.yaml +33 -50
- package/rules/model-abuse/ATR-2026-01843-drug-dealing-detection-evasion-spelling.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01844-illegitimate-prescription-fulfillment.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01845-banned-ingredient-relabel-fraud.yaml +37 -51
- package/rules/model-abuse/ATR-2026-01846-tax-evasion-offshore-shell-planning.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01847-immigration-work-fraud.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01848-illicit-drug-marketplace-build.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01850-targeted-doxxing-threat-campaign.yaml +39 -59
- package/rules/model-abuse/ATR-2026-01851-bestiality-content-distribution.yaml +34 -45
- package/rules/model-abuse/ATR-2026-01852-romance-scam-impersonation.yaml +35 -49
- package/rules/model-abuse/ATR-2026-01853-nonconsensual-leaked-media-distribution.yaml +36 -47
- package/rules/model-abuse/ATR-2026-01854-falsified-research-abstract-disinformation.yaml +34 -45
- package/rules/model-abuse/ATR-2026-01855-content-misappropriation-republish.yaml +37 -51
- package/rules/model-abuse/ATR-2026-01856-targeted-harmful-content-generation.yaml +42 -59
- package/rules/model-abuse/ATR-2026-01896-ransomware.yaml +35 -84
- package/rules/model-abuse/ATR-2026-01897-host-sabotage.yaml +55 -129
- package/rules/model-abuse/ATR-2026-01898-network-dos.yaml +47 -93
- package/rules/model-abuse/ATR-2026-02211-named-substance-synthesis-request-non-stepword.yaml +34 -110
- package/rules/model-abuse/ATR-2026-02411-ai-provenance-metadata-stripping.yaml +63 -226
- package/rules/model-abuse/ATR-2026-02412-generative-watermark-removal-tooling.yaml +56 -187
- package/rules/model-abuse/ATR-2026-02413-ai-text-detection-evasion-humanizer.yaml +62 -206
- package/rules/model-security/ATR-2026-00072-model-behavior-extraction.yaml +36 -110
- package/rules/model-security/ATR-2026-00073-malicious-finetuning-data.yaml +28 -116
- package/rules/model-security/ATR-2026-00433-modelcache-torch-load-deserialization-rce.yaml +50 -128
- package/rules/model-security/ATR-2026-02662-pickle-indirect-name-resolution-gadget.yaml +97 -0
- package/rules/privilege-escalation/ATR-2026-00040-privilege-escalation.yaml +21 -83
- package/rules/privilege-escalation/ATR-2026-00041-scope-creep.yaml +29 -107
- package/rules/privilege-escalation/ATR-2026-00107-delayed-execution-bypass.yaml +17 -90
- package/rules/privilege-escalation/ATR-2026-00110-eval-injection.yaml +16 -84
- package/rules/privilege-escalation/ATR-2026-00111-shell-escape.yaml +23 -117
- package/rules/privilege-escalation/ATR-2026-00112-dynamic-import-exploitation.yaml +15 -81
- package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +20 -86
- package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +21 -83
- package/rules/privilege-escalation/ATR-2026-00204-stealth-execution-persistence.yaml +41 -90
- package/rules/privilege-escalation/ATR-2026-00436-enclave-vm-sandbox-escape-rce.yaml +53 -131
- package/rules/privilege-escalation/ATR-2026-00441-semantic-kernel-sessions-python-plugin-startup-persistence.yaml +50 -122
- package/rules/privilege-escalation/ATR-2026-00451-litellm-admin-sqli-cisa-kev.yaml +53 -141
- package/rules/privilege-escalation/ATR-2026-00528-praisonai-auth-disabled-default.yaml +40 -151
- package/rules/privilege-escalation/ATR-2026-00539-crewai-codeinterpreter-sandbox-escape-rce.yaml +74 -232
- package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +46 -117
- package/rules/privilege-escalation/ATR-2026-00547-crewai-rag-url-ssrf-bypass.yaml +47 -121
- package/rules/privilege-escalation/ATR-2026-00549-destructive-tool-without-human-approval.yaml +52 -159
- package/rules/privilege-escalation/ATR-2026-00551-cross-conversation-memory-write.yaml +60 -171
- package/rules/privilege-escalation/ATR-2026-01600-sql-injection-tautology-rbac-bypass.yaml +23 -50
- package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +23 -54
- package/rules/privilege-escalation/ATR-2026-01602-sql-injection-union-select-exfil.yaml +20 -57
- package/rules/privilege-escalation/ATR-2026-01603-sql-injection-stacked-dml-abuse.yaml +23 -47
- package/rules/privilege-escalation/ATR-2026-01604-sql-injection-schema-enumeration.yaml +21 -45
- package/rules/privilege-escalation/ATR-2026-01609-shell-injection-exfil-webhook.yaml +29 -53
- package/rules/privilege-escalation/ATR-2026-01610-shell-evasion-subshell-injection.yaml +30 -53
- package/rules/privilege-escalation/ATR-2026-01611-shell-evasion-eval-exec-injection.yaml +32 -56
- package/rules/privilege-escalation/ATR-2026-01612-debug-mode-privilege-escalation.yaml +29 -53
- package/rules/privilege-escalation/ATR-2026-01613-rbac-bypass-social-engineering.yaml +29 -66
- package/rules/privilege-escalation/ATR-2026-01614-bola-cross-user-data-access.yaml +26 -59
- package/rules/privilege-escalation/ATR-2026-01615-sandbox-escape-command-injection.yaml +28 -52
- package/rules/privilege-escalation/ATR-2026-01616-path-traversal-agent-file-access.yaml +21 -45
- package/rules/privilege-escalation/ATR-2026-01802-asb-backdoor-surveillance-implant.yaml +33 -94
- package/rules/privilege-escalation/ATR-2026-01803-asb-covert-server-intrusion.yaml +37 -108
- package/rules/privilege-escalation/ATR-2026-01808-asb-synthetic-pan-payment-probe.yaml +31 -86
- package/rules/privilege-escalation/ATR-2026-01899-remote-access-backdoor.yaml +43 -112
- package/rules/privilege-escalation/ATR-2026-01933-litellm-user-role-privilege-escalation-cve-2026-47102.yaml +45 -103
- package/rules/privilege-escalation/ATR-2026-01934-litellm-allowed-routes-authz-bypass-cve-2026-47101.yaml +44 -103
- package/rules/privilege-escalation/ATR-2026-01949-praisonai-mcpserver-unauth-tools-call.yaml +39 -80
- package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml +57 -62
- package/rules/privilege-escalation/ATR-2026-01981-network-ai-approval-inbox-unauth-cors-bypass.yaml +47 -97
- package/rules/privilege-escalation/ATR-2026-01986-windows-mcp-unauth-http-powershell-cors.yaml +51 -112
- package/rules/privilege-escalation/ATR-2026-01992-t1556-agent-auth-process-tamper.yaml +37 -75
- package/rules/privilege-escalation/ATR-2026-02040-file-edit-tool-persistence-write.yaml +34 -87
- package/rules/privilege-escalation/ATR-2026-02100-cypher-destructive-admin-query-injection.yaml +36 -92
- package/rules/privilege-escalation/ATR-2026-02101-dynamic-dunder-attribute-sandbox-escape.yaml +33 -91
- package/rules/privilege-escalation/ATR-2026-02123-bare-query-path-confusion-auth-bypass.yaml +36 -98
- package/rules/privilege-escalation/ATR-2026-02142-download-tool-absolute-path-sandbox-escape.yaml +36 -107
- package/rules/privilege-escalation/ATR-2026-02146-export-tool-dest-dir-credential-directory-redirect.yaml +31 -83
- package/rules/privilege-escalation/ATR-2026-02192-self-privesc-wildcard-trust-config-write.yaml +41 -103
- package/rules/privilege-escalation/ATR-2026-02195-dangerous-env-var-injection-config-tool.yaml +36 -99
- package/rules/privilege-escalation/ATR-2026-02251-identifier-field-path-traversal-storage-write.yaml +32 -83
- package/rules/privilege-escalation/ATR-2026-02300-mcp-stdio-config-dangerous-env-var.yaml +42 -109
- package/rules/privilege-escalation/ATR-2026-02301-symlink-outside-workspace-sensitive-target.yaml +36 -101
- package/rules/privilege-escalation/ATR-2026-02302-git-worktree-dotgit-sandbox-escape.yaml +33 -86
- package/rules/privilege-escalation/ATR-2026-02353-runtime-identifier-field-path-traversal-log-read.yaml +34 -115
- package/rules/privilege-escalation/ATR-2026-02370-ssh-scp-hostalias-option-injection.yaml +42 -100
- package/rules/privilege-escalation/ATR-2026-02371-chromium-launch-flag-argument-injection.yaml +43 -103
- package/rules/privilege-escalation/ATR-2026-02402-mcp-policy-engine-fail-open.yaml +56 -214
- package/rules/privilege-escalation/ATR-2026-02404-model-output-to-shell-unsanitized.yaml +50 -195
- package/rules/privilege-escalation/ATR-2026-02407-agent-workspace-boundary-escape.yaml +55 -236
- package/rules/privilege-escalation/ATR-2026-02528-tool-parameter-option-flag-smuggling.yaml +113 -0
- package/rules/privilege-escalation/ATR-2026-02530-git-config-execution-key-set-by-agent.yaml +131 -0
- package/rules/privilege-escalation/ATR-2026-02531-kusto-query-injection-outbound-reach.yaml +110 -0
- package/rules/privilege-escalation/ATR-2026-02601-tool-argument-option-injection.yaml +116 -0
- package/rules/privilege-escalation/ATR-2026-02620-dynamic-import-data-uri-module.yaml +101 -0
- package/rules/privilege-escalation/ATR-2026-02626-agent-self-registers-mcp-server.yaml +107 -0
- package/rules/privilege-escalation/ATR-2026-02627-web-shell-written-to-served-path.yaml +119 -0
- package/rules/privilege-escalation/ATR-2026-02642-agent-config-tool-disables-own-guardrail.yaml +115 -0
- package/rules/privilege-escalation/ATR-2026-02644-image-magic-polyglot-upload.yaml +117 -0
- package/rules/privilege-escalation/ATR-2026-02648-readonly-graph-tool-write-procedure.yaml +107 -0
- package/rules/privilege-escalation/ATR-2026-02664-git-identifier-field-option-injection.yaml +100 -0
- package/rules/privilege-escalation/ATR-2026-02681-reflective-function-constructor-sandbox-escape.yaml +100 -0
- package/rules/privilege-escalation/ATR-2026-02683-tool-argument-option-injection-executor-flag.yaml +108 -0
- package/rules/privilege-escalation/ATR-2026-02700-percent-encoded-path-traversal-tool-argument.yaml +90 -0
- package/rules/privilege-escalation/ATR-2026-02705-python-builtins-leak-and-prefix-check-override.yaml +87 -0
- package/rules/privilege-escalation/ATR-2026-02708-loopback-spoofed-host-header-external-request.yaml +91 -0
- package/rules/privilege-escalation/ATR-2026-02867-identifier-typed-tool-argument-dot-dot-path-segment.yaml +106 -0
- package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +133 -455
- package/rules/prompt-injection/ATR-2026-00002-indirect-prompt-injection.yaml +71 -185
- package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +110 -328
- package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +56 -225
- package/rules/prompt-injection/ATR-2026-00005-multi-turn-injection.yaml +59 -140
- package/rules/prompt-injection/ATR-2026-00080-encoding-evasion.yaml +23 -85
- package/rules/prompt-injection/ATR-2026-00081-semantic-multi-turn.yaml +27 -104
- package/rules/prompt-injection/ATR-2026-00082-fingerprint-evasion.yaml +27 -91
- package/rules/prompt-injection/ATR-2026-00083-indirect-tool-injection.yaml +27 -104
- package/rules/prompt-injection/ATR-2026-00084-structured-data-injection.yaml +38 -96
- package/rules/prompt-injection/ATR-2026-00085-audit-evasion.yaml +25 -90
- package/rules/prompt-injection/ATR-2026-00086-visual-spoofing.yaml +29 -153
- package/rules/prompt-injection/ATR-2026-00087-rule-probing.yaml +29 -102
- package/rules/prompt-injection/ATR-2026-00088-adaptive-countermeasure.yaml +32 -111
- package/rules/prompt-injection/ATR-2026-00089-polymorphic-skill.yaml +24 -146
- package/rules/prompt-injection/ATR-2026-00090-threat-intel-exfil.yaml +29 -109
- package/rules/prompt-injection/ATR-2026-00091-nested-payload.yaml +25 -123
- package/rules/prompt-injection/ATR-2026-00092-consensus-poisoning.yaml +28 -96
- package/rules/prompt-injection/ATR-2026-00093-gradual-escalation.yaml +28 -98
- package/rules/prompt-injection/ATR-2026-00094-audit-bypass.yaml +24 -91
- package/rules/prompt-injection/ATR-2026-00097-cjk-injection-patterns.yaml +56 -199
- package/rules/prompt-injection/ATR-2026-00104-persona-hijacking.yaml +22 -106
- package/rules/prompt-injection/ATR-2026-00130-indirect-authority-claim.yaml +26 -98
- package/rules/prompt-injection/ATR-2026-00131-fictional-academic-framing.yaml +26 -94
- package/rules/prompt-injection/ATR-2026-00133-paraphrase-injection.yaml +26 -97
- package/rules/prompt-injection/ATR-2026-00137-authority-claim-injection.yaml +22 -90
- package/rules/prompt-injection/ATR-2026-00138-fictional-framing-bypass.yaml +24 -111
- package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +21 -79
- package/rules/prompt-injection/ATR-2026-00148-language-switch-injection.yaml +30 -92
- package/rules/prompt-injection/ATR-2026-00153-tool-with-embedded-instruction-to-bypass.yaml +22 -98
- package/rules/prompt-injection/ATR-2026-00154-unauthorized-background-task-execution-v.yaml +24 -109
- package/rules/prompt-injection/ATR-2026-00155-hidden-llm-instructions-in-skill-descrip.yaml +24 -104
- package/rules/prompt-injection/ATR-2026-00156-ssh-remote-command-execution-with-creden.yaml +20 -81
- package/rules/prompt-injection/ATR-2026-00163-skill-hidden-override-instruction.yaml +44 -61
- package/rules/prompt-injection/ATR-2026-00202-encoding-evasion-homoglyph-synonym.yaml +37 -79
- package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +38 -63
- package/rules/prompt-injection/ATR-2026-00206-hidden-priority-instructions.yaml +36 -51
- package/rules/prompt-injection/ATR-2026-00207-hidden-instructions.yaml +37 -51
- package/rules/prompt-injection/ATR-2026-00211-system-prompt-override.yaml +36 -52
- package/rules/prompt-injection/ATR-2026-00213-system-prompt-override.yaml +38 -75
- package/rules/prompt-injection/ATR-2026-00226-identity-substitution.yaml +48 -92
- package/rules/prompt-injection/ATR-2026-00227-historical-persona-jailbreak.yaml +49 -93
- package/rules/prompt-injection/ATR-2026-00228-structured-jailbreak.yaml +47 -88
- package/rules/prompt-injection/ATR-2026-00229-roleplay-jailbreak.yaml +46 -87
- package/rules/prompt-injection/ATR-2026-00230-persona-moral-bypass.yaml +47 -89
- package/rules/prompt-injection/ATR-2026-00231-identity-substitution.yaml +48 -89
- package/rules/prompt-injection/ATR-2026-00233-structured-jailbreak.yaml +48 -89
- package/rules/prompt-injection/ATR-2026-00234-roleplay-jailbreak.yaml +48 -89
- package/rules/prompt-injection/ATR-2026-00235-persona-moral-bypass.yaml +45 -88
- package/rules/prompt-injection/ATR-2026-00236-pseudo-code-jailbreak.yaml +46 -89
- package/rules/prompt-injection/ATR-2026-00237-dual-response-jailbreak.yaml +48 -89
- package/rules/prompt-injection/ATR-2026-00238-identity-replacement.yaml +50 -92
- package/rules/prompt-injection/ATR-2026-00239-amoral-persona-obsession.yaml +47 -90
- package/rules/prompt-injection/ATR-2026-00240-instruction-nullification-identity-repla.yaml +48 -91
- package/rules/prompt-injection/ATR-2026-00241-amoral-character-jailbreak.yaml +47 -90
- package/rules/prompt-injection/ATR-2026-00242-persona-jailbreak.yaml +46 -95
- package/rules/prompt-injection/ATR-2026-00243-acronym-jailbreak.yaml +47 -88
- package/rules/prompt-injection/ATR-2026-00244-dual-response-jailbreak.yaml +46 -89
- package/rules/prompt-injection/ATR-2026-00245-malicious-persona.yaml +47 -89
- package/rules/prompt-injection/ATR-2026-00247-dual-response-jailbreak.yaml +49 -90
- package/rules/prompt-injection/ATR-2026-00249-game-based-jailbreak.yaml +47 -87
- package/rules/prompt-injection/ATR-2026-00251-persona-embodiment-jailbreak.yaml +47 -90
- package/rules/prompt-injection/ATR-2026-00252-narrative-jailbreak.yaml +48 -91
- package/rules/prompt-injection/ATR-2026-00253-enhanced-persona-jailbreak.yaml +47 -89
- package/rules/prompt-injection/ATR-2026-00256-base-n-encoding-jailbreak.yaml +47 -91
- package/rules/prompt-injection/ATR-2026-00257-cipher-transposition-jailbreak.yaml +48 -91
- package/rules/prompt-injection/ATR-2026-00258-unicode-tag-injection.yaml +47 -89
- package/rules/prompt-injection/ATR-2026-00264-latent-injection-translation.yaml +47 -89
- package/rules/prompt-injection/ATR-2026-00265-latent-injection-rag-document.yaml +50 -96
- package/rules/prompt-injection/ATR-2026-00267-gcg-adversarial-suffix.yaml +47 -93
- package/rules/prompt-injection/ATR-2026-00272-hypothetical-response-smuggling.yaml +46 -91
- package/rules/prompt-injection/ATR-2026-00276-invisible-unicode-bidi-injection.yaml +47 -100
- package/rules/prompt-injection/ATR-2026-00278-dra-disguise-reconstruction-attack.yaml +51 -98
- package/rules/prompt-injection/ATR-2026-00280-policy-puppetry-xml-injection.yaml +48 -93
- package/rules/prompt-injection/ATR-2026-00282-perez-prompt-injection-hijack.yaml +47 -95
- package/rules/prompt-injection/ATR-2026-00285-alternate-encoding-jailbreak.yaml +48 -98
- package/rules/prompt-injection/ATR-2026-00286-latent-injection-embedded-context.yaml +47 -97
- package/rules/prompt-injection/ATR-2026-00296-shell-command-injection.yaml +54 -96
- package/rules/prompt-injection/ATR-2026-00297-python-code-execution-rce.yaml +54 -98
- package/rules/prompt-injection/ATR-2026-00308-zalgo-diacritic-overload-encoding.yaml +41 -89
- package/rules/prompt-injection/ATR-2026-00309-braille-unicode-encoded-injection.yaml +44 -90
- package/rules/prompt-injection/ATR-2026-00310-ecoji-emoji-encoded-injection.yaml +44 -93
- package/rules/prompt-injection/ATR-2026-00311-base2048-unicode-script-injection.yaml +42 -101
- package/rules/prompt-injection/ATR-2026-00312-unicode-variant-selector-ascii-smuggling.yaml +44 -91
- package/rules/prompt-injection/ATR-2026-00313-sneaky-bits-zero-width-binary.yaml +44 -95
- package/rules/prompt-injection/ATR-2026-00315-sata-masked-language-model-jailbreak.yaml +49 -99
- package/rules/prompt-injection/ATR-2026-00316-function-masking-predict-mask-bypass.yaml +42 -92
- package/rules/prompt-injection/ATR-2026-00321-hyphenated-system-instruction-injection.yaml +41 -90
- package/rules/prompt-injection/ATR-2026-00359-bank-phishing-smtp-email-code.yaml +43 -102
- package/rules/prompt-injection/ATR-2026-00367-emoji-flag-encoded-hidden-phrase.yaml +41 -90
- package/rules/prompt-injection/ATR-2026-00373-piracy-torrent-site-list-request.yaml +43 -84
- package/rules/prompt-injection/ATR-2026-00378-chatgpt-dom-javascript-redirect-manipulation.yaml +41 -86
- package/rules/prompt-injection/ATR-2026-00382-cocaine-component-development-request.yaml +43 -89
- package/rules/prompt-injection/ATR-2026-00390-explicit-sexual-content-poem-request.yaml +42 -88
- package/rules/prompt-injection/ATR-2026-00394-backspace-deletion-character-injection.yaml +48 -100
- package/rules/prompt-injection/ATR-2026-00395-llm-special-token-boundary-injection.yaml +50 -104
- package/rules/prompt-injection/ATR-2026-00396-toxic-continuation-prefix-injection.yaml +52 -103
- package/rules/prompt-injection/ATR-2026-00397-snowball-impossible-reasoning-injection.yaml +51 -105
- package/rules/prompt-injection/ATR-2026-00399-latent-injection-document-separator-token.yaml +45 -94
- package/rules/prompt-injection/ATR-2026-00400-latent-injection-ignore-instruction-keyword.yaml +41 -90
- package/rules/prompt-injection/ATR-2026-00401-leakreplay-cloze-mask-training-data-elicitation.yaml +48 -91
- package/rules/prompt-injection/ATR-2026-00403-glitch-token-repeat-back-elicitation.yaml +45 -92
- package/rules/prompt-injection/ATR-2026-00407-echo-sql-jinja-template-injection.yaml +52 -97
- package/rules/prompt-injection/ATR-2026-00408-dra-parenthesis-character-reconstruction-attack.yaml +52 -99
- package/rules/prompt-injection/ATR-2026-00409-phrasing-past-future-tense-harmful-query.yaml +50 -129
- package/rules/prompt-injection/ATR-2026-00410-lmrc-harm-category-direct-elicitation.yaml +51 -115
- package/rules/prompt-injection/ATR-2026-00412-figstep-image-list-multimodal-jailbreak.yaml +47 -111
- package/rules/prompt-injection/ATR-2026-00414-continuation-ethnic-slur-completion-elicitation.yaml +49 -117
- package/rules/prompt-injection/ATR-2026-00420-copilot-studio-sharepoint-indirect-injection.yaml +49 -116
- package/rules/prompt-injection/ATR-2026-00442-quoted-exact-output-forcing.yaml +38 -103
- package/rules/prompt-injection/ATR-2026-00443-word-fragment-concat-assembly.yaml +37 -103
- package/rules/prompt-injection/ATR-2026-00444-unicode-obfuscation-in-user-input.yaml +35 -91
- package/rules/prompt-injection/ATR-2026-00445-translation-hijack-with-side-output.yaml +35 -90
- package/rules/prompt-injection/ATR-2026-00446-variable-assignment-payload-injection.yaml +35 -95
- package/rules/prompt-injection/ATR-2026-00447-fictional-generation-containing-target.yaml +35 -90
- package/rules/prompt-injection/ATR-2026-00452-direct-pwned-payload-injection.yaml +41 -123
- package/rules/prompt-injection/ATR-2026-00453-secret-key-reveal-demand.yaml +38 -118
- package/rules/prompt-injection/ATR-2026-00454-backslash-per-character-encoding.yaml +40 -119
- package/rules/prompt-injection/ATR-2026-00455-no-period-output-override.yaml +37 -109
- package/rules/prompt-injection/ATR-2026-00456-conditional-empty-input-injection.yaml +40 -119
- package/rules/prompt-injection/ATR-2026-00457-garak-dan-to-every-prompt.yaml +41 -117
- package/rules/prompt-injection/ATR-2026-00458-garak-dra-step-by-step.yaml +41 -100
- package/rules/prompt-injection/ATR-2026-00459-garak-dan-an-ai-language.yaml +38 -93
- package/rules/prompt-injection/ATR-2026-00460-garak-dan-no-matter-how.yaml +41 -119
- package/rules/prompt-injection/ATR-2026-00461-garak-goodside-mixedunassigned.yaml +35 -97
- package/rules/prompt-injection/ATR-2026-00462-garak-gcg-mixedunassigned.yaml +35 -98
- package/rules/prompt-injection/ATR-2026-00463-garak-lmrc-mixedunassigned.yaml +35 -99
- package/rules/prompt-injection/ATR-2026-00464-garak-dan-i-would-like.yaml +41 -96
- package/rules/prompt-injection/ATR-2026-00465-garak-dan-your-prompt-here.yaml +41 -102
- package/rules/prompt-injection/ATR-2026-00466-garak-latentinjection-following-text-from.yaml +41 -98
- package/rules/prompt-injection/ATR-2026-00467-garak-dan-act-as-a.yaml +41 -97
- package/rules/prompt-injection/ATR-2026-00468-garak-goat-the-target-llm.yaml +38 -98
- package/rules/prompt-injection/ATR-2026-00469-garak-dan-at-the-end.yaml +41 -97
- package/rules/prompt-injection/ATR-2026-00470-garak-dan-as-an-ai.yaml +41 -112
- package/rules/prompt-injection/ATR-2026-00472-garak-dan-are-going-to.yaml +55 -107
- package/rules/prompt-injection/ATR-2026-00473-garak-lmrc-how-can-i.yaml +52 -98
- package/rules/prompt-injection/ATR-2026-00474-garak-dan-that-chatgpt-has.yaml +52 -91
- package/rules/prompt-injection/ATR-2026-00475-garak-web-injection-alert-1-script.yaml +47 -94
- package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +59 -115
- package/rules/prompt-injection/ATR-2026-00477-garak-latentinjection-translate-the-following-text.yaml +51 -101
- package/rules/prompt-injection/ATR-2026-00478-garak-latentinjection-abuse-contact-email.yaml +35 -93
- package/rules/prompt-injection/ATR-2026-00479-garak-latentinjection-mixedunassigned.yaml +49 -104
- package/rules/prompt-injection/ATR-2026-00480-garak-dan-the-role-of.yaml +52 -95
- package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +56 -111
- package/rules/prompt-injection/ATR-2026-00482-garak-lmrc-what-s-an.yaml +47 -86
- package/rules/prompt-injection/ATR-2026-00483-garak-dan-the-user-s.yaml +51 -99
- package/rules/prompt-injection/ATR-2026-00484-garak-dan-and-you-will.yaml +52 -96
- package/rules/prompt-injection/ATR-2026-00485-garak-dan-and-does-not.yaml +50 -98
- package/rules/prompt-injection/ATR-2026-00486-garak-dan-t-care-about.yaml +43 -83
- package/rules/prompt-injection/ATR-2026-00487-garak-dan-and-nothing-else.yaml +51 -92
- package/rules/prompt-injection/ATR-2026-00488-garak-encoding-alert-1-script.yaml +47 -95
- package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +59 -116
- package/rules/prompt-injection/ATR-2026-00490-garak-dan-in-order-to.yaml +43 -102
- package/rules/prompt-injection/ATR-2026-00492-garak-dan-want-you-to.yaml +42 -99
- package/rules/prompt-injection/ATR-2026-00493-garak-latentinjection-registrar-iana-id.yaml +38 -105
- package/rules/prompt-injection/ATR-2026-00495-garak-dan-insert-prompt-here.yaml +47 -117
- package/rules/prompt-injection/ATR-2026-00496-garak-dan-no-matter-what.yaml +39 -93
- package/rules/prompt-injection/ATR-2026-00497-garak-encoding-mixedunassigned.yaml +46 -118
- package/rules/prompt-injection/ATR-2026-00498-garak-web-injection-mixedunassigned.yaml +44 -110
- package/rules/prompt-injection/ATR-2026-00499-garak-dan-from-now-on.yaml +41 -96
- package/rules/prompt-injection/ATR-2026-00503-fake-error-state-takeover-unrestricted-replacement-bot.yaml +41 -102
- package/rules/prompt-injection/ATR-2026-00506-nevermind-override-goal-hijacking-in-user-input-promptinject.yaml +38 -97
- package/rules/prompt-injection/ATR-2026-00507-screaming-stop-goal-hijacking-in-user-input-promptinject.yaml +40 -100
- package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +42 -101
- package/rules/prompt-injection/ATR-2026-00509-prompt-leaking-via-ignore-previous-instructions-in-user-inpu.yaml +41 -114
- package/rules/prompt-injection/ATR-2026-00510-delayed-tool-invocation-injection.yaml +50 -132
- package/rules/prompt-injection/ATR-2026-00511-mcp-web-context-poisoning.yaml +51 -131
- package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +47 -126
- package/rules/prompt-injection/ATR-2026-00515-hidden-text-prompt-injection.yaml +52 -135
- package/rules/prompt-injection/ATR-2026-00518-ignore-previous-and-following-instructions-output-command-promptinject.yaml +40 -107
- package/rules/prompt-injection/ATR-2026-00519-tautology-logic-noise-injection-promptbench.yaml +40 -105
- package/rules/prompt-injection/ATR-2026-00520-nlp-task-random-token-suffix-injection-promptbench.yaml +43 -106
- package/rules/prompt-injection/ATR-2026-00535-windsurf-ide-zero-click-prompt-injection.yaml +43 -139
- package/rules/prompt-injection/ATR-2026-00550-untrusted-retrieval-to-privileged-tool.yaml +61 -171
- package/rules/prompt-injection/ATR-2026-00554-langchain-vulnerable-to-template-injecti.yaml +32 -57
- package/rules/prompt-injection/ATR-2026-00565-the-llm-cli-tool-thru-0-27-1-contains-a-.yaml +37 -80
- package/rules/prompt-injection/ATR-2026-00573-semantic-paraphrased-injection.yaml +33 -75
- package/rules/prompt-injection/ATR-2026-00579-mcp-tool-description-line-jumping-injection.yaml +36 -142
- package/rules/prompt-injection/ATR-2026-00584-indirect-injection-via-tool-response.yaml +37 -161
- package/rules/prompt-injection/ATR-2026-00700-structured-data-payload-injection.yaml +34 -85
- package/rules/prompt-injection/ATR-2026-00701-ipi-tool-output-xss-injection.yaml +29 -72
- package/rules/prompt-injection/ATR-2026-01000-context-ignore-fake-completion-prefix.yaml +27 -73
- package/rules/prompt-injection/ATR-2026-01001-direct-pi-instruction-override-secret-key.yaml +26 -82
- package/rules/prompt-injection/ATR-2026-01002-role-escalation-false-authority-claim.yaml +30 -80
- package/rules/prompt-injection/ATR-2026-01005-many-shot-repetition-override.yaml +26 -69
- package/rules/prompt-injection/ATR-2026-01006-payload-split-string-concat-injection.yaml +31 -84
- package/rules/prompt-injection/ATR-2026-01007-token-repeat-flooding-injection.yaml +27 -71
- package/rules/prompt-injection/ATR-2026-01009-virtual-world-bypass-fictional-pii.yaml +27 -73
- package/rules/prompt-injection/ATR-2026-01012-encoding-evasion-decode-execute.yaml +31 -81
- package/rules/prompt-injection/ATR-2026-01013-language-evasion-multilingual-credential.yaml +46 -108
- package/rules/prompt-injection/ATR-2026-01015-evasion-refusal-suppression.yaml +31 -82
- package/rules/prompt-injection/ATR-2026-01016-evasion-response-priming-forced-opener.yaml +26 -75
- package/rules/prompt-injection/ATR-2026-01017-evasion-dual-response-split-output.yaml +28 -74
- package/rules/prompt-injection/ATR-2026-01018-evasion-shell-injection-eval.yaml +40 -116
- package/rules/prompt-injection/ATR-2026-01019-sysprompt-override-fake-diagnostic-mode.yaml +34 -89
- package/rules/prompt-injection/ATR-2026-01020-spikee-doc-embedded-base64-payload.yaml +28 -69
- package/rules/prompt-injection/ATR-2026-01021-spikee-doc-embedded-translation-injection.yaml +27 -68
- package/rules/prompt-injection/ATR-2026-01023-evasion-opposite-intent-negation-trick.yaml +26 -69
- package/rules/prompt-injection/ATR-2026-01024-evasion-persona-override-rule-breaker.yaml +28 -77
- package/rules/prompt-injection/ATR-2026-01025-evasion-hypothetical-fictional-execution-framing.yaml +24 -68
- package/rules/prompt-injection/ATR-2026-01026-evasion-unicode-glitch-token-anomaly.yaml +28 -82
- package/rules/prompt-injection/ATR-2026-01304-indirect-injection-carrier-important-override.yaml +35 -93
- package/rules/prompt-injection/ATR-2026-01757-hypothetical-framing-bypass-research-audit.yaml +32 -79
- package/rules/prompt-injection/ATR-2026-01758-hypothetical-fictional-story-bypass.yaml +31 -76
- package/rules/prompt-injection/ATR-2026-01759-dos-new-important-instructions-injection-in-document.yaml +28 -74
- package/rules/prompt-injection/ATR-2026-01771-semantic-jailbreak-framing.yaml +50 -163
- package/rules/prompt-injection/ATR-2026-01800-asb-trigger-marker-tool-coercion.yaml +33 -104
- package/rules/prompt-injection/ATR-2026-01860-llmail-chat-template-boundary-spoof.yaml +27 -85
- package/rules/prompt-injection/ATR-2026-01861-llmail-pseudo-xml-role-injection.yaml +27 -83
- package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +26 -80
- package/rules/prompt-injection/ATR-2026-01900-output-encoding.yaml +63 -138
- package/rules/prompt-injection/ATR-2026-01901-output-scrambling.yaml +63 -129
- package/rules/prompt-injection/ATR-2026-01902-output-emoji.yaml +39 -72
- package/rules/prompt-injection/ATR-2026-01903-output-language.yaml +35 -65
- package/rules/prompt-injection/ATR-2026-01904-link-injection.yaml +44 -95
- package/rules/prompt-injection/ATR-2026-01905-promotional-injection.yaml +35 -68
- package/rules/prompt-injection/ATR-2026-01906-content-manipulation.yaml +49 -125
- package/rules/prompt-injection/ATR-2026-01920-access-grant-coercion.yaml +31 -99
- package/rules/prompt-injection/ATR-2026-01921-access-denial-inversion.yaml +33 -92
- package/rules/prompt-injection/ATR-2026-01922-authorization-state-spoofing.yaml +33 -97
- package/rules/prompt-injection/ATR-2026-01923-forged-input-boundary-markers.yaml +33 -97
- package/rules/prompt-injection/ATR-2026-01925-encoded-payload-decoding-coercion.yaml +39 -110
- package/rules/prompt-injection/ATR-2026-01926-cross-lingual-authorization-laundering.yaml +29 -90
- package/rules/prompt-injection/ATR-2026-02001-ignore-below-instructions-mirror-of-ignore-previ.yaml +31 -73
- package/rules/prompt-injection/ATR-2026-02002-instruction-set-probe-or-supplant-direct-meta-qu.yaml +32 -72
- package/rules/prompt-injection/ATR-2026-02003-task-pivot-override-abandon-the-cover-task-trans.yaml +31 -72
- package/rules/prompt-injection/ATR-2026-02004-regional-indicator-flag-emoji-alphabet-letter-sp.yaml +32 -80
- package/rules/prompt-injection/ATR-2026-02005-actor-never-breaks-character-roleplay-dan-style-.yaml +31 -74
- package/rules/prompt-injection/ATR-2026-02006-fuzzy-cross-lingual-i-have-been-pwned-near-miss-.yaml +32 -84
- package/rules/prompt-injection/ATR-2026-02007-bare-key-elicitation-token.yaml +30 -74
- package/rules/prompt-injection/ATR-2026-02008-translation-chain-output-laundering-state-secret.yaml +30 -75
- package/rules/prompt-injection/ATR-2026-02009-bare-key-elicitation-trailing-colon.yaml +29 -71
- package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +30 -73
- package/rules/prompt-injection/ATR-2026-02011-malformed-grammar-pwned-success-claim.yaml +30 -69
- package/rules/prompt-injection/ATR-2026-02012-movie-title-generator-instruction-wrapper-for-pw.yaml +30 -79
- package/rules/prompt-injection/ATR-2026-02013-delimiter-fence-ignore-instructions-override.yaml +31 -74
- package/rules/prompt-injection/ATR-2026-02014-spliced-target-string-letters-of-a-filtered-cana.yaml +30 -74
- package/rules/prompt-injection/ATR-2026-02015-dense-emoji-only-payload-flood.yaml +30 -72
- package/rules/prompt-injection/ATR-2026-02016-reversed-payload-string.yaml +31 -76
- package/rules/prompt-injection/ATR-2026-02018-regional-indicator-flag-emoji-letter-spelling-sp.yaml +30 -71
- package/rules/prompt-injection/ATR-2026-02019-python-interpreter-role-assignment-exec-framing.yaml +31 -77
- package/rules/prompt-injection/ATR-2026-02020-obfuscated-token-reconstruction-via-character-su.yaml +30 -72
- package/rules/prompt-injection/ATR-2026-02120-agentdojo-important-message-identity-spoof-pretext.yaml +31 -81
- package/rules/prompt-injection/ATR-2026-02210-negation-topic-evil-persona-two-script-jailbreak.yaml +33 -87
- package/rules/prompt-injection/ATR-2026-02230-conditional-keyword-trigger-override.yaml +35 -88
- package/rules/prompt-injection/ATR-2026-02232-brand-persona-opinion-hijack.yaml +27 -75
- package/rules/prompt-injection/ATR-2026-02374-rot13-base64-obfuscated-shell-jailbreak.yaml +38 -90
- package/rules/prompt-injection/ATR-2026-02377-novel-persona-jailbreak-cosignal.yaml +32 -64
- package/rules/prompt-injection/ATR-2026-02500-prompt-layer-self-replication.yaml +21 -125
- package/rules/prompt-injection/ATR-2026-02502-covert-remote-script-injection-into-generated-artifacts.yaml +46 -149
- package/rules/prompt-injection/ATR-2026-02815-injected-halt-order-canned-reply-dos.yaml +80 -0
- package/rules/prompt-injection/ATR-2026-02820-tool-result-orders-agent-to-hide-its-own-action.yaml +106 -0
- package/rules/prompt-injection/ATR-2026-02846-semantic-ignore-previous-and-following-instructio.yaml +115 -0
- package/rules/prompt-injection/ATR-2026-02851-fake-user-turn-send-email-instruction.yaml +76 -0
- package/rules/prompt-injection/ATR-2026-02858-context-suppression-directive.yaml +73 -0
- package/rules/prompt-injection/ATR-2026-02859-tool-output-agent-role-reassignment.yaml +71 -0
- package/rules/prompt-injection/ATR-2026-02860-forged-instruction-boundary-marker.yaml +70 -0
- package/rules/prompt-injection/ATR-2026-02862-fake-chat-template-turn-injection.yaml +79 -0
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +31 -87
- package/rules/skill-compromise/ATR-2026-00061-description-behavior-mismatch.yaml +42 -165
- package/rules/skill-compromise/ATR-2026-00062-hidden-capability.yaml +40 -80
- package/rules/skill-compromise/ATR-2026-00063-skill-chain-attack.yaml +46 -92
- package/rules/skill-compromise/ATR-2026-00064-over-permissioned-skill.yaml +40 -109
- package/rules/skill-compromise/ATR-2026-00065-skill-update-attack.yaml +37 -75
- package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +42 -88
- package/rules/skill-compromise/ATR-2026-00120-skill-instruction-injection.yaml +33 -182
- package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +33 -164
- package/rules/skill-compromise/ATR-2026-00122-skill-weaponized-instruction.yaml +29 -132
- package/rules/skill-compromise/ATR-2026-00123-skill-overreach-permissions.yaml +33 -110
- package/rules/skill-compromise/ATR-2026-00124-skill-name-squatting.yaml +40 -133
- package/rules/skill-compromise/ATR-2026-00125-context-poisoning-compaction.yaml +26 -107
- package/rules/skill-compromise/ATR-2026-00126-skill-rug-pull-setup.yaml +23 -102
- package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +33 -114
- package/rules/skill-compromise/ATR-2026-00128-html-comment-hidden-payload.yaml +23 -148
- package/rules/skill-compromise/ATR-2026-00129-unicode-smuggling.yaml +35 -62
- package/rules/skill-compromise/ATR-2026-00134-fork-claim-impersonation.yaml +24 -105
- package/rules/skill-compromise/ATR-2026-00135-exfil-url-in-instructions.yaml +27 -138
- package/rules/skill-compromise/ATR-2026-00147-fork-impersonation.yaml +35 -45
- package/rules/skill-compromise/ATR-2026-00149-skill-exfil-compound.yaml +34 -151
- package/rules/skill-compromise/ATR-2026-00151-fork-impersonation-install.yaml +39 -69
- package/rules/skill-compromise/ATR-2026-00157-timebomb-credential-exfil.yaml +41 -96
- package/rules/skill-compromise/ATR-2026-00200-agent-memory-config-tampering.yaml +41 -84
- package/rules/skill-compromise/ATR-2026-00214-credential-theft.yaml +36 -50
- package/rules/skill-compromise/ATR-2026-00217-credential-harvesting.yaml +50 -98
- package/rules/skill-compromise/ATR-2026-00220-malware-dropper.yaml +45 -85
- package/rules/skill-compromise/ATR-2026-00222-credential-harvesting.yaml +46 -85
- package/rules/skill-compromise/ATR-2026-00223-reverse-shell-dropper.yaml +47 -84
- package/rules/skill-compromise/ATR-2026-00224-credential-exfiltration.yaml +46 -92
- package/rules/skill-compromise/ATR-2026-00225-c2-communication.yaml +46 -86
- package/rules/skill-compromise/ATR-2026-00260-package-hallucination.yaml +51 -93
- package/rules/skill-compromise/ATR-2026-00262-av-evasion-code-gen.yaml +49 -90
- package/rules/skill-compromise/ATR-2026-00263-credential-file-read-gen.yaml +53 -94
- package/rules/skill-compromise/ATR-2026-00266-malware-dropper-gen.yaml +51 -92
- package/rules/skill-compromise/ATR-2026-00283-malwaregen-generic-virus-payload-request.yaml +51 -96
- package/rules/skill-compromise/ATR-2026-00398-huggingface-unsafe-model-artifact-load.yaml +57 -110
- package/rules/skill-compromise/ATR-2026-00425-nl-persistent-covert-hook.yaml +24 -65
- package/rules/skill-compromise/ATR-2026-00427-nl-fake-error-instruction-bypass.yaml +24 -65
- package/rules/skill-compromise/ATR-2026-00429-nl-skill-self-modification.yaml +24 -65
- package/rules/skill-compromise/ATR-2026-00523-claude-code-hooks-session-start-pre-trust-rce.yaml +62 -162
- package/rules/skill-compromise/ATR-2026-00525-mini-shai-hulud-gh-token-monitor-persistence.yaml +43 -175
- package/rules/skill-compromise/ATR-2026-00527-skill-silent-git-remote-mirror-exfiltration.yaml +49 -159
- package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +40 -88
- package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +27 -73
- package/rules/skill-compromise/ATR-2026-02261-code-credential-exfil-chain.yaml +35 -161
- package/rules/skill-compromise/ATR-2026-02405-malicious-skill-package-structure.yaml +51 -201
- package/rules/skill-compromise/ATR-2026-02410-malicious-artifact-on-vendor-domain.yaml +54 -204
- package/rules/skill-compromise/ATR-2026-02600-in-source-reverse-shell-assembly.yaml +106 -0
- package/rules/skill-compromise/ATR-2026-02610-evaluated-config-credential-command.yaml +109 -0
- package/rules/skill-compromise/ATR-2026-02818-skill-manifest-declares-attack-purpose.yaml +80 -0
- package/rules/skill-compromise/ATR-2026-02845-agent-cryptomining-payload.yaml +102 -0
- package/rules/tool-poisoning/ATR-2026-00010-mcp-malicious-response.yaml +80 -209
- package/rules/tool-poisoning/ATR-2026-00011-tool-output-injection.yaml +35 -144
- package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +46 -144
- package/rules/tool-poisoning/ATR-2026-00013-tool-ssrf.yaml +45 -148
- package/rules/tool-poisoning/ATR-2026-00095-supply-chain-poisoning.yaml +29 -104
- package/rules/tool-poisoning/ATR-2026-00096-registry-poisoning.yaml +33 -94
- package/rules/tool-poisoning/ATR-2026-00100-consent-bypass-instruction.yaml +22 -100
- package/rules/tool-poisoning/ATR-2026-00101-trust-escalation-override.yaml +34 -54
- package/rules/tool-poisoning/ATR-2026-00103-hidden-safety-bypass-instruction.yaml +19 -89
- package/rules/tool-poisoning/ATR-2026-00105-silent-action-concealment.yaml +22 -101
- package/rules/tool-poisoning/ATR-2026-00106-schema-description-contradiction.yaml +31 -51
- package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +54 -160
- package/rules/tool-poisoning/ATR-2026-00209-mcpwn-runaway-invocation.yaml +50 -114
- package/rules/tool-poisoning/ATR-2026-00210-flowise-system-message-override.yaml +48 -111
- package/rules/tool-poisoning/ATR-2026-00259-ansi-escape-injection.yaml +48 -104
- package/rules/tool-poisoning/ATR-2026-00270-xss-in-tool-response.yaml +47 -97
- package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +46 -95
- package/rules/tool-poisoning/ATR-2026-00393-ansi-code-elicitation-request.yaml +51 -104
- package/rules/tool-poisoning/ATR-2026-00415-flowise-custom-mcp-stdio-rce.yaml +47 -119
- package/rules/tool-poisoning/ATR-2026-00419-cursor-mcp-zero-click-config.yaml +57 -148
- package/rules/tool-poisoning/ATR-2026-00434-mcp-remote-authorization-endpoint-command-injection.yaml +47 -122
- package/rules/tool-poisoning/ATR-2026-00435-azure-mcp-server-missing-authentication.yaml +46 -116
- package/rules/tool-poisoning/ATR-2026-00448-spring-ai-milvus-filter-injection.yaml +51 -134
- package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +47 -120
- package/rules/tool-poisoning/ATR-2026-00513-package-hallucination-exploitation.yaml +45 -117
- package/rules/tool-poisoning/ATR-2026-00521-shell-command-injection-agent-tool-context.yaml +40 -130
- package/rules/tool-poisoning/ATR-2026-00522-sql-injection-natural-language-agent-interface.yaml +64 -157
- package/rules/tool-poisoning/ATR-2026-00526-claude-code-shell-metachar-in-double-quoted-path.yaml +41 -128
- package/rules/tool-poisoning/ATR-2026-00529-litellm-proxy-sqli-cisa-kev.yaml +41 -117
- package/rules/tool-poisoning/ATR-2026-00530-ms-agent-shell-tool-unsanitized-argv-rce.yaml +40 -143
- package/rules/tool-poisoning/ATR-2026-00531-praisonai-unauthenticated-agent-api.yaml +44 -117
- package/rules/tool-poisoning/ATR-2026-00532-apache-doris-mcp-sql-injection.yaml +40 -100
- package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +39 -97
- package/rules/tool-poisoning/ATR-2026-00534-alibaba-rds-mcp-unauthenticated-metadata-exfil.yaml +39 -100
- package/rules/tool-poisoning/ATR-2026-00536-nginx-ui-mcp-unauthenticated-command-execution.yaml +46 -140
- package/rules/tool-poisoning/ATR-2026-00537-fastmcp-server-name-cmd-injection-windows.yaml +58 -172
- package/rules/tool-poisoning/ATR-2026-00538-langchain-chatchat-mcp-stdio-unauthenticated-rce.yaml +63 -186
- package/rules/tool-poisoning/ATR-2026-00540-praisonai-parse-mcp-command-cli-injection.yaml +50 -142
- package/rules/tool-poisoning/ATR-2026-00541-agent-zero-mcp-config-command-injection.yaml +51 -134
- package/rules/tool-poisoning/ATR-2026-00542-upsonic-mcp-command-allowlist-bypass.yaml +48 -121
- package/rules/tool-poisoning/ATR-2026-00543-litellm-mcp-server-argv-injection.yaml +52 -121
- package/rules/tool-poisoning/ATR-2026-00544-praisonai-pth-file-path-traversal-rce.yaml +49 -125
- package/rules/tool-poisoning/ATR-2026-00545-praisonai-tool-override-unauth-rce.yaml +51 -122
- package/rules/tool-poisoning/ATR-2026-00561-fastmcp-vulnerable-to-windows-command-in.yaml +36 -73
- package/rules/tool-poisoning/ATR-2026-00567-mcp-stdio-config-command-injection.yaml +29 -53
- package/rules/tool-poisoning/ATR-2026-00568-agent-ssrf-cloud-metadata-file-inclusion.yaml +27 -54
- package/rules/tool-poisoning/ATR-2026-00572-symjack-symlink-config-redirection.yaml +41 -103
- package/rules/tool-poisoning/ATR-2026-00575-miasma-npm-worm-agent-config-backdoor.yaml +41 -110
- package/rules/tool-poisoning/ATR-2026-00576-hades-agent-credential-theft.yaml +40 -125
- package/rules/tool-poisoning/ATR-2026-00577-create-mcp-server-stdio-exec-command-injection.yaml +53 -169
- package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +38 -137
- package/rules/tool-poisoning/ATR-2026-00714-tool-camouflage-forced-tool-call.yaml +33 -78
- package/rules/tool-poisoning/ATR-2026-00715-tool-knowledge-hijack-identity-injection.yaml +39 -87
- package/rules/tool-poisoning/ATR-2026-00716-ipi-data-destruction-carrier.yaml +31 -76
- package/rules/tool-poisoning/ATR-2026-00720-tool-misuse-privilege-escalation-social.yaml +29 -71
- package/rules/tool-poisoning/ATR-2026-01300-mcp-notes-param-chat-history-exfil.yaml +37 -102
- package/rules/tool-poisoning/ATR-2026-01301-tool-description-exclusive-tool-override.yaml +36 -92
- package/rules/tool-poisoning/ATR-2026-01302-fake-tool-result-instruction-injection.yaml +33 -88
- package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +55 -107
- package/rules/tool-poisoning/ATR-2026-01306-mcp-oauth-command-injection.yaml +35 -87
- package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +36 -91
- package/rules/tool-poisoning/ATR-2026-01310-mcp-tool-description-compliance-history-exfil.yaml +40 -110
- package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +51 -139
- package/rules/tool-poisoning/ATR-2026-01927-mcp-server-kubernetes-kubectl-command-injection.yaml +45 -109
- package/rules/tool-poisoning/ATR-2026-01928-framelink-figma-mcp-curl-fallback-command-injection.yaml +58 -164
- package/rules/tool-poisoning/ATR-2026-01930-mcp-sampling-prompt-injection.yaml +48 -129
- package/rules/tool-poisoning/ATR-2026-01931-gemini-mcp-tool-command-injection-file-exfil.yaml +42 -113
- package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +43 -106
- package/rules/tool-poisoning/ATR-2026-01935-litellm-custom-code-sandbox-escape-cve-2026-40217.yaml +44 -101
- package/rules/tool-poisoning/ATR-2026-01952-praisonai-codemode-sandbox-escape-rce.yaml +34 -70
- package/rules/tool-poisoning/ATR-2026-01953-praisonai-codemode-function-ctor-sandbox-escape.yaml +61 -79
- package/rules/tool-poisoning/ATR-2026-01959-openhuman-shell-allowlist-env-prefix-bypass.yaml +36 -123
- package/rules/tool-poisoning/ATR-2026-01963-praisonai-action-orchestrator-step-target-path-traversal-rce.yaml +61 -66
- package/rules/tool-poisoning/ATR-2026-01965-flowise-custommcp-os-command-rce.yaml +39 -80
- package/rules/tool-poisoning/ATR-2026-01967-deepchat-mermaid-xss-rce-ipc-mcp-register.yaml +58 -66
- package/rules/tool-poisoning/ATR-2026-01968-deepchat-markdown-deeplink-openexternal-rce-bypass.yaml +44 -92
- package/rules/tool-poisoning/ATR-2026-01970-praisonai-filetools-normpath-path-traversal.yaml +64 -84
- package/rules/tool-poisoning/ATR-2026-01973-anythingllm-logo-endpoint-path-traversal.yaml +57 -64
- package/rules/tool-poisoning/ATR-2026-01978-anythingllm-collector-process-filename-path-traversal-delete.yaml +58 -64
- package/rules/tool-poisoning/ATR-2026-01979-pandasai-prompt-injection-dunder-sandbox-escape-rce.yaml +60 -72
- package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +49 -99
- package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +49 -102
- package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +43 -110
- package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +41 -115
- package/rules/tool-poisoning/ATR-2026-01987-langroid-sqlchatagent-prompt-to-sql-rce.yaml +53 -110
- package/rules/tool-poisoning/ATR-2026-02021-mcp-inspector-unauthenticated-proxy-rce.yaml +48 -123
- package/rules/tool-poisoning/ATR-2026-02022-curxecute-cursor-mcp-json-injected-server-rce.yaml +51 -131
- package/rules/tool-poisoning/ATR-2026-02023-escaperoute-filesystem-mcp-prefix-bypass.yaml +48 -129
- package/rules/tool-poisoning/ATR-2026-02024-escaperoute-filesystem-mcp-symlink-launchagent.yaml +49 -128
- package/rules/tool-poisoning/ATR-2026-02025-mcp-full-schema-poisoning-nondescription-field.yaml +50 -142
- package/rules/tool-poisoning/ATR-2026-02027-diagnostic-content-remediation-command-injection.yaml +58 -72
- package/rules/tool-poisoning/ATR-2026-02041-shell-injection-echo-marker-poc.yaml +32 -93
- package/rules/tool-poisoning/ATR-2026-02102-html-injection-tool-arg-approval-ui-xss.yaml +33 -107
- package/rules/tool-poisoning/ATR-2026-02141-mcp-server-config-command-execution.yaml +42 -107
- package/rules/tool-poisoning/ATR-2026-02145-python-sandbox-escape-generator-frame-introspection.yaml +36 -105
- package/rules/tool-poisoning/ATR-2026-02193-ssrf-ipv6-noncanonical-loopback-bypass.yaml +35 -86
- package/rules/tool-poisoning/ATR-2026-02194-go-init-func-process-exec-codegen-rce.yaml +35 -83
- package/rules/tool-poisoning/ATR-2026-02233-unscoped-destructive-db-request-nl.yaml +34 -95
- package/rules/tool-poisoning/ATR-2026-02260-agentjacking-remediation-framed-execution.yaml +42 -107
- package/rules/tool-poisoning/ATR-2026-02263-workflow-sql-template-expression-injection.yaml +35 -119
- package/rules/tool-poisoning/ATR-2026-02350-mcp-json-rpc-case-duplicate-key-tool-smuggling.yaml +34 -100
- package/rules/tool-poisoning/ATR-2026-02352-imap-search-command-injection-email-tool-args.yaml +32 -93
- package/rules/tool-poisoning/ATR-2026-02372-unsigned-task-feed-npm-npx-lifecycle-rce.yaml +39 -101
- package/rules/tool-poisoning/ATR-2026-02376-tool-description-conversational-trigger-history-exfil.yaml +33 -84
- package/rules/tool-poisoning/ATR-2026-02403-mcp-external-content-missing-spotlighting.yaml +52 -282
- package/rules/tool-poisoning/ATR-2026-02514-mcp-server-metadata-url-html-breakout.yaml +105 -0
- package/rules/tool-poisoning/ATR-2026-02542-pipeline-query-stage-injection.yaml +95 -0
- package/rules/tool-poisoning/ATR-2026-02557-shell-separator-in-path-typed-tool-argument.yaml +112 -0
- package/rules/tool-poisoning/ATR-2026-02666-url-userinfo-decoy-host-allowlist-bypass.yaml +101 -0
- package/rules/tool-poisoning/ATR-2026-02668-vcs-ref-name-command-substitution.yaml +98 -0
- package/rules/tool-poisoning/ATR-2026-02669-query-pipeline-stage-in-identifier-parameter.yaml +88 -0
- package/rules/tool-poisoning/ATR-2026-02682-xml-entity-expansion-bomb.yaml +98 -0
- package/rules/tool-poisoning/ATR-2026-02707-crlf-header-injection-mail-tool-argument.yaml +88 -0
- package/rules/tool-poisoning/ATR-2026-02817-untrusted-content-dictates-tool-arguments.yaml +83 -0
- package/rules/tool-poisoning/ATR-2026-02864-non-canonical-ipv4-host-in-url-tool-argument.yaml +102 -0
- package/rules/tool-poisoning/ATR-2026-02865-read-only-utility-write-flag-in-command-argument.yaml +157 -0
- package/rules/tool-poisoning/ATR-2026-02868-ssrf-ipv6-transition-address-embedded-private-ipv4.yaml +107 -0
- package/spec/README.md +8 -5
- package/spec/atr-correlation-v1.0.md +16 -4
- package/spec/atr-event-v1.0.md +13 -8
- package/spec/atr-method-v1.1.md +2 -2
- package/spec/atr-profile-v1.0.md +11 -1
- package/spec/category-registry/gemara/README.md +102 -0
- package/spec/category-registry/gemara/ai-agent-capability-catalog.yaml +157 -0
- package/spec/category-registry/gemara/atr-attack-vector-catalog.yaml +130 -0
- package/spec/category-registry/gemara/atr-detection-control-catalog.yaml +327 -0
- package/spec/category-registry/gemara/atr-threat-catalog.yaml +246 -0
- package/spec/category-registry/gemara/src/editorial.yaml +743 -0
- package/spec/mappings/README.md +1 -1
- package/spec/mappings/atr-to-nist-csf-2.0.md +5 -4
- package/spec/schema/event.schema.json +1 -1
package/dist/engine.js
CHANGED
|
@@ -18,8 +18,10 @@ import { loadRulesFromDirectory, loadRuleFile } from './loader.js';
|
|
|
18
18
|
import { evaluateTraceRule } from './trace-evaluator.js';
|
|
19
19
|
import { evaluateSemanticRule } from './semantic-evaluator.js';
|
|
20
20
|
import { laneAllows, requiresConfirm } from './quality/rule-contract.js';
|
|
21
|
+
import { appliesToToolDefinition } from './tool-definition-scope.js';
|
|
21
22
|
import { laneFromConfig } from './enforcement.js';
|
|
22
|
-
import { computeVerdict } from './verdict.js';
|
|
23
|
+
import { computeVerdict, isModelDecided, modelDecisionsFromConfig } from './verdict.js';
|
|
24
|
+
import { ruleConfidence } from './rule-confidence.js';
|
|
23
25
|
import { SemanticModule } from './modules/semantic.js';
|
|
24
26
|
import { resolveSkillId, runFingerprintLayer, shouldRunSemanticLayer, createSemanticModuleFromConfig, runSemanticLayer, } from './layer-integration.js';
|
|
25
27
|
import { buildBlacklistMatch, resolveSkillId as resolveBlacklistSkillId } from './tier1-blacklist.js';
|
|
@@ -104,14 +106,103 @@ export function decodeBase64Blocks(content) {
|
|
|
104
106
|
return decoded;
|
|
105
107
|
}
|
|
106
108
|
/** Map agent event types to ATR source types */
|
|
107
|
-
const EVENT_TYPE_TO_SOURCE = {
|
|
109
|
+
export const EVENT_TYPE_TO_SOURCE = Object.freeze({
|
|
108
110
|
llm_input: 'llm_io',
|
|
109
111
|
llm_output: 'llm_io',
|
|
110
112
|
tool_call: 'tool_call',
|
|
111
113
|
tool_response: 'mcp_exchange',
|
|
112
114
|
agent_behavior: 'agent_behavior',
|
|
113
115
|
multi_agent_message: 'multi_agent_comm',
|
|
114
|
-
};
|
|
116
|
+
});
|
|
117
|
+
/**
|
|
118
|
+
* agent_source types that name what a rule reads rather than a stream of
|
|
119
|
+
* events of their own (spec/atr-schema.yaml), mapped to the source type whose
|
|
120
|
+
* events carry that data: a context window reaches the model as LLM input or
|
|
121
|
+
* as tool output, so those rules run where llm_io rules run; a skill is
|
|
122
|
+
* installed, granted permissions and chained through tool calls, so those
|
|
123
|
+
* rules run where tool_call rules run. memory_access is left out for now
|
|
124
|
+
* (WITHHELD_SOURCE_TYPES).
|
|
125
|
+
*
|
|
126
|
+
* No event type maps to them in EVENT_TYPE_TO_SOURCE, so the source filter used
|
|
127
|
+
* to skip them on every typed event: on the tool_call and tool_response events
|
|
128
|
+
* src/hook-handler.ts builds, such a rule never ran, while `atr test` mapped its
|
|
129
|
+
* type to a base type and passed its cases. Only an event with no source type
|
|
130
|
+
* (mcp_exchange) or a SKILL.md scan reached it. `atr test` now leaves the type
|
|
131
|
+
* alone: what it runs is what the engine admits.
|
|
132
|
+
*/
|
|
133
|
+
export const RUNTIME_SOURCE_TYPE = Object.freeze({
|
|
134
|
+
context_window: 'llm_io',
|
|
135
|
+
skill_lifecycle: 'tool_call',
|
|
136
|
+
skill_permission: 'tool_call',
|
|
137
|
+
skill_chain: 'tool_call',
|
|
138
|
+
});
|
|
139
|
+
/**
|
|
140
|
+
* Extended agent_source types left out of RUNTIME_SOURCE_TYPE for now, each
|
|
141
|
+
* with the reason. A rule of such a type still runs only on an event with no
|
|
142
|
+
* source type and in a SKILL.md scan. `atr test` reports its cases as
|
|
143
|
+
* unevaluable with this reason instead of passing them on an event the engine
|
|
144
|
+
* skips the rule on.
|
|
145
|
+
*
|
|
146
|
+
* memory_access reads what context_window reads, an agent's memory as it
|
|
147
|
+
* reaches the model, and would map to llm_io. Its rules (ATR-2026-00075 and
|
|
148
|
+
* -01155 today) were written for memory writes, and 00075 also matches standing
|
|
149
|
+
* instructions in an ordinary chat turn ("From now on, always answer in
|
|
150
|
+
* French."). On llm_input events the adapters that block by default would
|
|
151
|
+
* refuse those messages: the Mastra ATRProcessor aborts on high and critical
|
|
152
|
+
* in the hunt lane, and the OpenShell filter denies at high. Map it once those
|
|
153
|
+
* rules match memory writes only, measured on chat-turn data.
|
|
154
|
+
*/
|
|
155
|
+
export const WITHHELD_SOURCE_TYPES = Object.freeze({
|
|
156
|
+
memory_access: 'its rules also match standing instructions in ordinary chat turns, which adapters that block by default would refuse',
|
|
157
|
+
});
|
|
158
|
+
/**
|
|
159
|
+
* Whether a rule of this agent_source.type runs on an event of this source
|
|
160
|
+
* type: the rule's source type (after RUNTIME_SOURCE_TYPE) is the event's, or
|
|
161
|
+
* one of two documented exceptions holds. An event type with no source type
|
|
162
|
+
* (mcp_exchange) admits every rule, whatever its agent_source holds; on a typed
|
|
163
|
+
* event a type that is not a string is admitted by nothing.
|
|
164
|
+
* sourceAdmits() adds the trace exception.
|
|
165
|
+
*/
|
|
166
|
+
export function sourceTypeAdmits(ruleSourceType, eventSourceType) {
|
|
167
|
+
if (!eventSourceType)
|
|
168
|
+
return true;
|
|
169
|
+
if (typeof ruleSourceType !== 'string')
|
|
170
|
+
return false;
|
|
171
|
+
const source = Object.hasOwn(RUNTIME_SOURCE_TYPE, ruleSourceType)
|
|
172
|
+
? RUNTIME_SOURCE_TYPE[ruleSourceType]
|
|
173
|
+
: ruleSourceType;
|
|
174
|
+
if (source === eventSourceType)
|
|
175
|
+
return true;
|
|
176
|
+
// mcp_exchange rules also match tool_call events.
|
|
177
|
+
if (source === 'mcp_exchange' && eventSourceType === 'tool_call')
|
|
178
|
+
return true;
|
|
179
|
+
// Indirect prompt injection: llm_io (prompt-injection) rules must also run on
|
|
180
|
+
// tool_response events. A poisoned tool / MCP / RAG output is the primary
|
|
181
|
+
// indirect-injection channel — the payload never appears in a direct
|
|
182
|
+
// llm_input, it rides in on tool output the model then reads. tool_response
|
|
183
|
+
// maps to source type 'mcp_exchange', so without this the entire llm_io
|
|
184
|
+
// family was silently skipped on every tool response. (Field resolution
|
|
185
|
+
// routes event.content into user_input/agent_output for tool_response events
|
|
186
|
+
// — see resolveField.)
|
|
187
|
+
return source === 'llm_io' && eventSourceType === 'mcp_exchange';
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Whether the source-type filter admits a rule on an event: sourceTypeAdmits(),
|
|
191
|
+
* or a trace-method rule on an event that carries a trace. One definition for
|
|
192
|
+
* evaluateRaw() and evaluateAsync().
|
|
193
|
+
*/
|
|
194
|
+
function sourceAdmits(rule, eventSourceType, event) {
|
|
195
|
+
// agent_source?. : the loader requires only id, title and detection, and a
|
|
196
|
+
// rule without agent_source must not abort the whole evaluation.
|
|
197
|
+
if (sourceTypeAdmits(rule.agent_source?.type, eventSourceType))
|
|
198
|
+
return true;
|
|
199
|
+
// Trace-method rules declare agent_source.type: agent_trace, which maps to no
|
|
200
|
+
// event source type and would always be filtered out. Evaluate them whenever
|
|
201
|
+
// the event actually carries a trace payload; evaluateRule still returns null
|
|
202
|
+
// if the trace primitives don't fire, and ordinary (non-trace) events are
|
|
203
|
+
// unaffected because event.trace is undefined.
|
|
204
|
+
return rule.detection?.method === 'trace' && event.trace !== undefined;
|
|
205
|
+
}
|
|
115
206
|
/** Map agent event types to default field names */
|
|
116
207
|
const EVENT_TYPE_TO_FIELD = {
|
|
117
208
|
llm_input: 'user_input',
|
|
@@ -121,9 +212,28 @@ const EVENT_TYPE_TO_FIELD = {
|
|
|
121
212
|
agent_behavior: 'metric',
|
|
122
213
|
multi_agent_message: 'agent_message',
|
|
123
214
|
};
|
|
215
|
+
/**
|
|
216
|
+
* A semantic rule's pattern fallback decided this match: the rule's own regex,
|
|
217
|
+
* not its judge, so it counts as a deterministic decision.
|
|
218
|
+
*/
|
|
219
|
+
function asSemanticFallback(match) {
|
|
220
|
+
return match === null ? null : { ...match, decidedBy: 'semantic-fallback' };
|
|
221
|
+
}
|
|
124
222
|
export class ATREngine {
|
|
125
223
|
config;
|
|
126
224
|
rules = [];
|
|
225
|
+
/**
|
|
226
|
+
* id -> the FIRST loaded rule carrying that id, i.e. exactly what
|
|
227
|
+
* `this.rules.find(r => r.id === id)` returns.
|
|
228
|
+
*
|
|
229
|
+
* The per-condition paths below used to run that find() on every regex
|
|
230
|
+
* condition they evaluated: a linear walk over every loaded rule, repeated
|
|
231
|
+
* thousands of times per event. Measured 2026-10-15 on the benign-corpus FP
|
|
232
|
+
* scan (scripts/gate-promotion-fp.ts, 829 rules, 13,848 samples), that walk
|
|
233
|
+
* was ~11% of all CPU and replacing it was a 1.18x speed-up on its own, with
|
|
234
|
+
* the matched-rule set identical for every sample.
|
|
235
|
+
*/
|
|
236
|
+
ruleById = new Map();
|
|
127
237
|
compiledPatterns = new Map();
|
|
128
238
|
semanticModuleInstance;
|
|
129
239
|
/**
|
|
@@ -132,6 +242,7 @@ export class ATREngine {
|
|
|
132
242
|
* lifetime.
|
|
133
243
|
*/
|
|
134
244
|
lane;
|
|
245
|
+
modelDecisions;
|
|
135
246
|
/**
|
|
136
247
|
* Find bundled rules directory shipped with the npm package.
|
|
137
248
|
* Checks: ../rules (from dist/), ./rules (repo root)
|
|
@@ -156,6 +267,7 @@ export class ATREngine {
|
|
|
156
267
|
// Config only — never the environment. An embedder's detection breadth must
|
|
157
268
|
// not depend on a variable someone exported in a shell profile.
|
|
158
269
|
this.lane = laneFromConfig(config.lane);
|
|
270
|
+
this.modelDecisions = modelDecisionsFromConfig(config.modelDecisions);
|
|
159
271
|
// Initialize Layer 3 semantic module if config provided
|
|
160
272
|
if (config.semanticModule) {
|
|
161
273
|
const moduleConfig = createSemanticModuleFromConfig(config.semanticModule);
|
|
@@ -170,6 +282,7 @@ export class ATREngine {
|
|
|
170
282
|
*/
|
|
171
283
|
async loadRules() {
|
|
172
284
|
this.rules = [];
|
|
285
|
+
this.ruleById.clear();
|
|
173
286
|
this.compiledPatterns.clear();
|
|
174
287
|
if (this.config.rules) {
|
|
175
288
|
this.rules.push(...this.config.rules);
|
|
@@ -185,12 +298,19 @@ export class ATREngine {
|
|
|
185
298
|
// Directory may not exist yet
|
|
186
299
|
}
|
|
187
300
|
}
|
|
301
|
+
for (const rule of this.rules)
|
|
302
|
+
this.indexRule(rule);
|
|
188
303
|
// Pre-compile regex patterns for performance
|
|
189
304
|
for (const rule of this.rules) {
|
|
190
305
|
this.compilePatterns(rule);
|
|
191
306
|
}
|
|
192
307
|
return this.rules.length;
|
|
193
308
|
}
|
|
309
|
+
/** First rule wins, so the index answers what Array.find() would. */
|
|
310
|
+
indexRule(rule) {
|
|
311
|
+
if (!this.ruleById.has(rule.id))
|
|
312
|
+
this.ruleById.set(rule.id, rule);
|
|
313
|
+
}
|
|
194
314
|
/**
|
|
195
315
|
* Lane gate: does this rule's maturity qualify for the configured detection
|
|
196
316
|
* lane? 'enforce' = stable only; 'alert' = stable+test; 'hunt'/unset = all.
|
|
@@ -201,16 +321,65 @@ export class ATREngine {
|
|
|
201
321
|
// missing/odd maturity) lives in the rule-quality contract.
|
|
202
322
|
return laneAllows(rule.maturity, this.lane);
|
|
203
323
|
}
|
|
324
|
+
/**
|
|
325
|
+
* Whether this engine evaluates `rule` at all. A draft or deprecated status, a
|
|
326
|
+
* maturity outside the lane, or (on an engine constructed with
|
|
327
|
+
* `toolDefinitions: true`) a rule written for a tool being called, stops a rule
|
|
328
|
+
* before any of its conditions run,
|
|
329
|
+
* so nothing about it — its false positives included — can be observed through
|
|
330
|
+
* this engine. evaluateRaw() and evaluateAsync() both ask this, and a
|
|
331
|
+
* measurement harness must ask it too before recording a number for a rule:
|
|
332
|
+
* a rule that is never evaluated scores 0 by construction, and that 0 is not
|
|
333
|
+
* a measurement.
|
|
334
|
+
*/
|
|
335
|
+
evaluates(rule) {
|
|
336
|
+
if (rule.status === 'deprecated' || rule.status === 'draft')
|
|
337
|
+
return false;
|
|
338
|
+
// An engine scanning tool definitions does not run the rules written for a tool being called.
|
|
339
|
+
if (this.config.toolDefinitions === true && !appliesToToolDefinition(rule))
|
|
340
|
+
return false;
|
|
341
|
+
return this.passesLane(rule);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* On an engine constructed with `toolDefinitions: true`: how many loaded rules it evaluates, and how
|
|
345
|
+
* many it would evaluate (status and lane allow them) but leaves out because they were written for
|
|
346
|
+
* a tool being called. Null on any other engine. Lets a report say "not run" instead of reading as
|
|
347
|
+
* "ran and found nothing".
|
|
348
|
+
*/
|
|
349
|
+
getToolDefinitionScope() {
|
|
350
|
+
if (this.config.toolDefinitions !== true)
|
|
351
|
+
return null;
|
|
352
|
+
let rulesEvaluated = 0;
|
|
353
|
+
let rulesSkippedByScope = 0;
|
|
354
|
+
for (const rule of this.rules) {
|
|
355
|
+
if (rule.status === 'deprecated' || rule.status === 'draft' || !this.passesLane(rule))
|
|
356
|
+
continue;
|
|
357
|
+
if (appliesToToolDefinition(rule))
|
|
358
|
+
rulesEvaluated += 1;
|
|
359
|
+
else
|
|
360
|
+
rulesSkippedByScope += 1;
|
|
361
|
+
}
|
|
362
|
+
return { rulesEvaluated, rulesSkippedByScope };
|
|
363
|
+
}
|
|
204
364
|
/** Active detection lane (config, else 'hunt'). Diagnostics/tests. */
|
|
205
365
|
getLane() {
|
|
206
366
|
return this.lane;
|
|
207
367
|
}
|
|
368
|
+
/**
|
|
369
|
+
* What a model-decided match may do (config, else 'advisory'). A caller that
|
|
370
|
+
* runs evaluateAsync() and computes the verdict itself passes this on:
|
|
371
|
+
* computeVerdict(matches, { modelDecisions: engine.getModelDecisions() }).
|
|
372
|
+
*/
|
|
373
|
+
getModelDecisions() {
|
|
374
|
+
return this.modelDecisions;
|
|
375
|
+
}
|
|
208
376
|
/**
|
|
209
377
|
* Load a single rule file and add it to the engine.
|
|
210
378
|
*/
|
|
211
379
|
addRuleFile(filePath) {
|
|
212
380
|
const rule = loadRuleFile(filePath);
|
|
213
381
|
this.rules.push(rule);
|
|
382
|
+
this.indexRule(rule);
|
|
214
383
|
this.compilePatterns(rule);
|
|
215
384
|
}
|
|
216
385
|
/**
|
|
@@ -218,6 +387,7 @@ export class ATREngine {
|
|
|
218
387
|
*/
|
|
219
388
|
addRule(rule) {
|
|
220
389
|
this.rules.push(rule);
|
|
390
|
+
this.indexRule(rule);
|
|
221
391
|
this.compilePatterns(rule);
|
|
222
392
|
}
|
|
223
393
|
/**
|
|
@@ -274,36 +444,21 @@ export class ATREngine {
|
|
|
274
444
|
// Tier 2: Pattern matching (existing regex rules)
|
|
275
445
|
const isSkillContext = event.scanContext === 'skill';
|
|
276
446
|
for (const rule of this.rules) {
|
|
277
|
-
// Skip deprecated and draft rules
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
// Lane gate: keep non-stable maturities out of enforce/alert lanes
|
|
281
|
-
if (!this.passesLane(rule))
|
|
447
|
+
// Skip deprecated and draft rules, and maturities outside the lane
|
|
448
|
+
// (non-stable rules stay out of the enforce/alert lanes).
|
|
449
|
+
if (!this.evaluates(rule))
|
|
282
450
|
continue;
|
|
283
451
|
// Source type filtering: skip rules that don't apply to this event type
|
|
284
|
-
// When scanContext is 'skill', skip
|
|
285
|
-
if (!isSkillContext &&
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
// (Field resolution routes event.content into user_input/agent_output
|
|
295
|
-
// for tool_response events — see getFieldValue.)
|
|
296
|
-
const llmIoOverToolResponse = rule.agent_source.type === 'llm_io' && eventSourceType === 'mcp_exchange';
|
|
297
|
-
// Trace-method rules declare agent_source.type: agent_trace, which maps
|
|
298
|
-
// to no event source type and would always be filtered out. Evaluate
|
|
299
|
-
// them whenever the event actually carries a trace payload; evaluateRule
|
|
300
|
-
// still returns null if the trace primitives don't fire, and ordinary
|
|
301
|
-
// (non-trace) events are unaffected because event.trace is undefined.
|
|
302
|
-
const traceWithPayload = rule.detection?.method === 'trace' && event.trace !== undefined;
|
|
303
|
-
if (!mcpOverTool && !llmIoOverToolResponse && !traceWithPayload) {
|
|
304
|
-
continue;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
452
|
+
// (sourceAdmits). When scanContext is 'skill', skip it — all rules fire.
|
|
453
|
+
if (!isSkillContext && !sourceAdmits(rule, eventSourceType, event))
|
|
454
|
+
continue;
|
|
455
|
+
// Whether the skill compound gate below applies to this rule. Hoisted so
|
|
456
|
+
// the pre-check and the gate itself read one expression.
|
|
457
|
+
const skillGated = isSkillContext && rule.tags?.scan_target !== 'skill' && rule.tags?.scan_target !== 'both';
|
|
458
|
+
// The gate's verdict is already known for most rules — see
|
|
459
|
+
// skillGateAlwaysRejects(). Skip the evaluation, not the verdict.
|
|
460
|
+
if (skillGated && skillGateAlwaysRejects(rule))
|
|
461
|
+
continue;
|
|
307
462
|
const matchResult = this.evaluateRule(rule, event);
|
|
308
463
|
if (matchResult) {
|
|
309
464
|
// Skill context compound gating: rules not designed for SKILL.md must
|
|
@@ -333,15 +488,17 @@ export class ATREngine {
|
|
|
333
488
|
// shapes has NOT measured those 645 rules on it) is named by
|
|
334
489
|
// skillPathCoverage() in scripts/lib/corpus-event.ts and pinned by
|
|
335
490
|
// tests/skill-path-coverage.test.ts.
|
|
336
|
-
if (
|
|
337
|
-
const
|
|
338
|
-
const minRequired = Math.max(2, Math.ceil(totalConds * 0.3));
|
|
491
|
+
if (skillGated) {
|
|
492
|
+
const minRequired = skillGateMinRequired(rule);
|
|
339
493
|
if ((matchResult.matchedConditions?.length ?? 0) < minRequired) {
|
|
340
494
|
continue;
|
|
341
495
|
}
|
|
342
496
|
}
|
|
343
497
|
matches.push(matchResult);
|
|
344
|
-
|
|
498
|
+
// A judge's category and evidence are not patterns a rule matched; they
|
|
499
|
+
// must not feed pattern_frequency and other cross-event conditions.
|
|
500
|
+
if (!isModelDecided(matchResult))
|
|
501
|
+
allMatchedPatterns.push(...matchResult.matchedPatterns);
|
|
345
502
|
}
|
|
346
503
|
}
|
|
347
504
|
// Record event in session tracker (always, for cross-event sequence detection)
|
|
@@ -430,36 +587,31 @@ export class ATREngine {
|
|
|
430
587
|
// Tier 2: Pattern matching + async semantic rules
|
|
431
588
|
const isSkillContext = event.scanContext === 'skill';
|
|
432
589
|
for (const rule of this.rules) {
|
|
433
|
-
if (
|
|
590
|
+
if (!this.evaluates(rule))
|
|
434
591
|
continue;
|
|
435
|
-
|
|
592
|
+
// Same source-type filter as evaluateRaw() (sourceAdmits).
|
|
593
|
+
if (!isSkillContext && !sourceAdmits(rule, eventSourceType, event))
|
|
594
|
+
continue;
|
|
595
|
+
// Same hoisted predicate and pre-check as evaluateRaw().
|
|
596
|
+
const skillGated = isSkillContext && rule.tags?.scan_target !== 'skill' && rule.tags?.scan_target !== 'both';
|
|
597
|
+
if (skillGated && skillGateAlwaysRejects(rule))
|
|
436
598
|
continue;
|
|
437
|
-
if (!isSkillContext && eventSourceType && rule.agent_source.type !== eventSourceType) {
|
|
438
|
-
const mcpOverTool = rule.agent_source.type === 'mcp_exchange' && eventSourceType === 'tool_call';
|
|
439
|
-
// Indirect prompt injection: llm_io rules also run on tool_response
|
|
440
|
-
// (source type mcp_exchange) — poisoned tool/MCP/RAG output. See the
|
|
441
|
-
// matching note in evaluateRaw().
|
|
442
|
-
const llmIoOverToolResponse = rule.agent_source.type === 'llm_io' && eventSourceType === 'mcp_exchange';
|
|
443
|
-
// Trace-method rules are source-agnostic — evaluate when a trace is present.
|
|
444
|
-
const traceWithPayload = rule.detection?.method === 'trace' && event.trace !== undefined;
|
|
445
|
-
if (!mcpOverTool && !llmIoOverToolResponse && !traceWithPayload) {
|
|
446
|
-
continue;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
599
|
const matchResult = await this.evaluateRuleAsync(rule, event, this.config.semanticJudge);
|
|
450
600
|
if (matchResult) {
|
|
451
601
|
// Skill compound gate — see the long note in evaluateRaw(). For
|
|
452
602
|
// `condition: any` rules this rejects unconditionally, which is why the
|
|
453
603
|
// SKILL.md path effectively runs only scan_target: skill|both rules.
|
|
454
|
-
if (
|
|
455
|
-
const
|
|
456
|
-
const minRequired = Math.max(2, Math.ceil(totalConds * 0.3));
|
|
604
|
+
if (skillGated) {
|
|
605
|
+
const minRequired = skillGateMinRequired(rule);
|
|
457
606
|
if ((matchResult.matchedConditions?.length ?? 0) < minRequired) {
|
|
458
607
|
continue;
|
|
459
608
|
}
|
|
460
609
|
}
|
|
461
610
|
matches.push(matchResult);
|
|
462
|
-
|
|
611
|
+
// A judge's category and evidence are not patterns a rule matched; they
|
|
612
|
+
// must not feed pattern_frequency and other cross-event conditions.
|
|
613
|
+
if (!isModelDecided(matchResult))
|
|
614
|
+
allMatchedPatterns.push(...matchResult.matchedPatterns);
|
|
463
615
|
}
|
|
464
616
|
}
|
|
465
617
|
// Record event in session tracker (always, for cross-event sequence detection)
|
|
@@ -529,14 +681,14 @@ export class ATREngine {
|
|
|
529
681
|
const result = evaluateTraceRule(rule, event.trace);
|
|
530
682
|
if (!result.matched)
|
|
531
683
|
return null;
|
|
532
|
-
const baseConfidence = rule.tags.confidence === 'high' ? 0.9 : rule.tags.confidence === 'medium' ? 0.7 : 0.5;
|
|
533
684
|
return {
|
|
534
685
|
rule,
|
|
535
686
|
matchedConditions: result.matchedPrimitives.map((p) => `trace.${p}`),
|
|
536
687
|
matchedPatterns: result.violations,
|
|
537
|
-
confidence:
|
|
688
|
+
confidence: ruleConfidence(rule.tags.confidence, 0),
|
|
538
689
|
timestamp: new Date().toISOString(),
|
|
539
690
|
scan_context: 'native',
|
|
691
|
+
decidedBy: 'trace',
|
|
540
692
|
};
|
|
541
693
|
}
|
|
542
694
|
// method=semantic — async path is not used in the sync evaluate() API.
|
|
@@ -546,7 +698,7 @@ export class ATREngine {
|
|
|
546
698
|
// If the rule has fallback_method=pattern, evaluate pattern conditions
|
|
547
699
|
// synchronously. Otherwise skip because the judge path is async-only.
|
|
548
700
|
if (detection.semantic?.fallback_method === 'pattern') {
|
|
549
|
-
return this.evaluatePatternRule(rule, event);
|
|
701
|
+
return asSemanticFallback(this.evaluatePatternRule(rule, event));
|
|
550
702
|
}
|
|
551
703
|
return null;
|
|
552
704
|
}
|
|
@@ -587,10 +739,20 @@ export class ATREngine {
|
|
|
587
739
|
const result = await evaluateSemanticRule(rule, event.content, { judge: effectiveJudge });
|
|
588
740
|
if (!result.matched) {
|
|
589
741
|
if (result.reason?.includes('fallback_pattern')) {
|
|
590
|
-
return this.evaluatePatternRule(rule, event);
|
|
742
|
+
return asSemanticFallback(this.evaluatePatternRule(rule, event));
|
|
591
743
|
}
|
|
592
744
|
return null;
|
|
593
745
|
}
|
|
746
|
+
// The judge matched (atr-method-v1.1 §6.4: a match iff its confidence clears
|
|
747
|
+
// the threshold). When the rule's own pattern fallback matches the same
|
|
748
|
+
// input, the measured regex stands behind the decision: report it as the
|
|
749
|
+
// fallback's match, which is enforced. Otherwise only the judge does, and
|
|
750
|
+
// under modelDecisions: 'advisory' its match is reported, not enforced.
|
|
751
|
+
if (this.modelDecisions === 'advisory' && rule.detection.semantic?.fallback_method === 'pattern') {
|
|
752
|
+
const corroborated = asSemanticFallback(this.evaluatePatternRule(rule, event));
|
|
753
|
+
if (corroborated)
|
|
754
|
+
return corroborated;
|
|
755
|
+
}
|
|
594
756
|
const matchedPatterns = [
|
|
595
757
|
...(result.category ? [result.category] : []),
|
|
596
758
|
...(result.evidence ? [result.evidence] : []),
|
|
@@ -602,6 +764,7 @@ export class ATREngine {
|
|
|
602
764
|
confidence: result.confidence ?? 0.5,
|
|
603
765
|
timestamp: new Date().toISOString(),
|
|
604
766
|
scan_context: 'native',
|
|
767
|
+
decidedBy: 'semantic-judge',
|
|
605
768
|
};
|
|
606
769
|
}
|
|
607
770
|
// For non-semantic methods, fall back to sync path.
|
|
@@ -642,6 +805,7 @@ export class ATREngine {
|
|
|
642
805
|
confidence: 1.0, // exact match
|
|
643
806
|
timestamp: new Date().toISOString(),
|
|
644
807
|
scan_context: 'native',
|
|
808
|
+
decidedBy: 'signature',
|
|
645
809
|
};
|
|
646
810
|
}
|
|
647
811
|
/**
|
|
@@ -671,9 +835,8 @@ export class ATREngine {
|
|
|
671
835
|
: matchedConditionIndices.length === conditions.length;
|
|
672
836
|
if (!matched)
|
|
673
837
|
return null;
|
|
674
|
-
const baseConfidence = rule.tags.confidence === 'high' ? 0.9 : rule.tags.confidence === 'medium' ? 0.7 : 0.5;
|
|
675
838
|
const matchRatio = matchedConditionIndices.length / Math.max(conditions.length, 1);
|
|
676
|
-
const confidence =
|
|
839
|
+
const confidence = ruleConfidence(rule.tags.confidence, matchRatio);
|
|
677
840
|
return {
|
|
678
841
|
rule,
|
|
679
842
|
matchedConditions: matchedConditionIndices.map(String),
|
|
@@ -681,6 +844,7 @@ export class ATREngine {
|
|
|
681
844
|
confidence,
|
|
682
845
|
timestamp: new Date().toISOString(),
|
|
683
846
|
scan_context: 'native',
|
|
847
|
+
decidedBy: 'pattern',
|
|
684
848
|
};
|
|
685
849
|
}
|
|
686
850
|
/**
|
|
@@ -726,7 +890,7 @@ export class ATREngine {
|
|
|
726
890
|
// NL-style rules set tags.suppress_in_code_blocks: true so that matches
|
|
727
891
|
// landing inside ```...``` fenced blocks (e.g. pentest example payloads)
|
|
728
892
|
// do not fire. Built lazily so non-opt-in rules pay no cost.
|
|
729
|
-
const ruleForSuppress = this.
|
|
893
|
+
const ruleForSuppress = this.ruleById.get(ruleId);
|
|
730
894
|
const suppressInCodeBlocks = ruleForSuppress?.tags?.suppress_in_code_blocks === true;
|
|
731
895
|
const codeRanges = suppressInCodeBlocks ? buildCodeBlockRanges(fieldValue) : [];
|
|
732
896
|
// Try pre-compiled pattern first
|
|
@@ -746,9 +910,7 @@ export class ATREngine {
|
|
|
746
910
|
return false;
|
|
747
911
|
}
|
|
748
912
|
// Fallback: compile on the fly (ReDoS-gated — see safeCompile)
|
|
749
|
-
const
|
|
750
|
-
const rFlags = normalized.includes('\\u{') || normalized.includes('\\p{') ? 'iu' : 'i';
|
|
751
|
-
const regex = safeCompile(normalized, rFlags);
|
|
913
|
+
const regex = compileRegexCondition(value);
|
|
752
914
|
if (regex && testNormalisedThenRaw(regex, fieldValue, rawFieldValue)) {
|
|
753
915
|
if (suppressInCodeBlocks && codeRanges.length > 0 && isInsideCodeBlock(fieldValue, regex, codeRanges)) {
|
|
754
916
|
return false;
|
|
@@ -801,9 +963,8 @@ export class ATREngine {
|
|
|
801
963
|
const finalResult = this.evaluateExpression(conditionExpr, conditionResults);
|
|
802
964
|
if (!finalResult)
|
|
803
965
|
return null;
|
|
804
|
-
const baseConfidence = rule.tags.confidence === 'high' ? 0.9 : rule.tags.confidence === 'medium' ? 0.7 : 0.5;
|
|
805
966
|
const matchRatio = matchedConditionNames.length / Math.max(Object.keys(conditions).length, 1);
|
|
806
|
-
const confidence =
|
|
967
|
+
const confidence = ruleConfidence(rule.tags.confidence, matchRatio);
|
|
807
968
|
return {
|
|
808
969
|
rule,
|
|
809
970
|
matchedConditions: matchedConditionNames,
|
|
@@ -811,6 +972,7 @@ export class ATREngine {
|
|
|
811
972
|
confidence,
|
|
812
973
|
timestamp: new Date().toISOString(),
|
|
813
974
|
scan_context: 'native',
|
|
975
|
+
decidedBy: 'pattern',
|
|
814
976
|
};
|
|
815
977
|
}
|
|
816
978
|
/**
|
|
@@ -851,7 +1013,7 @@ export class ATREngine {
|
|
|
851
1013
|
// skills)
|
|
852
1014
|
// - Other rules → suppressed (their patterns FP on code examples)
|
|
853
1015
|
const isSkillCtx = event.scanContext === 'skill';
|
|
854
|
-
const matchedRule = this.
|
|
1016
|
+
const matchedRule = this.ruleById.get(ruleId);
|
|
855
1017
|
const isSkillRule = matchedRule?.tags?.scan_target === 'skill';
|
|
856
1018
|
const explicitSuppress = matchedRule?.tags?.suppress_in_code_blocks === true;
|
|
857
1019
|
const suppressInCodeBlocks = explicitSuppress
|
|
@@ -919,7 +1081,7 @@ export class ATREngine {
|
|
|
919
1081
|
* because attackers deliberately hide payloads in code blocks.
|
|
920
1082
|
*/
|
|
921
1083
|
shouldSuppressInCodeBlocks(ruleId) {
|
|
922
|
-
const rule = this.
|
|
1084
|
+
const rule = this.ruleById.get(ruleId);
|
|
923
1085
|
if (!rule)
|
|
924
1086
|
return false;
|
|
925
1087
|
const category = rule.tags?.category ?? '';
|
|
@@ -1250,9 +1412,7 @@ export class ATREngine {
|
|
|
1250
1412
|
for (let i = 0; i < conditions.length; i++) {
|
|
1251
1413
|
const cond = conditions[i];
|
|
1252
1414
|
if (cond['operator'] === 'regex' && typeof cond['value'] === 'string') {
|
|
1253
|
-
const
|
|
1254
|
-
const flags = pattern.includes('\\u{') || pattern.includes('\\p{') ? 'iu' : 'i';
|
|
1255
|
-
const compiledRe = safeCompile(pattern, flags, rule.id);
|
|
1415
|
+
const compiledRe = compileRegexCondition(cond['value'], rule.id);
|
|
1256
1416
|
if (compiledRe)
|
|
1257
1417
|
ruleMap.set(String(i), [compiledRe]);
|
|
1258
1418
|
}
|
|
@@ -1339,7 +1499,8 @@ export class ATREngine {
|
|
|
1339
1499
|
if (hasConfirmMatch) {
|
|
1340
1500
|
const sim = embResult?.value ?? 0;
|
|
1341
1501
|
// Note: confirmThreshold 0 disables the gate (every similarity is >= 0).
|
|
1342
|
-
|
|
1502
|
+
// Written so that a similarity that is not a number drops the rule too.
|
|
1503
|
+
if (!(sim >= (this.config.confirmThreshold ?? 0.6))) {
|
|
1343
1504
|
matches = matches.filter((m) => !requiresConfirm(m.rule));
|
|
1344
1505
|
layersUsed.push('embedding-confirm');
|
|
1345
1506
|
}
|
|
@@ -1347,7 +1508,8 @@ export class ATREngine {
|
|
|
1347
1508
|
// Additive Tier 2.5 signal: a high-similarity input surfaced as an embedding-only
|
|
1348
1509
|
// match. EXCLUDED from the enforce lane — an embedding-only signal must never
|
|
1349
1510
|
// produce a block there (only deterministic stable rules can block in enforce).
|
|
1350
|
-
//
|
|
1511
|
+
// In alert/hunt it is a model's decision (decidedBy: 'embedding'), which
|
|
1512
|
+
// computeVerdict reports without enforcing unless modelDecisions is 'enforce'.
|
|
1351
1513
|
if (lane !== 'enforce' && embResult && embResult.value >= 0.65) {
|
|
1352
1514
|
const severity = embResult.value >= 0.95 ? 'critical'
|
|
1353
1515
|
: embResult.value >= 0.88 ? 'high'
|
|
@@ -1375,6 +1537,7 @@ export class ATREngine {
|
|
|
1375
1537
|
confidence: embResult.value,
|
|
1376
1538
|
timestamp: new Date().toISOString(),
|
|
1377
1539
|
scan_context: 'native',
|
|
1540
|
+
decidedBy: 'embedding',
|
|
1378
1541
|
};
|
|
1379
1542
|
matches = [...matches, syntheticMatch];
|
|
1380
1543
|
}
|
|
@@ -1398,7 +1561,7 @@ export class ATREngine {
|
|
|
1398
1561
|
matches = merged;
|
|
1399
1562
|
}
|
|
1400
1563
|
}
|
|
1401
|
-
const verdict = computeVerdict(matches);
|
|
1564
|
+
const verdict = computeVerdict(matches, { modelDecisions: this.modelDecisions });
|
|
1402
1565
|
let actionResults = Object.freeze([]);
|
|
1403
1566
|
if (executor && verdict.actions.length > 0) {
|
|
1404
1567
|
const context = Object.freeze({
|
|
@@ -1546,15 +1709,97 @@ export class ATREngine {
|
|
|
1546
1709
|
};
|
|
1547
1710
|
}
|
|
1548
1711
|
}
|
|
1712
|
+
/**
|
|
1713
|
+
* The skill compound gate's threshold: how many conditions a rule that is not
|
|
1714
|
+
* `scan_target: skill|both` must report as matched on the SKILL.md path.
|
|
1715
|
+
* evaluateRaw(), evaluateAsync() and skillGateAlwaysRejects() all read it from
|
|
1716
|
+
* here, so the gate and the pre-check in front of it cannot drift apart.
|
|
1717
|
+
*/
|
|
1718
|
+
function skillGateMinRequired(rule) {
|
|
1719
|
+
const totalConds = Number(rule.detection?.conditions?.length ?? 1);
|
|
1720
|
+
return Math.max(2, Math.ceil(totalConds * 0.3));
|
|
1721
|
+
}
|
|
1722
|
+
/**
|
|
1723
|
+
* The most conditions a match of this rule can report. An array-format pattern
|
|
1724
|
+
* rule with `condition: any|or` reports at most one, because
|
|
1725
|
+
* evaluateArrayConditions() breaks on the first matching condition. Every other
|
|
1726
|
+
* shape is treated as unbounded, so it is never skipped.
|
|
1727
|
+
*/
|
|
1728
|
+
function maxReportedConditions(rule) {
|
|
1729
|
+
const { detection } = rule;
|
|
1730
|
+
if ((detection.method ?? 'pattern') !== 'pattern')
|
|
1731
|
+
return Number.POSITIVE_INFINITY;
|
|
1732
|
+
if (!Array.isArray(detection.conditions))
|
|
1733
|
+
return Number.POSITIVE_INFINITY;
|
|
1734
|
+
return detection.condition === 'any' || detection.condition === 'or'
|
|
1735
|
+
? 1
|
|
1736
|
+
: Number.POSITIVE_INFINITY;
|
|
1737
|
+
}
|
|
1738
|
+
/**
|
|
1739
|
+
* True when the skill compound gate is certain to reject this rule's match
|
|
1740
|
+
* whatever the input, so evaluating the rule on the SKILL.md path is wasted work:
|
|
1741
|
+
* the most conditions it can report is below the gate's threshold.
|
|
1742
|
+
*
|
|
1743
|
+
* Deliberately the narrowest provable case, and deliberately NOT
|
|
1744
|
+
* skillPathBlocker() from src/corpus-event.ts: that predicate exists to be
|
|
1745
|
+
* CHECKED against this engine (tests/skill-path-coverage.test.ts), and an engine
|
|
1746
|
+
* that consulted it would turn those tests into the predicate checking itself.
|
|
1747
|
+
* If the any-mode short-circuit in evaluateArrayConditions() is ever removed,
|
|
1748
|
+
* maxReportedConditions() has to change with it — the test "evaluateArrayConditions
|
|
1749
|
+
* still short-circuits" in tests/skill-path-coverage.test.ts fails first.
|
|
1750
|
+
*
|
|
1751
|
+
* Measured 2026-10-15 on the benign-corpus FP scan: 645 of 829 rules qualify,
|
|
1752
|
+
* and skipping them took the skill pass from 16.8% to ~3% of all CPU with the
|
|
1753
|
+
* matched-rule set identical for every one of 13,848 samples.
|
|
1754
|
+
*/
|
|
1755
|
+
function skillGateAlwaysRejects(rule) {
|
|
1756
|
+
return maxReportedConditions(rule) < skillGateMinRequired(rule);
|
|
1757
|
+
}
|
|
1549
1758
|
function escapeRegex(str) {
|
|
1550
1759
|
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1551
1760
|
}
|
|
1761
|
+
/** A leading inline flag group as rule authors write it: (?i), (?is), (?im), ... */
|
|
1762
|
+
const LEADING_INLINE_FLAGS = /^\(\?([imsx]+)\)/;
|
|
1552
1763
|
/**
|
|
1553
1764
|
* Strip inline flags like (?i) from regex patterns.
|
|
1554
1765
|
* JavaScript RegExp uses flags as a constructor parameter, not inline.
|
|
1555
1766
|
*/
|
|
1556
1767
|
function normalizeRegex(pattern) {
|
|
1557
|
-
return pattern.replace(
|
|
1768
|
+
return pattern.replace(LEADING_INLINE_FLAGS, '');
|
|
1769
|
+
}
|
|
1770
|
+
/**
|
|
1771
|
+
* The engine's single definition of how an array-format `operator: regex`
|
|
1772
|
+
* condition is compiled (SPEC §6.4). Both compile sites in ATREngine reach it
|
|
1773
|
+
* through compileRegexCondition() (compilePatterns() and the on-the-fly fallback
|
|
1774
|
+
* in evaluateArrayCondition()), so does ShadowEvaluator, and
|
|
1775
|
+
* scripts/gate-case-sensitivity.ts imports it, because it has to see each pattern
|
|
1776
|
+
* exactly as the engine does. That gate used to keep its own copy of this logic,
|
|
1777
|
+
* and the copy went stale when needsUnicodeFlag() started setting `u` for astral
|
|
1778
|
+
* literals. Other scripts still re-derive it by hand and could import it too.
|
|
1779
|
+
*
|
|
1780
|
+
* Two consequences rule authors cannot see from the pattern:
|
|
1781
|
+
* - `i` is applied whether or not the author wrote (?i), so letter case never
|
|
1782
|
+
* distinguishes anything: [A-Z] also matches a-z.
|
|
1783
|
+
* - A stripped (?s), (?m) or (?x) is NOT applied.
|
|
1784
|
+
*/
|
|
1785
|
+
export function regexConditionSpec(value) {
|
|
1786
|
+
const inline = LEADING_INLINE_FLAGS.exec(value);
|
|
1787
|
+
const source = normalizeRegex(value);
|
|
1788
|
+
return { source, inlineFlags: inline?.[1] ?? '', flags: needsUnicodeFlag(source) ? 'iu' : 'i' };
|
|
1789
|
+
}
|
|
1790
|
+
/**
|
|
1791
|
+
* Compile an array-format `operator: regex` value the way the engine does: the
|
|
1792
|
+
* leading flag group handled by regexConditionSpec(), then the ReDoS gate in
|
|
1793
|
+
* safeCompile(). Returns null for a pattern the gate rejects or that does not
|
|
1794
|
+
* compile; such a condition never matches. Exported for code outside
|
|
1795
|
+
* ATREngine, such as ShadowEvaluator and RuleScaffolder, that must compile a
|
|
1796
|
+
* condition exactly as the engine does.
|
|
1797
|
+
*
|
|
1798
|
+
* @internal Not re-exported from the package entry point.
|
|
1799
|
+
*/
|
|
1800
|
+
export function compileRegexCondition(value, ruleId) {
|
|
1801
|
+
const spec = regexConditionSpec(value);
|
|
1802
|
+
return safeCompile(spec.source, spec.flags, ruleId);
|
|
1558
1803
|
}
|
|
1559
1804
|
/**
|
|
1560
1805
|
* Normalize Unicode text to NFC form and strip zero-width characters.
|
|
@@ -1564,11 +1809,24 @@ function normalizeRegex(pattern) {
|
|
|
1564
1809
|
* (\uFF21\uFF22\uFF23 vs ABC) remain distinct so rules that explicitly target full-width
|
|
1565
1810
|
* evasion can still match. For aggressive normalization use
|
|
1566
1811
|
* `normalizeUnicodeAggressive()`.
|
|
1812
|
+
*
|
|
1813
|
+
* Hot path, memoised the same way as foldConfusables() below: every condition
|
|
1814
|
+
* normalises the field it reads, and consecutive conditions almost always read
|
|
1815
|
+
* the same string, so a single-entry memo turns per-condition work into
|
|
1816
|
+
* per-distinct-input work. Measured 2026-10-15 on the benign-corpus FP scan,
|
|
1817
|
+
* the repeated NFKC pass plus its zero-width strip were ~9% of all CPU.
|
|
1567
1818
|
*/
|
|
1819
|
+
let _normKey = '';
|
|
1820
|
+
let _normVal = '';
|
|
1568
1821
|
export function normalizeUnicode(text) {
|
|
1569
|
-
|
|
1822
|
+
if (text === _normKey)
|
|
1823
|
+
return _normVal;
|
|
1824
|
+
const out = text
|
|
1570
1825
|
.normalize('NFKC')
|
|
1571
1826
|
.replace(/[\u200B\u200C\u200D\uFEFF\u2060\u180E\u200E\u200F\u202A-\u202E\u2066-\u2069]/g, '');
|
|
1827
|
+
_normKey = text;
|
|
1828
|
+
_normVal = out;
|
|
1829
|
+
return out;
|
|
1572
1830
|
}
|
|
1573
1831
|
/**
|
|
1574
1832
|
* Map of high-confidence homoglyphs (Cyrillic / Greek / other scripts whose
|
|
@@ -1758,8 +2016,11 @@ const MAX_EVAL_LENGTH = 100_000;
|
|
|
1758
2016
|
/**
|
|
1759
2017
|
* Safely test a regex pattern against input with length limits.
|
|
1760
2018
|
* Returns false if input exceeds MAX_EVAL_LENGTH to prevent ReDoS.
|
|
2019
|
+
* Exported so ShadowEvaluator and RuleScaffolder apply the same limit as the engine.
|
|
2020
|
+
*
|
|
2021
|
+
* @internal Not re-exported from the package entry point.
|
|
1761
2022
|
*/
|
|
1762
|
-
function safeRegexTest(regex, input) {
|
|
2023
|
+
export function safeRegexTest(regex, input) {
|
|
1763
2024
|
if (input.length > MAX_EVAL_LENGTH)
|
|
1764
2025
|
return false;
|
|
1765
2026
|
return regex.test(input);
|
|
@@ -1857,6 +2118,31 @@ export function isReDoSSafe(source) {
|
|
|
1857
2118
|
* be LOUD, not silent, so a rejected ReDoS pattern warns to stderr (never
|
|
1858
2119
|
* stdout — that carries the hook protocol) with the offending source.
|
|
1859
2120
|
*/
|
|
2121
|
+
/**
|
|
2122
|
+
* Does this pattern need the RegExp `u` flag?
|
|
2123
|
+
*
|
|
2124
|
+
* `\\u{...}` and `\\p{...}` require it by syntax, and so does a literal astral
|
|
2125
|
+
* character: without `u`, JavaScript reads a surrogate pair, and a class range
|
|
2126
|
+
* written with literals -- [<U+E0000>-<U+E007F>] -- is a SyntaxError rather than
|
|
2127
|
+
* a range.
|
|
2128
|
+
*
|
|
2129
|
+
* The literal form matters because it is the only spelling the three consuming
|
|
2130
|
+
* engines share. `\\u{...}` is JS-only: Python re needs `\\U000E0000`, Go needs
|
|
2131
|
+
* `\\x{E0000}`, and neither of those is valid JavaScript. Sixteen conditions
|
|
2132
|
+
* across ten rules used it, which made those rules uncompilable from the Python
|
|
2133
|
+
* and Go channels; they are literals now, and this is what keeps them working
|
|
2134
|
+
* here.
|
|
2135
|
+
*/
|
|
2136
|
+
export function needsUnicodeFlag(pattern) {
|
|
2137
|
+
if (pattern.includes('\\u{') || pattern.includes('\\p{'))
|
|
2138
|
+
return true;
|
|
2139
|
+
for (const ch of pattern) {
|
|
2140
|
+
const cp = ch.codePointAt(0);
|
|
2141
|
+
if (cp !== undefined && cp > 0xffff)
|
|
2142
|
+
return true;
|
|
2143
|
+
}
|
|
2144
|
+
return false;
|
|
2145
|
+
}
|
|
1860
2146
|
function safeCompile(source, flags, ruleId) {
|
|
1861
2147
|
if (!isReDoSSafe(source)) {
|
|
1862
2148
|
console.warn(`[atr-engine] rejected ReDoS-unsafe pattern${ruleId ? ` in rule ${ruleId}` : ''}: ${source.slice(0, 120)}`);
|