@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.
Files changed (274) hide show
  1. package/dist/action-executor.d.ts +44 -0
  2. package/dist/action-executor.d.ts.map +1 -0
  3. package/dist/action-executor.js +130 -0
  4. package/dist/action-executor.js.map +1 -0
  5. package/dist/adapters/default-adapter.d.ts +24 -0
  6. package/dist/adapters/default-adapter.d.ts.map +1 -0
  7. package/dist/adapters/default-adapter.js +51 -0
  8. package/dist/adapters/default-adapter.js.map +1 -0
  9. package/dist/adapters/stdio-adapter.d.ts +30 -0
  10. package/dist/adapters/stdio-adapter.d.ts.map +1 -0
  11. package/dist/adapters/stdio-adapter.js +128 -0
  12. package/dist/adapters/stdio-adapter.js.map +1 -0
  13. package/dist/badge.d.ts +42 -0
  14. package/dist/badge.d.ts.map +1 -0
  15. package/dist/badge.js +163 -0
  16. package/dist/badge.js.map +1 -0
  17. package/dist/capability-extractor.d.ts +35 -0
  18. package/dist/capability-extractor.d.ts.map +1 -0
  19. package/dist/capability-extractor.js +91 -0
  20. package/dist/capability-extractor.js.map +1 -0
  21. package/dist/cli/scan-handler.d.ts +21 -0
  22. package/dist/cli/scan-handler.d.ts.map +1 -0
  23. package/dist/cli/scan-handler.js +276 -0
  24. package/dist/cli/scan-handler.js.map +1 -0
  25. package/dist/cli/tc-pipeline.d.ts +18 -0
  26. package/dist/cli/tc-pipeline.d.ts.map +1 -0
  27. package/dist/cli/tc-pipeline.js +295 -0
  28. package/dist/cli/tc-pipeline.js.map +1 -0
  29. package/dist/cli.d.ts +12 -0
  30. package/dist/cli.d.ts.map +1 -0
  31. package/dist/cli.js +894 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/content-hash.d.ts +7 -0
  34. package/dist/content-hash.d.ts.map +1 -0
  35. package/dist/content-hash.js +10 -0
  36. package/dist/content-hash.js.map +1 -0
  37. package/dist/converters/elastic.d.ts +36 -0
  38. package/dist/converters/elastic.d.ts.map +1 -0
  39. package/dist/converters/elastic.js +125 -0
  40. package/dist/converters/elastic.js.map +1 -0
  41. package/dist/converters/generic-regex.d.ts +37 -0
  42. package/dist/converters/generic-regex.d.ts.map +1 -0
  43. package/dist/converters/generic-regex.js +59 -0
  44. package/dist/converters/generic-regex.js.map +1 -0
  45. package/dist/converters/index.d.ts +32 -0
  46. package/dist/converters/index.d.ts.map +1 -0
  47. package/dist/converters/index.js +38 -0
  48. package/dist/converters/index.js.map +1 -0
  49. package/dist/converters/sarif.d.ts +18 -0
  50. package/dist/converters/sarif.d.ts.map +1 -0
  51. package/dist/converters/sarif.js +142 -0
  52. package/dist/converters/sarif.js.map +1 -0
  53. package/dist/converters/splunk.d.ts +19 -0
  54. package/dist/converters/splunk.d.ts.map +1 -0
  55. package/dist/converters/splunk.js +148 -0
  56. package/dist/converters/splunk.js.map +1 -0
  57. package/dist/coverage-analyzer.d.ts +43 -0
  58. package/dist/coverage-analyzer.d.ts.map +1 -0
  59. package/dist/coverage-analyzer.js +329 -0
  60. package/dist/coverage-analyzer.js.map +1 -0
  61. package/dist/embedding/build-corpus.d.ts +15 -0
  62. package/dist/embedding/build-corpus.d.ts.map +1 -0
  63. package/dist/embedding/build-corpus.js +105 -0
  64. package/dist/embedding/build-corpus.js.map +1 -0
  65. package/dist/embedding/model-loader.d.ts +41 -0
  66. package/dist/embedding/model-loader.d.ts.map +1 -0
  67. package/dist/embedding/model-loader.js +90 -0
  68. package/dist/embedding/model-loader.js.map +1 -0
  69. package/dist/embedding/vector-store.d.ts +41 -0
  70. package/dist/embedding/vector-store.d.ts.map +1 -0
  71. package/dist/embedding/vector-store.js +70 -0
  72. package/dist/embedding/vector-store.js.map +1 -0
  73. package/dist/engine.d.ts +222 -0
  74. package/dist/engine.d.ts.map +1 -0
  75. package/dist/engine.js +1185 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/eval/corpus.d.ts +42 -0
  78. package/dist/eval/corpus.d.ts.map +1 -0
  79. package/dist/eval/corpus.js +427 -0
  80. package/dist/eval/corpus.js.map +1 -0
  81. package/dist/eval/eval-harness.d.ts +44 -0
  82. package/dist/eval/eval-harness.d.ts.map +1 -0
  83. package/dist/eval/eval-harness.js +296 -0
  84. package/dist/eval/eval-harness.js.map +1 -0
  85. package/dist/eval/index.d.ts +13 -0
  86. package/dist/eval/index.d.ts.map +1 -0
  87. package/dist/eval/index.js +9 -0
  88. package/dist/eval/index.js.map +1 -0
  89. package/dist/eval/metrics.d.ts +74 -0
  90. package/dist/eval/metrics.d.ts.map +1 -0
  91. package/dist/eval/metrics.js +108 -0
  92. package/dist/eval/metrics.js.map +1 -0
  93. package/dist/eval/pint-corpus.d.ts +34 -0
  94. package/dist/eval/pint-corpus.d.ts.map +1 -0
  95. package/dist/eval/pint-corpus.js +113 -0
  96. package/dist/eval/pint-corpus.js.map +1 -0
  97. package/dist/eval/rule-corpus.d.ts +9 -0
  98. package/dist/eval/rule-corpus.d.ts.map +1 -0
  99. package/dist/eval/rule-corpus.js +4780 -0
  100. package/dist/eval/rule-corpus.js.map +1 -0
  101. package/dist/eval/rule-metrics.d.ts +34 -0
  102. package/dist/eval/rule-metrics.d.ts.map +1 -0
  103. package/dist/eval/rule-metrics.js +92 -0
  104. package/dist/eval/rule-metrics.js.map +1 -0
  105. package/dist/eval/run-eval.d.ts +7 -0
  106. package/dist/eval/run-eval.d.ts.map +1 -0
  107. package/dist/eval/run-eval.js +11 -0
  108. package/dist/eval/run-eval.js.map +1 -0
  109. package/dist/eval/run-pint-benchmark.d.ts +18 -0
  110. package/dist/eval/run-pint-benchmark.d.ts.map +1 -0
  111. package/dist/eval/run-pint-benchmark.js +159 -0
  112. package/dist/eval/run-pint-benchmark.js.map +1 -0
  113. package/dist/eval/skill-benchmark.d.ts +66 -0
  114. package/dist/eval/skill-benchmark.d.ts.map +1 -0
  115. package/dist/eval/skill-benchmark.js +194 -0
  116. package/dist/eval/skill-benchmark.js.map +1 -0
  117. package/dist/flywheel.d.ts +54 -0
  118. package/dist/flywheel.d.ts.map +1 -0
  119. package/dist/flywheel.js +121 -0
  120. package/dist/flywheel.js.map +1 -0
  121. package/dist/hook-handler.d.ts +61 -0
  122. package/dist/hook-handler.d.ts.map +1 -0
  123. package/dist/hook-handler.js +178 -0
  124. package/dist/hook-handler.js.map +1 -0
  125. package/dist/index.d.ts +8 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/{src/index.ts → dist/index.js} +1 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/layer-integration.d.ts +55 -0
  130. package/dist/layer-integration.d.ts.map +1 -0
  131. package/dist/layer-integration.js +187 -0
  132. package/dist/layer-integration.js.map +1 -0
  133. package/dist/loader.d.ts +18 -0
  134. package/dist/loader.d.ts.map +1 -0
  135. package/dist/loader.js +129 -0
  136. package/dist/loader.js.map +1 -0
  137. package/dist/mcp-server.d.ts +13 -0
  138. package/dist/mcp-server.d.ts.map +1 -0
  139. package/dist/mcp-server.js +246 -0
  140. package/dist/mcp-server.js.map +1 -0
  141. package/dist/mcp-tools/coverage-gaps.d.ts +13 -0
  142. package/dist/mcp-tools/coverage-gaps.d.ts.map +1 -0
  143. package/dist/mcp-tools/coverage-gaps.js +55 -0
  144. package/dist/mcp-tools/coverage-gaps.js.map +1 -0
  145. package/dist/mcp-tools/list-rules.d.ts +17 -0
  146. package/dist/mcp-tools/list-rules.d.ts.map +1 -0
  147. package/dist/mcp-tools/list-rules.js +45 -0
  148. package/dist/mcp-tools/list-rules.js.map +1 -0
  149. package/dist/mcp-tools/scan-skill.d.ts +17 -0
  150. package/dist/mcp-tools/scan-skill.d.ts.map +1 -0
  151. package/dist/mcp-tools/scan-skill.js +65 -0
  152. package/dist/mcp-tools/scan-skill.js.map +1 -0
  153. package/dist/mcp-tools/scan.d.ts +24 -0
  154. package/dist/mcp-tools/scan.d.ts.map +1 -0
  155. package/dist/mcp-tools/scan.js +94 -0
  156. package/dist/mcp-tools/scan.js.map +1 -0
  157. package/dist/mcp-tools/submit-proposal.d.ts +12 -0
  158. package/dist/mcp-tools/submit-proposal.d.ts.map +1 -0
  159. package/dist/mcp-tools/submit-proposal.js +103 -0
  160. package/dist/mcp-tools/submit-proposal.js.map +1 -0
  161. package/dist/mcp-tools/threat-summary.d.ts +12 -0
  162. package/dist/mcp-tools/threat-summary.d.ts.map +1 -0
  163. package/dist/mcp-tools/threat-summary.js +74 -0
  164. package/dist/mcp-tools/threat-summary.js.map +1 -0
  165. package/dist/mcp-tools/validate.d.ts +15 -0
  166. package/dist/mcp-tools/validate.d.ts.map +1 -0
  167. package/dist/mcp-tools/validate.js +51 -0
  168. package/dist/mcp-tools/validate.js.map +1 -0
  169. package/dist/modules/embedding.d.ts +71 -0
  170. package/dist/modules/embedding.d.ts.map +1 -0
  171. package/dist/modules/embedding.js +141 -0
  172. package/dist/modules/embedding.js.map +1 -0
  173. package/dist/modules/index.d.ts +144 -0
  174. package/dist/modules/index.d.ts.map +1 -0
  175. package/dist/modules/index.js +82 -0
  176. package/dist/modules/index.js.map +1 -0
  177. package/dist/modules/semantic.d.ts +106 -0
  178. package/dist/modules/semantic.d.ts.map +1 -0
  179. package/dist/modules/semantic.js +359 -0
  180. package/dist/modules/semantic.js.map +1 -0
  181. package/dist/modules/session.d.ts +70 -0
  182. package/dist/modules/session.d.ts.map +1 -0
  183. package/dist/modules/session.js +128 -0
  184. package/dist/modules/session.js.map +1 -0
  185. package/dist/quality/adapters/atr.d.ts +65 -0
  186. package/dist/quality/adapters/atr.d.ts.map +1 -0
  187. package/dist/quality/adapters/atr.js +154 -0
  188. package/dist/quality/adapters/atr.js.map +1 -0
  189. package/dist/quality/adapters/index.d.ts +10 -0
  190. package/dist/quality/adapters/index.d.ts.map +1 -0
  191. package/dist/quality/adapters/index.js +10 -0
  192. package/dist/quality/adapters/index.js.map +1 -0
  193. package/dist/quality/compute-confidence.d.ts +45 -0
  194. package/dist/quality/compute-confidence.d.ts.map +1 -0
  195. package/dist/quality/compute-confidence.js +133 -0
  196. package/dist/quality/compute-confidence.js.map +1 -0
  197. package/dist/quality/index.d.ts +36 -0
  198. package/dist/quality/index.d.ts.map +1 -0
  199. package/dist/quality/index.js +39 -0
  200. package/dist/quality/index.js.map +1 -0
  201. package/dist/quality/quality-gate.d.ts +86 -0
  202. package/dist/quality/quality-gate.d.ts.map +1 -0
  203. package/dist/quality/quality-gate.js +187 -0
  204. package/dist/quality/quality-gate.js.map +1 -0
  205. package/dist/quality/types.d.ts +129 -0
  206. package/dist/quality/types.d.ts.map +1 -0
  207. package/dist/quality/types.js +10 -0
  208. package/dist/quality/types.js.map +1 -0
  209. package/dist/quality/validate-maturity.d.ts +51 -0
  210. package/dist/quality/validate-maturity.d.ts.map +1 -0
  211. package/dist/quality/validate-maturity.js +134 -0
  212. package/dist/quality/validate-maturity.js.map +1 -0
  213. package/dist/quality.d.ts +8 -0
  214. package/dist/quality.d.ts.map +1 -0
  215. package/dist/quality.js +8 -0
  216. package/dist/quality.js.map +1 -0
  217. package/dist/rule-scaffolder.d.ts +53 -0
  218. package/dist/rule-scaffolder.d.ts.map +1 -0
  219. package/dist/rule-scaffolder.js +301 -0
  220. package/dist/rule-scaffolder.js.map +1 -0
  221. package/dist/session-tracker.d.ts +58 -0
  222. package/dist/session-tracker.d.ts.map +1 -0
  223. package/dist/session-tracker.js +176 -0
  224. package/dist/session-tracker.js.map +1 -0
  225. package/dist/shadow-evaluator.d.ts +48 -0
  226. package/dist/shadow-evaluator.d.ts.map +1 -0
  227. package/dist/shadow-evaluator.js +129 -0
  228. package/dist/shadow-evaluator.js.map +1 -0
  229. package/dist/skill-fingerprint.d.ts +85 -0
  230. package/dist/skill-fingerprint.d.ts.map +1 -0
  231. package/dist/skill-fingerprint.js +284 -0
  232. package/dist/skill-fingerprint.js.map +1 -0
  233. package/dist/tc-reporter.d.ts +50 -0
  234. package/dist/tc-reporter.d.ts.map +1 -0
  235. package/dist/tc-reporter.js +164 -0
  236. package/dist/tc-reporter.js.map +1 -0
  237. package/dist/tier0-invariant.d.ts +49 -0
  238. package/dist/tier0-invariant.d.ts.map +1 -0
  239. package/dist/tier0-invariant.js +185 -0
  240. package/dist/tier0-invariant.js.map +1 -0
  241. package/dist/tier1-blacklist.d.ts +48 -0
  242. package/dist/tier1-blacklist.d.ts.map +1 -0
  243. package/dist/tier1-blacklist.js +92 -0
  244. package/dist/tier1-blacklist.js.map +1 -0
  245. package/dist/types.d.ts +232 -0
  246. package/dist/types.d.ts.map +1 -0
  247. package/dist/types.js +6 -0
  248. package/dist/types.js.map +1 -0
  249. package/dist/verdict.d.ts +26 -0
  250. package/dist/verdict.d.ts.map +1 -0
  251. package/dist/verdict.js +127 -0
  252. package/dist/verdict.js.map +1 -0
  253. package/package.json +16 -4
  254. package/.github/ISSUE_TEMPLATE/evasion-report.yml +0 -75
  255. package/.github/ISSUE_TEMPLATE/false-positive.yml +0 -31
  256. package/.github/ISSUE_TEMPLATE/mirofish-prediction.yml +0 -128
  257. package/.github/ISSUE_TEMPLATE/new-rule.yml +0 -37
  258. package/.github/PULL_REQUEST_TEMPLATE.md +0 -23
  259. package/.github/workflows/rule-quality.yml +0 -203
  260. package/.github/workflows/validate.yml +0 -42
  261. package/CHANGELOG.md +0 -30
  262. package/CONTRIBUTING.md +0 -168
  263. package/CONTRIBUTORS.md +0 -28
  264. package/COVERAGE.md +0 -135
  265. package/LIMITATIONS.md +0 -154
  266. package/SECURITY.md +0 -48
  267. package/THREAT-MODEL.md +0 -243
  268. package/docs/contribution-paths.md +0 -202
  269. package/docs/mirofish-prediction-guide.md +0 -304
  270. package/docs/quick-start.md +0 -245
  271. package/docs/rule-writing-guide.md +0 -647
  272. package/docs/schema-spec.md +0 -594
  273. package/examples/how-to-write-a-rule.md +0 -251
  274. 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"}