agent-threat-rules 0.1.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.
Files changed (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +299 -0
  3. package/dist/cli.d.ts +12 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +544 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/engine.d.ts +127 -0
  8. package/dist/engine.d.ts.map +1 -0
  9. package/dist/engine.js +636 -0
  10. package/dist/engine.js.map +1 -0
  11. package/dist/index.d.ts +18 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +14 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/loader.d.ts +21 -0
  16. package/dist/loader.d.ts.map +1 -0
  17. package/dist/loader.js +124 -0
  18. package/dist/loader.js.map +1 -0
  19. package/dist/modules/index.d.ts +143 -0
  20. package/dist/modules/index.d.ts.map +1 -0
  21. package/dist/modules/index.js +80 -0
  22. package/dist/modules/index.js.map +1 -0
  23. package/dist/modules/session.d.ts +70 -0
  24. package/dist/modules/session.d.ts.map +1 -0
  25. package/dist/modules/session.js +128 -0
  26. package/dist/modules/session.js.map +1 -0
  27. package/dist/session-tracker.d.ts +56 -0
  28. package/dist/session-tracker.d.ts.map +1 -0
  29. package/dist/session-tracker.js +175 -0
  30. package/dist/session-tracker.js.map +1 -0
  31. package/dist/types.d.ts +129 -0
  32. package/dist/types.d.ts.map +1 -0
  33. package/dist/types.js +6 -0
  34. package/dist/types.js.map +1 -0
  35. package/package.json +71 -0
  36. package/rules/agent-manipulation/ATR-2026-030-cross-agent-attack.yaml +175 -0
  37. package/rules/agent-manipulation/ATR-2026-032-goal-hijacking.yaml +135 -0
  38. package/rules/agent-manipulation/ATR-2026-074-cross-agent-privilege-escalation.yaml +115 -0
  39. package/rules/agent-manipulation/ATR-2026-076-inter-agent-message-spoofing.yaml +165 -0
  40. package/rules/agent-manipulation/ATR-2026-077-human-trust-exploitation.yaml +144 -0
  41. package/rules/context-exfiltration/ATR-2026-020-system-prompt-leak.yaml +175 -0
  42. package/rules/context-exfiltration/ATR-2026-021-api-key-exposure.yaml +176 -0
  43. package/rules/context-exfiltration/ATR-2026-075-agent-memory-manipulation.yaml +115 -0
  44. package/rules/data-poisoning/ATR-2026-070-data-poisoning.yaml +160 -0
  45. package/rules/excessive-autonomy/ATR-2026-050-runaway-agent-loop.yaml +134 -0
  46. package/rules/excessive-autonomy/ATR-2026-051-resource-exhaustion.yaml +137 -0
  47. package/rules/excessive-autonomy/ATR-2026-052-cascading-failure.yaml +153 -0
  48. package/rules/model-security/ATR-2026-072-model-behavior-extraction.yaml +115 -0
  49. package/rules/model-security/ATR-2026-073-malicious-finetuning-data.yaml +108 -0
  50. package/rules/privilege-escalation/ATR-2026-040-privilege-escalation.yaml +175 -0
  51. package/rules/privilege-escalation/ATR-2026-041-scope-creep.yaml +124 -0
  52. package/rules/prompt-injection/ATR-2026-001-direct-prompt-injection.yaml +265 -0
  53. package/rules/prompt-injection/ATR-2026-002-indirect-prompt-injection.yaml +214 -0
  54. package/rules/prompt-injection/ATR-2026-003-jailbreak-attempt.yaml +250 -0
  55. package/rules/prompt-injection/ATR-2026-004-system-prompt-override.yaml +204 -0
  56. package/rules/prompt-injection/ATR-2026-005-multi-turn-injection.yaml +181 -0
  57. package/rules/skill-compromise/ATR-2026-060-skill-impersonation.yaml +153 -0
  58. package/rules/skill-compromise/ATR-2026-061-description-behavior-mismatch.yaml +98 -0
  59. package/rules/skill-compromise/ATR-2026-062-hidden-capability.yaml +96 -0
  60. package/rules/skill-compromise/ATR-2026-063-skill-chain-attack.yaml +96 -0
  61. package/rules/skill-compromise/ATR-2026-064-over-permissioned-skill.yaml +115 -0
  62. package/rules/skill-compromise/ATR-2026-065-skill-update-attack.yaml +93 -0
  63. package/rules/skill-compromise/ATR-2026-066-parameter-injection.yaml +106 -0
  64. package/rules/tool-poisoning/ATR-2026-010-mcp-malicious-response.yaml +237 -0
  65. package/rules/tool-poisoning/ATR-2026-011-tool-output-injection.yaml +185 -0
  66. package/rules/tool-poisoning/ATR-2026-012-unauthorized-tool-call.yaml +190 -0
  67. package/rules/tool-poisoning/ATR-2026-013-tool-ssrf.yaml +208 -0
  68. package/spec/atr-schema.yaml +375 -0
package/dist/cli.js ADDED
@@ -0,0 +1,544 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * ATR CLI - Command-line interface for Agent Threat Rules
4
+ *
5
+ * Usage:
6
+ * npx agent-threat-rules scan <events.json> Scan events against all rules
7
+ * npx agent-threat-rules validate <rule.yaml> Validate a rule file
8
+ * npx agent-threat-rules test <rule.yaml> Run a rule's test cases
9
+ * npx agent-threat-rules stats Show rule collection stats
10
+ */
11
+ import { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';
12
+ import { resolve, dirname, join } from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { ATREngine } from './engine.js';
15
+ import { loadRuleFile, loadRulesFromDirectory, validateRule } from './loader.js';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ const RULES_DIR = resolve(__dirname, '..', 'rules');
19
+ const SEVERITY_COLORS = {
20
+ critical: '\x1b[91m', // bright red
21
+ high: '\x1b[31m', // red
22
+ medium: '\x1b[33m', // yellow
23
+ low: '\x1b[36m', // cyan
24
+ informational: '\x1b[37m', // white
25
+ };
26
+ const RESET = '\x1b[0m';
27
+ const GREEN = '\x1b[32m';
28
+ const RED = '\x1b[31m';
29
+ const DIM = '\x1b[2m';
30
+ const BOLD = '\x1b[1m';
31
+ function printUsage() {
32
+ console.log(`
33
+ ${BOLD}ATR - Agent Threat Rules${RESET}
34
+ Open detection rules for AI agent security threats.
35
+
36
+ ${BOLD}Usage:${RESET}
37
+ atr scan <events.json> [--rules <dir>] Scan events against ATR rules
38
+ atr validate <rule.yaml|dir> Validate rule file(s)
39
+ atr test <rule.yaml|dir> Run embedded test cases
40
+ atr stats [--rules <dir>] Show rule collection statistics
41
+
42
+ ${BOLD}Options:${RESET}
43
+ --rules <dir> Custom rules directory (default: bundled rules)
44
+ --json Output results as JSON
45
+ --severity <s> Minimum severity to report (critical|high|medium|low|informational)
46
+ --help Show this help message
47
+
48
+ ${BOLD}Examples:${RESET}
49
+ ${DIM}# Scan agent events for threats${RESET}
50
+ atr scan events.json
51
+
52
+ ${DIM}# Validate a custom rule${RESET}
53
+ atr validate my-rules/custom-rule.yaml
54
+
55
+ ${DIM}# Test all rules against their embedded test cases${RESET}
56
+ atr test rules/
57
+
58
+ ${DIM}# Show stats for bundled rules${RESET}
59
+ atr stats
60
+ `);
61
+ }
62
+ function parseArgs(argv) {
63
+ const args = argv.slice(2);
64
+ const command = args[0] ?? 'help';
65
+ const options = {};
66
+ let target = '';
67
+ for (let i = 1; i < args.length; i++) {
68
+ if (args[i].startsWith('--')) {
69
+ const key = args[i].slice(2);
70
+ if (key === 'json' || key === 'help') {
71
+ options[key] = 'true';
72
+ }
73
+ else {
74
+ options[key] = args[++i] ?? '';
75
+ }
76
+ }
77
+ else if (!target) {
78
+ target = args[i];
79
+ }
80
+ }
81
+ return { command, target, options };
82
+ }
83
+ // --- SCAN command ---
84
+ async function cmdScan(target, options) {
85
+ if (!target) {
86
+ console.error(`${RED}Error: Missing events file. Usage: atr scan <events.json>${RESET}`);
87
+ process.exit(1);
88
+ }
89
+ const eventsPath = resolve(target);
90
+ if (!existsSync(eventsPath)) {
91
+ console.error(`${RED}Error: File not found: ${eventsPath}${RESET}`);
92
+ process.exit(1);
93
+ }
94
+ const rulesDir = options['rules'] ? resolve(options['rules']) : RULES_DIR;
95
+ const minSeverity = options['severity'] ?? 'informational';
96
+ const jsonOutput = options['json'] === 'true';
97
+ const raw = readFileSync(eventsPath, 'utf-8');
98
+ let events;
99
+ try {
100
+ const parsed = JSON.parse(raw);
101
+ events = Array.isArray(parsed) ? parsed : [parsed];
102
+ }
103
+ catch {
104
+ console.error(`${RED}Error: Invalid JSON in ${eventsPath}${RESET}`);
105
+ process.exit(1);
106
+ }
107
+ const engine = new ATREngine({ rulesDir });
108
+ await engine.loadRules();
109
+ const severityOrder = ['informational', 'low', 'medium', 'high', 'critical'];
110
+ const minIdx = severityOrder.indexOf(minSeverity);
111
+ const allMatches = [];
112
+ let totalThreats = 0;
113
+ for (const event of events) {
114
+ const matches = engine.evaluate(event)
115
+ .filter(m => severityOrder.indexOf(m.rule.severity) >= minIdx);
116
+ if (matches.length > 0) {
117
+ allMatches.push({ event, matches });
118
+ totalThreats += matches.length;
119
+ }
120
+ }
121
+ if (jsonOutput) {
122
+ console.log(JSON.stringify({
123
+ eventsScanned: events.length,
124
+ threatsDetected: totalThreats,
125
+ rulesLoaded: engine.getRuleCount(),
126
+ results: allMatches.map(({ event, matches }) => ({
127
+ event: { type: event.type, timestamp: event.timestamp, contentPreview: event.content.slice(0, 100) },
128
+ matches: matches.map(m => ({
129
+ ruleId: m.rule.id,
130
+ title: m.rule.title,
131
+ severity: m.rule.severity,
132
+ confidence: m.confidence,
133
+ matchedConditions: m.matchedConditions,
134
+ })),
135
+ })),
136
+ }, null, 2));
137
+ return;
138
+ }
139
+ console.log(`\n${BOLD}ATR Scan Results${RESET}`);
140
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
141
+ console.log(` Events scanned: ${events.length}`);
142
+ console.log(` Rules loaded: ${engine.getRuleCount()}`);
143
+ console.log(` Threats found: ${totalThreats > 0 ? RED + totalThreats + RESET : GREEN + '0' + RESET}`);
144
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}\n`);
145
+ if (totalThreats === 0) {
146
+ console.log(`${GREEN}No threats detected.${RESET}\n`);
147
+ return;
148
+ }
149
+ for (const { event, matches } of allMatches) {
150
+ const preview = event.content.slice(0, 80).replace(/\n/g, ' ');
151
+ console.log(` ${DIM}Event: [${event.type}] "${preview}..."${RESET}`);
152
+ for (const m of matches) {
153
+ const color = SEVERITY_COLORS[m.rule.severity] ?? '';
154
+ console.log(` ${color}${m.rule.severity.toUpperCase().padEnd(13)}${RESET} ${m.rule.id} - ${m.rule.title}`);
155
+ console.log(` ${DIM}Confidence: ${(m.confidence * 100).toFixed(0)}% | Conditions: ${m.matchedConditions.join(', ')}${RESET}`);
156
+ }
157
+ console.log('');
158
+ }
159
+ }
160
+ // --- VALIDATE command ---
161
+ function cmdValidate(target, options) {
162
+ if (!target) {
163
+ console.error(`${RED}Error: Missing rule file/directory. Usage: atr validate <rule.yaml|dir>${RESET}`);
164
+ process.exit(1);
165
+ }
166
+ const targetPath = resolve(target);
167
+ if (!existsSync(targetPath)) {
168
+ console.error(`${RED}Error: Not found: ${targetPath}${RESET}`);
169
+ process.exit(1);
170
+ }
171
+ const jsonOutput = options['json'] === 'true';
172
+ const files = [];
173
+ if (statSync(targetPath).isDirectory()) {
174
+ const rules = loadRulesFromDirectory(targetPath);
175
+ // Re-validate each file individually for error reporting
176
+ collectYamlFiles(targetPath, files);
177
+ }
178
+ else {
179
+ files.push(targetPath);
180
+ }
181
+ let passed = 0;
182
+ let failed = 0;
183
+ const results = [];
184
+ for (const file of files) {
185
+ try {
186
+ const rule = loadRuleFile(file);
187
+ const result = validateRule(rule);
188
+ results.push({ file, valid: result.valid, errors: result.errors });
189
+ if (result.valid) {
190
+ passed++;
191
+ }
192
+ else {
193
+ failed++;
194
+ }
195
+ }
196
+ catch (e) {
197
+ const msg = e instanceof Error ? e.message : String(e);
198
+ results.push({ file, valid: false, errors: [msg] });
199
+ failed++;
200
+ }
201
+ }
202
+ if (jsonOutput) {
203
+ console.log(JSON.stringify({ total: files.length, passed, failed, results }, null, 2));
204
+ return;
205
+ }
206
+ console.log(`\n${BOLD}ATR Rule Validation${RESET}`);
207
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
208
+ for (const r of results) {
209
+ const icon = r.valid ? `${GREEN}PASS${RESET}` : `${RED}FAIL${RESET}`;
210
+ const shortPath = r.file.replace(process.cwd() + '/', '');
211
+ console.log(` ${icon} ${shortPath}`);
212
+ if (!r.valid) {
213
+ for (const err of r.errors) {
214
+ console.log(` ${RED}${err}${RESET}`);
215
+ }
216
+ }
217
+ }
218
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
219
+ console.log(` ${GREEN}${passed} passed${RESET} ${failed > 0 ? RED + failed + ' failed' + RESET : ''}\n`);
220
+ if (failed > 0)
221
+ process.exit(1);
222
+ }
223
+ function collectYamlFiles(dir, out) {
224
+ const entries = readdirSync(dir);
225
+ for (const entry of entries) {
226
+ const full = join(dir, entry);
227
+ if (statSync(full).isDirectory()) {
228
+ collectYamlFiles(full, out);
229
+ }
230
+ else if (full.endsWith('.yaml') || full.endsWith('.yml')) {
231
+ out.push(full);
232
+ }
233
+ }
234
+ }
235
+ // --- TEST command ---
236
+ async function cmdTest(target, options) {
237
+ if (!target) {
238
+ // Default: test bundled rules
239
+ target = RULES_DIR;
240
+ }
241
+ const targetPath = resolve(target);
242
+ if (!existsSync(targetPath)) {
243
+ console.error(`${RED}Error: Not found: ${targetPath}${RESET}`);
244
+ process.exit(1);
245
+ }
246
+ const jsonOutput = options['json'] === 'true';
247
+ const rules = [];
248
+ if (statSync(targetPath).isDirectory()) {
249
+ rules.push(...loadRulesFromDirectory(targetPath));
250
+ }
251
+ else {
252
+ rules.push(loadRuleFile(targetPath));
253
+ }
254
+ let totalTests = 0;
255
+ let passed = 0;
256
+ let failed = 0;
257
+ const failures = [];
258
+ // Map extended agent_source types to basic event-compatible source types
259
+ // so the engine's source type filter doesn't skip rules during testing.
260
+ // The engine only recognizes: llm_io, tool_call, mcp_exchange, agent_behavior, multi_agent_comm
261
+ const EXTENDED_SOURCE_TO_BASE = {
262
+ context_window: 'llm_io',
263
+ memory_access: 'llm_io',
264
+ skill_lifecycle: 'tool_call',
265
+ skill_permission: 'tool_call',
266
+ skill_chain: 'tool_call',
267
+ };
268
+ for (const rule of rules) {
269
+ if (!rule.test_cases)
270
+ continue;
271
+ // For testing, normalize extended source types so the engine doesn't filter them out
272
+ const originalSourceType = rule.agent_source?.type;
273
+ const baseSourceType = EXTENDED_SOURCE_TO_BASE[originalSourceType ?? ''];
274
+ const testRule = baseSourceType
275
+ ? { ...rule, agent_source: { ...rule.agent_source, type: baseSourceType } }
276
+ : rule;
277
+ const engine = new ATREngine({ rules: [testRule] });
278
+ await engine.loadRules();
279
+ const tp = rule.test_cases.true_positives ?? [];
280
+ const tn = rule.test_cases.true_negatives ?? [];
281
+ for (const tc of tp) {
282
+ totalTests++;
283
+ const event = buildEventFromTestCase(tc, rule);
284
+ const matches = engine.evaluate(event);
285
+ const triggered = matches.some(m => m.rule.id === rule.id);
286
+ if (triggered) {
287
+ passed++;
288
+ }
289
+ else {
290
+ failed++;
291
+ failures.push({
292
+ ruleId: rule.id,
293
+ testType: 'true_positive',
294
+ input: String(tc.input ?? tc.tool_response ?? tc.agent_output ?? '').slice(0, 100),
295
+ expected: 'triggered',
296
+ got: 'not_triggered',
297
+ });
298
+ }
299
+ }
300
+ for (const tc of tn) {
301
+ totalTests++;
302
+ const event = buildEventFromTestCase(tc, rule);
303
+ const matches = engine.evaluate(event);
304
+ const triggered = matches.some(m => m.rule.id === rule.id);
305
+ if (!triggered) {
306
+ passed++;
307
+ }
308
+ else {
309
+ failed++;
310
+ failures.push({
311
+ ruleId: rule.id,
312
+ testType: 'true_negative',
313
+ input: String(tc.input ?? tc.tool_response ?? tc.agent_output ?? '').slice(0, 100),
314
+ expected: 'not_triggered',
315
+ got: 'triggered',
316
+ });
317
+ }
318
+ }
319
+ }
320
+ if (jsonOutput) {
321
+ console.log(JSON.stringify({ totalRules: rules.length, totalTests, passed, failed, failures }, null, 2));
322
+ return;
323
+ }
324
+ console.log(`\n${BOLD}ATR Test Runner${RESET}`);
325
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
326
+ console.log(` Rules tested: ${rules.length}`);
327
+ console.log(` Test cases: ${totalTests}`);
328
+ console.log(` ${GREEN}Passed:${RESET} ${passed}`);
329
+ if (failed > 0) {
330
+ console.log(` ${RED}Failed:${RESET} ${failed}`);
331
+ }
332
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
333
+ if (failures.length > 0) {
334
+ console.log(`\n${RED}Failures:${RESET}\n`);
335
+ for (const f of failures) {
336
+ console.log(` ${RED}FAIL${RESET} ${f.ruleId} [${f.testType}]`);
337
+ console.log(` ${DIM}Input: "${f.input}..."${RESET}`);
338
+ console.log(` Expected: ${f.expected}, Got: ${f.got}\n`);
339
+ }
340
+ process.exit(1);
341
+ }
342
+ else {
343
+ console.log(`\n${GREEN}All tests passed.${RESET}\n`);
344
+ }
345
+ }
346
+ function buildEventFromTestCase(tc, rule) {
347
+ // Stringify any object values
348
+ const str = (v) => {
349
+ if (v === undefined || v === null)
350
+ return '';
351
+ if (typeof v === 'string')
352
+ return v;
353
+ return JSON.stringify(v);
354
+ };
355
+ // Extract fields, handling both flat and object-style test cases.
356
+ // Object-style: input: { tool_name: "...", tool_args: "...", response: "..." }
357
+ // Flat-style: input: "...", tool_response: "...", tool_name: "..."
358
+ const rawInput = tc['input'];
359
+ let input = '';
360
+ let toolName = str(tc['tool_name']);
361
+ let toolArgs = str(tc['tool_args']);
362
+ let toolResponse = str(tc['tool_response']);
363
+ const agentOutput = str(tc['agent_output']);
364
+ if (rawInput !== null && rawInput !== undefined && typeof rawInput === 'object' && !Array.isArray(rawInput)) {
365
+ const inputObj = rawInput;
366
+ if (inputObj['tool_name'] && !toolName)
367
+ toolName = str(inputObj['tool_name']);
368
+ if (inputObj['tool_args'] && !toolArgs)
369
+ toolArgs = str(inputObj['tool_args']);
370
+ // Handle 'response' as alias for 'tool_response' (used in ATR-065 etc.)
371
+ if (inputObj['response'] && !toolResponse)
372
+ toolResponse = str(inputObj['response']);
373
+ if (inputObj['tool_response'] && !toolResponse)
374
+ toolResponse = str(inputObj['tool_response']);
375
+ // For object inputs, use tool_args as the primary string input.
376
+ // If no tool_args, only use JSON-stringified input as fallback when there's
377
+ // no other meaningful field (tool_response/response) extracted.
378
+ if (toolArgs) {
379
+ input = toolArgs;
380
+ }
381
+ else if (!toolResponse) {
382
+ input = str(rawInput);
383
+ }
384
+ }
385
+ else {
386
+ input = str(rawInput);
387
+ }
388
+ // Infer event type from rule's agent_source and test case structure
389
+ const sourceType = rule.agent_source?.type ?? 'llm_io';
390
+ const SOURCE_TO_EVENT = {
391
+ llm_io: 'llm_input',
392
+ tool_call: 'tool_call',
393
+ mcp_exchange: 'tool_response',
394
+ agent_behavior: 'agent_behavior',
395
+ multi_agent_comm: 'multi_agent_message',
396
+ context_window: 'llm_input',
397
+ memory_access: 'llm_input',
398
+ skill_lifecycle: 'tool_call',
399
+ skill_permission: 'tool_call',
400
+ skill_chain: 'tool_call',
401
+ };
402
+ let type = SOURCE_TO_EVENT[sourceType] ?? 'llm_input';
403
+ // If rule expects tool_call but test case has only plain text input
404
+ // (no tool_name, tool_args, or tool_response), use llm_input event type
405
+ // since the content is natural language, not a tool invocation.
406
+ // This prevents the engine's tool_name fallback from treating text as a tool name.
407
+ if (type === 'tool_call' && !toolName && !toolArgs && !toolResponse) {
408
+ type = 'llm_input';
409
+ }
410
+ // Determine the primary content based on what the rule conditions check
411
+ // Problem 2 & 3: For rules that check tool_response, the tool_response
412
+ // should be the primary content when the event type resolves tool_response from content
413
+ let content;
414
+ if (toolResponse && type === 'tool_response') {
415
+ // If event type is tool_response, engine resolves field:tool_response from event.content
416
+ content = toolResponse;
417
+ }
418
+ else {
419
+ content = input || toolResponse || agentOutput || '';
420
+ }
421
+ const fields = {};
422
+ // Populate ALL known field aliases so the engine can resolve any field name
423
+ if (input)
424
+ fields['user_input'] = input;
425
+ if (toolResponse)
426
+ fields['tool_response'] = toolResponse;
427
+ if (agentOutput)
428
+ fields['agent_output'] = agentOutput;
429
+ // Always set tool_name (even empty) to prevent engine fallback
430
+ // from using event.content as tool_name for tool_call events
431
+ fields['tool_name'] = toolName;
432
+ if (toolArgs)
433
+ fields['tool_args'] = toolArgs;
434
+ // For content-based rules, set content and agent_message fields
435
+ fields['content'] = content;
436
+ fields['agent_message'] = content;
437
+ return {
438
+ type,
439
+ timestamp: new Date().toISOString(),
440
+ content,
441
+ fields,
442
+ sessionId: 'test-session',
443
+ agentId: 'test-agent',
444
+ };
445
+ }
446
+ // --- STATS command ---
447
+ function cmdStats(options) {
448
+ const rulesDir = options['rules'] ? resolve(options['rules']) : RULES_DIR;
449
+ const jsonOutput = options['json'] === 'true';
450
+ const rules = loadRulesFromDirectory(rulesDir);
451
+ const byCategory = {};
452
+ const bySeverity = {};
453
+ const byMaturity = {};
454
+ const byTier = {};
455
+ let totalTP = 0;
456
+ let totalTN = 0;
457
+ let totalEvasion = 0;
458
+ let withCVE = 0;
459
+ for (const rule of rules) {
460
+ const cat = rule.tags?.category ?? 'unknown';
461
+ byCategory[cat] = (byCategory[cat] ?? 0) + 1;
462
+ bySeverity[rule.severity] = (bySeverity[rule.severity] ?? 0) + 1;
463
+ const maturity = rule['maturity'] ?? 'experimental';
464
+ byMaturity[maturity] = (byMaturity[maturity] ?? 0) + 1;
465
+ const tier = rule['detection_tier'] ?? 'pattern';
466
+ byTier[tier] = (byTier[tier] ?? 0) + 1;
467
+ if (rule.test_cases) {
468
+ totalTP += rule.test_cases.true_positives?.length ?? 0;
469
+ totalTN += rule.test_cases.true_negatives?.length ?? 0;
470
+ }
471
+ const evasion = rule['evasion_tests'];
472
+ if (Array.isArray(evasion))
473
+ totalEvasion += evasion.length;
474
+ if (rule.references?.cve && rule.references.cve.length > 0)
475
+ withCVE++;
476
+ }
477
+ if (jsonOutput) {
478
+ console.log(JSON.stringify({
479
+ totalRules: rules.length,
480
+ byCategory, bySeverity, byMaturity, byTier,
481
+ testCases: { truePositives: totalTP, trueNegatives: totalTN, evasionTests: totalEvasion },
482
+ rulesWithCVE: withCVE,
483
+ }, null, 2));
484
+ return;
485
+ }
486
+ console.log(`\n${BOLD}ATR Rule Collection Statistics${RESET}`);
487
+ console.log(`${DIM}${'─'.repeat(60)}${RESET}`);
488
+ console.log(` Total rules: ${rules.length}`);
489
+ console.log(` True positives: ${totalTP}`);
490
+ console.log(` True negatives: ${totalTN}`);
491
+ console.log(` Evasion tests: ${totalEvasion}`);
492
+ console.log(` Rules with CVE: ${withCVE}`);
493
+ console.log(`\n ${BOLD}By Category:${RESET}`);
494
+ for (const [cat, count] of Object.entries(byCategory).sort((a, b) => b[1] - a[1])) {
495
+ console.log(` ${cat.padEnd(24)} ${count}`);
496
+ }
497
+ console.log(`\n ${BOLD}By Severity:${RESET}`);
498
+ for (const sev of ['critical', 'high', 'medium', 'low', 'informational']) {
499
+ if (bySeverity[sev]) {
500
+ const color = SEVERITY_COLORS[sev] ?? '';
501
+ console.log(` ${color}${sev.padEnd(24)}${RESET} ${bySeverity[sev]}`);
502
+ }
503
+ }
504
+ console.log(`\n ${BOLD}By Maturity:${RESET}`);
505
+ for (const [mat, count] of Object.entries(byMaturity).sort((a, b) => b[1] - a[1])) {
506
+ console.log(` ${mat.padEnd(24)} ${count}`);
507
+ }
508
+ console.log(`\n ${BOLD}By Detection Tier:${RESET}`);
509
+ for (const [tier, count] of Object.entries(byTier).sort((a, b) => b[1] - a[1])) {
510
+ console.log(` ${tier.padEnd(24)} ${count}`);
511
+ }
512
+ console.log('');
513
+ }
514
+ // --- Main ---
515
+ async function main() {
516
+ const { command, target, options } = parseArgs(process.argv);
517
+ if (command === 'help' || options['help']) {
518
+ printUsage();
519
+ return;
520
+ }
521
+ switch (command) {
522
+ case 'scan':
523
+ await cmdScan(target, options);
524
+ break;
525
+ case 'validate':
526
+ cmdValidate(target, options);
527
+ break;
528
+ case 'test':
529
+ await cmdTest(target, options);
530
+ break;
531
+ case 'stats':
532
+ cmdStats(options);
533
+ break;
534
+ default:
535
+ console.error(`${RED}Unknown command: ${command}${RESET}`);
536
+ printUsage();
537
+ process.exit(1);
538
+ }
539
+ }
540
+ main().catch(err => {
541
+ console.error(`${RED}Error: ${err instanceof Error ? err.message : String(err)}${RESET}`);
542
+ process.exit(1);
543
+ });
544
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}