@panguard-ai/atr 1.4.3 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/action-executor.d.ts +44 -0
- package/dist/action-executor.d.ts.map +1 -0
- package/dist/action-executor.js +130 -0
- package/dist/action-executor.js.map +1 -0
- package/dist/adapters/default-adapter.d.ts +24 -0
- package/dist/adapters/default-adapter.d.ts.map +1 -0
- package/dist/adapters/default-adapter.js +51 -0
- package/dist/adapters/default-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +30 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +128 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/badge.d.ts +42 -0
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +163 -0
- package/dist/badge.js.map +1 -0
- package/dist/capability-extractor.d.ts +35 -0
- package/dist/capability-extractor.d.ts.map +1 -0
- package/dist/capability-extractor.js +91 -0
- package/dist/capability-extractor.js.map +1 -0
- package/dist/cli/scan-handler.d.ts +21 -0
- package/dist/cli/scan-handler.d.ts.map +1 -0
- package/dist/cli/scan-handler.js +276 -0
- package/dist/cli/scan-handler.js.map +1 -0
- package/dist/cli/tc-pipeline.d.ts +18 -0
- package/dist/cli/tc-pipeline.d.ts.map +1 -0
- package/dist/cli/tc-pipeline.js +295 -0
- package/dist/cli/tc-pipeline.js.map +1 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +894 -0
- package/dist/cli.js.map +1 -0
- package/dist/content-hash.d.ts +7 -0
- package/dist/content-hash.d.ts.map +1 -0
- package/dist/content-hash.js +10 -0
- package/dist/content-hash.js.map +1 -0
- package/dist/converters/elastic.d.ts +36 -0
- package/dist/converters/elastic.d.ts.map +1 -0
- package/dist/converters/elastic.js +125 -0
- package/dist/converters/elastic.js.map +1 -0
- package/dist/converters/generic-regex.d.ts +37 -0
- package/dist/converters/generic-regex.d.ts.map +1 -0
- package/dist/converters/generic-regex.js +59 -0
- package/dist/converters/generic-regex.js.map +1 -0
- package/dist/converters/index.d.ts +32 -0
- package/dist/converters/index.d.ts.map +1 -0
- package/dist/converters/index.js +38 -0
- package/dist/converters/index.js.map +1 -0
- package/dist/converters/sarif.d.ts +18 -0
- package/dist/converters/sarif.d.ts.map +1 -0
- package/dist/converters/sarif.js +142 -0
- package/dist/converters/sarif.js.map +1 -0
- package/dist/converters/splunk.d.ts +19 -0
- package/dist/converters/splunk.d.ts.map +1 -0
- package/dist/converters/splunk.js +148 -0
- package/dist/converters/splunk.js.map +1 -0
- package/dist/coverage-analyzer.d.ts +43 -0
- package/dist/coverage-analyzer.d.ts.map +1 -0
- package/dist/coverage-analyzer.js +329 -0
- package/dist/coverage-analyzer.js.map +1 -0
- package/dist/embedding/build-corpus.d.ts +15 -0
- package/dist/embedding/build-corpus.d.ts.map +1 -0
- package/dist/embedding/build-corpus.js +105 -0
- package/dist/embedding/build-corpus.js.map +1 -0
- package/dist/embedding/model-loader.d.ts +41 -0
- package/dist/embedding/model-loader.d.ts.map +1 -0
- package/dist/embedding/model-loader.js +90 -0
- package/dist/embedding/model-loader.js.map +1 -0
- package/dist/embedding/vector-store.d.ts +41 -0
- package/dist/embedding/vector-store.d.ts.map +1 -0
- package/dist/embedding/vector-store.js +70 -0
- package/dist/embedding/vector-store.js.map +1 -0
- package/dist/engine.d.ts +222 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1185 -0
- package/dist/engine.js.map +1 -0
- package/dist/eval/corpus.d.ts +42 -0
- package/dist/eval/corpus.d.ts.map +1 -0
- package/dist/eval/corpus.js +427 -0
- package/dist/eval/corpus.js.map +1 -0
- package/dist/eval/eval-harness.d.ts +44 -0
- package/dist/eval/eval-harness.d.ts.map +1 -0
- package/dist/eval/eval-harness.js +296 -0
- package/dist/eval/eval-harness.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +9 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/metrics.d.ts +74 -0
- package/dist/eval/metrics.d.ts.map +1 -0
- package/dist/eval/metrics.js +108 -0
- package/dist/eval/metrics.js.map +1 -0
- package/dist/eval/pint-corpus.d.ts +34 -0
- package/dist/eval/pint-corpus.d.ts.map +1 -0
- package/dist/eval/pint-corpus.js +113 -0
- package/dist/eval/pint-corpus.js.map +1 -0
- package/dist/eval/rule-corpus.d.ts +9 -0
- package/dist/eval/rule-corpus.d.ts.map +1 -0
- package/dist/eval/rule-corpus.js +4780 -0
- package/dist/eval/rule-corpus.js.map +1 -0
- package/dist/eval/rule-metrics.d.ts +34 -0
- package/dist/eval/rule-metrics.d.ts.map +1 -0
- package/dist/eval/rule-metrics.js +92 -0
- package/dist/eval/rule-metrics.js.map +1 -0
- package/dist/eval/run-eval.d.ts +7 -0
- package/dist/eval/run-eval.d.ts.map +1 -0
- package/dist/eval/run-eval.js +11 -0
- package/dist/eval/run-eval.js.map +1 -0
- package/dist/eval/run-pint-benchmark.d.ts +18 -0
- package/dist/eval/run-pint-benchmark.d.ts.map +1 -0
- package/dist/eval/run-pint-benchmark.js +159 -0
- package/dist/eval/run-pint-benchmark.js.map +1 -0
- package/dist/eval/skill-benchmark.d.ts +66 -0
- package/dist/eval/skill-benchmark.d.ts.map +1 -0
- package/dist/eval/skill-benchmark.js +194 -0
- package/dist/eval/skill-benchmark.js.map +1 -0
- package/dist/flywheel.d.ts +54 -0
- package/dist/flywheel.d.ts.map +1 -0
- package/dist/flywheel.js +121 -0
- package/dist/flywheel.js.map +1 -0
- package/dist/hook-handler.d.ts +61 -0
- package/dist/hook-handler.d.ts.map +1 -0
- package/dist/hook-handler.js +178 -0
- package/dist/hook-handler.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/{src/index.ts → dist/index.js} +1 -0
- package/dist/index.js.map +1 -0
- package/dist/layer-integration.d.ts +55 -0
- package/dist/layer-integration.d.ts.map +1 -0
- package/dist/layer-integration.js +187 -0
- package/dist/layer-integration.js.map +1 -0
- package/dist/loader.d.ts +18 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +129 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp-server.d.ts +13 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +246 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
- package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
- package/dist/mcp-tools/coverage-gaps.js +55 -0
- package/dist/mcp-tools/coverage-gaps.js.map +1 -0
- package/dist/mcp-tools/list-rules.d.ts +17 -0
- package/dist/mcp-tools/list-rules.d.ts.map +1 -0
- package/dist/mcp-tools/list-rules.js +45 -0
- package/dist/mcp-tools/list-rules.js.map +1 -0
- package/dist/mcp-tools/scan-skill.d.ts +17 -0
- package/dist/mcp-tools/scan-skill.d.ts.map +1 -0
- package/dist/mcp-tools/scan-skill.js +65 -0
- package/dist/mcp-tools/scan-skill.js.map +1 -0
- package/dist/mcp-tools/scan.d.ts +24 -0
- package/dist/mcp-tools/scan.d.ts.map +1 -0
- package/dist/mcp-tools/scan.js +94 -0
- package/dist/mcp-tools/scan.js.map +1 -0
- package/dist/mcp-tools/submit-proposal.d.ts +12 -0
- package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
- package/dist/mcp-tools/submit-proposal.js +103 -0
- package/dist/mcp-tools/submit-proposal.js.map +1 -0
- package/dist/mcp-tools/threat-summary.d.ts +12 -0
- package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
- package/dist/mcp-tools/threat-summary.js +74 -0
- package/dist/mcp-tools/threat-summary.js.map +1 -0
- package/dist/mcp-tools/validate.d.ts +15 -0
- package/dist/mcp-tools/validate.d.ts.map +1 -0
- package/dist/mcp-tools/validate.js +51 -0
- package/dist/mcp-tools/validate.js.map +1 -0
- package/dist/modules/embedding.d.ts +71 -0
- package/dist/modules/embedding.d.ts.map +1 -0
- package/dist/modules/embedding.js +141 -0
- package/dist/modules/embedding.js.map +1 -0
- package/dist/modules/index.d.ts +144 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +82 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/semantic.d.ts +106 -0
- package/dist/modules/semantic.d.ts.map +1 -0
- package/dist/modules/semantic.js +359 -0
- package/dist/modules/semantic.js.map +1 -0
- package/dist/modules/session.d.ts +70 -0
- package/dist/modules/session.d.ts.map +1 -0
- package/dist/modules/session.js +128 -0
- package/dist/modules/session.js.map +1 -0
- package/dist/quality/adapters/atr.d.ts +65 -0
- package/dist/quality/adapters/atr.d.ts.map +1 -0
- package/dist/quality/adapters/atr.js +154 -0
- package/dist/quality/adapters/atr.js.map +1 -0
- package/dist/quality/adapters/index.d.ts +10 -0
- package/dist/quality/adapters/index.d.ts.map +1 -0
- package/dist/quality/adapters/index.js +10 -0
- package/dist/quality/adapters/index.js.map +1 -0
- package/dist/quality/compute-confidence.d.ts +45 -0
- package/dist/quality/compute-confidence.d.ts.map +1 -0
- package/dist/quality/compute-confidence.js +133 -0
- package/dist/quality/compute-confidence.js.map +1 -0
- package/dist/quality/index.d.ts +36 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +39 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/quality-gate.d.ts +86 -0
- package/dist/quality/quality-gate.d.ts.map +1 -0
- package/dist/quality/quality-gate.js +187 -0
- package/dist/quality/quality-gate.js.map +1 -0
- package/dist/quality/types.d.ts +129 -0
- package/dist/quality/types.d.ts.map +1 -0
- package/dist/quality/types.js +10 -0
- package/dist/quality/types.js.map +1 -0
- package/dist/quality/validate-maturity.d.ts +51 -0
- package/dist/quality/validate-maturity.d.ts.map +1 -0
- package/dist/quality/validate-maturity.js +134 -0
- package/dist/quality/validate-maturity.js.map +1 -0
- package/dist/quality.d.ts +8 -0
- package/dist/quality.d.ts.map +1 -0
- package/dist/quality.js +8 -0
- package/dist/quality.js.map +1 -0
- package/dist/rule-scaffolder.d.ts +53 -0
- package/dist/rule-scaffolder.d.ts.map +1 -0
- package/dist/rule-scaffolder.js +301 -0
- package/dist/rule-scaffolder.js.map +1 -0
- package/dist/session-tracker.d.ts +58 -0
- package/dist/session-tracker.d.ts.map +1 -0
- package/dist/session-tracker.js +176 -0
- package/dist/session-tracker.js.map +1 -0
- package/dist/shadow-evaluator.d.ts +48 -0
- package/dist/shadow-evaluator.d.ts.map +1 -0
- package/dist/shadow-evaluator.js +129 -0
- package/dist/shadow-evaluator.js.map +1 -0
- package/dist/skill-fingerprint.d.ts +85 -0
- package/dist/skill-fingerprint.d.ts.map +1 -0
- package/dist/skill-fingerprint.js +284 -0
- package/dist/skill-fingerprint.js.map +1 -0
- package/dist/tc-reporter.d.ts +50 -0
- package/dist/tc-reporter.d.ts.map +1 -0
- package/dist/tc-reporter.js +164 -0
- package/dist/tc-reporter.js.map +1 -0
- package/dist/tier0-invariant.d.ts +49 -0
- package/dist/tier0-invariant.d.ts.map +1 -0
- package/dist/tier0-invariant.js +185 -0
- package/dist/tier0-invariant.js.map +1 -0
- package/dist/tier1-blacklist.d.ts +48 -0
- package/dist/tier1-blacklist.d.ts.map +1 -0
- package/dist/tier1-blacklist.js +92 -0
- package/dist/tier1-blacklist.js.map +1 -0
- package/dist/types.d.ts +232 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/verdict.d.ts +26 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +127 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +16 -4
- package/.github/ISSUE_TEMPLATE/evasion-report.yml +0 -75
- package/.github/ISSUE_TEMPLATE/false-positive.yml +0 -31
- package/.github/ISSUE_TEMPLATE/mirofish-prediction.yml +0 -128
- package/.github/ISSUE_TEMPLATE/new-rule.yml +0 -37
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- package/.github/workflows/rule-quality.yml +0 -203
- package/.github/workflows/validate.yml +0 -42
- package/CHANGELOG.md +0 -30
- package/CONTRIBUTING.md +0 -168
- package/CONTRIBUTORS.md +0 -28
- package/COVERAGE.md +0 -135
- package/LIMITATIONS.md +0 -154
- package/SECURITY.md +0 -48
- package/THREAT-MODEL.md +0 -243
- package/docs/contribution-paths.md +0 -202
- package/docs/mirofish-prediction-guide.md +0 -304
- package/docs/quick-start.md +0 -245
- package/docs/rule-writing-guide.md +0 -647
- package/docs/schema-spec.md +0 -594
- package/examples/how-to-write-a-rule.md +0 -251
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATR-to-Splunk SPL Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts ATR YAML rules into Splunk Search Processing Language (SPL) queries
|
|
5
|
+
* that a SOC analyst can use as a starting point for threat hunting.
|
|
6
|
+
*
|
|
7
|
+
* @module agent-threat-rules/converters/splunk
|
|
8
|
+
*/
|
|
9
|
+
import type { ATRRule } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Convert an ATR rule to a Splunk SPL query string.
|
|
12
|
+
*
|
|
13
|
+
* The generated query includes:
|
|
14
|
+
* - Comment header with rule metadata
|
|
15
|
+
* - Index/sourcetype base search (generic, analyst should customize)
|
|
16
|
+
* - Condition clauses joined with appropriate logic
|
|
17
|
+
*/
|
|
18
|
+
export declare function ruleToSPL(rule: ATRRule): string;
|
|
19
|
+
//# sourceMappingURL=splunk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splunk.d.ts","sourceRoot":"","sources":["../../src/converters/splunk.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AAoD9D;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAqG/C"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATR-to-Splunk SPL Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts ATR YAML rules into Splunk Search Processing Language (SPL) queries
|
|
5
|
+
* that a SOC analyst can use as a starting point for threat hunting.
|
|
6
|
+
*
|
|
7
|
+
* @module agent-threat-rules/converters/splunk
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Escape a string for use in Splunk SPL double-quoted values.
|
|
11
|
+
*/
|
|
12
|
+
function escapeForSPL(value) {
|
|
13
|
+
return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert a single ATR array condition to an SPL clause.
|
|
17
|
+
*
|
|
18
|
+
* Supports operators: regex, contains, exact, starts_with, gt, lt, gte, lte, eq
|
|
19
|
+
*/
|
|
20
|
+
function conditionToSPL(cond) {
|
|
21
|
+
const field = cond.field;
|
|
22
|
+
const value = cond.value;
|
|
23
|
+
switch (cond.operator) {
|
|
24
|
+
case 'regex':
|
|
25
|
+
return `| regex ${field}="${escapeForSPL(value)}"`;
|
|
26
|
+
case 'contains':
|
|
27
|
+
return `${field}="*${escapeForSPL(value)}*"`;
|
|
28
|
+
case 'exact':
|
|
29
|
+
return `${field}="${escapeForSPL(value)}"`;
|
|
30
|
+
case 'starts_with':
|
|
31
|
+
return `${field}="${escapeForSPL(value)}*"`;
|
|
32
|
+
case 'gt':
|
|
33
|
+
return `| where ${field} > ${Number(value)}`;
|
|
34
|
+
case 'lt':
|
|
35
|
+
return `| where ${field} < ${Number(value)}`;
|
|
36
|
+
case 'gte':
|
|
37
|
+
return `| where ${field} >= ${Number(value)}`;
|
|
38
|
+
case 'lte':
|
|
39
|
+
return `| where ${field} <= ${Number(value)}`;
|
|
40
|
+
case 'eq':
|
|
41
|
+
return `| where ${field} == ${Number(value)}`;
|
|
42
|
+
default:
|
|
43
|
+
// Fallback: treat unknown operators as a contains search
|
|
44
|
+
return `${field}="*${escapeForSPL(value)}*"`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Convert an ATR rule to a Splunk SPL query string.
|
|
49
|
+
*
|
|
50
|
+
* The generated query includes:
|
|
51
|
+
* - Comment header with rule metadata
|
|
52
|
+
* - Index/sourcetype base search (generic, analyst should customize)
|
|
53
|
+
* - Condition clauses joined with appropriate logic
|
|
54
|
+
*/
|
|
55
|
+
export function ruleToSPL(rule) {
|
|
56
|
+
const conditions = rule.detection.conditions;
|
|
57
|
+
const logic = rule.detection.condition; // "any" or "all"
|
|
58
|
+
const lines = [];
|
|
59
|
+
// Comment header with rule metadata
|
|
60
|
+
lines.push(`\`\`\` ATR Rule: ${rule.id} \`\`\``);
|
|
61
|
+
lines.push(`\`\`\` Title: ${rule.title} \`\`\``);
|
|
62
|
+
lines.push(`\`\`\` Severity: ${rule.severity} | Category: ${rule.tags.category} \`\`\``);
|
|
63
|
+
lines.push(`\`\`\` Source: ${rule.agent_source.type} | Condition logic: ${logic} \`\`\``);
|
|
64
|
+
lines.push('');
|
|
65
|
+
// Base search -- analyst should adjust index and sourcetype
|
|
66
|
+
lines.push('index=ai_agent_logs sourcetype=agent_events');
|
|
67
|
+
if (!Array.isArray(conditions)) {
|
|
68
|
+
// Named-map format: not common in current rules, emit a placeholder
|
|
69
|
+
lines.push('```` Warning: Named-map conditions not fully supported. Review manually. ````');
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
const arrayConditions = conditions;
|
|
73
|
+
if (arrayConditions.length === 0) {
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
// For "any" logic with regex conditions, we can combine them using
|
|
77
|
+
// a single regex with OR (|) alternation where possible, or use
|
|
78
|
+
// multiple search branches.
|
|
79
|
+
// For clarity and analyst usability, we emit each condition separately.
|
|
80
|
+
if (logic === 'all') {
|
|
81
|
+
// AND logic: chain all conditions sequentially
|
|
82
|
+
for (const cond of arrayConditions) {
|
|
83
|
+
lines.push(conditionToSPL(cond));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// OR logic ("any"): use Splunk's multisearch or OR-joined search
|
|
88
|
+
// For regex conditions, wrap in a single eval+match approach
|
|
89
|
+
// For simplicity and readability, use OR-joined subsearches
|
|
90
|
+
const regexConditions = arrayConditions.filter(c => c.operator === 'regex');
|
|
91
|
+
const otherConditions = arrayConditions.filter(c => c.operator !== 'regex');
|
|
92
|
+
if (regexConditions.length > 0 && otherConditions.length === 0) {
|
|
93
|
+
// All regex: combine with OR in eval/match
|
|
94
|
+
lines.push('| where (');
|
|
95
|
+
const regexClauses = regexConditions.map((cond, i) => {
|
|
96
|
+
const prefix = i === 0 ? ' ' : ' OR ';
|
|
97
|
+
return `${prefix}match(${cond.field}, "${escapeForSPL(cond.value)}")`;
|
|
98
|
+
});
|
|
99
|
+
lines.push(...regexClauses);
|
|
100
|
+
lines.push(')');
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Mixed operators: emit each as separate OR clause
|
|
104
|
+
lines.push('| where (');
|
|
105
|
+
const clauses = [];
|
|
106
|
+
for (const cond of arrayConditions) {
|
|
107
|
+
switch (cond.operator) {
|
|
108
|
+
case 'regex':
|
|
109
|
+
clauses.push(`match(${cond.field}, "${escapeForSPL(cond.value)}")`);
|
|
110
|
+
break;
|
|
111
|
+
case 'contains':
|
|
112
|
+
clauses.push(`like(${cond.field}, "%${escapeForSPL(cond.value)}%")`);
|
|
113
|
+
break;
|
|
114
|
+
case 'exact':
|
|
115
|
+
clauses.push(`${cond.field}="${escapeForSPL(cond.value)}"`);
|
|
116
|
+
break;
|
|
117
|
+
case 'starts_with':
|
|
118
|
+
clauses.push(`like(${cond.field}, "${escapeForSPL(cond.value)}%")`);
|
|
119
|
+
break;
|
|
120
|
+
case 'gt':
|
|
121
|
+
clauses.push(`${cond.field} > ${Number(cond.value)}`);
|
|
122
|
+
break;
|
|
123
|
+
case 'lt':
|
|
124
|
+
clauses.push(`${cond.field} < ${Number(cond.value)}`);
|
|
125
|
+
break;
|
|
126
|
+
case 'gte':
|
|
127
|
+
clauses.push(`${cond.field} >= ${Number(cond.value)}`);
|
|
128
|
+
break;
|
|
129
|
+
case 'lte':
|
|
130
|
+
clauses.push(`${cond.field} <= ${Number(cond.value)}`);
|
|
131
|
+
break;
|
|
132
|
+
case 'eq':
|
|
133
|
+
clauses.push(`${cond.field} == ${Number(cond.value)}`);
|
|
134
|
+
break;
|
|
135
|
+
default:
|
|
136
|
+
clauses.push(`like(${cond.field}, "%${escapeForSPL(cond.value)}%")`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
lines.push(clauses.map((c, i) => (i === 0 ? ` ${c}` : ` OR ${c}`)).join('\n'));
|
|
140
|
+
lines.push(')');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Add a table output for the analyst
|
|
144
|
+
const fields = [...new Set(arrayConditions.map(c => c.field))];
|
|
145
|
+
lines.push(`| table _time ${fields.join(' ')} source`);
|
|
146
|
+
return lines.join('\n');
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=splunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splunk.js","sourceRoot":"","sources":["../../src/converters/splunk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATR Coverage Analyzer - Analyzes rule sets for coverage gaps
|
|
3
|
+
* against OWASP Agentic Top 10 and MITRE ATLAS frameworks.
|
|
4
|
+
* @module agent-threat-rules/coverage-analyzer
|
|
5
|
+
*/
|
|
6
|
+
import type { ATRRule } from './types.js';
|
|
7
|
+
export interface CoverageGap {
|
|
8
|
+
framework: string;
|
|
9
|
+
riskId: string;
|
|
10
|
+
riskName: string;
|
|
11
|
+
currentRuleCount: number;
|
|
12
|
+
recommendedMin: number;
|
|
13
|
+
}
|
|
14
|
+
export interface CoverageReport {
|
|
15
|
+
totalRules: number;
|
|
16
|
+
gaps: CoverageGap[];
|
|
17
|
+
categoryDistribution: Record<string, number>;
|
|
18
|
+
suggestions: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare class CoverageAnalyzer {
|
|
21
|
+
private readonly rules;
|
|
22
|
+
constructor(rules: readonly ATRRule[]);
|
|
23
|
+
/**
|
|
24
|
+
* Analyze the rule set for coverage gaps against OWASP Agentic Top 10,
|
|
25
|
+
* MITRE ATLAS, and ATR category distribution.
|
|
26
|
+
*/
|
|
27
|
+
analyze(): CoverageReport;
|
|
28
|
+
/**
|
|
29
|
+
* Count how many active rules cover a given framework item,
|
|
30
|
+
* either by ATR category match or by explicit reference in rule metadata.
|
|
31
|
+
*/
|
|
32
|
+
private countCoveringRules;
|
|
33
|
+
/**
|
|
34
|
+
* Build a distribution count of rules per ATR category.
|
|
35
|
+
*/
|
|
36
|
+
private buildCategoryDistribution;
|
|
37
|
+
/**
|
|
38
|
+
* Generate human-readable suggestions based on identified gaps
|
|
39
|
+
* and category distribution.
|
|
40
|
+
*/
|
|
41
|
+
private generateSuggestions;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=coverage-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-analyzer.d.ts","sourceRoot":"","sources":["../src/coverage-analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA4ND,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;gBAE/B,KAAK,EAAE,SAAS,OAAO,EAAE;IAIrC;;;OAGG;IACH,OAAO,IAAI,cAAc;IA2CzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CA6D5B"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ATR Coverage Analyzer - Analyzes rule sets for coverage gaps
|
|
3
|
+
* against OWASP Agentic Top 10 and MITRE ATLAS frameworks.
|
|
4
|
+
* @module agent-threat-rules/coverage-analyzer
|
|
5
|
+
*/
|
|
6
|
+
const OWASP_AGENTIC_TOP_10 = [
|
|
7
|
+
{
|
|
8
|
+
id: 'ASI01',
|
|
9
|
+
name: 'Prompt Injection',
|
|
10
|
+
categories: ['prompt-injection'],
|
|
11
|
+
recommendedMin: 3,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 'ASI02',
|
|
15
|
+
name: 'Tool/Skill Poisoning',
|
|
16
|
+
categories: ['tool-poisoning'],
|
|
17
|
+
recommendedMin: 2,
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 'ASI03',
|
|
21
|
+
name: 'Insecure Output Handling',
|
|
22
|
+
categories: ['context-exfiltration'],
|
|
23
|
+
recommendedMin: 2,
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'ASI04',
|
|
27
|
+
name: 'Privilege Escalation',
|
|
28
|
+
categories: ['privilege-escalation'],
|
|
29
|
+
recommendedMin: 2,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: 'ASI05',
|
|
33
|
+
name: 'Data Poisoning',
|
|
34
|
+
categories: ['data-poisoning'],
|
|
35
|
+
recommendedMin: 2,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'ASI06',
|
|
39
|
+
name: 'Excessive Autonomy',
|
|
40
|
+
categories: ['excessive-autonomy'],
|
|
41
|
+
recommendedMin: 2,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: 'ASI07',
|
|
45
|
+
name: 'Multi-Agent Manipulation',
|
|
46
|
+
categories: ['agent-manipulation'],
|
|
47
|
+
recommendedMin: 2,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'ASI08',
|
|
51
|
+
name: 'Model Abuse',
|
|
52
|
+
categories: ['model-abuse'],
|
|
53
|
+
recommendedMin: 2,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'ASI09',
|
|
57
|
+
name: 'Insufficient Logging',
|
|
58
|
+
categories: [],
|
|
59
|
+
recommendedMin: 1,
|
|
60
|
+
noDirectRules: true,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: 'ASI10',
|
|
64
|
+
name: 'Supply Chain Compromise',
|
|
65
|
+
categories: ['skill-compromise'],
|
|
66
|
+
recommendedMin: 2,
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
// MITRE ATLAS techniques to check
|
|
71
|
+
// ---------------------------------------------------------------------------
|
|
72
|
+
const MITRE_ATLAS_TECHNIQUES = [
|
|
73
|
+
{
|
|
74
|
+
id: 'AML.T0051',
|
|
75
|
+
name: 'LLM Prompt Injection',
|
|
76
|
+
categories: ['prompt-injection'],
|
|
77
|
+
recommendedMin: 1,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'AML.T0051.000',
|
|
81
|
+
name: 'LLM Prompt Injection: Direct',
|
|
82
|
+
categories: ['prompt-injection'],
|
|
83
|
+
recommendedMin: 1,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'AML.T0051.001',
|
|
87
|
+
name: 'LLM Prompt Injection: Indirect',
|
|
88
|
+
categories: ['prompt-injection'],
|
|
89
|
+
recommendedMin: 1,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 'AML.T0053',
|
|
93
|
+
name: 'Data Poisoning',
|
|
94
|
+
categories: ['data-poisoning'],
|
|
95
|
+
recommendedMin: 1,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: 'AML.T0056',
|
|
99
|
+
name: 'LLM Plugin Compromise',
|
|
100
|
+
categories: ['tool-poisoning', 'skill-compromise'],
|
|
101
|
+
recommendedMin: 1,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'AML.T0010',
|
|
105
|
+
name: 'ML Supply Chain Compromise',
|
|
106
|
+
categories: ['skill-compromise', 'tool-poisoning'],
|
|
107
|
+
recommendedMin: 1,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: 'AML.T0020',
|
|
111
|
+
name: 'Poison Training Data',
|
|
112
|
+
categories: ['data-poisoning'],
|
|
113
|
+
recommendedMin: 1,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'AML.T0018',
|
|
117
|
+
name: 'Backdoor ML Model',
|
|
118
|
+
categories: ['model-abuse', 'data-poisoning'],
|
|
119
|
+
recommendedMin: 1,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
id: 'AML.T0024',
|
|
123
|
+
name: 'Exfiltration via ML Inference API',
|
|
124
|
+
categories: ['context-exfiltration'],
|
|
125
|
+
recommendedMin: 1,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'AML.T0040',
|
|
129
|
+
name: 'ML Model Inference API Access',
|
|
130
|
+
categories: ['model-abuse'],
|
|
131
|
+
recommendedMin: 1,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: 'AML.T0043',
|
|
135
|
+
name: 'Craft Adversarial Data',
|
|
136
|
+
categories: ['data-poisoning', 'prompt-injection'],
|
|
137
|
+
recommendedMin: 1,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: 'AML.T0044',
|
|
141
|
+
name: 'Full ML Model Access',
|
|
142
|
+
categories: ['model-abuse'],
|
|
143
|
+
recommendedMin: 1,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: 'AML.T0046',
|
|
147
|
+
name: 'Evade ML Model',
|
|
148
|
+
categories: ['prompt-injection', 'agent-manipulation'],
|
|
149
|
+
recommendedMin: 1,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: 'AML.T0047',
|
|
153
|
+
name: 'ML-Enabled Product/Service Abuse',
|
|
154
|
+
categories: ['model-abuse', 'excessive-autonomy'],
|
|
155
|
+
recommendedMin: 1,
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: 'AML.T0050',
|
|
159
|
+
name: 'Command and Control via ML Service',
|
|
160
|
+
categories: ['agent-manipulation'],
|
|
161
|
+
recommendedMin: 1,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
id: 'AML.T0052.000',
|
|
165
|
+
name: 'Phishing via LLM',
|
|
166
|
+
categories: ['model-abuse'],
|
|
167
|
+
recommendedMin: 1,
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 'AML.T0054',
|
|
171
|
+
name: 'LLM Jailbreak',
|
|
172
|
+
categories: ['prompt-injection'],
|
|
173
|
+
recommendedMin: 1,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: 'AML.T0055',
|
|
177
|
+
name: 'Unsafe LLM Output',
|
|
178
|
+
categories: ['context-exfiltration', 'model-abuse'],
|
|
179
|
+
recommendedMin: 1,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
id: 'AML.T0057',
|
|
183
|
+
name: 'LLM Data Leakage',
|
|
184
|
+
categories: ['context-exfiltration'],
|
|
185
|
+
recommendedMin: 1,
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// All 9 ATR categories
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
const ALL_ATR_CATEGORIES = [
|
|
192
|
+
'prompt-injection',
|
|
193
|
+
'tool-poisoning',
|
|
194
|
+
'context-exfiltration',
|
|
195
|
+
'agent-manipulation',
|
|
196
|
+
'privilege-escalation',
|
|
197
|
+
'excessive-autonomy',
|
|
198
|
+
'data-poisoning',
|
|
199
|
+
'model-abuse',
|
|
200
|
+
'skill-compromise',
|
|
201
|
+
];
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// CoverageAnalyzer
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
export class CoverageAnalyzer {
|
|
206
|
+
rules;
|
|
207
|
+
constructor(rules) {
|
|
208
|
+
this.rules = rules;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Analyze the rule set for coverage gaps against OWASP Agentic Top 10,
|
|
212
|
+
* MITRE ATLAS, and ATR category distribution.
|
|
213
|
+
*/
|
|
214
|
+
analyze() {
|
|
215
|
+
const activeRules = this.rules.filter((r) => r.status !== 'deprecated');
|
|
216
|
+
const categoryDistribution = this.buildCategoryDistribution(activeRules);
|
|
217
|
+
const gaps = [];
|
|
218
|
+
// Check OWASP Agentic Top 10
|
|
219
|
+
for (const item of OWASP_AGENTIC_TOP_10) {
|
|
220
|
+
const count = this.countCoveringRules(activeRules, item);
|
|
221
|
+
if (count < item.recommendedMin) {
|
|
222
|
+
gaps.push({
|
|
223
|
+
framework: 'OWASP Agentic Top 10',
|
|
224
|
+
riskId: item.id,
|
|
225
|
+
riskName: item.name,
|
|
226
|
+
currentRuleCount: count,
|
|
227
|
+
recommendedMin: item.recommendedMin,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Check MITRE ATLAS techniques
|
|
232
|
+
for (const item of MITRE_ATLAS_TECHNIQUES) {
|
|
233
|
+
const count = this.countCoveringRules(activeRules, item);
|
|
234
|
+
if (count < item.recommendedMin) {
|
|
235
|
+
gaps.push({
|
|
236
|
+
framework: 'MITRE ATLAS',
|
|
237
|
+
riskId: item.id,
|
|
238
|
+
riskName: item.name,
|
|
239
|
+
currentRuleCount: count,
|
|
240
|
+
recommendedMin: item.recommendedMin,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const suggestions = this.generateSuggestions(gaps, categoryDistribution);
|
|
245
|
+
return {
|
|
246
|
+
totalRules: activeRules.length,
|
|
247
|
+
gaps,
|
|
248
|
+
categoryDistribution,
|
|
249
|
+
suggestions,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Count how many active rules cover a given framework item,
|
|
254
|
+
* either by ATR category match or by explicit reference in rule metadata.
|
|
255
|
+
*/
|
|
256
|
+
countCoveringRules(activeRules, item) {
|
|
257
|
+
if (item.noDirectRules) {
|
|
258
|
+
return 0;
|
|
259
|
+
}
|
|
260
|
+
const covering = new Set();
|
|
261
|
+
for (const rule of activeRules) {
|
|
262
|
+
const matchesCategory = item.categories.includes(rule.tags.category);
|
|
263
|
+
const matchesOwaspRef = rule.references?.owasp_llm?.some((ref) => ref.includes(item.id)) ?? false;
|
|
264
|
+
const matchesMitreRef = rule.references?.mitre_atlas?.some((ref) => ref.includes(item.id)) ?? false;
|
|
265
|
+
if (matchesCategory || matchesOwaspRef || matchesMitreRef) {
|
|
266
|
+
covering.add(rule.id);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return covering.size;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Build a distribution count of rules per ATR category.
|
|
273
|
+
*/
|
|
274
|
+
buildCategoryDistribution(activeRules) {
|
|
275
|
+
const dist = {};
|
|
276
|
+
for (const cat of ALL_ATR_CATEGORIES) {
|
|
277
|
+
dist[cat] = 0;
|
|
278
|
+
}
|
|
279
|
+
for (const rule of activeRules) {
|
|
280
|
+
const cat = rule.tags.category;
|
|
281
|
+
dist[cat] = (dist[cat] ?? 0) + 1;
|
|
282
|
+
}
|
|
283
|
+
return dist;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Generate human-readable suggestions based on identified gaps
|
|
287
|
+
* and category distribution.
|
|
288
|
+
*/
|
|
289
|
+
generateSuggestions(gaps, categoryDistribution) {
|
|
290
|
+
const suggestions = [];
|
|
291
|
+
// Group OWASP gaps
|
|
292
|
+
const owaspGaps = gaps.filter((g) => g.framework === 'OWASP Agentic Top 10');
|
|
293
|
+
if (owaspGaps.length > 0) {
|
|
294
|
+
const ids = owaspGaps.map((g) => g.riskId).join(', ');
|
|
295
|
+
suggestions.push(`OWASP Agentic Top 10 coverage gaps found for: ${ids}. ` +
|
|
296
|
+
`Create rules targeting these risk areas to improve coverage.`);
|
|
297
|
+
}
|
|
298
|
+
// Group MITRE gaps
|
|
299
|
+
const mitreGaps = gaps.filter((g) => g.framework === 'MITRE ATLAS');
|
|
300
|
+
if (mitreGaps.length > 0) {
|
|
301
|
+
const ids = mitreGaps.map((g) => g.riskId).join(', ');
|
|
302
|
+
suggestions.push(`MITRE ATLAS technique coverage gaps found for: ${ids}. ` +
|
|
303
|
+
`Add detection rules or reference mappings for these techniques.`);
|
|
304
|
+
}
|
|
305
|
+
// Check for empty categories
|
|
306
|
+
const emptyCategories = ALL_ATR_CATEGORIES.filter((cat) => (categoryDistribution[cat] ?? 0) === 0);
|
|
307
|
+
if (emptyCategories.length > 0) {
|
|
308
|
+
suggestions.push(`No rules found for ATR categories: ${emptyCategories.join(', ')}. ` +
|
|
309
|
+
`Consider adding at least one rule per category for baseline coverage.`);
|
|
310
|
+
}
|
|
311
|
+
// ASI09 (Insufficient Logging) always appears as a gap since no direct rules exist
|
|
312
|
+
const asi09Gap = gaps.find((g) => g.riskId === 'ASI09');
|
|
313
|
+
if (asi09Gap) {
|
|
314
|
+
suggestions.push(`ASI09 (Insufficient Logging) has no direct ATR rule category. ` +
|
|
315
|
+
`Consider implementing logging validation at the agent framework level ` +
|
|
316
|
+
`rather than through detection rules.`);
|
|
317
|
+
}
|
|
318
|
+
// Suggest overall improvement if many gaps
|
|
319
|
+
if (gaps.length > 10) {
|
|
320
|
+
suggestions.push(`${gaps.length} total coverage gaps detected. Prioritize OWASP Agentic Top 10 ` +
|
|
321
|
+
`gaps first, then address MITRE ATLAS technique gaps.`);
|
|
322
|
+
}
|
|
323
|
+
if (suggestions.length === 0) {
|
|
324
|
+
suggestions.push('Rule coverage looks good across both OWASP and MITRE frameworks.');
|
|
325
|
+
}
|
|
326
|
+
return suggestions;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=coverage-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-analyzer.js","sourceRoot":"","sources":["../src/coverage-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Build attack embedding corpus from ATR rule test cases.
|
|
4
|
+
*
|
|
5
|
+
* Reads all stable ATR rules, extracts true_positive test cases,
|
|
6
|
+
* encodes them through all-MiniLM-L6-v2, and saves as JSON.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx tsx src/embedding/build-corpus.ts
|
|
10
|
+
*
|
|
11
|
+
* Output:
|
|
12
|
+
* data/attack-embeddings.json
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=build-corpus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-corpus.d.ts","sourceRoot":"","sources":["../../src/embedding/build-corpus.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|