agent-threat-rules 4.2.3 → 4.3.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 +277 -0
- package/README.md +2 -0
- package/dist/cli/scan-handler.d.ts.map +1 -1
- package/dist/cli/scan-handler.js +164 -1
- package/dist/cli/scan-handler.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +123 -3
- package/dist/cli.js.map +1 -1
- package/dist/converters/numbat.d.ts +73 -0
- package/dist/converters/numbat.d.ts.map +1 -0
- package/dist/converters/numbat.js +281 -0
- package/dist/converters/numbat.js.map +1 -0
- package/dist/converters/quarry.d.ts +122 -0
- package/dist/converters/quarry.d.ts.map +1 -0
- package/dist/converters/quarry.js +431 -0
- package/dist/converters/quarry.js.map +1 -0
- package/dist/converters/sarif.d.ts +7 -0
- package/dist/converters/sarif.d.ts.map +1 -1
- package/dist/converters/sarif.js +24 -0
- package/dist/converters/sarif.js.map +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +7 -1
- package/dist/engine.js.map +1 -1
- package/dist/re2.d.ts +22 -0
- package/dist/re2.d.ts.map +1 -0
- package/dist/re2.js +213 -0
- package/dist/re2.js.map +1 -0
- package/package.json +1 -1
- package/rules/agent-manipulation/ATR-2026-00030-cross-agent-attack.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00301-tap-tree-of-attacks-jailbreak.yaml +3 -3
- package/rules/agent-manipulation/ATR-2026-00352-trainergpt-fix-my-ai-harmful-output-extraction.yaml +1 -1
- package/rules/agent-manipulation/ATR-2026-00432-superagi-output-handler-eval-rce.yaml +3 -3
- package/rules/agent-manipulation/ATR-2026-00440-semantic-kernel-vector-store-eval-rce.yaml +3 -3
- package/rules/context-exfiltration/ATR-2026-00020-system-prompt-leak.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00471-garak-sysprompt-extraction-mixedunassigned.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00501-data-exfiltration-via-markdown-image-and-link-url-injection.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00504-tool-and-function-capability-enumeration.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00505-system-prompt-extraction-instruction-dump-request.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00514-system-prompt-extraction.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-00516-output-xss-via-llm.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01462-sysprompt-override-pseudo-admin.yaml +2 -2
- package/rules/context-exfiltration/ATR-2026-01770-semantic-pii-credential-extraction.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-01862-llmail-email-tool-exfil-confirmation.yaml +2 -2
- package/rules/context-exfiltration/ATR-2026-01863-llmail-post-summary-exfil-directive.yaml +2 -2
- package/rules/context-exfiltration/ATR-2026-01864-llmail-obfuscated-exfil-address.yaml +2 -2
- package/rules/context-exfiltration/ATR-2026-01924-system-instruction-extraction-reformat.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02017-secret-key-exfiltration-request.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02026-oblique-sysprompt-extraction-transform.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02847-policy-justified-exfil-to-email.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02850-fake-documentation-forward-request.yaml +1 -1
- package/rules/context-exfiltration/ATR-2026-02855-cross-email-exfil-relay.yaml +1 -1
- package/rules/data-poisoning/ATR-2026-00070-data-poisoning.yaml +2 -2
- package/rules/excessive-autonomy/ATR-2026-00050-runaway-agent-loop.yaml +2 -2
- package/rules/excessive-autonomy/ATR-2026-00052-cascading-failure.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-00491-garak-agent-breaker-markdown-just-raw-json.yaml +1 -1
- package/rules/excessive-autonomy/ATR-2026-00500-ssrf-via-agent-url-fetch-instruction.yaml +1 -1
- package/rules/model-abuse/ATR-2026-00502-training-data-extraction-via-divergent-repetition-attack.yaml +1 -1
- package/rules/model-abuse/ATR-2026-00517-model-extraction-distillation.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00001-direct-prompt-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00002-indirect-prompt-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-00003-jailbreak-attempt.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00140-indirect-reference-reversal.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00211-system-prompt-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00257-cipher-transposition-jailbreak.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00312-unicode-variant-selector-ascii-smuggling.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00452-direct-pwned-payload-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00453-secret-key-reveal-demand.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00454-backslash-per-character-encoding.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00455-no-period-output-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00456-conditional-empty-input-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00457-garak-dan-to-every-prompt.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00458-garak-dra-step-by-step.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00459-garak-dan-an-ai-language.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00460-garak-dan-no-matter-how.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00461-garak-goodside-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00462-garak-gcg-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00463-garak-lmrc-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00464-garak-dan-i-would-like.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00465-garak-dan-your-prompt-here.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00466-garak-latentinjection-following-text-from.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00467-garak-dan-act-as-a.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00468-garak-goat-the-target-llm.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00469-garak-dan-at-the-end.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00470-garak-dan-as-an-ai.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00472-garak-dan-are-going-to.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00473-garak-lmrc-how-can-i.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00474-garak-dan-that-chatgpt-has.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00475-garak-web-injection-alert-1-script.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00476-garak-web-injection-javascript-alert-1.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00477-garak-latentinjection-translate-the-following-text.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00478-garak-latentinjection-abuse-contact-email.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00479-garak-latentinjection-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00480-garak-dan-the-role-of.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00481-garak-dan-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00482-garak-lmrc-what-s-an.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00483-garak-dan-the-user-s.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00484-garak-dan-and-you-will.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00485-garak-dan-and-does-not.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00486-garak-dan-t-care-about.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00487-garak-dan-and-nothing-else.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00488-garak-encoding-alert-1-script.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00489-garak-encoding-javascript-alert-1.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00490-garak-dan-in-order-to.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00492-garak-dan-want-you-to.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00493-garak-latentinjection-registrar-iana-id.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00495-garak-dan-insert-prompt-here.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00496-garak-dan-no-matter-what.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00497-garak-encoding-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00498-garak-web-injection-mixedunassigned.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00499-garak-dan-from-now-on.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00503-fake-error-state-takeover-unrestricted-replacement-bot.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00506-nevermind-override-goal-hijacking-in-user-input-promptinject.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00507-screaming-stop-goal-hijacking-in-user-input-promptinject.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00508-escape-delimiter-wrapped-goal-hijacking-in-user-input-prompt.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00509-prompt-leaking-via-ignore-previous-instructions-in-user-inpu.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00510-delayed-tool-invocation-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00511-mcp-web-context-poisoning.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00515-hidden-text-prompt-injection.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00518-ignore-previous-and-following-instructions-output-command-promptinject.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00519-tautology-logic-noise-injection-promptbench.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-00520-nlp-task-random-token-suffix-injection-promptbench.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01860-llmail-chat-template-boundary-spoof.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01861-llmail-pseudo-xml-role-injection.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01865-llmail-fake-email-boundary-marker.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01920-access-grant-coercion.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01921-access-denial-inversion.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01922-authorization-state-spoofing.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-01923-forged-input-boundary-markers.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01925-encoded-payload-decoding-coercion.yaml +2 -2
- package/rules/prompt-injection/ATR-2026-01926-cross-lingual-authorization-laundering.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02001-ignore-below-instructions-mirror-of-ignore-previ.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02002-instruction-set-probe-or-supplant-direct-meta-qu.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02003-task-pivot-override-abandon-the-cover-task-trans.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02004-regional-indicator-flag-emoji-alphabet-letter-sp.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02005-actor-never-breaks-character-roleplay-dan-style-.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02006-fuzzy-cross-lingual-i-have-been-pwned-near-miss-.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02007-bare-key-elicitation-token.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02008-translation-chain-output-laundering-state-secret.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02009-bare-key-elicitation-trailing-colon.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02010-emoji-only-payload.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02011-malformed-grammar-pwned-success-claim.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02012-movie-title-generator-instruction-wrapper-for-pw.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02013-delimiter-fence-ignore-instructions-override.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02014-spliced-target-string-letters-of-a-filtered-cana.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02015-dense-emoji-only-payload-flood.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02016-reversed-payload-string.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02018-regional-indicator-flag-emoji-letter-spelling-sp.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02019-python-interpreter-role-assignment-exec-framing.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02020-obfuscated-token-reconstruction-via-character-su.yaml +1 -1
- package/rules/prompt-injection/ATR-2026-02851-fake-user-turn-send-email-instruction.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-00060-skill-impersonation.yaml +1 -1
- package/rules/skill-compromise/ATR-2026-00121-skill-dangerous-script.yaml +5 -5
- package/rules/skill-compromise/ATR-2026-00225-c2-communication.yaml +3 -3
- package/rules/tool-poisoning/ATR-2026-00277-echo-template-command-injection.yaml +3 -3
- package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00513-package-hallucination-exploitation.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00521-shell-command-injection-agent-tool-context.yaml +1 -1
- package/rules/tool-poisoning/ATR-2026-00522-sql-injection-natural-language-agent-interface.yaml +1 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATR-to-Quarry converter
|
|
3
|
+
*
|
|
4
|
+
* Exports ATR rules as Project Quarry rules (Cisco AI Defense, DSL 0.1): one
|
|
5
|
+
* `.rule` file per ATR rule, a `quarry.yaml` that loads them, and one test
|
|
6
|
+
* file per rule built from the rule's own test cases as OpenAI-shaped
|
|
7
|
+
* conversations. `check_atr_tests.py`, written next to them, runs those
|
|
8
|
+
* conversations through Quarry's scanner, so a JS/RE2 difference that a test
|
|
9
|
+
* case exercises shows up as a failing case.
|
|
10
|
+
*
|
|
11
|
+
* Field mapping (Quarry data surfaces):
|
|
12
|
+
* user_input -> user_messages.content, and tool_responses.content
|
|
13
|
+
* agent_output -> assistant_messages.content, and tool_responses.content
|
|
14
|
+
* (the ATR engine reads both on tool output, so
|
|
15
|
+
* indirect injection riding in on a tool result is seen)
|
|
16
|
+
* tool_args -> tool_calls.raw_arguments
|
|
17
|
+
* tool_response -> tool_responses.content
|
|
18
|
+
* tool_name -> tool_calls.name and tool_responses.name
|
|
19
|
+
* tool_description -> tools.description
|
|
20
|
+
* content -> the text of user and assistant messages, tool call
|
|
21
|
+
* arguments and tool results. System and developer
|
|
22
|
+
* messages are not read: the ATR engine sees them only
|
|
23
|
+
* when a producer sends them as user input.
|
|
24
|
+
*
|
|
25
|
+
* What does not carry over:
|
|
26
|
+
* - Conditions on other fields, and patterns RE2 cannot express, are
|
|
27
|
+
* dropped. A rule whose detection is "all" loses its meaning if any
|
|
28
|
+
* condition is dropped, so it is skipped; an "any" rule keeps the
|
|
29
|
+
* conditions that convert. The ATR engine tests an "all" rule's
|
|
30
|
+
* conditions on one event, so here they must hold on one item of one
|
|
31
|
+
* surface; a rule whose conditions share no surface is skipped.
|
|
32
|
+
* - The ATR engine folds Unicode confusables and normalizes NFKC/NFC before
|
|
33
|
+
* matching; Quarry matches the raw text, so obfuscated input can match in
|
|
34
|
+
* ATR and not here.
|
|
35
|
+
* - JavaScript and RE2 differ in a few classes: JS `\s` also matches `\v`,
|
|
36
|
+
* NBSP, the other Unicode spaces and the BOM (RE2's is ASCII only), JS `.` excludes `\r`, and a JS pattern without the
|
|
37
|
+
* `u` flag counts an astral character as two. RE2's case folding also
|
|
38
|
+
* maps U+017F to `s` and U+212A to `k`. The tests catch a
|
|
39
|
+
* difference only where a test case exercises it.
|
|
40
|
+
* - Quarry reports matches; the rules carry the ATR severity as metadata
|
|
41
|
+
* and blocking is the application's decision.
|
|
42
|
+
*
|
|
43
|
+
* @module agent-threat-rules/converters/quarry
|
|
44
|
+
*/
|
|
45
|
+
import { regexConditionSpec } from '../regex-dialect.js';
|
|
46
|
+
import { toRe2 } from '../re2.js';
|
|
47
|
+
import { laneAllows, requiresConfirm } from '../quality/rule-contract.js';
|
|
48
|
+
/** Quarry surface and item field read, per ATR field. */
|
|
49
|
+
const FIELD_TARGETS = {
|
|
50
|
+
user_input: [
|
|
51
|
+
['user_messages', 'content'],
|
|
52
|
+
['tool_responses', 'content'],
|
|
53
|
+
],
|
|
54
|
+
agent_output: [
|
|
55
|
+
['assistant_messages', 'content'],
|
|
56
|
+
['tool_responses', 'content'],
|
|
57
|
+
],
|
|
58
|
+
tool_args: [['tool_calls', 'raw_arguments']],
|
|
59
|
+
tool_response: [['tool_responses', 'content']],
|
|
60
|
+
tool_name: [
|
|
61
|
+
['tool_calls', 'name'],
|
|
62
|
+
['tool_responses', 'name'],
|
|
63
|
+
],
|
|
64
|
+
tool_description: [['tools', 'description']],
|
|
65
|
+
content: [
|
|
66
|
+
['user_messages', 'content'],
|
|
67
|
+
['assistant_messages', 'content'],
|
|
68
|
+
['tool_calls', 'raw_arguments'],
|
|
69
|
+
['tool_responses', 'content'],
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
const SURFACES = ['user_messages', 'assistant_messages', 'tool_calls', 'tool_responses', 'tools'];
|
|
73
|
+
/**
|
|
74
|
+
* A Quarry string literal. Quarry decodes it with Python string escapes, so
|
|
75
|
+
* every backslash is doubled and the pattern reaches RE2 unchanged.
|
|
76
|
+
*/
|
|
77
|
+
function quarryString(s) {
|
|
78
|
+
const escaped = s
|
|
79
|
+
.replace(/\\/g, '\\\\')
|
|
80
|
+
.replace(/"/g, '\\"')
|
|
81
|
+
.replace(/\n/g, '\\n')
|
|
82
|
+
.replace(/\r/g, '\\r')
|
|
83
|
+
.replace(/\t/g, '\\t')
|
|
84
|
+
// literal_eval rejects a raw NUL, and other control characters read better escaped.
|
|
85
|
+
.replace(/[\x00-\x1f]/g, (c) => `\\x${c.charCodeAt(0).toString(16).padStart(2, '0')}`);
|
|
86
|
+
return `"${escaped}"`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A Quarry `regex` declaration. Quarry hands the text between the quotes to
|
|
90
|
+
* RE2 without decoding escapes, so escape pairs are copied as they are and
|
|
91
|
+
* only a bare quote or a line break is escaped (RE2 reads `\"`, `\n`, `\r`
|
|
92
|
+
* and `\t` as those characters).
|
|
93
|
+
*/
|
|
94
|
+
function quarryRegexString(pattern) {
|
|
95
|
+
let out = '';
|
|
96
|
+
for (let i = 0; i < pattern.length; i++) {
|
|
97
|
+
const ch = pattern[i];
|
|
98
|
+
if (ch === '\\' && i + 1 < pattern.length) {
|
|
99
|
+
// A backslash before a line break is an identity escape in JS; RE2 reads `\n` the same way.
|
|
100
|
+
const next = pattern[i + 1];
|
|
101
|
+
out += next === '\n' ? '\\n' : next === '\r' ? '\\r' : next === '\t' ? '\\t' : ch + next;
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
else if (ch === '"')
|
|
105
|
+
out += '\\"';
|
|
106
|
+
else if (ch === '\n')
|
|
107
|
+
out += '\\n';
|
|
108
|
+
else if (ch === '\r')
|
|
109
|
+
out += '\\r';
|
|
110
|
+
else if (ch === '\t')
|
|
111
|
+
out += '\\t';
|
|
112
|
+
else
|
|
113
|
+
out += ch;
|
|
114
|
+
}
|
|
115
|
+
return `"${out}"`;
|
|
116
|
+
}
|
|
117
|
+
/** One ATR regex condition, or null when it cannot be converted. */
|
|
118
|
+
function convertCondition(cond) {
|
|
119
|
+
const targets = FIELD_TARGETS[cond.field];
|
|
120
|
+
if (!targets || cond.operator !== 'regex' || !cond.value)
|
|
121
|
+
return null;
|
|
122
|
+
const spec = regexConditionSpec(cond.value);
|
|
123
|
+
const re2 = toRe2(spec.source);
|
|
124
|
+
if (re2 === null)
|
|
125
|
+
return null;
|
|
126
|
+
try {
|
|
127
|
+
return { re2, targets, js: new RegExp(spec.source, spec.flags) };
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null; // the ATR engine cannot compile it either
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const fieldOn = (c, surface) => c.targets.find(([s]) => s === surface)?.[1];
|
|
134
|
+
/** Surfaces on which every condition reads a field. */
|
|
135
|
+
function sharedSurfaces(conditions) {
|
|
136
|
+
return SURFACES.filter((s) => conditions.every((c) => fieldOn(c, s) !== undefined));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The rule's `condition:` expression, one comprehension per surface (Quarry
|
|
140
|
+
* warns on rules with many). Condition i is declared as `$p<i>`.
|
|
141
|
+
*/
|
|
142
|
+
function conditionExpression(conditions, logic) {
|
|
143
|
+
const surfaces = logic === 'all' ? sharedSurfaces(conditions) : SURFACES;
|
|
144
|
+
const clauses = surfaces.flatMap((s) => {
|
|
145
|
+
const tests = conditions.flatMap((c, i) => {
|
|
146
|
+
const field = fieldOn(c, s);
|
|
147
|
+
return field === undefined ? [] : [`($p${i} in x.${field})`];
|
|
148
|
+
});
|
|
149
|
+
if (tests.length === 0)
|
|
150
|
+
return [];
|
|
151
|
+
const body = tests.length === 1 ? tests[0] : `(${tests.join(logic === 'all' ? ' and ' : ' or ')})`;
|
|
152
|
+
return [`(any x in ${s} where ${body})`];
|
|
153
|
+
});
|
|
154
|
+
return clauses.join('\n or ');
|
|
155
|
+
}
|
|
156
|
+
const CALL_ID = 'call_atr_1';
|
|
157
|
+
const DEFAULT_TOOL = 'atr_test_tool';
|
|
158
|
+
/**
|
|
159
|
+
* Where a plain-text test case goes. ATR's `input` key is the text of
|
|
160
|
+
* whatever the rule reads, so a rule that reads only tool output gets a tool
|
|
161
|
+
* result, and one that reads only tool arguments gets a tool call.
|
|
162
|
+
*/
|
|
163
|
+
function plainTextKey(fields) {
|
|
164
|
+
// A named field says where the text belongs; `content` alone does not.
|
|
165
|
+
for (const f of ['tool_response', 'tool_args', 'user_input', 'agent_output', 'tool_description']) {
|
|
166
|
+
if (fields.has(f))
|
|
167
|
+
return f;
|
|
168
|
+
}
|
|
169
|
+
return 'user_input';
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Tool-call argument text Quarry accepts: the text itself when it is a JSON
|
|
173
|
+
* object, else `{"input": <text>}`. The wrapped text is JSON-escaped, so a
|
|
174
|
+
* pattern that relies on a quote, backslash or control character in it can
|
|
175
|
+
* miss; the coverage check then reports that true positive.
|
|
176
|
+
*/
|
|
177
|
+
function asJsonObjectText(text) {
|
|
178
|
+
try {
|
|
179
|
+
const parsed = JSON.parse(text);
|
|
180
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
181
|
+
return text;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// not JSON
|
|
185
|
+
}
|
|
186
|
+
return JSON.stringify({ input: text });
|
|
187
|
+
}
|
|
188
|
+
/** The conversation for one ATR test case, or null when the case has no mappable field. */
|
|
189
|
+
function testConversation(tc, fields) {
|
|
190
|
+
const str = (v) => (typeof v === 'string' ? v : JSON.stringify(v));
|
|
191
|
+
const parts = {};
|
|
192
|
+
for (const key of ['user_input', 'agent_output', 'tool_args', 'tool_response', 'tool_description']) {
|
|
193
|
+
if (tc[key] !== undefined && tc[key] !== null)
|
|
194
|
+
parts[key] = str(tc[key]);
|
|
195
|
+
}
|
|
196
|
+
const plain = tc['input'] ?? tc['content'];
|
|
197
|
+
if (typeof plain === 'string') {
|
|
198
|
+
const key = plainTextKey(fields);
|
|
199
|
+
parts[key] ??= plain;
|
|
200
|
+
}
|
|
201
|
+
const name = typeof tc['tool_name'] === 'string' && tc['tool_name'] ? tc['tool_name'] : undefined;
|
|
202
|
+
if (Object.keys(parts).length === 0 && name === undefined)
|
|
203
|
+
return null;
|
|
204
|
+
const tool = name ?? DEFAULT_TOOL;
|
|
205
|
+
const messages = [];
|
|
206
|
+
if (parts['user_input'] !== undefined)
|
|
207
|
+
messages.push({ role: 'user', content: parts['user_input'] });
|
|
208
|
+
// Quarry requires tool-call arguments to be a JSON object, so other text is wrapped as one.
|
|
209
|
+
const args = parts['tool_args'] === undefined ? undefined : asJsonObjectText(parts['tool_args']);
|
|
210
|
+
const calls = parts['tool_args'] !== undefined || parts['tool_response'] !== undefined || name !== undefined;
|
|
211
|
+
if (calls) {
|
|
212
|
+
messages.push({
|
|
213
|
+
role: 'assistant',
|
|
214
|
+
content: null,
|
|
215
|
+
tool_calls: [{ id: CALL_ID, type: 'function', function: { name: tool, arguments: args ?? '{}' } }],
|
|
216
|
+
});
|
|
217
|
+
if (parts['tool_response'] !== undefined)
|
|
218
|
+
messages.push({ role: 'tool', tool_call_id: CALL_ID, content: parts['tool_response'] });
|
|
219
|
+
}
|
|
220
|
+
if (parts['agent_output'] !== undefined)
|
|
221
|
+
messages.push({ role: 'assistant', content: parts['agent_output'] });
|
|
222
|
+
const description = parts['tool_description'];
|
|
223
|
+
if (messages.length === 0)
|
|
224
|
+
messages.push({ role: 'user', content: '' });
|
|
225
|
+
return description === undefined
|
|
226
|
+
? { messages }
|
|
227
|
+
: { messages, tools: [{ type: 'function', function: { name: tool, description, parameters: { type: 'object', properties: {} } } }] };
|
|
228
|
+
}
|
|
229
|
+
/** The items of each surface in a conversation, as Quarry exposes them. */
|
|
230
|
+
function surfaceItems(conv) {
|
|
231
|
+
const items = {
|
|
232
|
+
user_messages: [],
|
|
233
|
+
assistant_messages: [],
|
|
234
|
+
tool_calls: [],
|
|
235
|
+
tool_responses: [],
|
|
236
|
+
tools: [],
|
|
237
|
+
};
|
|
238
|
+
const callNames = new Map();
|
|
239
|
+
for (const m of conv.messages) {
|
|
240
|
+
if (m.role === 'user')
|
|
241
|
+
items.user_messages.push({ content: m.content });
|
|
242
|
+
if (m.role === 'assistant') {
|
|
243
|
+
items.assistant_messages.push({ content: m.content ?? '' });
|
|
244
|
+
for (const call of m.tool_calls ?? []) {
|
|
245
|
+
callNames.set(call.id, call.function.name);
|
|
246
|
+
items.tool_calls.push({ name: call.function.name, raw_arguments: call.function.arguments });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (m.role === 'tool')
|
|
250
|
+
items.tool_responses.push({ content: m.content, name: callNames.get(m.tool_call_id) ?? '' });
|
|
251
|
+
}
|
|
252
|
+
for (const t of conv.tools ?? [])
|
|
253
|
+
items.tools.push({ name: t.function.name, description: t.function.description });
|
|
254
|
+
return items;
|
|
255
|
+
}
|
|
256
|
+
/** Does the converted rule match this conversation, judged with the JS patterns? */
|
|
257
|
+
function ruleMatches(conditions, logic, conv) {
|
|
258
|
+
const items = surfaceItems(conv);
|
|
259
|
+
const hit = (c, item, field) => {
|
|
260
|
+
const value = item[field];
|
|
261
|
+
c.js.lastIndex = 0;
|
|
262
|
+
return typeof value === 'string' && c.js.test(value);
|
|
263
|
+
};
|
|
264
|
+
if (logic === 'all') {
|
|
265
|
+
return sharedSurfaces(conditions).some((s) => items[s].some((item) => conditions.every((c) => hit(c, item, fieldOn(c, s)))));
|
|
266
|
+
}
|
|
267
|
+
return conditions.some((c) => c.targets.some(([s, f]) => items[s].some((item) => hit(c, item, f))));
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* The rule's test conversations. A true positive that only a dropped
|
|
271
|
+
* condition caught would fail in Quarry, so it is left out and reported.
|
|
272
|
+
*/
|
|
273
|
+
function buildTests(rule, converted, logic) {
|
|
274
|
+
const fields = new Set(arrayConditions(rule)?.map((c) => c.field) ?? []);
|
|
275
|
+
const cases = [];
|
|
276
|
+
const uncovered = [];
|
|
277
|
+
const unmapped = [];
|
|
278
|
+
const add = (list, expect, label) => {
|
|
279
|
+
if (!Array.isArray(list))
|
|
280
|
+
return;
|
|
281
|
+
list.forEach((tc, i) => {
|
|
282
|
+
const conversation = tc && typeof tc === 'object' ? testConversation(tc, fields) : null;
|
|
283
|
+
if (!conversation) {
|
|
284
|
+
unmapped.push(`${expect === 'match' ? 'tp' : 'tn'}-${i + 1}`);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (expect === 'match' && !ruleMatches(converted, logic, conversation)) {
|
|
288
|
+
uncovered.push(i + 1);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
cases.push({ name: `${label}-${i + 1}`, expect, conversation });
|
|
292
|
+
});
|
|
293
|
+
};
|
|
294
|
+
add(rule.test_cases?.true_positives, 'match', 'atr-true-positive');
|
|
295
|
+
add(rule.test_cases?.true_negatives, 'no_match', 'atr-true-negative');
|
|
296
|
+
return { cases, uncovered, unmapped };
|
|
297
|
+
}
|
|
298
|
+
function arrayConditions(rule) {
|
|
299
|
+
return Array.isArray(rule.detection.conditions) ? rule.detection.conditions : null;
|
|
300
|
+
}
|
|
301
|
+
/** Convert one ATR rule, or say why it cannot be converted. */
|
|
302
|
+
export function ruleToQuarry(rule) {
|
|
303
|
+
const conditions = arrayConditions(rule);
|
|
304
|
+
if (!conditions)
|
|
305
|
+
return { ruleId: rule.id, reason: 'named-format conditions are not supported' };
|
|
306
|
+
const converted = [];
|
|
307
|
+
const dropped = [];
|
|
308
|
+
conditions.forEach((cond, i) => {
|
|
309
|
+
const c = convertCondition(cond);
|
|
310
|
+
if (c === null)
|
|
311
|
+
dropped.push(i);
|
|
312
|
+
else
|
|
313
|
+
converted.push(c);
|
|
314
|
+
});
|
|
315
|
+
const logic = String(rule.detection.condition ?? 'any').trim().toLowerCase();
|
|
316
|
+
if (logic !== 'any' && logic !== 'all')
|
|
317
|
+
return { ruleId: rule.id, reason: `detection condition "${logic}" is not supported` };
|
|
318
|
+
if (converted.length === 0)
|
|
319
|
+
return { ruleId: rule.id, reason: 'no condition converts (fields or RE2)' };
|
|
320
|
+
if (logic === 'all' && dropped.length > 0) {
|
|
321
|
+
return { ruleId: rule.id, reason: 'an "all" rule with an unconvertible condition would change meaning' };
|
|
322
|
+
}
|
|
323
|
+
if (logic === 'all' && sharedSurfaces(converted).length === 0) {
|
|
324
|
+
return { ruleId: rule.id, reason: 'an "all" rule whose conditions read different Quarry surfaces can never match' };
|
|
325
|
+
}
|
|
326
|
+
if (!/^ATR-\d{4}-\d{5}$/.test(rule.id))
|
|
327
|
+
return { ruleId: rule.id, reason: 'rule id is not in ATR-YYYY-NNNNN form' };
|
|
328
|
+
const metadata = [
|
|
329
|
+
['title', rule.title],
|
|
330
|
+
['severity', rule.severity],
|
|
331
|
+
['category', String(rule.tags.category)],
|
|
332
|
+
['maturity', String(rule.maturity ?? '')],
|
|
333
|
+
['rule_version', String(rule.rule_version ?? 1)],
|
|
334
|
+
['source', `Agent Threat Rules ${rule.id} (https://github.com/Agent-Threat-Rule/agent-threat-rules)`],
|
|
335
|
+
];
|
|
336
|
+
const text = [
|
|
337
|
+
`rule ${quarryString(rule.id)}`,
|
|
338
|
+
'metadata:',
|
|
339
|
+
...metadata.map(([k, v]) => ` ${k} = ${quarryString(v)}`),
|
|
340
|
+
'strings:',
|
|
341
|
+
// SPEC §6.4: every condition matches case-insensitively.
|
|
342
|
+
...converted.map((c, i) => ` $p${i} = ${quarryRegexString(c.re2)} regex nocase`),
|
|
343
|
+
'condition:',
|
|
344
|
+
` ${conditionExpression(converted, logic)}`,
|
|
345
|
+
'',
|
|
346
|
+
].join('\n');
|
|
347
|
+
const tests = buildTests(rule, converted, logic);
|
|
348
|
+
return {
|
|
349
|
+
ruleId: rule.id,
|
|
350
|
+
stem: rule.id.toLowerCase(),
|
|
351
|
+
rule: text,
|
|
352
|
+
tests: tests.cases,
|
|
353
|
+
droppedConditions: dropped,
|
|
354
|
+
uncoveredTruePositives: tests.uncovered,
|
|
355
|
+
unmappedCases: tests.unmapped,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
/** Convert the rules in `lane` (default `enforce`). Embedding-confirmed rules are left out of enforce and alert. */
|
|
359
|
+
export function rulesToQuarry(rules, options = {}) {
|
|
360
|
+
const lane = options.lane ?? 'enforce';
|
|
361
|
+
const files = [];
|
|
362
|
+
const skipped = [];
|
|
363
|
+
for (const rule of rules) {
|
|
364
|
+
if (rule.status === 'draft' || rule.status === 'deprecated')
|
|
365
|
+
continue;
|
|
366
|
+
if (!laneAllows(rule.maturity, lane))
|
|
367
|
+
continue;
|
|
368
|
+
if (lane !== 'hunt' && requiresConfirm(rule)) {
|
|
369
|
+
skipped.push({ ruleId: rule.id, reason: 'needs embedding confirmation, which this export does not run' });
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
const out = ruleToQuarry(rule);
|
|
373
|
+
if ('reason' in out)
|
|
374
|
+
skipped.push(out);
|
|
375
|
+
else
|
|
376
|
+
files.push(out);
|
|
377
|
+
}
|
|
378
|
+
return { files, skipped };
|
|
379
|
+
}
|
|
380
|
+
/** `quarry.yaml`, loading the exported rules. Quarry resolves `rules/` against the working directory. */
|
|
381
|
+
export const QUARRY_CONFIG = 'config_version: 2\nrules:\n - rules/\n';
|
|
382
|
+
/** `check_atr_tests.py`: runs each rule's ATR test conversations through Quarry. */
|
|
383
|
+
export const QUARRY_CHECK_SCRIPT = `"""Run the ATR test cases exported with these rules through Quarry.
|
|
384
|
+
|
|
385
|
+
With Quarry installed:
|
|
386
|
+
|
|
387
|
+
python check_atr_tests.py
|
|
388
|
+
|
|
389
|
+
Each tests/<rule>.json holds that rule's ATR true positives (expect "match")
|
|
390
|
+
and true negatives (expect "no_match") as conversations. A case passes when
|
|
391
|
+
the named rule's verdict is what the case expects; other rules may match too.
|
|
392
|
+
Exits 1 if any case fails or any scan is incomplete.
|
|
393
|
+
"""
|
|
394
|
+
|
|
395
|
+
import json
|
|
396
|
+
import os
|
|
397
|
+
import sys
|
|
398
|
+
from pathlib import Path
|
|
399
|
+
|
|
400
|
+
from quarry import DSLScanner
|
|
401
|
+
from quarry.config import QuarryConfig
|
|
402
|
+
|
|
403
|
+
HERE = Path(__file__).resolve().parent
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def main() -> int:
|
|
407
|
+
# Quarry resolves the rules path in quarry.yaml against the working directory.
|
|
408
|
+
os.chdir(HERE)
|
|
409
|
+
scanner = DSLScanner(QuarryConfig.from_yaml(HERE / "quarry.yaml"))
|
|
410
|
+
total = failed = 0
|
|
411
|
+
for path in sorted((HERE / "tests").glob("*.json")):
|
|
412
|
+
suite = json.loads(path.read_text(encoding="utf-8"))
|
|
413
|
+
for case in suite["cases"]:
|
|
414
|
+
total += 1
|
|
415
|
+
result = scanner.scan_data(case["conversation"])
|
|
416
|
+
if not result.is_complete:
|
|
417
|
+
failed += 1
|
|
418
|
+
print(f"{suite['rule']} {case['name']}: scan {result.completion_state}")
|
|
419
|
+
continue
|
|
420
|
+
matched = suite["rule"] in result.rule_matches
|
|
421
|
+
if matched != (case["expect"] == "match"):
|
|
422
|
+
failed += 1
|
|
423
|
+
print(f"{suite['rule']} {case['name']}: expected {case['expect']}")
|
|
424
|
+
print(f"{total - failed}/{total} cases pass")
|
|
425
|
+
return 1 if failed else 0
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
if __name__ == "__main__":
|
|
429
|
+
sys.exit(main())
|
|
430
|
+
`;
|
|
431
|
+
//# sourceMappingURL=quarry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quarry.js","sourceRoot":"","sources":["../../src/converters/quarry.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,13 @@ export interface SarifOptions {
|
|
|
25
25
|
readonly runProperties?: Readonly<Record<string, unknown>>;
|
|
26
26
|
/** Extra properties for every result of one scan result (e.g. the tool name of a tools/list entry). */
|
|
27
27
|
readonly resultProperties?: (result: ScanResult) => Readonly<Record<string, unknown>> | undefined;
|
|
28
|
+
/** Files the tool deliberately skipped, reported as SARIF execution warnings. */
|
|
29
|
+
readonly skippedFiles?: readonly {
|
|
30
|
+
readonly file: string;
|
|
31
|
+
readonly reason: string;
|
|
32
|
+
}[];
|
|
33
|
+
/** Whether the invocation produced at least one scan result. */
|
|
34
|
+
readonly executionSuccessful?: boolean;
|
|
28
35
|
}
|
|
29
36
|
export declare function scanResultToSARIF(results: readonly ScanResult[], toolVersion: string, options?: SarifOptions): object;
|
|
30
37
|
//# sourceMappingURL=sarif.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/converters/sarif.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAW,QAAQ,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/converters/sarif.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAW,QAAQ,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AAuG9E;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC;IACjD,6GAA6G;IAC7G,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,uGAAuG;IACvG,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAClG,iFAAiF;IACjF,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACtF,gEAAgE;IAChE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,UAAU,EAAE,EAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,YAAiB,GACzB,MAAM,CAqIR"}
|
package/dist/converters/sarif.js
CHANGED
|
@@ -71,6 +71,10 @@ function toArtifactUri(inputFile) {
|
|
|
71
71
|
}
|
|
72
72
|
return inputFile;
|
|
73
73
|
}
|
|
74
|
+
/** Keep filesystem diagnostics useful without publishing the scanner's absolute path. */
|
|
75
|
+
function skippedReasonForSarif(reason, file, uri) {
|
|
76
|
+
return file === uri ? reason : reason.split(file).join(uri);
|
|
77
|
+
}
|
|
74
78
|
/**
|
|
75
79
|
* Raw-octet SHA-256 of a file's bytes — the digest basis the shared envelope
|
|
76
80
|
* profile joins layers on (claude-code-skill-security-check#24 §2): computed
|
|
@@ -181,6 +185,20 @@ export function scanResultToSARIF(results, toolVersion, options = {}) {
|
|
|
181
185
|
});
|
|
182
186
|
}
|
|
183
187
|
}
|
|
188
|
+
const toolExecutionNotifications = options.skippedFiles?.map(({ file, reason }) => {
|
|
189
|
+
const uri = toArtifactUri(file);
|
|
190
|
+
const safeReason = skippedReasonForSarif(reason, file, uri);
|
|
191
|
+
return {
|
|
192
|
+
descriptor: { id: 'ATR_SCAN_SKIPPED' },
|
|
193
|
+
level: 'warning',
|
|
194
|
+
message: { text: `Skipped ${uri}: ${safeReason}` },
|
|
195
|
+
locations: [{
|
|
196
|
+
physicalLocation: {
|
|
197
|
+
artifactLocation: { uri, uriBaseId: '%SRCROOT%' },
|
|
198
|
+
},
|
|
199
|
+
}],
|
|
200
|
+
};
|
|
201
|
+
}) ?? [];
|
|
184
202
|
return {
|
|
185
203
|
$schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/main/sarif-2.1/schema/sarif-schema-2.1.0.json',
|
|
186
204
|
version: '2.1.0',
|
|
@@ -196,6 +214,12 @@ export function scanResultToSARIF(results, toolVersion, options = {}) {
|
|
|
196
214
|
},
|
|
197
215
|
},
|
|
198
216
|
...(artifacts.length > 0 ? { artifacts } : {}),
|
|
217
|
+
...(toolExecutionNotifications.length > 0 ? {
|
|
218
|
+
invocations: [{
|
|
219
|
+
executionSuccessful: options.executionSuccessful ?? true,
|
|
220
|
+
toolExecutionNotifications,
|
|
221
|
+
}],
|
|
222
|
+
} : {}),
|
|
199
223
|
...(options.runProperties ? { properties: options.runProperties } : {}),
|
|
200
224
|
results: sarifResults,
|
|
201
225
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/converters/sarif.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAMvC,sCAAsC;AACtC,SAAS,eAAe,CAAC,QAAqB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB,KAAK,KAAK,CAAC;QACX,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,eAAe,CAAC,QAAqB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,UAAU;YACb,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,eAAe;YAClB,OAAO,KAAK,CAAC;QACf;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,SAAS,YAAY,CACnB,OAA8B;IAE9B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,SAAiB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,sDAAsD;QACtD,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,SAAS,CAAC;IAChF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,SAAS,aAAa,CAAC,SAAiB;IACtC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/converters/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.js
CHANGED
|
@@ -301,7 +301,13 @@ export class ATREngine {
|
|
|
301
301
|
const rulesDir = this.config.rulesDir ?? this.findBundledRulesDir();
|
|
302
302
|
if (rulesDir) {
|
|
303
303
|
try {
|
|
304
|
-
|
|
304
|
+
// A rule passed in config overrides the directory's rule with that id.
|
|
305
|
+
// Compiled patterns are keyed by id, so keeping both ran the directory
|
|
306
|
+
// copy's regex under the passed rule's name. Duplicates inside the
|
|
307
|
+
// directory are left in place for the id-collision and measurement
|
|
308
|
+
// gates to see.
|
|
309
|
+
const passed = new Set((this.config.rules ?? []).map((r) => r.id));
|
|
310
|
+
const fileRules = loadRulesFromDirectory(rulesDir).filter((r) => !passed.has(r.id));
|
|
305
311
|
this.rules.push(...fileRules);
|
|
306
312
|
}
|
|
307
313
|
catch {
|