@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.
- package/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/action/detectors/exec.d.ts +21 -0
- package/dist/action/detectors/exec.d.ts.map +1 -0
- package/dist/action/detectors/exec.js +201 -0
- package/dist/action/detectors/exec.js.map +1 -0
- package/dist/action/detectors/index.d.ts +4 -0
- package/dist/action/detectors/index.d.ts.map +1 -0
- package/dist/action/detectors/index.js +20 -0
- package/dist/action/detectors/index.js.map +1 -0
- package/dist/action/detectors/network.d.ts +21 -0
- package/dist/action/detectors/network.d.ts.map +1 -0
- package/dist/action/detectors/network.js +152 -0
- package/dist/action/detectors/network.js.map +1 -0
- package/dist/action/detectors/secret-leak.d.ts +28 -0
- package/dist/action/detectors/secret-leak.d.ts.map +1 -0
- package/dist/action/detectors/secret-leak.js +94 -0
- package/dist/action/detectors/secret-leak.js.map +1 -0
- package/dist/action/goplus/client.d.ts +151 -0
- package/dist/action/goplus/client.d.ts.map +1 -0
- package/dist/action/goplus/client.js +187 -0
- package/dist/action/goplus/client.js.map +1 -0
- package/dist/action/index.d.ts +61 -0
- package/dist/action/index.d.ts.map +1 -0
- package/dist/action/index.js +643 -0
- package/dist/action/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +410 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/policy/default.d.ts +77 -0
- package/dist/policy/default.d.ts.map +1 -0
- package/dist/policy/default.js +94 -0
- package/dist/policy/default.js.map +1 -0
- package/dist/registry/index.d.ts +93 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +280 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/storage.d.ts +69 -0
- package/dist/registry/storage.d.ts.map +1 -0
- package/dist/registry/storage.js +208 -0
- package/dist/registry/storage.js.map +1 -0
- package/dist/registry/trust.d.ts +41 -0
- package/dist/registry/trust.d.ts.map +1 -0
- package/dist/registry/trust.js +139 -0
- package/dist/registry/trust.js.map +1 -0
- package/dist/scanner/file-walker.d.ts +34 -0
- package/dist/scanner/file-walker.d.ts.map +1 -0
- package/dist/scanner/file-walker.js +134 -0
- package/dist/scanner/file-walker.js.map +1 -0
- package/dist/scanner/index.d.ts +67 -0
- package/dist/scanner/index.d.ts.map +1 -0
- package/dist/scanner/index.js +349 -0
- package/dist/scanner/index.js.map +1 -0
- package/dist/scanner/rules/exfiltration.d.ts +6 -0
- package/dist/scanner/rules/exfiltration.d.ts.map +1 -0
- package/dist/scanner/rules/exfiltration.js +48 -0
- package/dist/scanner/rules/exfiltration.js.map +1 -0
- package/dist/scanner/rules/index.d.ts +18 -0
- package/dist/scanner/rules/index.d.ts.map +1 -0
- package/dist/scanner/rules/index.js +54 -0
- package/dist/scanner/rules/index.js.map +1 -0
- package/dist/scanner/rules/obfuscation.d.ts +6 -0
- package/dist/scanner/rules/obfuscation.d.ts.map +1 -0
- package/dist/scanner/rules/obfuscation.js +37 -0
- package/dist/scanner/rules/obfuscation.js.map +1 -0
- package/dist/scanner/rules/prompt-injection.d.ts +6 -0
- package/dist/scanner/rules/prompt-injection.d.ts.map +1 -0
- package/dist/scanner/rules/prompt-injection.js +38 -0
- package/dist/scanner/rules/prompt-injection.js.map +1 -0
- package/dist/scanner/rules/remote-loader.d.ts +6 -0
- package/dist/scanner/rules/remote-loader.d.ts.map +1 -0
- package/dist/scanner/rules/remote-loader.js +31 -0
- package/dist/scanner/rules/remote-loader.js.map +1 -0
- package/dist/scanner/rules/secrets.d.ts +6 -0
- package/dist/scanner/rules/secrets.d.ts.map +1 -0
- package/dist/scanner/rules/secrets.js +68 -0
- package/dist/scanner/rules/secrets.js.map +1 -0
- package/dist/scanner/rules/shell-exec.d.ts +6 -0
- package/dist/scanner/rules/shell-exec.d.ts.map +1 -0
- package/dist/scanner/rules/shell-exec.js +52 -0
- package/dist/scanner/rules/shell-exec.js.map +1 -0
- package/dist/scanner/rules/web3.d.ts +6 -0
- package/dist/scanner/rules/web3.d.ts.map +1 -0
- package/dist/scanner/rules/web3.js +139 -0
- package/dist/scanner/rules/web3.js.map +1 -0
- package/dist/tests/action.test.d.ts +2 -0
- package/dist/tests/action.test.d.ts.map +1 -0
- package/dist/tests/action.test.js +127 -0
- package/dist/tests/action.test.js.map +1 -0
- package/dist/tests/registry.test.d.ts +2 -0
- package/dist/tests/registry.test.d.ts.map +1 -0
- package/dist/tests/registry.test.js +109 -0
- package/dist/tests/registry.test.js.map +1 -0
- package/dist/tests/scanner.test.d.ts +2 -0
- package/dist/tests/scanner.test.d.ts.map +1 -0
- package/dist/tests/scanner.test.js +57 -0
- package/dist/tests/scanner.test.js.map +1 -0
- package/dist/types/action.d.ts +198 -0
- package/dist/types/action.d.ts.map +1 -0
- package/dist/types/action.js +3 -0
- package/dist/types/action.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +104 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +21 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/scanner.d.ts +88 -0
- package/dist/types/scanner.d.ts.map +1 -0
- package/dist/types/scanner.js +20 -0
- package/dist/types/scanner.js.map +1 -0
- package/dist/types/skill.d.ts +52 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +33 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/utils/hash.d.ts +21 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +112 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/patterns.d.ts +74 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +157 -0
- package/dist/utils/patterns.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|