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
@@ -0,0 +1,18 @@
1
+ /**
2
+ * ATR (Agent Threat Rules) - Detection rules for AI Agent threats
3
+ *
4
+ * ATR is an open standard for writing detection rules specifically
5
+ * for AI agent threats. Think "Sigma for AI Agents."
6
+ *
7
+ * @module agent-threat-rules
8
+ */
9
+ export { ATREngine } from './engine.js';
10
+ export type { ATREngineConfig } from './engine.js';
11
+ export { SessionTracker } from './session-tracker.js';
12
+ export type { SessionStateSnapshot } from './session-tracker.js';
13
+ export { loadRuleFile, loadRulesFromDirectory, validateRule } from './loader.js';
14
+ export { ModuleRegistry } from './modules/index.js';
15
+ export type { ATRModule, ModuleCondition, ModuleResult } from './modules/index.js';
16
+ export { SessionModule } from './modules/session.js';
17
+ export type { ATRRule, ATRMatch, AgentEvent, AgentEventType, ATRAction, ATRCategory, ATRSeverity, ATRStatus, ATRConfidence, ATRSourceType, ATRMatchType, ATROperator, ATRReferences, ATRTags, ATRAgentSource, ATRDetection, ATRResponse, ATRTestCases, ATRTestCase, ATRPatternCondition, ATRBehavioralCondition, ATRSequenceCondition, ATRSequenceStep, } from './types.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EACV,OAAO,EACP,QAAQ,EACR,UAAU,EACV,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,aAAa,EACb,OAAO,EACP,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ATR (Agent Threat Rules) - Detection rules for AI Agent threats
3
+ *
4
+ * ATR is an open standard for writing detection rules specifically
5
+ * for AI agent threats. Think "Sigma for AI Agents."
6
+ *
7
+ * @module agent-threat-rules
8
+ */
9
+ export { ATREngine } from './engine.js';
10
+ export { SessionTracker } from './session-tracker.js';
11
+ export { loadRuleFile, loadRulesFromDirectory, validateRule } from './loader.js';
12
+ export { ModuleRegistry } from './modules/index.js';
13
+ export { SessionModule } from './modules/session.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ATR Rule Loader - Reads and parses ATR YAML rule files
3
+ * @module agent-threat-rules/loader
4
+ */
5
+ import type { ATRRule } from './types.js';
6
+ /**
7
+ * Load a single ATR rule from a YAML file.
8
+ */
9
+ export declare function loadRuleFile(filePath: string): ATRRule;
10
+ /**
11
+ * Recursively load all ATR YAML rules from a directory.
12
+ */
13
+ export declare function loadRulesFromDirectory(dirPath: string): ATRRule[];
14
+ /**
15
+ * Validate that a parsed object conforms to the ATR rule schema (basic checks).
16
+ */
17
+ export declare function validateRule(rule: unknown): {
18
+ valid: boolean;
19
+ errors: string[];
20
+ };
21
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAoBjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAwFhF"}
package/dist/loader.js ADDED
@@ -0,0 +1,124 @@
1
+ /**
2
+ * ATR Rule Loader - Reads and parses ATR YAML rule files
3
+ * @module agent-threat-rules/loader
4
+ */
5
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
6
+ import { join, extname } from 'node:path';
7
+ import yaml from 'js-yaml';
8
+ /**
9
+ * Load a single ATR rule from a YAML file.
10
+ */
11
+ export function loadRuleFile(filePath) {
12
+ const content = readFileSync(filePath, 'utf-8');
13
+ const parsed = yaml.load(content);
14
+ if (!parsed.id || !parsed.title || !parsed.detection) {
15
+ throw new Error(`Invalid ATR rule in ${filePath}: missing required fields (id, title, detection)`);
16
+ }
17
+ return parsed;
18
+ }
19
+ /**
20
+ * Recursively load all ATR YAML rules from a directory.
21
+ */
22
+ export function loadRulesFromDirectory(dirPath) {
23
+ const rules = [];
24
+ const entries = readdirSync(dirPath);
25
+ for (const entry of entries) {
26
+ const fullPath = join(dirPath, entry);
27
+ const stat = statSync(fullPath);
28
+ if (stat.isDirectory()) {
29
+ rules.push(...loadRulesFromDirectory(fullPath));
30
+ }
31
+ else if (stat.isFile() && (extname(entry) === '.yaml' || extname(entry) === '.yml')) {
32
+ try {
33
+ rules.push(loadRuleFile(fullPath));
34
+ }
35
+ catch {
36
+ // Skip invalid rule files — logged at caller level
37
+ }
38
+ }
39
+ }
40
+ return rules;
41
+ }
42
+ /**
43
+ * Validate that a parsed object conforms to the ATR rule schema (basic checks).
44
+ */
45
+ export function validateRule(rule) {
46
+ const errors = [];
47
+ const r = rule;
48
+ // Required fields
49
+ const required = ['title', 'id', 'status', 'description', 'author', 'date', 'severity', 'tags', 'agent_source', 'detection', 'response'];
50
+ for (const field of required) {
51
+ if (!r[field]) {
52
+ errors.push(`Missing required field: ${field}`);
53
+ }
54
+ }
55
+ // ID format
56
+ if (typeof r['id'] === 'string' && !/^ATR-\d{4}-\d{3}$/.test(r['id'])) {
57
+ errors.push(`Invalid id format: ${r['id']} (expected ATR-YYYY-NNN)`);
58
+ }
59
+ // Status enum
60
+ const validStatuses = ['draft', 'experimental', 'stable', 'deprecated'];
61
+ if (typeof r['status'] === 'string' && !validStatuses.includes(r['status'])) {
62
+ errors.push(`Invalid status: ${r['status']}`);
63
+ }
64
+ // Severity enum
65
+ const validSeverities = ['critical', 'high', 'medium', 'low', 'informational'];
66
+ if (typeof r['severity'] === 'string' && !validSeverities.includes(r['severity'])) {
67
+ errors.push(`Invalid severity: ${r['severity']}`);
68
+ }
69
+ // Tags category
70
+ const tags = r['tags'];
71
+ if (tags) {
72
+ const validCategories = [
73
+ 'prompt-injection', 'tool-poisoning', 'context-exfiltration',
74
+ 'agent-manipulation', 'privilege-escalation', 'excessive-autonomy',
75
+ 'data-poisoning', 'model-abuse', 'skill-compromise',
76
+ ];
77
+ if (typeof tags['category'] === 'string' && !validCategories.includes(tags['category'])) {
78
+ errors.push(`Invalid tags.category: ${tags['category']}`);
79
+ }
80
+ }
81
+ // Agent source type
82
+ const agentSource = r['agent_source'];
83
+ if (agentSource) {
84
+ const validTypes = [
85
+ 'llm_io', 'tool_call', 'mcp_exchange', 'agent_behavior',
86
+ 'multi_agent_comm', 'context_window', 'memory_access',
87
+ 'skill_lifecycle', 'skill_permission', 'skill_chain',
88
+ ];
89
+ if (typeof agentSource['type'] === 'string' && !validTypes.includes(agentSource['type'])) {
90
+ errors.push(`Invalid agent_source.type: ${agentSource['type']}`);
91
+ }
92
+ }
93
+ // Detection must have conditions and condition
94
+ const detection = r['detection'];
95
+ if (detection) {
96
+ if (!detection['conditions']) {
97
+ errors.push('Missing detection.conditions');
98
+ }
99
+ if (!detection['condition']) {
100
+ errors.push('Missing detection.condition');
101
+ }
102
+ }
103
+ // Response must have actions
104
+ const response = r['response'];
105
+ if (response) {
106
+ if (!Array.isArray(response['actions']) || response['actions'].length === 0) {
107
+ errors.push('Missing or empty response.actions');
108
+ }
109
+ }
110
+ // Test cases validation
111
+ const testCases = r['test_cases'];
112
+ if (testCases) {
113
+ const tp = testCases['true_positives'];
114
+ const tn = testCases['true_negatives'];
115
+ if (!Array.isArray(tp) || tp.length === 0) {
116
+ errors.push('test_cases.true_positives must have at least one entry');
117
+ }
118
+ if (!Array.isArray(tn) || tn.length === 0) {
119
+ errors.push('test_cases.true_negatives must have at least one entry');
120
+ }
121
+ }
122
+ return { valid: errors.length === 0, errors };
123
+ }
124
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * ATR Module System
3
+ *
4
+ * Extensible detection modules beyond regex pattern matching.
5
+ * Inspired by YARA modules, adapted for AI agent threat detection.
6
+ *
7
+ * Built-in modules:
8
+ * - session: Cross-event behavioral analysis using SessionTracker
9
+ *
10
+ * Reserved namespaces (planned):
11
+ * - embedding: Semantic similarity detection (v0.2)
12
+ * - protocol: MCP/transport-level inspection (v0.2)
13
+ * - entropy: Information-theoretic anomaly detection (v0.3)
14
+ * - tokenizer: Token-level analysis for smuggling detection (v0.3)
15
+ *
16
+ * @module agent-threat-rules/modules
17
+ */
18
+ import type { AgentEvent } from '../types.js';
19
+ /**
20
+ * Condition defined by a module (used in rule YAML).
21
+ *
22
+ * Example in YAML:
23
+ * ```yaml
24
+ * detection:
25
+ * conditions:
26
+ * high_frequency:
27
+ * module: session
28
+ * function: call_frequency
29
+ * args:
30
+ * tool_name: "execute_code"
31
+ * window: "5m"
32
+ * operator: gt
33
+ * threshold: 10
34
+ * condition: "high_frequency"
35
+ * ```
36
+ */
37
+ export interface ModuleCondition {
38
+ /** Module name (e.g., "session", "embedding") */
39
+ module: string;
40
+ /** Function within the module to call */
41
+ function: string;
42
+ /** Arguments passed to the module function */
43
+ args: Record<string, unknown>;
44
+ /** Comparison operator for the result */
45
+ operator: 'gt' | 'lt' | 'eq' | 'gte' | 'lte';
46
+ /** Threshold value to compare against */
47
+ threshold: number;
48
+ }
49
+ /**
50
+ * Result returned by a module evaluation.
51
+ */
52
+ export interface ModuleResult {
53
+ /** Whether the condition was met */
54
+ matched: boolean;
55
+ /** Numeric value produced by the module (for threshold comparison) */
56
+ value: number;
57
+ /** Human-readable description of the result */
58
+ description: string;
59
+ }
60
+ /**
61
+ * Interface that all ATR detection modules must implement.
62
+ *
63
+ * Modules extend ATR's detection beyond regex by providing
64
+ * custom evaluation logic (behavioral analysis, embedding
65
+ * similarity, protocol inspection, etc.).
66
+ */
67
+ export interface ATRModule {
68
+ /** Unique module name (used in rule YAML) */
69
+ readonly name: string;
70
+ /** Human-readable description */
71
+ readonly description: string;
72
+ /** Module version */
73
+ readonly version: string;
74
+ /**
75
+ * List of functions this module provides.
76
+ * Each function can be referenced in rule conditions.
77
+ */
78
+ readonly functions: ReadonlyArray<{
79
+ name: string;
80
+ description: string;
81
+ args: ReadonlyArray<{
82
+ name: string;
83
+ type: 'string' | 'number' | 'boolean';
84
+ required: boolean;
85
+ description: string;
86
+ }>;
87
+ }>;
88
+ /**
89
+ * Initialize the module. Called once when the engine starts.
90
+ * Use for setup, connection pooling, model loading, etc.
91
+ */
92
+ initialize(): Promise<void>;
93
+ /**
94
+ * Evaluate a module condition against an agent event.
95
+ *
96
+ * @param event - The agent event being evaluated
97
+ * @param condition - The module condition from the rule
98
+ * @returns Module evaluation result
99
+ */
100
+ evaluate(event: AgentEvent, condition: ModuleCondition): Promise<ModuleResult>;
101
+ /**
102
+ * Clean up module resources. Called when the engine shuts down.
103
+ */
104
+ destroy(): Promise<void>;
105
+ }
106
+ /**
107
+ * Registry for ATR detection modules.
108
+ */
109
+ export declare class ModuleRegistry {
110
+ private readonly modules;
111
+ /** Reserved module namespaces (cannot be registered by third parties) */
112
+ private static readonly RESERVED;
113
+ /**
114
+ * Register a detection module.
115
+ * @throws if module name is already registered or reserved
116
+ */
117
+ register(module: ATRModule): void;
118
+ /**
119
+ * Check if a module name is reserved by the ATR core team.
120
+ */
121
+ isReserved(name: string): boolean;
122
+ /**
123
+ * Get a registered module by name.
124
+ */
125
+ get(name: string): ATRModule | undefined;
126
+ /**
127
+ * List all registered modules.
128
+ */
129
+ list(): ReadonlyArray<{
130
+ name: string;
131
+ version: string;
132
+ description: string;
133
+ }>;
134
+ /**
135
+ * Initialize all registered modules.
136
+ */
137
+ initializeAll(): Promise<void>;
138
+ /**
139
+ * Destroy all registered modules.
140
+ */
141
+ destroyAll(): Promise<void>;
142
+ }
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,yCAAyC;IACzC,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC;IAC7C,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,qBAAqB;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,aAAa,CAAC;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH;;;OAGG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/E;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAM7B;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAOjC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIxC;;OAEG;IACH,IAAI,IAAI,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ7E;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * ATR Module System
3
+ *
4
+ * Extensible detection modules beyond regex pattern matching.
5
+ * Inspired by YARA modules, adapted for AI agent threat detection.
6
+ *
7
+ * Built-in modules:
8
+ * - session: Cross-event behavioral analysis using SessionTracker
9
+ *
10
+ * Reserved namespaces (planned):
11
+ * - embedding: Semantic similarity detection (v0.2)
12
+ * - protocol: MCP/transport-level inspection (v0.2)
13
+ * - entropy: Information-theoretic anomaly detection (v0.3)
14
+ * - tokenizer: Token-level analysis for smuggling detection (v0.3)
15
+ *
16
+ * @module agent-threat-rules/modules
17
+ */
18
+ /**
19
+ * Registry for ATR detection modules.
20
+ */
21
+ export class ModuleRegistry {
22
+ modules = new Map();
23
+ /** Reserved module namespaces (cannot be registered by third parties) */
24
+ static RESERVED = new Set([
25
+ 'session',
26
+ 'embedding',
27
+ 'protocol',
28
+ 'entropy',
29
+ 'tokenizer',
30
+ ]);
31
+ /**
32
+ * Register a detection module.
33
+ * @throws if module name is already registered or reserved
34
+ */
35
+ register(module) {
36
+ if (this.modules.has(module.name)) {
37
+ throw new Error(`Module "${module.name}" is already registered`);
38
+ }
39
+ this.modules.set(module.name, module);
40
+ }
41
+ /**
42
+ * Check if a module name is reserved by the ATR core team.
43
+ */
44
+ isReserved(name) {
45
+ return ModuleRegistry.RESERVED.has(name);
46
+ }
47
+ /**
48
+ * Get a registered module by name.
49
+ */
50
+ get(name) {
51
+ return this.modules.get(name);
52
+ }
53
+ /**
54
+ * List all registered modules.
55
+ */
56
+ list() {
57
+ return Array.from(this.modules.values()).map(m => ({
58
+ name: m.name,
59
+ version: m.version,
60
+ description: m.description,
61
+ }));
62
+ }
63
+ /**
64
+ * Initialize all registered modules.
65
+ */
66
+ async initializeAll() {
67
+ for (const module of this.modules.values()) {
68
+ await module.initialize();
69
+ }
70
+ }
71
+ /**
72
+ * Destroy all registered modules.
73
+ */
74
+ async destroyAll() {
75
+ for (const module of this.modules.values()) {
76
+ await module.destroy();
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/modules/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAoGH;;GAEG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAExD,yEAAyE;IACjE,MAAM,CAAU,QAAQ,GAAG,IAAI,GAAG,CAAC;QACzC,SAAS;QACT,WAAW;QACX,UAAU;QACV,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IAEH;;;OAGG;IACH,QAAQ,CAAC,MAAiB;QACxB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,yBAAyB,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;SAC3B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;IACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * ATR Session Module - Built-in behavioral detection module
3
+ *
4
+ * Provides cross-event analysis using SessionTracker.
5
+ * This is the reference implementation for ATR modules.
6
+ *
7
+ * Functions:
8
+ * - call_frequency: Count tool calls within a time window
9
+ * - pattern_frequency: Count pattern occurrences within a window
10
+ * - event_count: Total events in a session within a window
11
+ * - session_age: Time since first event in session (seconds)
12
+ *
13
+ * @module agent-threat-rules/modules/session
14
+ */
15
+ import type { AgentEvent } from '../types.js';
16
+ import { SessionTracker } from '../session-tracker.js';
17
+ import type { ATRModule, ModuleCondition, ModuleResult } from './index.js';
18
+ export declare class SessionModule implements ATRModule {
19
+ readonly name = "session";
20
+ readonly description = "Cross-event behavioral analysis using session state tracking";
21
+ readonly version = "0.1.0";
22
+ readonly functions: readonly [{
23
+ readonly name: "call_frequency";
24
+ readonly description: "Count how many times a specific tool was called within a time window";
25
+ readonly args: readonly [{
26
+ readonly name: "tool_name";
27
+ readonly type: "string";
28
+ readonly required: true;
29
+ readonly description: "Tool name to count";
30
+ }, {
31
+ readonly name: "window";
32
+ readonly type: "string";
33
+ readonly required: false;
34
+ readonly description: "Time window (e.g., \"5m\", \"1h\"). Default: 5m";
35
+ }];
36
+ }, {
37
+ readonly name: "pattern_frequency";
38
+ readonly description: "Count how many times a pattern was matched within a time window";
39
+ readonly args: readonly [{
40
+ readonly name: "pattern";
41
+ readonly type: "string";
42
+ readonly required: true;
43
+ readonly description: "Pattern string to count";
44
+ }, {
45
+ readonly name: "window";
46
+ readonly type: "string";
47
+ readonly required: false;
48
+ readonly description: "Time window. Default: 5m";
49
+ }];
50
+ }, {
51
+ readonly name: "event_count";
52
+ readonly description: "Total number of events in the current session within a time window";
53
+ readonly args: readonly [{
54
+ readonly name: "window";
55
+ readonly type: "string";
56
+ readonly required: false;
57
+ readonly description: "Time window. Default: 5m";
58
+ }];
59
+ }, {
60
+ readonly name: "session_age";
61
+ readonly description: "Time in seconds since the first event in this session";
62
+ readonly args: readonly [];
63
+ }];
64
+ private tracker;
65
+ constructor(tracker?: SessionTracker);
66
+ initialize(): Promise<void>;
67
+ evaluate(event: AgentEvent, condition: ModuleCondition): Promise<ModuleResult>;
68
+ destroy(): Promise<void>;
69
+ }
70
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/modules/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,kEAAkE;IACtF,QAAQ,CAAC,OAAO,WAAW;IAE3B,QAAQ,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BP;IAEX,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE,cAAc;IAI9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;IAqD9E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * ATR Session Module - Built-in behavioral detection module
3
+ *
4
+ * Provides cross-event analysis using SessionTracker.
5
+ * This is the reference implementation for ATR modules.
6
+ *
7
+ * Functions:
8
+ * - call_frequency: Count tool calls within a time window
9
+ * - pattern_frequency: Count pattern occurrences within a window
10
+ * - event_count: Total events in a session within a window
11
+ * - session_age: Time since first event in session (seconds)
12
+ *
13
+ * @module agent-threat-rules/modules/session
14
+ */
15
+ import { SessionTracker } from '../session-tracker.js';
16
+ export class SessionModule {
17
+ name = 'session';
18
+ description = 'Cross-event behavioral analysis using session state tracking';
19
+ version = '0.1.0';
20
+ functions = [
21
+ {
22
+ name: 'call_frequency',
23
+ description: 'Count how many times a specific tool was called within a time window',
24
+ args: [
25
+ { name: 'tool_name', type: 'string', required: true, description: 'Tool name to count' },
26
+ { name: 'window', type: 'string', required: false, description: 'Time window (e.g., "5m", "1h"). Default: 5m' },
27
+ ],
28
+ },
29
+ {
30
+ name: 'pattern_frequency',
31
+ description: 'Count how many times a pattern was matched within a time window',
32
+ args: [
33
+ { name: 'pattern', type: 'string', required: true, description: 'Pattern string to count' },
34
+ { name: 'window', type: 'string', required: false, description: 'Time window. Default: 5m' },
35
+ ],
36
+ },
37
+ {
38
+ name: 'event_count',
39
+ description: 'Total number of events in the current session within a time window',
40
+ args: [
41
+ { name: 'window', type: 'string', required: false, description: 'Time window. Default: 5m' },
42
+ ],
43
+ },
44
+ {
45
+ name: 'session_age',
46
+ description: 'Time in seconds since the first event in this session',
47
+ args: [],
48
+ },
49
+ ];
50
+ tracker;
51
+ constructor(tracker) {
52
+ this.tracker = tracker ?? new SessionTracker();
53
+ }
54
+ async initialize() {
55
+ // SessionTracker is ready immediately, no async setup needed
56
+ }
57
+ async evaluate(event, condition) {
58
+ const sessionId = event.sessionId ?? 'default';
59
+ const fn = condition.function;
60
+ const args = condition.args;
61
+ let value = 0;
62
+ let description = '';
63
+ switch (fn) {
64
+ case 'call_frequency': {
65
+ const toolName = String(args['tool_name'] ?? '');
66
+ const window = String(args['window'] ?? '5m');
67
+ const windowMs = parseWindow(window);
68
+ value = this.tracker.getCallFrequency(sessionId, toolName, windowMs);
69
+ description = `Tool "${toolName}" called ${value} times in ${window}`;
70
+ break;
71
+ }
72
+ case 'pattern_frequency': {
73
+ const pattern = String(args['pattern'] ?? '');
74
+ const window = String(args['window'] ?? '5m');
75
+ const windowMs = parseWindow(window);
76
+ value = this.tracker.getPatternFrequency(sessionId, pattern, windowMs);
77
+ description = `Pattern "${pattern}" seen ${value} times in ${window}`;
78
+ break;
79
+ }
80
+ case 'event_count': {
81
+ const window = String(args['window'] ?? '5m');
82
+ const windowMs = parseWindow(window);
83
+ value = this.tracker.getEventCount(sessionId, windowMs);
84
+ description = `${value} events in session within ${window}`;
85
+ break;
86
+ }
87
+ case 'session_age': {
88
+ const snapshot = this.tracker.getSessionSnapshot(sessionId);
89
+ if (snapshot && snapshot.oldestEventTimestamp) {
90
+ value = Math.floor((Date.now() - snapshot.oldestEventTimestamp) / 1000);
91
+ }
92
+ description = `Session age: ${value} seconds`;
93
+ break;
94
+ }
95
+ default:
96
+ return { matched: false, value: 0, description: `Unknown function: ${fn}` };
97
+ }
98
+ const matched = compare(value, condition.operator, condition.threshold);
99
+ return { matched, value, description };
100
+ }
101
+ async destroy() {
102
+ // No cleanup needed
103
+ }
104
+ }
105
+ function compare(value, operator, threshold) {
106
+ switch (operator) {
107
+ case 'gt': return value > threshold;
108
+ case 'lt': return value < threshold;
109
+ case 'eq': return value === threshold;
110
+ case 'gte': return value >= threshold;
111
+ case 'lte': return value <= threshold;
112
+ default: return false;
113
+ }
114
+ }
115
+ function parseWindow(window) {
116
+ const match = window.match(/^(\d+)(s|m|h)$/);
117
+ if (!match)
118
+ return 300_000; // default 5m
119
+ const [, num, unit] = match;
120
+ const n = parseInt(num, 10);
121
+ switch (unit) {
122
+ case 's': return n * 1000;
123
+ case 'm': return n * 60_000;
124
+ case 'h': return n * 3_600_000;
125
+ default: return 300_000;
126
+ }
127
+ }
128
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/modules/session.ts"],"names":[],"mappings":"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"}