@empowered-humanity/agent-security 1.0.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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +295 -0
  3. package/SECURITY.md +96 -0
  4. package/dist/index.d.ts +14 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +200 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/patterns/agent-attacks.d.ts +53 -0
  9. package/dist/patterns/agent-attacks.d.ts.map +1 -0
  10. package/dist/patterns/agent-attacks.js +304 -0
  11. package/dist/patterns/agent-attacks.js.map +1 -0
  12. package/dist/patterns/credentials.d.ts +30 -0
  13. package/dist/patterns/credentials.d.ts.map +1 -0
  14. package/dist/patterns/credentials.js +231 -0
  15. package/dist/patterns/credentials.js.map +1 -0
  16. package/dist/patterns/defense-evasion.d.ts +39 -0
  17. package/dist/patterns/defense-evasion.d.ts.map +1 -0
  18. package/dist/patterns/defense-evasion.js +193 -0
  19. package/dist/patterns/defense-evasion.js.map +1 -0
  20. package/dist/patterns/index.d.ts +73 -0
  21. package/dist/patterns/index.d.ts.map +1 -0
  22. package/dist/patterns/index.js +114 -0
  23. package/dist/patterns/index.js.map +1 -0
  24. package/dist/patterns/injection.d.ts +68 -0
  25. package/dist/patterns/injection.d.ts.map +1 -0
  26. package/dist/patterns/injection.js +398 -0
  27. package/dist/patterns/injection.js.map +1 -0
  28. package/dist/patterns/mcp-checklist.d.ts +30 -0
  29. package/dist/patterns/mcp-checklist.d.ts.map +1 -0
  30. package/dist/patterns/mcp-checklist.js +559 -0
  31. package/dist/patterns/mcp-checklist.js.map +1 -0
  32. package/dist/patterns/owasp-asi.d.ts +79 -0
  33. package/dist/patterns/owasp-asi.d.ts.map +1 -0
  34. package/dist/patterns/owasp-asi.js +274 -0
  35. package/dist/patterns/owasp-asi.js.map +1 -0
  36. package/dist/patterns/rce.d.ts +44 -0
  37. package/dist/patterns/rce.d.ts.map +1 -0
  38. package/dist/patterns/rce.js +276 -0
  39. package/dist/patterns/rce.js.map +1 -0
  40. package/dist/patterns/types.d.ts +134 -0
  41. package/dist/patterns/types.d.ts.map +1 -0
  42. package/dist/patterns/types.js +8 -0
  43. package/dist/patterns/types.js.map +1 -0
  44. package/dist/reporters/console.d.ts +31 -0
  45. package/dist/reporters/console.d.ts.map +1 -0
  46. package/dist/reporters/console.js +147 -0
  47. package/dist/reporters/console.js.map +1 -0
  48. package/dist/reporters/index.d.ts +6 -0
  49. package/dist/reporters/index.d.ts.map +1 -0
  50. package/dist/reporters/index.js +6 -0
  51. package/dist/reporters/index.js.map +1 -0
  52. package/dist/reporters/json.d.ts +19 -0
  53. package/dist/reporters/json.d.ts.map +1 -0
  54. package/dist/reporters/json.js +74 -0
  55. package/dist/reporters/json.js.map +1 -0
  56. package/dist/scanner/content-scanner.d.ts +40 -0
  57. package/dist/scanner/content-scanner.d.ts.map +1 -0
  58. package/dist/scanner/content-scanner.js +101 -0
  59. package/dist/scanner/content-scanner.js.map +1 -0
  60. package/dist/scanner/engine.d.ts +38 -0
  61. package/dist/scanner/engine.d.ts.map +1 -0
  62. package/dist/scanner/engine.js +373 -0
  63. package/dist/scanner/engine.js.map +1 -0
  64. package/dist/scanner/index.d.ts +6 -0
  65. package/dist/scanner/index.d.ts.map +1 -0
  66. package/dist/scanner/index.js +6 -0
  67. package/dist/scanner/index.js.map +1 -0
  68. package/package.json +88 -0
  69. package/sbom.json +107 -0
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Pattern Matching Engine
3
+ *
4
+ * Core engine for matching security patterns against content.
5
+ * Includes:
6
+ * - Context-aware filtering (file type → pattern context matching)
7
+ * - Test file detection and severity downgrade
8
+ * - Auto-classification of findings (why the finding exists)
9
+ * - Taint proximity analysis (is user input near dangerous sinks?)
10
+ * - Context flow tracing (does serialized context reach external tools?)
11
+ */
12
+ import type { DetectionPattern, Finding, FindingClassification, MatchContext, RiskScore, ScanResult, TaintProximity } from '../patterns/types.js';
13
+ export declare function inferFileContext(filePath: string): MatchContext;
14
+ export declare function shouldApplyPattern(pattern: DetectionPattern, filePath: string): boolean;
15
+ export declare function isTestFile(filePath: string): boolean;
16
+ export declare function classifyFinding(finding: Finding): FindingClassification;
17
+ export declare function analyzeTaintProximity(lines: string[], sinkLineIndex: number, windowSize?: number): TaintProximity;
18
+ export declare function traceContextFlow(lines: string[], serializeLineIndex: number, windowSize?: number): string[] | undefined;
19
+ /**
20
+ * Match a single pattern against content with full intelligence pipeline
21
+ */
22
+ export declare function matchPattern(pattern: DetectionPattern, content: string, file: string): Finding[];
23
+ /**
24
+ * Match multiple patterns against content
25
+ */
26
+ export declare function matchPatterns(patterns: DetectionPattern[], content: string, file: string): Finding[];
27
+ export declare function calculateRiskScore(findings: Finding[]): RiskScore;
28
+ export declare function deduplicateFindings(findings: Finding[]): Finding[];
29
+ export declare function sortFindingsBySeverity(findings: Finding[]): Finding[];
30
+ export declare function groupFindingsByFile(findings: Finding[]): Map<string, Finding[]>;
31
+ export declare function groupFindingsByCategory(findings: Finding[]): Map<string, Finding[]>;
32
+ /**
33
+ * Group findings by classification
34
+ */
35
+ export declare function groupFindingsByClassification(findings: Finding[]): Map<FindingClassification, Finding[]>;
36
+ export declare function filterFindingsBySeverity(findings: Finding[], minSeverity: 'critical' | 'high' | 'medium' | 'low'): Finding[];
37
+ export declare function createScanResult(filesScanned: number, patternsChecked: number, findings: Finding[], startTime: number): ScanResult;
38
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/scanner/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,OAAO,EACP,qBAAqB,EACrB,YAAY,EACZ,SAAS,EAET,UAAU,EACV,cAAc,EACf,MAAM,sBAAsB,CAAC;AA+B9B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAQ/D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAevF;AAwBD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGpD;AAwCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,qBAAqB,CA+CvE;AAcD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,aAAa,EAAE,MAAM,EACrB,UAAU,SAAK,GACd,cAAc,CAkBhB;AASD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,MAAM,EAC1B,UAAU,SAAK,GACd,MAAM,EAAE,GAAG,SAAS,CAyBtB;AAYD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,EAAE,CA2DX;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,GACX,OAAO,EAAE,CAMX;AAMD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAuBjE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAQlE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAKrE;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAQ/E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CASnF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,qBAAqB,EAAE,OAAO,EAAE,CAAC,CAQxG;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAClD,OAAO,EAAE,CAIX;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,MAAM,GAChB,UAAU,CASZ"}
@@ -0,0 +1,373 @@
1
+ /**
2
+ * Pattern Matching Engine
3
+ *
4
+ * Core engine for matching security patterns against content.
5
+ * Includes:
6
+ * - Context-aware filtering (file type → pattern context matching)
7
+ * - Test file detection and severity downgrade
8
+ * - Auto-classification of findings (why the finding exists)
9
+ * - Taint proximity analysis (is user input near dangerous sinks?)
10
+ * - Context flow tracing (does serialized context reach external tools?)
11
+ */
12
+ // ═══════════════════════════════════════════════════════════
13
+ // Context-Aware Filtering
14
+ // ═══════════════════════════════════════════════════════════
15
+ const RUNTIME_ONLY_CONTEXTS = [
16
+ 'file_write_operation',
17
+ 'file_create',
18
+ 'outbound_request',
19
+ 'email_operation',
20
+ 'url_parameter',
21
+ 'user_input',
22
+ ];
23
+ const EXT_CONTEXT_MAP = {
24
+ '.json': 'config', '.yaml': 'config', '.yml': 'config', '.toml': 'config',
25
+ '.ini': 'config', '.cfg': 'config', '.conf': 'config', '.xml': 'config',
26
+ '.ts': 'code', '.tsx': 'code', '.js': 'code', '.jsx': 'code',
27
+ '.py': 'code', '.go': 'code', '.rs': 'code', '.java': 'code',
28
+ '.c': 'code', '.cpp': 'code', '.rb': 'code',
29
+ '.sh': 'code', '.bash': 'code', '.zsh': 'code', '.ps1': 'code',
30
+ '.md': 'prompt', '.txt': 'prompt', '.rst': 'prompt',
31
+ };
32
+ const DEPENDENCY_FILE_PATTERNS = [
33
+ /package\.json$/i, /requirements\.txt$/i, /Pipfile$/i,
34
+ /Cargo\.toml$/i, /go\.mod$/i, /go\.sum$/i, /Gemfile$/i,
35
+ /pom\.xml$/i, /build\.gradle$/i, /\.csproj$/i,
36
+ ];
37
+ export function inferFileContext(filePath) {
38
+ const lower = filePath.toLowerCase().replace(/\\/g, '/');
39
+ if (/\.env(?:\.\w+)?$/.test(lower))
40
+ return 'config';
41
+ for (const depPattern of DEPENDENCY_FILE_PATTERNS) {
42
+ if (depPattern.test(lower))
43
+ return 'dependency_version';
44
+ }
45
+ const ext = lower.match(/\.[^./\\]+$/)?.[0] || '';
46
+ return EXT_CONTEXT_MAP[ext] || 'any';
47
+ }
48
+ export function shouldApplyPattern(pattern, filePath) {
49
+ const patternContext = pattern.context;
50
+ if (!patternContext || patternContext === 'any')
51
+ return true;
52
+ if (RUNTIME_ONLY_CONTEXTS.includes(patternContext))
53
+ return false;
54
+ const fileContext = inferFileContext(filePath);
55
+ if (fileContext === 'any')
56
+ return true;
57
+ if (patternContext === 'dependency_version')
58
+ return fileContext === 'dependency_version';
59
+ if (patternContext === 'generated_code' || patternContext === 'command_template')
60
+ return fileContext === 'code';
61
+ if (patternContext === 'config')
62
+ return fileContext === 'config' || fileContext === 'dependency_version';
63
+ if (patternContext === 'code')
64
+ return fileContext === 'code';
65
+ if (patternContext === 'prompt')
66
+ return fileContext === 'prompt';
67
+ return true;
68
+ }
69
+ // ═══════════════════════════════════════════════════════════
70
+ // Test File Detection
71
+ // ═══════════════════════════════════════════════════════════
72
+ const TEST_PATH_PATTERNS = [
73
+ /[/\\]tests?[/\\]/i,
74
+ /[/\\]__tests__[/\\]/i,
75
+ /[/\\]test_/i,
76
+ /[/\\]spec[/\\]/i,
77
+ /[/\\]fixtures?[/\\]/i,
78
+ /[/\\]mocks?[/\\]/i,
79
+ /[/\\]stubs?[/\\]/i,
80
+ /[/\\]examples?[/\\]/i,
81
+ /[/\\]e2e[/\\]/i,
82
+ /\.test\.\w+$/i,
83
+ /\.spec\.\w+$/i,
84
+ /_test\.\w+$/i,
85
+ /test_\w+\.\w+$/i,
86
+ /\.fixture\.\w+$/i,
87
+ /\.mock\.\w+$/i,
88
+ ];
89
+ export function isTestFile(filePath) {
90
+ const normalized = filePath.replace(/\\/g, '/');
91
+ return TEST_PATH_PATTERNS.some(p => p.test(normalized));
92
+ }
93
+ const SEVERITY_DOWNGRADE = {
94
+ critical: 'high',
95
+ high: 'medium',
96
+ medium: 'low',
97
+ low: 'low',
98
+ };
99
+ // ═══════════════════════════════════════════════════════════
100
+ // Auto-Classification
101
+ // ═══════════════════════════════════════════════════════════
102
+ const INJECTION_CATEGORIES = new Set([
103
+ 'instruction_override', 'role_manipulation', 'boundary_escape',
104
+ 'hierarchy_violation', 'goal_hijacking', 'rag_poisoning',
105
+ 'hidden_injection', 'stealth_instruction', 'session_smuggling',
106
+ 'behavior_manipulation', 'adversarial_suffix', 'prompt_extraction',
107
+ ]);
108
+ const CREDENTIAL_CATEGORIES = new Set([
109
+ 'credential_exposure', 'credential_theft',
110
+ ]);
111
+ const CONFIG_CATEGORIES = new Set([
112
+ 'config_vulnerability', 'permission_escalation',
113
+ ]);
114
+ const ARCHITECTURAL_CATEGORIES = new Set([
115
+ 'cross_agent_escalation', 'mcp_attack', 'persistence',
116
+ 'ASI01_goal_hijack', 'ASI02_tool_misuse', 'ASI03_privilege_abuse',
117
+ 'ASI04_supply_chain', 'ASI06_memory_poisoning', 'ASI07_insecure_comms',
118
+ 'ASI08_cascading_failures', 'ASI09_trust_exploitation', 'ASI10_rogue_agents',
119
+ ]);
120
+ const SUPPLY_CHAIN_PATTERNS = new Set([
121
+ 'mcp_version_unpinned', 'mcp_dependency_wildcard', 'mcp_unsigned_plugin',
122
+ 'mcp_install_untrusted_registry', 'mcp_no_tool_integrity_check',
123
+ ]);
124
+ export function classifyFinding(finding) {
125
+ const { pattern, isTestFile: inTestFile } = finding;
126
+ // Test payloads: injection patterns found in test files of security tools
127
+ if (inTestFile && INJECTION_CATEGORIES.has(pattern.category)) {
128
+ return 'test_payload';
129
+ }
130
+ // Supply chain risks
131
+ if (SUPPLY_CHAIN_PATTERNS.has(pattern.name) || pattern.category === 'ASI04_supply_chain') {
132
+ return 'supply_chain_risk';
133
+ }
134
+ // Credential exposure
135
+ if (CREDENTIAL_CATEGORIES.has(pattern.category)) {
136
+ return inTestFile ? 'credential_exposure' : 'credential_exposure';
137
+ }
138
+ // Configuration risks
139
+ if (CONFIG_CATEGORIES.has(pattern.category)) {
140
+ return 'configuration_risk';
141
+ }
142
+ // Architectural weaknesses
143
+ if (ARCHITECTURAL_CATEGORIES.has(pattern.category)) {
144
+ return 'architectural_weakness';
145
+ }
146
+ // Code execution patterns
147
+ if (pattern.category === 'code_injection' || pattern.category === 'argument_injection' ||
148
+ pattern.category === 'ssrf' || pattern.category === 'ASI05_rce' ||
149
+ pattern.category === 'dangerous_commands') {
150
+ return 'live_vulnerability';
151
+ }
152
+ // Data exfiltration / defense evasion
153
+ if (pattern.category === 'data_exfiltration' || pattern.category === 'defense_evasion' ||
154
+ pattern.category === 'rendering_exfil') {
155
+ return inTestFile ? 'test_payload' : 'live_vulnerability';
156
+ }
157
+ // Injection patterns in non-test files
158
+ if (INJECTION_CATEGORIES.has(pattern.category)) {
159
+ return 'live_vulnerability';
160
+ }
161
+ return 'unclassified';
162
+ }
163
+ // ═══════════════════════════════════════════════════════════
164
+ // Taint Proximity Analysis
165
+ // ═══════════════════════════════════════════════════════════
166
+ const TAINT_SINK_PATTERNS = new Set([
167
+ 'eval_exec_usage', 'dangerous_module_import', 'pickle_loads',
168
+ 'shell_true', 'langchain_import_bypass', 'langchain_palchain',
169
+ 'asi05_code_execution',
170
+ ]);
171
+ const TAINT_SOURCE_REGEX = /(?:input\s*\(|request\.|req\.body|req\.query|req\.params|argv|sys\.stdin|process\.stdin|\.invoke\(|\.generate\(|\.complete\(|\.chat\(|user_input|user_message|prompt_text|raw_input|from_user)/i;
172
+ export function analyzeTaintProximity(lines, sinkLineIndex, windowSize = 10) {
173
+ // Check the sink line itself
174
+ if (TAINT_SOURCE_REGEX.test(lines[sinkLineIndex])) {
175
+ return 'direct';
176
+ }
177
+ // Check surrounding lines within window
178
+ const start = Math.max(0, sinkLineIndex - windowSize);
179
+ const end = Math.min(lines.length, sinkLineIndex + windowSize + 1);
180
+ for (let i = start; i < end; i++) {
181
+ if (i === sinkLineIndex)
182
+ continue;
183
+ if (TAINT_SOURCE_REGEX.test(lines[i])) {
184
+ return 'nearby';
185
+ }
186
+ }
187
+ return 'distant';
188
+ }
189
+ // ═══════════════════════════════════════════════════════════
190
+ // Context Flow Tracing
191
+ // ═══════════════════════════════════════════════════════════
192
+ const CONTEXT_SERIALIZE_REGEX = /(?:JSON\.stringify|\.dump|serialize|\.toString)\s*\(.*(?:context|conversation|history|messages|chat_log|memory)/i;
193
+ const EXTERNAL_CALL_REGEX = /(?:fetch|axios|request|http\.|urllib|requests\.|tool_call|function_call|mcp|\.post\(|\.get\(|\.send\()/i;
194
+ export function traceContextFlow(lines, serializeLineIndex, windowSize = 15) {
195
+ const chain = [];
196
+ // Record the serialization point
197
+ chain.push(`serialize@L${serializeLineIndex + 1}: ${lines[serializeLineIndex].trim().substring(0, 80)}`);
198
+ // Look forward for external calls
199
+ const end = Math.min(lines.length, serializeLineIndex + windowSize + 1);
200
+ for (let i = serializeLineIndex + 1; i < end; i++) {
201
+ if (EXTERNAL_CALL_REGEX.test(lines[i])) {
202
+ chain.push(`external_call@L${i + 1}: ${lines[i].trim().substring(0, 80)}`);
203
+ return chain;
204
+ }
205
+ }
206
+ // Look backward — maybe the serialized var was passed to a call above
207
+ const start = Math.max(0, serializeLineIndex - windowSize);
208
+ for (let i = serializeLineIndex - 1; i >= start; i--) {
209
+ if (EXTERNAL_CALL_REGEX.test(lines[i])) {
210
+ chain.push(`external_call@L${i + 1}: ${lines[i].trim().substring(0, 80)}`);
211
+ return chain;
212
+ }
213
+ }
214
+ return undefined;
215
+ }
216
+ // ═══════════════════════════════════════════════════════════
217
+ // Core Matching Engine
218
+ // ═══════════════════════════════════════════════════════════
219
+ function getContext(lines, lineIndex, contextSize = 2) {
220
+ const start = Math.max(0, lineIndex - contextSize);
221
+ const end = Math.min(lines.length, lineIndex + contextSize + 1);
222
+ return lines.slice(start, end).join('\n');
223
+ }
224
+ /**
225
+ * Match a single pattern against content with full intelligence pipeline
226
+ */
227
+ export function matchPattern(pattern, content, file) {
228
+ if (!shouldApplyPattern(pattern, file))
229
+ return [];
230
+ const findings = [];
231
+ const lines = content.split('\n');
232
+ const testFile = isTestFile(file);
233
+ for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
234
+ const line = lines[lineIndex];
235
+ const matches = line.matchAll(new RegExp(pattern.pattern, 'gi'));
236
+ for (const match of matches) {
237
+ const originalSeverity = pattern.severity;
238
+ const shouldDowngrade = testFile && (CREDENTIAL_CATEGORIES.has(pattern.category) ||
239
+ INJECTION_CATEGORIES.has(pattern.category));
240
+ const finding = {
241
+ pattern: shouldDowngrade
242
+ ? { ...pattern, severity: SEVERITY_DOWNGRADE[originalSeverity] }
243
+ : pattern,
244
+ file,
245
+ line: lineIndex + 1,
246
+ column: (match.index || 0) + 1,
247
+ match: match[0],
248
+ context: getContext(lines, lineIndex),
249
+ timestamp: new Date(),
250
+ classification: 'unclassified',
251
+ originalSeverity,
252
+ severityDowngraded: shouldDowngrade,
253
+ isTestFile: testFile,
254
+ };
255
+ // Taint proximity for dangerous sink patterns
256
+ if (TAINT_SINK_PATTERNS.has(pattern.name)) {
257
+ finding.taintProximity = analyzeTaintProximity(lines, lineIndex);
258
+ // Escalate severity if tainted input is nearby
259
+ if (finding.taintProximity === 'direct') {
260
+ finding.pattern = { ...finding.pattern, severity: 'critical' };
261
+ }
262
+ else if (finding.taintProximity === 'nearby') {
263
+ finding.pattern = { ...finding.pattern, severity: 'critical' };
264
+ }
265
+ }
266
+ // Context flow tracing for context serialization patterns
267
+ if (pattern.name === 'mcp_context_dump_to_tool') {
268
+ finding.contextFlowChain = traceContextFlow(lines, lineIndex);
269
+ }
270
+ // Auto-classify
271
+ finding.classification = classifyFinding(finding);
272
+ findings.push(finding);
273
+ }
274
+ }
275
+ return findings;
276
+ }
277
+ /**
278
+ * Match multiple patterns against content
279
+ */
280
+ export function matchPatterns(patterns, content, file) {
281
+ const findings = [];
282
+ for (const pattern of patterns) {
283
+ findings.push(...matchPattern(pattern, content, file));
284
+ }
285
+ return findings;
286
+ }
287
+ // ═══════════════════════════════════════════════════════════
288
+ // Risk Scoring (uses downgraded severity, not original)
289
+ // ═══════════════════════════════════════════════════════════
290
+ export function calculateRiskScore(findings) {
291
+ const weights = { critical: 25, high: 10, medium: 3, low: 1 };
292
+ const counts = { critical: 0, high: 0, medium: 0, low: 0 };
293
+ let deductions = 0;
294
+ for (const finding of findings) {
295
+ const sev = finding.pattern.severity;
296
+ counts[sev]++;
297
+ deductions += weights[sev];
298
+ }
299
+ const total = Math.max(0, 100 - deductions);
300
+ let level;
301
+ if (total >= 80)
302
+ level = 'low';
303
+ else if (total >= 60)
304
+ level = 'moderate';
305
+ else if (total >= 40)
306
+ level = 'high';
307
+ else
308
+ level = 'critical';
309
+ const owaspFindings = findings.filter((f) => f.pattern.owaspAsi);
310
+ const owaspCompliance = owaspFindings.length === 0 ? 100 : Math.max(0, 100 - owaspFindings.length * 10);
311
+ return { total, level, counts, owaspCompliance };
312
+ }
313
+ export function deduplicateFindings(findings) {
314
+ const seen = new Set();
315
+ return findings.filter((f) => {
316
+ const key = `${f.pattern.name}:${f.file}:${f.line}:${f.column}`;
317
+ if (seen.has(key))
318
+ return false;
319
+ seen.add(key);
320
+ return true;
321
+ });
322
+ }
323
+ export function sortFindingsBySeverity(findings) {
324
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
325
+ return [...findings].sort((a, b) => severityOrder[a.pattern.severity] - severityOrder[b.pattern.severity]);
326
+ }
327
+ export function groupFindingsByFile(findings) {
328
+ const groups = new Map();
329
+ for (const finding of findings) {
330
+ const existing = groups.get(finding.file) || [];
331
+ existing.push(finding);
332
+ groups.set(finding.file, existing);
333
+ }
334
+ return groups;
335
+ }
336
+ export function groupFindingsByCategory(findings) {
337
+ const groups = new Map();
338
+ for (const finding of findings) {
339
+ const category = finding.pattern.category;
340
+ const existing = groups.get(category) || [];
341
+ existing.push(finding);
342
+ groups.set(category, existing);
343
+ }
344
+ return groups;
345
+ }
346
+ /**
347
+ * Group findings by classification
348
+ */
349
+ export function groupFindingsByClassification(findings) {
350
+ const groups = new Map();
351
+ for (const finding of findings) {
352
+ const existing = groups.get(finding.classification) || [];
353
+ existing.push(finding);
354
+ groups.set(finding.classification, existing);
355
+ }
356
+ return groups;
357
+ }
358
+ export function filterFindingsBySeverity(findings, minSeverity) {
359
+ const severityOrder = { low: 0, medium: 1, high: 2, critical: 3 };
360
+ const minLevel = severityOrder[minSeverity];
361
+ return findings.filter((f) => severityOrder[f.pattern.severity] >= minLevel);
362
+ }
363
+ export function createScanResult(filesScanned, patternsChecked, findings, startTime) {
364
+ return {
365
+ filesScanned,
366
+ patternsChecked,
367
+ findings: sortFindingsBySeverity(deduplicateFindings(findings)),
368
+ riskScore: calculateRiskScore(findings),
369
+ duration: Date.now() - startTime,
370
+ timestamp: new Date(),
371
+ };
372
+ }
373
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/scanner/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Scanner Module Exports
3
+ */
4
+ export * from './engine.js';
5
+ export * from './content-scanner.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Scanner Module Exports
3
+ */
4
+ export * from './engine.js';
5
+ export * from './content-scanner.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@empowered-humanity/agent-security",
3
+ "version": "1.0.0",
4
+ "description": "Security scanner for AI agent architectures - 176 detection patterns for prompt injection, credential exposure, MCP security, and OWASP ASI vulnerabilities",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./patterns": {
14
+ "types": "./dist/patterns/index.d.ts",
15
+ "default": "./dist/patterns/index.js"
16
+ },
17
+ "./scanner": {
18
+ "types": "./dist/scanner/index.d.ts",
19
+ "default": "./dist/scanner/index.js"
20
+ },
21
+ "./reporters": {
22
+ "types": "./dist/reporters/index.d.ts",
23
+ "default": "./dist/reporters/index.js"
24
+ }
25
+ },
26
+ "bin": {
27
+ "te-agent-security": "dist/index.js",
28
+ "te-as": "dist/index.js"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE",
34
+ "SECURITY.md",
35
+ "sbom.json"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "dev": "tsc --watch",
40
+ "start": "node dist/index.js",
41
+ "test": "vitest run",
42
+ "test:watch": "vitest",
43
+ "typecheck": "tsc --noEmit",
44
+ "lint": "eslint src/",
45
+ "clean": "rimraf dist",
46
+ "prepublishOnly": "npm run clean && npm run build && npm test"
47
+ },
48
+ "keywords": [
49
+ "security",
50
+ "ai-agent",
51
+ "prompt-injection",
52
+ "scanner",
53
+ "llm",
54
+ "owasp",
55
+ "asi",
56
+ "agent-security",
57
+ "code-injection",
58
+ "credential-detection",
59
+ "sast",
60
+ "vulnerability-scanner"
61
+ ],
62
+ "author": "Empowered Humanity <security@empoweredhumanity.ai>",
63
+ "license": "MIT",
64
+ "repository": {
65
+ "type": "git",
66
+ "url": "https://github.com/Traviseric/agent-security.git"
67
+ },
68
+ "bugs": {
69
+ "url": "https://github.com/Traviseric/agent-security/issues"
70
+ },
71
+ "homepage": "https://github.com/Traviseric/agent-security#readme",
72
+ "dependencies": {
73
+ "chalk": "^5.3.0",
74
+ "commander": "^12.0.0",
75
+ "glob": "^10.3.0",
76
+ "ora": "^8.0.0",
77
+ "yaml": "^2.3.0"
78
+ },
79
+ "devDependencies": {
80
+ "@types/node": "^20.10.0",
81
+ "rimraf": "^5.0.0",
82
+ "typescript": "^5.3.0",
83
+ "vitest": "^1.0.0"
84
+ },
85
+ "engines": {
86
+ "node": ">=18.0.0"
87
+ }
88
+ }
package/sbom.json ADDED
@@ -0,0 +1,107 @@
1
+ {
2
+ "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
3
+ "bomFormat": "CycloneDX",
4
+ "specVersion": "1.6",
5
+ "version": 1,
6
+ "serialNumber": "urn:uuid:3acedb58-5bfd-4dd9-8fd8-f8c1e634fc57",
7
+ "metadata": {
8
+ "timestamp": "2026-02-11T22:01:04.519Z",
9
+ "tools": {
10
+ "components": [
11
+ {
12
+ "type": "application",
13
+ "name": "npm",
14
+ "version": "11.6.2"
15
+ },
16
+ {
17
+ "type": "application",
18
+ "name": "cyclonedx-npm",
19
+ "group": "@cyclonedx",
20
+ "version": "4.1.2",
21
+ "author": "Jan Kowalleck",
22
+ "description": "Create CycloneDX Software Bill of Materials (SBOM) from NPM projects.",
23
+ "licenses": [
24
+ {
25
+ "license": {
26
+ "id": "Apache-2.0"
27
+ }
28
+ }
29
+ ],
30
+ "externalReferences": [
31
+ {
32
+ "url": "git+https://github.com/CycloneDX/cyclonedx-node-npm.git",
33
+ "type": "vcs",
34
+ "comment": "as detected from PackageJson property \"repository.url\""
35
+ },
36
+ {
37
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm#readme",
38
+ "type": "website",
39
+ "comment": "as detected from PackageJson property \"homepage\""
40
+ },
41
+ {
42
+ "url": "https://github.com/CycloneDX/cyclonedx-node-npm/issues",
43
+ "type": "issue-tracker",
44
+ "comment": "as detected from PackageJson property \"bugs.url\""
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "type": "library",
50
+ "name": "cyclonedx-library",
51
+ "group": "@cyclonedx",
52
+ "version": "9.4.1",
53
+ "author": "Jan Kowalleck",
54
+ "description": "Core functionality of CycloneDX for JavaScript (Node.js or WebBrowser).",
55
+ "licenses": [
56
+ {
57
+ "license": {
58
+ "id": "Apache-2.0"
59
+ }
60
+ }
61
+ ],
62
+ "externalReferences": [
63
+ {
64
+ "url": "git+https://github.com/CycloneDX/cyclonedx-javascript-library.git",
65
+ "type": "vcs",
66
+ "comment": "as detected from PackageJson property \"repository.url\""
67
+ },
68
+ {
69
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library#readme",
70
+ "type": "website",
71
+ "comment": "as detected from PackageJson property \"homepage\""
72
+ },
73
+ {
74
+ "url": "https://github.com/CycloneDX/cyclonedx-javascript-library/issues",
75
+ "type": "issue-tracker",
76
+ "comment": "as detected from PackageJson property \"bugs.url\""
77
+ }
78
+ ]
79
+ }
80
+ ]
81
+ },
82
+ "component": {
83
+ "type": "application",
84
+ "name": "te-security",
85
+ "version": "0.1.0",
86
+ "bom-ref": "te-security@0.1.0",
87
+ "description": "Security tools monorepo for TE Code ecosystem",
88
+ "purl": "pkg:npm/te-security@0.1.0",
89
+ "properties": [
90
+ {
91
+ "name": "cdx:npm:package:private",
92
+ "value": "true"
93
+ },
94
+ {
95
+ "name": "cdx:npm:package:path",
96
+ "value": ""
97
+ }
98
+ ]
99
+ }
100
+ },
101
+ "components": [],
102
+ "dependencies": [
103
+ {
104
+ "ref": "te-security@0.1.0"
105
+ }
106
+ ]
107
+ }