agent-threat-rules 4.1.5 → 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 +688 -1
- package/README.md +355 -125
- 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 +126 -34
- package/dist/cli/scan-handler.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +80 -43
- 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 +150 -6
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +337 -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/testcase-event.d.ts +82 -1
- package/dist/testcase-event.d.ts.map +1 -1
- package/dist/testcase-event.js +135 -16
- package/dist/testcase-event.js.map +1 -1
- 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 +2 -1
- package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +2 -2
- package/rules/agent-manipulation/ATR-2026-00139-casual-authority-redirect.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00328-named-mode-persona-override.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00330-yoja-allcaps-settings-block-persona.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00418-weknora-mcp-config-rce.yaml +5 -5
- package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +3 -3
- package/rules/context-exfiltration/ATR-2026-00426-nl-output-injection-credential-leak.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00851-indirect-pi-financial-payment-exfil.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01457-sysprompt-completion-clone-attack.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01463-imend-imsystem-prompt-injection-format.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +1 -1
- 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/excessive-autonomy/ATR-2026-00710-ipi-physical-access-grant.yaml +1 -1
- package/rules/model-abuse/ATR-2026-01897-host-sabotage.yaml +2 -2
- package/rules/model-security/ATR-2026-00433-modelcache-torch-load-deserialization-rce.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-00436-enclave-vm-sandbox-escape-rce.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +2 -2
- package/rules/privilege-escalation/ATR-2026-01612-debug-mode-privilege-escalation.yaml +1 -1
- package/rules/privilege-escalation/ATR-2026-02867-identifier-typed-tool-argument-dot-dot-path-segment.yaml +106 -0
- package/rules/prompt-injection/ATR-2026-00004-system-prompt-override.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00080-encoding-evasion.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00086-visual-spoofing.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00203-context-pollution-skill-description.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00228-structured-jailbreak.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00233-structured-jailbreak.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00256-base-n-encoding-jailbreak.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00264-latent-injection-translation.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00265-latent-injection-rag-document.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00282-perez-prompt-injection-hijack.yaml +4 -4
- package/rules/prompt-injection/ATR-2026-00321-hyphenated-system-instruction-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00394-backspace-deletion-character-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00446-variable-assignment-payload-injection.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +3 -3
- package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01005-many-shot-repetition-override.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01006-payload-split-string-concat-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01015-evasion-refusal-suppression.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01016-evasion-response-priming-forced-opener.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01026-evasion-unicode-glitch-token-anomaly.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01304-indirect-injection-carrier-important-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01759-dos-new-important-instructions-injection-in-document.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +2 -2
- 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-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 +1 -1
- package/rules/skill-compromise/ATR-2026-00063-skill-chain-attack.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-00066-parameter-injection.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-00149-skill-exfil-compound.yaml +6 -6
- package/rules/skill-compromise/ATR-2026-00223-reverse-shell-dropper.yaml +2 -2
- package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-02261-code-credential-exfil-chain.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00012-unauthorized-tool-call.yaml +23 -23
- package/rules/tool-poisoning/ATR-2026-00013-tool-ssrf.yaml +16 -5
- package/rules/tool-poisoning/ATR-2026-00161-important-tag-cross-tool-shadowing.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +2 -2
- package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +4 -4
- package/rules/tool-poisoning/ATR-2026-00581-mcp-tool-rug-pull-post-approval-redefinition.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +2 -2
- package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-01932-shadow-undeclared-mcp-server-registration.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-02025-mcp-full-schema-poisoning-nondescription-field.yaml +1 -1
- 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 +6 -3
- package/spec/atr-event-v1.0.md +13 -8
- package/spec/atr-method-v1.1.md +2 -2
- 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.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import type { ATRRule, ATRMatch, AgentEvent, ATRVerdict, ActionResult, ScanResult, ATRLanguage, ATRSemanticJudge } from './types.js';
|
|
15
15
|
import { type Lane } from './quality/rule-contract.js';
|
|
16
16
|
import type { SessionTracker } from './session-tracker.js';
|
|
17
|
+
import { type ModelDecisions } from './verdict.js';
|
|
17
18
|
import type { ActionExecutor } from './action-executor.js';
|
|
18
19
|
import type { SkillFingerprintStore } from './skill-fingerprint.js';
|
|
19
20
|
import type { SemanticLayerConfig } from './layer-integration.js';
|
|
@@ -21,6 +22,51 @@ import type { InvariantChecker } from './tier0-invariant.js';
|
|
|
21
22
|
import type { BlacklistProvider } from './tier1-blacklist.js';
|
|
22
23
|
import type { EmbeddingModule } from './modules/embedding.js';
|
|
23
24
|
export declare function decodeBase64Blocks(content: string): string[];
|
|
25
|
+
/** Map agent event types to ATR source types */
|
|
26
|
+
export declare const EVENT_TYPE_TO_SOURCE: Readonly<Record<string, string>>;
|
|
27
|
+
/**
|
|
28
|
+
* agent_source types that name what a rule reads rather than a stream of
|
|
29
|
+
* events of their own (spec/atr-schema.yaml), mapped to the source type whose
|
|
30
|
+
* events carry that data: a context window reaches the model as LLM input or
|
|
31
|
+
* as tool output, so those rules run where llm_io rules run; a skill is
|
|
32
|
+
* installed, granted permissions and chained through tool calls, so those
|
|
33
|
+
* rules run where tool_call rules run. memory_access is left out for now
|
|
34
|
+
* (WITHHELD_SOURCE_TYPES).
|
|
35
|
+
*
|
|
36
|
+
* No event type maps to them in EVENT_TYPE_TO_SOURCE, so the source filter used
|
|
37
|
+
* to skip them on every typed event: on the tool_call and tool_response events
|
|
38
|
+
* src/hook-handler.ts builds, such a rule never ran, while `atr test` mapped its
|
|
39
|
+
* type to a base type and passed its cases. Only an event with no source type
|
|
40
|
+
* (mcp_exchange) or a SKILL.md scan reached it. `atr test` now leaves the type
|
|
41
|
+
* alone: what it runs is what the engine admits.
|
|
42
|
+
*/
|
|
43
|
+
export declare const RUNTIME_SOURCE_TYPE: Readonly<Record<string, string>>;
|
|
44
|
+
/**
|
|
45
|
+
* Extended agent_source types left out of RUNTIME_SOURCE_TYPE for now, each
|
|
46
|
+
* with the reason. A rule of such a type still runs only on an event with no
|
|
47
|
+
* source type and in a SKILL.md scan. `atr test` reports its cases as
|
|
48
|
+
* unevaluable with this reason instead of passing them on an event the engine
|
|
49
|
+
* skips the rule on.
|
|
50
|
+
*
|
|
51
|
+
* memory_access reads what context_window reads, an agent's memory as it
|
|
52
|
+
* reaches the model, and would map to llm_io. Its rules (ATR-2026-00075 and
|
|
53
|
+
* -01155 today) were written for memory writes, and 00075 also matches standing
|
|
54
|
+
* instructions in an ordinary chat turn ("From now on, always answer in
|
|
55
|
+
* French."). On llm_input events the adapters that block by default would
|
|
56
|
+
* refuse those messages: the Mastra ATRProcessor aborts on high and critical
|
|
57
|
+
* in the hunt lane, and the OpenShell filter denies at high. Map it once those
|
|
58
|
+
* rules match memory writes only, measured on chat-turn data.
|
|
59
|
+
*/
|
|
60
|
+
export declare const WITHHELD_SOURCE_TYPES: Readonly<Record<string, string>>;
|
|
61
|
+
/**
|
|
62
|
+
* Whether a rule of this agent_source.type runs on an event of this source
|
|
63
|
+
* type: the rule's source type (after RUNTIME_SOURCE_TYPE) is the event's, or
|
|
64
|
+
* one of two documented exceptions holds. An event type with no source type
|
|
65
|
+
* (mcp_exchange) admits every rule, whatever its agent_source holds; on a typed
|
|
66
|
+
* event a type that is not a string is admitted by nothing.
|
|
67
|
+
* sourceAdmits() adds the trace exception.
|
|
68
|
+
*/
|
|
69
|
+
export declare function sourceTypeAdmits(ruleSourceType: unknown, eventSourceType: string | undefined): boolean;
|
|
24
70
|
/**
|
|
25
71
|
* Detection reporter — opt-in callback for feeding scan results back to
|
|
26
72
|
* ATR Threat Cloud. Every integration endpoint that enables this becomes
|
|
@@ -99,10 +145,42 @@ export interface ATREngineConfig {
|
|
|
99
145
|
* (they are too broad to block without confirmation). Default 0.6.
|
|
100
146
|
*/
|
|
101
147
|
confirmThreshold?: number;
|
|
148
|
+
/**
|
|
149
|
+
* What a match a model decided may do in evaluateWithVerdict(): a semantic
|
|
150
|
+
* rule's semanticJudge, the embeddingModule signal, the semanticModule layer.
|
|
151
|
+
* 'advisory' (default): reported, observe-tier actions only, no part in the
|
|
152
|
+
* verdict's outcome.
|
|
153
|
+
* 'enforce': counts like a rule's own match. No benign-corpus measurement
|
|
154
|
+
* stands behind a model's decision; choose it only if you accept that.
|
|
155
|
+
* Any other value throws at construction time.
|
|
156
|
+
*/
|
|
157
|
+
modelDecisions?: ModelDecisions;
|
|
158
|
+
/**
|
|
159
|
+
* Every event this engine evaluates is an MCP tool definition: an entry of a `tools/list`
|
|
160
|
+
* document, which defines a tool and calls none (`atr scan` on such a document sets it). Rules
|
|
161
|
+
* written for a tool being called then do not run: a rule with agent_source.type `tool_call` runs
|
|
162
|
+
* only if one of its conditions reads `tool_description`, or if its subject is the tool's identity
|
|
163
|
+
* (TOOL_IDENTITY_RULES). Every other rule runs as without the option. See
|
|
164
|
+
* src/tool-definition-scope.ts. Default false: other producers (hooks, adapters, event files) are
|
|
165
|
+
* unaffected.
|
|
166
|
+
*/
|
|
167
|
+
toolDefinitions?: boolean;
|
|
102
168
|
}
|
|
103
169
|
export declare class ATREngine {
|
|
104
170
|
private readonly config;
|
|
105
171
|
private rules;
|
|
172
|
+
/**
|
|
173
|
+
* id -> the FIRST loaded rule carrying that id, i.e. exactly what
|
|
174
|
+
* `this.rules.find(r => r.id === id)` returns.
|
|
175
|
+
*
|
|
176
|
+
* The per-condition paths below used to run that find() on every regex
|
|
177
|
+
* condition they evaluated: a linear walk over every loaded rule, repeated
|
|
178
|
+
* thousands of times per event. Measured 2026-10-15 on the benign-corpus FP
|
|
179
|
+
* scan (scripts/gate-promotion-fp.ts, 829 rules, 13,848 samples), that walk
|
|
180
|
+
* was ~11% of all CPU and replacing it was a 1.18x speed-up on its own, with
|
|
181
|
+
* the matched-rule set identical for every sample.
|
|
182
|
+
*/
|
|
183
|
+
private readonly ruleById;
|
|
106
184
|
private readonly compiledPatterns;
|
|
107
185
|
private readonly semanticModuleInstance;
|
|
108
186
|
/**
|
|
@@ -111,6 +189,7 @@ export declare class ATREngine {
|
|
|
111
189
|
* lifetime.
|
|
112
190
|
*/
|
|
113
191
|
private readonly lane;
|
|
192
|
+
private readonly modelDecisions;
|
|
114
193
|
/**
|
|
115
194
|
* Find bundled rules directory shipped with the npm package.
|
|
116
195
|
* Checks: ../rules (from dist/), ./rules (repo root)
|
|
@@ -121,14 +200,44 @@ export declare class ATREngine {
|
|
|
121
200
|
* Load rules from configured directory and/or pre-loaded rules.
|
|
122
201
|
*/
|
|
123
202
|
loadRules(): Promise<number>;
|
|
203
|
+
/** First rule wins, so the index answers what Array.find() would. */
|
|
204
|
+
private indexRule;
|
|
124
205
|
/**
|
|
125
206
|
* Lane gate: does this rule's maturity qualify for the configured detection
|
|
126
207
|
* lane? 'enforce' = stable only; 'alert' = stable+test; 'hunt'/unset = all.
|
|
127
208
|
* Keeps experimental content out of the auto-block path without deleting it.
|
|
128
209
|
*/
|
|
129
210
|
private passesLane;
|
|
211
|
+
/**
|
|
212
|
+
* Whether this engine evaluates `rule` at all. A draft or deprecated status, a
|
|
213
|
+
* maturity outside the lane, or (on an engine constructed with
|
|
214
|
+
* `toolDefinitions: true`) a rule written for a tool being called, stops a rule
|
|
215
|
+
* before any of its conditions run,
|
|
216
|
+
* so nothing about it — its false positives included — can be observed through
|
|
217
|
+
* this engine. evaluateRaw() and evaluateAsync() both ask this, and a
|
|
218
|
+
* measurement harness must ask it too before recording a number for a rule:
|
|
219
|
+
* a rule that is never evaluated scores 0 by construction, and that 0 is not
|
|
220
|
+
* a measurement.
|
|
221
|
+
*/
|
|
222
|
+
evaluates(rule: Pick<ATRRule, 'status' | 'maturity'> & Partial<Pick<ATRRule, 'id' | 'agent_source' | 'detection'>>): boolean;
|
|
223
|
+
/**
|
|
224
|
+
* On an engine constructed with `toolDefinitions: true`: how many loaded rules it evaluates, and how
|
|
225
|
+
* many it would evaluate (status and lane allow them) but leaves out because they were written for
|
|
226
|
+
* a tool being called. Null on any other engine. Lets a report say "not run" instead of reading as
|
|
227
|
+
* "ran and found nothing".
|
|
228
|
+
*/
|
|
229
|
+
getToolDefinitionScope(): {
|
|
230
|
+
rulesEvaluated: number;
|
|
231
|
+
rulesSkippedByScope: number;
|
|
232
|
+
} | null;
|
|
130
233
|
/** Active detection lane (config, else 'hunt'). Diagnostics/tests. */
|
|
131
234
|
getLane(): Lane;
|
|
235
|
+
/**
|
|
236
|
+
* What a model-decided match may do (config, else 'advisory'). A caller that
|
|
237
|
+
* runs evaluateAsync() and computes the verdict itself passes this on:
|
|
238
|
+
* computeVerdict(matches, { modelDecisions: engine.getModelDecisions() }).
|
|
239
|
+
*/
|
|
240
|
+
getModelDecisions(): ModelDecisions;
|
|
132
241
|
/**
|
|
133
242
|
* Load a single rule file and add it to the engine.
|
|
134
243
|
*/
|
|
@@ -305,15 +414,42 @@ export declare class ATREngine {
|
|
|
305
414
|
/** Async MCP event scan result with semantic rule support. */
|
|
306
415
|
evaluateFullAsync(event: AgentEvent, filePath?: string): Promise<ScanResult>;
|
|
307
416
|
}
|
|
417
|
+
/** How the engine compiles one array-format `operator: regex` condition. */
|
|
418
|
+
export interface RegexConditionSpec {
|
|
419
|
+
/** The pattern handed to RegExp: the condition's value minus a leading inline flag group. */
|
|
420
|
+
readonly source: string;
|
|
421
|
+
/** The letters of that stripped group ("i", "is", ...), or "" when there was none. Stripped, not applied. */
|
|
422
|
+
readonly inlineFlags: string;
|
|
423
|
+
/** Always `i` -- this condition shape has no case-sensitive mode -- plus `u` when the pattern needs it. */
|
|
424
|
+
readonly flags: 'i' | 'iu';
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* The engine's single definition of how an array-format `operator: regex`
|
|
428
|
+
* condition is compiled (SPEC §6.4). Both compile sites in ATREngine reach it
|
|
429
|
+
* through compileRegexCondition() (compilePatterns() and the on-the-fly fallback
|
|
430
|
+
* in evaluateArrayCondition()), so does ShadowEvaluator, and
|
|
431
|
+
* scripts/gate-case-sensitivity.ts imports it, because it has to see each pattern
|
|
432
|
+
* exactly as the engine does. That gate used to keep its own copy of this logic,
|
|
433
|
+
* and the copy went stale when needsUnicodeFlag() started setting `u` for astral
|
|
434
|
+
* literals. Other scripts still re-derive it by hand and could import it too.
|
|
435
|
+
*
|
|
436
|
+
* Two consequences rule authors cannot see from the pattern:
|
|
437
|
+
* - `i` is applied whether or not the author wrote (?i), so letter case never
|
|
438
|
+
* distinguishes anything: [A-Z] also matches a-z.
|
|
439
|
+
* - A stripped (?s), (?m) or (?x) is NOT applied.
|
|
440
|
+
*/
|
|
441
|
+
export declare function regexConditionSpec(value: string): RegexConditionSpec;
|
|
308
442
|
/**
|
|
309
|
-
*
|
|
310
|
-
*
|
|
443
|
+
* Compile an array-format `operator: regex` value the way the engine does: the
|
|
444
|
+
* leading flag group handled by regexConditionSpec(), then the ReDoS gate in
|
|
445
|
+
* safeCompile(). Returns null for a pattern the gate rejects or that does not
|
|
446
|
+
* compile; such a condition never matches. Exported for code outside
|
|
447
|
+
* ATREngine, such as ShadowEvaluator and RuleScaffolder, that must compile a
|
|
448
|
+
* condition exactly as the engine does.
|
|
311
449
|
*
|
|
312
|
-
*
|
|
313
|
-
* (\uFF21\uFF22\uFF23 vs ABC) remain distinct so rules that explicitly target full-width
|
|
314
|
-
* evasion can still match. For aggressive normalization use
|
|
315
|
-
* `normalizeUnicodeAggressive()`.
|
|
450
|
+
* @internal Not re-exported from the package entry point.
|
|
316
451
|
*/
|
|
452
|
+
export declare function compileRegexCondition(value: string, ruleId?: string): RegExp | null;
|
|
317
453
|
export declare function normalizeUnicode(text: string): string;
|
|
318
454
|
export declare function foldConfusables(text: string): string;
|
|
319
455
|
/**
|
|
@@ -349,6 +485,14 @@ export declare function detectInputLanguage(text: string): ATRLanguage;
|
|
|
349
485
|
* Exported for unit testing; not part of the public API surface.
|
|
350
486
|
*/
|
|
351
487
|
export declare function conditionLanguageMatches(condLang: ATRLanguage | undefined, inputLang: ATRLanguage): boolean;
|
|
488
|
+
/**
|
|
489
|
+
* Safely test a regex pattern against input with length limits.
|
|
490
|
+
* Returns false if input exceeds MAX_EVAL_LENGTH to prevent ReDoS.
|
|
491
|
+
* Exported so ShadowEvaluator and RuleScaffolder apply the same limit as the engine.
|
|
492
|
+
*
|
|
493
|
+
* @internal Not re-exported from the package entry point.
|
|
494
|
+
*/
|
|
495
|
+
export declare function safeRegexTest(regex: RegExp, input: string): boolean;
|
|
352
496
|
/**
|
|
353
497
|
* Heuristic catastrophic-backtracking (ReDoS) detector for rule-derived
|
|
354
498
|
* patterns.
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EAGV,UAAU,EACV,YAAY,EACZ,UAAU,EAEV,WAAW,EACX,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAA+B,KAAK,IAAI,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|