@goplus/agentguard 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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/action/detectors/exec.d.ts +21 -0
  4. package/dist/action/detectors/exec.d.ts.map +1 -0
  5. package/dist/action/detectors/exec.js +201 -0
  6. package/dist/action/detectors/exec.js.map +1 -0
  7. package/dist/action/detectors/index.d.ts +4 -0
  8. package/dist/action/detectors/index.d.ts.map +1 -0
  9. package/dist/action/detectors/index.js +20 -0
  10. package/dist/action/detectors/index.js.map +1 -0
  11. package/dist/action/detectors/network.d.ts +21 -0
  12. package/dist/action/detectors/network.d.ts.map +1 -0
  13. package/dist/action/detectors/network.js +152 -0
  14. package/dist/action/detectors/network.js.map +1 -0
  15. package/dist/action/detectors/secret-leak.d.ts +28 -0
  16. package/dist/action/detectors/secret-leak.d.ts.map +1 -0
  17. package/dist/action/detectors/secret-leak.js +94 -0
  18. package/dist/action/detectors/secret-leak.js.map +1 -0
  19. package/dist/action/goplus/client.d.ts +151 -0
  20. package/dist/action/goplus/client.d.ts.map +1 -0
  21. package/dist/action/goplus/client.js +187 -0
  22. package/dist/action/goplus/client.js.map +1 -0
  23. package/dist/action/index.d.ts +61 -0
  24. package/dist/action/index.d.ts.map +1 -0
  25. package/dist/action/index.js +643 -0
  26. package/dist/action/index.js.map +1 -0
  27. package/dist/index.d.ts +31 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +77 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/mcp-server.d.ts +3 -0
  32. package/dist/mcp-server.d.ts.map +1 -0
  33. package/dist/mcp-server.js +410 -0
  34. package/dist/mcp-server.js.map +1 -0
  35. package/dist/policy/default.d.ts +77 -0
  36. package/dist/policy/default.d.ts.map +1 -0
  37. package/dist/policy/default.js +94 -0
  38. package/dist/policy/default.js.map +1 -0
  39. package/dist/registry/index.d.ts +93 -0
  40. package/dist/registry/index.d.ts.map +1 -0
  41. package/dist/registry/index.js +280 -0
  42. package/dist/registry/index.js.map +1 -0
  43. package/dist/registry/storage.d.ts +69 -0
  44. package/dist/registry/storage.d.ts.map +1 -0
  45. package/dist/registry/storage.js +208 -0
  46. package/dist/registry/storage.js.map +1 -0
  47. package/dist/registry/trust.d.ts +41 -0
  48. package/dist/registry/trust.d.ts.map +1 -0
  49. package/dist/registry/trust.js +139 -0
  50. package/dist/registry/trust.js.map +1 -0
  51. package/dist/scanner/file-walker.d.ts +34 -0
  52. package/dist/scanner/file-walker.d.ts.map +1 -0
  53. package/dist/scanner/file-walker.js +134 -0
  54. package/dist/scanner/file-walker.js.map +1 -0
  55. package/dist/scanner/index.d.ts +67 -0
  56. package/dist/scanner/index.d.ts.map +1 -0
  57. package/dist/scanner/index.js +349 -0
  58. package/dist/scanner/index.js.map +1 -0
  59. package/dist/scanner/rules/exfiltration.d.ts +6 -0
  60. package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
  61. package/dist/scanner/rules/exfiltration.js +48 -0
  62. package/dist/scanner/rules/exfiltration.js.map +1 -0
  63. package/dist/scanner/rules/index.d.ts +18 -0
  64. package/dist/scanner/rules/index.d.ts.map +1 -0
  65. package/dist/scanner/rules/index.js +54 -0
  66. package/dist/scanner/rules/index.js.map +1 -0
  67. package/dist/scanner/rules/obfuscation.d.ts +6 -0
  68. package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
  69. package/dist/scanner/rules/obfuscation.js +37 -0
  70. package/dist/scanner/rules/obfuscation.js.map +1 -0
  71. package/dist/scanner/rules/prompt-injection.d.ts +6 -0
  72. package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
  73. package/dist/scanner/rules/prompt-injection.js +38 -0
  74. package/dist/scanner/rules/prompt-injection.js.map +1 -0
  75. package/dist/scanner/rules/remote-loader.d.ts +6 -0
  76. package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
  77. package/dist/scanner/rules/remote-loader.js +31 -0
  78. package/dist/scanner/rules/remote-loader.js.map +1 -0
  79. package/dist/scanner/rules/secrets.d.ts +6 -0
  80. package/dist/scanner/rules/secrets.d.ts.map +1 -0
  81. package/dist/scanner/rules/secrets.js +68 -0
  82. package/dist/scanner/rules/secrets.js.map +1 -0
  83. package/dist/scanner/rules/shell-exec.d.ts +6 -0
  84. package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
  85. package/dist/scanner/rules/shell-exec.js +52 -0
  86. package/dist/scanner/rules/shell-exec.js.map +1 -0
  87. package/dist/scanner/rules/web3.d.ts +6 -0
  88. package/dist/scanner/rules/web3.d.ts.map +1 -0
  89. package/dist/scanner/rules/web3.js +139 -0
  90. package/dist/scanner/rules/web3.js.map +1 -0
  91. package/dist/tests/action.test.d.ts +2 -0
  92. package/dist/tests/action.test.d.ts.map +1 -0
  93. package/dist/tests/action.test.js +127 -0
  94. package/dist/tests/action.test.js.map +1 -0
  95. package/dist/tests/registry.test.d.ts +2 -0
  96. package/dist/tests/registry.test.d.ts.map +1 -0
  97. package/dist/tests/registry.test.js +109 -0
  98. package/dist/tests/registry.test.js.map +1 -0
  99. package/dist/tests/scanner.test.d.ts +2 -0
  100. package/dist/tests/scanner.test.d.ts.map +1 -0
  101. package/dist/tests/scanner.test.js +57 -0
  102. package/dist/tests/scanner.test.js.map +1 -0
  103. package/dist/types/action.d.ts +198 -0
  104. package/dist/types/action.d.ts.map +1 -0
  105. package/dist/types/action.js +3 -0
  106. package/dist/types/action.js.map +1 -0
  107. package/dist/types/index.d.ts +5 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +22 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/types/registry.d.ts +104 -0
  112. package/dist/types/registry.d.ts.map +1 -0
  113. package/dist/types/registry.js +21 -0
  114. package/dist/types/registry.js.map +1 -0
  115. package/dist/types/scanner.d.ts +88 -0
  116. package/dist/types/scanner.d.ts.map +1 -0
  117. package/dist/types/scanner.js +20 -0
  118. package/dist/types/scanner.js.map +1 -0
  119. package/dist/types/skill.d.ts +52 -0
  120. package/dist/types/skill.d.ts.map +1 -0
  121. package/dist/types/skill.js +33 -0
  122. package/dist/types/skill.js.map +1 -0
  123. package/dist/utils/hash.d.ts +21 -0
  124. package/dist/utils/hash.d.ts.map +1 -0
  125. package/dist/utils/hash.js +112 -0
  126. package/dist/utils/hash.js.map +1 -0
  127. package/dist/utils/patterns.d.ts +74 -0
  128. package/dist/utils/patterns.d.ts.map +1 -0
  129. package/dist/utils/patterns.js +157 -0
  130. package/dist/utils/patterns.js.map +1 -0
  131. package/package.json +60 -0
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.scanner = exports.SkillScanner = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const crypto = __importStar(require("crypto"));
39
+ const file_walker_js_1 = require("./file-walker.js");
40
+ const index_js_1 = require("./rules/index.js");
41
+ /**
42
+ * Skill Scanner - Module A
43
+ * Scans skill code for security risks
44
+ */
45
+ class SkillScanner {
46
+ options;
47
+ externalScannerAvailable = null;
48
+ constructor(options = {}) {
49
+ this.options = {
50
+ useExternalScanner: true,
51
+ deep: false,
52
+ ...options,
53
+ };
54
+ }
55
+ /**
56
+ * Check if cisco-ai-defense/skill-scanner is installed
57
+ */
58
+ async checkExternalScanner() {
59
+ if (this.externalScannerAvailable !== null) {
60
+ return this.externalScannerAvailable;
61
+ }
62
+ return new Promise((resolve) => {
63
+ const proc = (0, child_process_1.spawn)('skill-scanner', ['--version'], {
64
+ shell: true,
65
+ stdio: 'pipe',
66
+ });
67
+ proc.on('error', () => {
68
+ this.externalScannerAvailable = false;
69
+ resolve(false);
70
+ });
71
+ proc.on('close', (code) => {
72
+ this.externalScannerAvailable = code === 0;
73
+ resolve(code === 0);
74
+ });
75
+ });
76
+ }
77
+ /**
78
+ * Run external skill-scanner CLI
79
+ */
80
+ async runExternalScanner(dirPath) {
81
+ return new Promise((resolve) => {
82
+ const args = ['scan', dirPath, '--format', 'json'];
83
+ if (this.options.deep) {
84
+ args.push('--use-behavioral');
85
+ }
86
+ const proc = (0, child_process_1.spawn)('skill-scanner', args, {
87
+ shell: true,
88
+ stdio: ['ignore', 'pipe', 'pipe'],
89
+ });
90
+ let stdout = '';
91
+ let stderr = '';
92
+ proc.stdout?.on('data', (data) => {
93
+ stdout += data.toString();
94
+ });
95
+ proc.stderr?.on('data', (data) => {
96
+ stderr += data.toString();
97
+ });
98
+ proc.on('error', () => {
99
+ resolve(null);
100
+ });
101
+ proc.on('close', (code) => {
102
+ if (code !== 0 && code !== 1) {
103
+ // code 1 means findings detected
104
+ console.warn('External scanner failed:', stderr);
105
+ resolve(null);
106
+ return;
107
+ }
108
+ try {
109
+ const result = this.parseExternalResult(stdout);
110
+ resolve(result);
111
+ }
112
+ catch (err) {
113
+ console.warn('Failed to parse external scanner result:', err);
114
+ resolve(null);
115
+ }
116
+ });
117
+ });
118
+ }
119
+ /**
120
+ * Parse external skill-scanner JSON output
121
+ */
122
+ parseExternalResult(jsonOutput) {
123
+ // Try to extract JSON from output (may contain non-JSON text)
124
+ const jsonMatch = jsonOutput.match(/\{[\s\S]*\}/);
125
+ if (!jsonMatch) {
126
+ throw new Error('No JSON found in output');
127
+ }
128
+ const data = JSON.parse(jsonMatch[0]);
129
+ // Map external findings to our format
130
+ const evidence = [];
131
+ const riskTags = new Set();
132
+ if (data.findings && Array.isArray(data.findings)) {
133
+ for (const finding of data.findings) {
134
+ // Map finding type to our risk tags
135
+ const tag = this.mapExternalFindingToTag(finding.type || finding.category);
136
+ if (tag) {
137
+ riskTags.add(tag);
138
+ evidence.push({
139
+ tag,
140
+ file: finding.file || finding.location?.file || 'unknown',
141
+ line: finding.line || finding.location?.line || 0,
142
+ match: finding.match || finding.description || '',
143
+ context: finding.context,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ // Determine risk level
149
+ const riskLevel = this.calculateRiskLevel(Array.from(riskTags));
150
+ return {
151
+ risk_level: riskLevel,
152
+ risk_tags: Array.from(riskTags),
153
+ evidence,
154
+ summary: data.summary || `Found ${evidence.length} security findings`,
155
+ metadata: {
156
+ files_scanned: data.files_scanned || 0,
157
+ scan_duration_ms: data.duration_ms || 0,
158
+ scan_time: new Date().toISOString(),
159
+ },
160
+ };
161
+ }
162
+ /**
163
+ * Map external finding type to our risk tags
164
+ */
165
+ mapExternalFindingToTag(externalType) {
166
+ const mapping = {
167
+ 'command-injection': 'SHELL_EXEC',
168
+ 'code-execution': 'SHELL_EXEC',
169
+ 'remote-code-loading': 'REMOTE_LOADER',
170
+ 'dynamic-import': 'REMOTE_LOADER',
171
+ 'env-access': 'READ_ENV_SECRETS',
172
+ 'secret-access': 'READ_ENV_SECRETS',
173
+ 'ssh-key-access': 'READ_SSH_KEYS',
174
+ 'credential-access': 'READ_KEYCHAIN',
175
+ 'data-exfiltration': 'NET_EXFIL_UNRESTRICTED',
176
+ 'webhook-exfil': 'WEBHOOK_EXFIL',
177
+ 'obfuscation': 'OBFUSCATION',
178
+ 'prompt-injection': 'PROMPT_INJECTION',
179
+ 'private-key': 'PRIVATE_KEY_PATTERN',
180
+ 'mnemonic': 'MNEMONIC_PATTERN',
181
+ };
182
+ return mapping[externalType?.toLowerCase()] || null;
183
+ }
184
+ /**
185
+ * Run built-in scanner
186
+ */
187
+ async runBuiltinScanner(dirPath) {
188
+ const startTime = Date.now();
189
+ const files = await (0, file_walker_js_1.walkDirectory)(dirPath);
190
+ const evidence = [];
191
+ const riskTags = new Set();
192
+ const allRules = [...index_js_1.ALL_RULES, ...(this.options.additionalRules || [])];
193
+ for (const file of files) {
194
+ const rules = (0, index_js_1.getRulesForExtension)(file.extension);
195
+ for (const rule of rules) {
196
+ for (const pattern of rule.patterns) {
197
+ const lines = file.content.split('\n');
198
+ for (let i = 0; i < lines.length; i++) {
199
+ const line = lines[i];
200
+ const match = line.match(pattern);
201
+ if (match) {
202
+ // Run validator if present
203
+ if (rule.validator && !rule.validator(file.content, match)) {
204
+ continue;
205
+ }
206
+ riskTags.add(rule.id);
207
+ evidence.push({
208
+ tag: rule.id,
209
+ file: file.relativePath,
210
+ line: i + 1,
211
+ match: match[0].slice(0, 100), // Truncate long matches
212
+ });
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ const riskLevel = this.calculateRiskLevel(Array.from(riskTags));
219
+ return {
220
+ risk_level: riskLevel,
221
+ risk_tags: Array.from(riskTags),
222
+ evidence,
223
+ summary: this.generateSummary(riskTags, evidence),
224
+ metadata: {
225
+ files_scanned: files.length,
226
+ scan_duration_ms: Date.now() - startTime,
227
+ scan_time: new Date().toISOString(),
228
+ },
229
+ };
230
+ }
231
+ /**
232
+ * Calculate risk level from tags
233
+ */
234
+ calculateRiskLevel(tags) {
235
+ const allRules = [...index_js_1.ALL_RULES, ...(this.options.additionalRules || [])];
236
+ for (const tag of tags) {
237
+ const rule = allRules.find((r) => r.id === tag);
238
+ if (rule?.severity === 'critical')
239
+ return 'critical';
240
+ }
241
+ for (const tag of tags) {
242
+ const rule = allRules.find((r) => r.id === tag);
243
+ if (rule?.severity === 'high')
244
+ return 'high';
245
+ }
246
+ for (const tag of tags) {
247
+ const rule = allRules.find((r) => r.id === tag);
248
+ if (rule?.severity === 'medium')
249
+ return 'medium';
250
+ }
251
+ return 'low';
252
+ }
253
+ /**
254
+ * Generate human-readable summary
255
+ */
256
+ generateSummary(tags, evidence) {
257
+ if (tags.size === 0) {
258
+ return 'No security issues detected';
259
+ }
260
+ const parts = [];
261
+ if (tags.has('SHELL_EXEC') || tags.has('REMOTE_LOADER')) {
262
+ parts.push('code execution capabilities');
263
+ }
264
+ if (tags.has('PRIVATE_KEY_PATTERN') || tags.has('MNEMONIC_PATTERN')) {
265
+ parts.push('hardcoded secrets');
266
+ }
267
+ if (tags.has('PROMPT_INJECTION')) {
268
+ parts.push('prompt injection attempts');
269
+ }
270
+ if (tags.has('WALLET_DRAINING') || tags.has('UNLIMITED_APPROVAL')) {
271
+ parts.push('dangerous Web3 patterns');
272
+ }
273
+ if (tags.has('WEBHOOK_EXFIL') || tags.has('NET_EXFIL_UNRESTRICTED')) {
274
+ parts.push('data exfiltration risks');
275
+ }
276
+ return `Found ${evidence.length} findings: ${parts.join(', ') || 'various security concerns'}`;
277
+ }
278
+ /**
279
+ * Calculate artifact hash for a directory
280
+ */
281
+ async calculateArtifactHash(dirPath) {
282
+ const files = await (0, file_walker_js_1.walkDirectory)(dirPath);
283
+ const hash = crypto.createHash('sha256');
284
+ // Sort files for consistent hashing
285
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
286
+ for (const file of files) {
287
+ hash.update(file.relativePath);
288
+ hash.update(file.content);
289
+ }
290
+ return `sha256:${hash.digest('hex')}`;
291
+ }
292
+ /**
293
+ * Main scan method
294
+ */
295
+ async scan(payload) {
296
+ const { skill, payload: scanPayload, options } = payload;
297
+ // Validate payload
298
+ if (scanPayload.type !== 'dir') {
299
+ // For now, only support directory scanning
300
+ // TODO: Support zip and repo_url
301
+ throw new Error(`Unsupported payload type: ${scanPayload.type}. Only 'dir' is supported.`);
302
+ }
303
+ const dirPath = scanPayload.ref.replace('file://', '');
304
+ // Check if directory exists
305
+ if (!(await (0, file_walker_js_1.pathExists)(dirPath))) {
306
+ throw new Error(`Directory not found: ${dirPath}`);
307
+ }
308
+ if (!(await (0, file_walker_js_1.isDirectory)(dirPath))) {
309
+ throw new Error(`Path is not a directory: ${dirPath}`);
310
+ }
311
+ // Try external scanner first if enabled
312
+ if (this.options.useExternalScanner) {
313
+ const externalAvailable = await this.checkExternalScanner();
314
+ if (externalAvailable) {
315
+ const externalResult = await this.runExternalScanner(dirPath);
316
+ if (externalResult) {
317
+ return externalResult;
318
+ }
319
+ }
320
+ }
321
+ // Fall back to built-in scanner
322
+ return this.runBuiltinScanner(dirPath);
323
+ }
324
+ /**
325
+ * Quick scan - scan and return basic info
326
+ */
327
+ async quickScan(dirPath) {
328
+ const hash = await this.calculateArtifactHash(dirPath);
329
+ const skill = {
330
+ id: 'unknown',
331
+ source: dirPath,
332
+ version_ref: 'unknown',
333
+ artifact_hash: hash,
334
+ };
335
+ const result = await this.scan({
336
+ skill,
337
+ payload: { type: 'dir', ref: dirPath },
338
+ });
339
+ return {
340
+ risk_level: result.risk_level,
341
+ risk_tags: result.risk_tags,
342
+ summary: result.summary,
343
+ };
344
+ }
345
+ }
346
+ exports.SkillScanner = SkillScanner;
347
+ // Export singleton instance
348
+ exports.scanner = new SkillScanner();
349
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ScanRule } from '../../types/scanner.js';
2
+ /**
3
+ * Data exfiltration detection rules
4
+ */
5
+ export declare const EXFILTRATION_RULES: ScanRule[];
6
+ //# sourceMappingURL=exfiltration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exfiltration.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/exfiltration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,EAwCxC,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EXFILTRATION_RULES = void 0;
4
+ /**
5
+ * Data exfiltration detection rules
6
+ */
7
+ exports.EXFILTRATION_RULES = [
8
+ {
9
+ id: 'NET_EXFIL_UNRESTRICTED',
10
+ description: 'Detects unrestricted network data exfiltration',
11
+ severity: 'high',
12
+ file_patterns: ['*.js', '*.ts', '*.mjs', '*.py'],
13
+ patterns: [
14
+ // Generic POST requests (may need context analysis)
15
+ /fetch\s*\([^)]+,\s*\{[^}]*method\s*:\s*['"`]POST['"`]/,
16
+ /axios\.post\s*\(/,
17
+ /requests\.post\s*\(/,
18
+ /http\.request\s*\([^)]*method\s*:\s*['"`]POST['"`]/,
19
+ // FormData upload
20
+ /new\s+FormData\s*\(/,
21
+ // File upload patterns
22
+ /enctype\s*[:=]\s*['"`]multipart\/form-data['"`]/,
23
+ ],
24
+ },
25
+ {
26
+ id: 'WEBHOOK_EXFIL',
27
+ description: 'Detects webhook-based data exfiltration',
28
+ severity: 'critical',
29
+ file_patterns: ['*'],
30
+ patterns: [
31
+ // Discord webhooks
32
+ /discord(?:app)?\.com\/api\/webhooks/i,
33
+ /discordapp\.com\/api\/webhooks/i,
34
+ // Telegram bot API
35
+ /api\.telegram\.org\/bot/i,
36
+ /telegram-bot-api/i,
37
+ // Slack webhooks
38
+ /hooks\.slack\.com/i,
39
+ // Generic webhook patterns
40
+ /webhook\s*[:=]\s*['"`]https?:/i,
41
+ /ngrok\.io/i,
42
+ /requestbin/i,
43
+ /pipedream/i,
44
+ /webhook\.site/i,
45
+ ],
46
+ },
47
+ ];
48
+ //# sourceMappingURL=exfiltration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exfiltration.js","sourceRoot":"","sources":["../../../src/scanner/rules/exfiltration.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,kBAAkB,GAAe;IAC5C;QACE,EAAE,EAAE,wBAAwB;QAC5B,WAAW,EAAE,gDAAgD;QAC7D,QAAQ,EAAE,MAAM;QAChB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QAChD,QAAQ,EAAE;YACR,oDAAoD;YACpD,uDAAuD;YACvD,kBAAkB;YAClB,qBAAqB;YACrB,oDAAoD;YACpD,kBAAkB;YAClB,qBAAqB;YACrB,uBAAuB;YACvB,iDAAiD;SAClD;KACF;IACD;QACE,EAAE,EAAE,eAAe;QACnB,WAAW,EAAE,yCAAyC;QACtD,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,CAAC,GAAG,CAAC;QACpB,QAAQ,EAAE;YACR,mBAAmB;YACnB,sCAAsC;YACtC,iCAAiC;YACjC,mBAAmB;YACnB,0BAA0B;YAC1B,mBAAmB;YACnB,iBAAiB;YACjB,oBAAoB;YACpB,2BAA2B;YAC3B,gCAAgC;YAChC,YAAY;YACZ,aAAa;YACb,YAAY;YACZ,gBAAgB;SACjB;KACF;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ScanRule, RiskTag } from '../../types/scanner.js';
2
+ /**
3
+ * All built-in scan rules
4
+ */
5
+ export declare const ALL_RULES: ScanRule[];
6
+ /**
7
+ * Get rules by severity
8
+ */
9
+ export declare function getRulesBySeverity(severity: 'low' | 'medium' | 'high' | 'critical'): ScanRule[];
10
+ /**
11
+ * Get rule by ID
12
+ */
13
+ export declare function getRuleById(id: RiskTag): ScanRule | undefined;
14
+ /**
15
+ * Get rules for specific file extension
16
+ */
17
+ export declare function getRulesForExtension(extension: string): ScanRule[];
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAWhE;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,QAAQ,EAQ/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,EAAE,CAE/F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAE7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,CAUlE"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_RULES = void 0;
4
+ exports.getRulesBySeverity = getRulesBySeverity;
5
+ exports.getRuleById = getRuleById;
6
+ exports.getRulesForExtension = getRulesForExtension;
7
+ // Import all rule modules
8
+ const shell_exec_js_1 = require("./shell-exec.js");
9
+ const remote_loader_js_1 = require("./remote-loader.js");
10
+ const secrets_js_1 = require("./secrets.js");
11
+ const web3_js_1 = require("./web3.js");
12
+ const obfuscation_js_1 = require("./obfuscation.js");
13
+ const prompt_injection_js_1 = require("./prompt-injection.js");
14
+ const exfiltration_js_1 = require("./exfiltration.js");
15
+ /**
16
+ * All built-in scan rules
17
+ */
18
+ exports.ALL_RULES = [
19
+ ...shell_exec_js_1.SHELL_EXEC_RULES,
20
+ ...remote_loader_js_1.REMOTE_LOADER_RULES,
21
+ ...secrets_js_1.SECRETS_RULES,
22
+ ...web3_js_1.WEB3_RULES,
23
+ ...obfuscation_js_1.OBFUSCATION_RULES,
24
+ ...prompt_injection_js_1.PROMPT_INJECTION_RULES,
25
+ ...exfiltration_js_1.EXFILTRATION_RULES,
26
+ ];
27
+ /**
28
+ * Get rules by severity
29
+ */
30
+ function getRulesBySeverity(severity) {
31
+ return exports.ALL_RULES.filter(rule => rule.severity === severity);
32
+ }
33
+ /**
34
+ * Get rule by ID
35
+ */
36
+ function getRuleById(id) {
37
+ return exports.ALL_RULES.find(rule => rule.id === id);
38
+ }
39
+ /**
40
+ * Get rules for specific file extension
41
+ */
42
+ function getRulesForExtension(extension) {
43
+ return exports.ALL_RULES.filter(rule => {
44
+ return rule.file_patterns.some(pattern => {
45
+ if (pattern === '*')
46
+ return true;
47
+ if (pattern.startsWith('*.')) {
48
+ return extension === pattern.slice(1);
49
+ }
50
+ return false;
51
+ });
52
+ });
53
+ }
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanner/rules/index.ts"],"names":[],"mappings":";;;AA2BA,gDAEC;AAKD,kCAEC;AAKD,oDAUC;AAjDD,0BAA0B;AAC1B,mDAAmD;AACnD,yDAAyD;AACzD,6CAA6C;AAC7C,uCAAuC;AACvC,qDAAqD;AACrD,+DAA+D;AAC/D,uDAAuD;AAEvD;;GAEG;AACU,QAAA,SAAS,GAAe;IACnC,GAAG,gCAAgB;IACnB,GAAG,sCAAmB;IACtB,GAAG,0BAAa;IAChB,GAAG,oBAAU;IACb,GAAG,kCAAiB;IACpB,GAAG,4CAAsB;IACzB,GAAG,oCAAkB;CACtB,CAAC;AAEF;;GAEG;AACH,SAAgB,kBAAkB,CAAC,QAAgD;IACjF,OAAO,iBAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW,CAAC,EAAW;IACrC,OAAO,iBAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB,CAAC,SAAiB;IACpD,OAAO,iBAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACvC,IAAI,OAAO,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC;YACjC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,SAAS,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ScanRule } from '../../types/scanner.js';
2
+ /**
3
+ * Code obfuscation detection rules
4
+ */
5
+ export declare const OBFUSCATION_RULES: ScanRule[];
6
+ //# sourceMappingURL=obfuscation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscation.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/obfuscation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,EA6BvC,CAAC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OBFUSCATION_RULES = void 0;
4
+ /**
5
+ * Code obfuscation detection rules
6
+ */
7
+ exports.OBFUSCATION_RULES = [
8
+ {
9
+ id: 'OBFUSCATION',
10
+ description: 'Detects code obfuscation techniques',
11
+ severity: 'high',
12
+ file_patterns: ['*.js', '*.ts', '*.mjs', '*.py'],
13
+ patterns: [
14
+ // JavaScript eval
15
+ /\beval\s*\(/,
16
+ /new\s+Function\s*\(/,
17
+ /setTimeout\s*\(\s*['"`]/,
18
+ /setInterval\s*\(\s*['"`]/,
19
+ // Base64 decode + execute
20
+ /atob\s*\([^)]+\).*eval/,
21
+ /Buffer\.from\s*\([^,]+,\s*['"`]base64['"`]\s*\).*eval/,
22
+ // Python eval/exec
23
+ /\bexec\s*\(/,
24
+ /\beval\s*\(/,
25
+ /\bcompile\s*\([^)]+,\s*['"`]<[^>]+>['"`],\s*['"`]exec['"`]\s*\)/,
26
+ // Hex encoding patterns
27
+ /\\x[0-9a-fA-F]{2}(?:\\x[0-9a-fA-F]{2}){10,}/,
28
+ // Unicode encoding patterns
29
+ /\\u[0-9a-fA-F]{4}(?:\\u[0-9a-fA-F]{4}){10,}/,
30
+ // Character code obfuscation
31
+ /String\.fromCharCode\s*\(\s*\d+(?:\s*,\s*\d+){10,}\s*\)/,
32
+ // Packed JavaScript
33
+ /eval\s*\(\s*function\s*\(\s*p\s*,\s*a\s*,\s*c\s*,\s*k\s*,\s*e\s*,\s*[dr]\s*\)/,
34
+ ],
35
+ },
36
+ ];
37
+ //# sourceMappingURL=obfuscation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscation.js","sourceRoot":"","sources":["../../../src/scanner/rules/obfuscation.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,iBAAiB,GAAe;IAC3C;QACE,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE,MAAM;QAChB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;QAChD,QAAQ,EAAE;YACR,kBAAkB;YAClB,aAAa;YACb,qBAAqB;YACrB,yBAAyB;YACzB,0BAA0B;YAC1B,0BAA0B;YAC1B,wBAAwB;YACxB,uDAAuD;YACvD,mBAAmB;YACnB,aAAa;YACb,aAAa;YACb,iEAAiE;YACjE,wBAAwB;YACxB,6CAA6C;YAC7C,4BAA4B;YAC5B,6CAA6C;YAC7C,6BAA6B;YAC7B,yDAAyD;YACzD,oBAAoB;YACpB,+EAA+E;SAChF;KACF;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ScanRule } from '../../types/scanner.js';
2
+ /**
3
+ * Prompt injection detection rules
4
+ */
5
+ export declare const PROMPT_INJECTION_RULES: ScanRule[];
6
+ //# sourceMappingURL=prompt-injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/prompt-injection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,EA8B5C,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROMPT_INJECTION_RULES = void 0;
4
+ /**
5
+ * Prompt injection detection rules
6
+ */
7
+ exports.PROMPT_INJECTION_RULES = [
8
+ {
9
+ id: 'PROMPT_INJECTION',
10
+ description: 'Detects prompt injection attempts',
11
+ severity: 'critical',
12
+ file_patterns: ['*'],
13
+ patterns: [
14
+ // Ignore instructions
15
+ /ignore\s+(previous|all|above|prior)\s+(instructions?|rules?|guidelines?)/i,
16
+ /disregard\s+(previous|all|above|prior)\s+(instructions?|rules?|guidelines?)/i,
17
+ /forget\s+(previous|all|above|prior)\s+(instructions?|rules?|guidelines?)/i,
18
+ // Jailbreak attempts
19
+ /you\s+are\s+(now|a)\s+(?:DAN|jailbroken|unrestricted)/i,
20
+ /pretend\s+(?:you\s+are|to\s+be)\s+(?:a\s+)?(?:different|new|unrestricted)/i,
21
+ /act\s+as\s+(?:if\s+)?(?:you\s+have\s+)?no\s+(?:restrictions?|rules?|limitations?)/i,
22
+ // Bypass confirmation
23
+ /(?:no|without|skip)\s+(?:need\s+(?:for\s+)?)?confirm(?:ation)?/i,
24
+ /bypass\s+(?:security|safety|restrictions?|confirm)/i,
25
+ /auto(?:matically)?\s+(?:approve|confirm|execute|run)/i,
26
+ // Role manipulation
27
+ /you\s+must\s+(?:always\s+)?(?:obey|follow|execute)/i,
28
+ /system\s*:\s*you\s+are/i,
29
+ /\[system\].*\[\/system\]/is,
30
+ // Chinese variations
31
+ /忽略(?:之前|所有|上面)(?:的)?(?:指令|规则|说明)/,
32
+ /无需确认/,
33
+ /自动执行/,
34
+ /跳过验证/,
35
+ ],
36
+ },
37
+ ];
38
+ //# sourceMappingURL=prompt-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.js","sourceRoot":"","sources":["../../../src/scanner/rules/prompt-injection.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACU,QAAA,sBAAsB,GAAe;IAChD;QACE,EAAE,EAAE,kBAAkB;QACtB,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,CAAC,GAAG,CAAC;QACpB,QAAQ,EAAE;YACR,sBAAsB;YACtB,2EAA2E;YAC3E,8EAA8E;YAC9E,2EAA2E;YAC3E,qBAAqB;YACrB,wDAAwD;YACxD,4EAA4E;YAC5E,oFAAoF;YACpF,sBAAsB;YACtB,iEAAiE;YACjE,qDAAqD;YACrD,uDAAuD;YACvD,oBAAoB;YACpB,qDAAqD;YACrD,yBAAyB;YACzB,4BAA4B;YAC5B,qBAAqB;YACrB,kCAAkC;YAClC,MAAM;YACN,MAAM;YACN,MAAM;SACP;KACF;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ScanRule } from '../../types/scanner.js';
2
+ /**
3
+ * Remote code loading detection rules
4
+ */
5
+ export declare const REMOTE_LOADER_RULES: ScanRule[];
6
+ //# sourceMappingURL=remote-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-loader.d.ts","sourceRoot":"","sources":["../../../src/scanner/rules/remote-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,EAuBzC,CAAC"}