transskill 0.2.0 → 0.2.2

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 (61) hide show
  1. package/README.md +162 -32
  2. package/README.zh.md +134 -4
  3. package/dist/audit/auditor-registry.d.ts +6 -0
  4. package/dist/audit/auditor-registry.d.ts.map +1 -0
  5. package/dist/audit/auditor-registry.js +17 -0
  6. package/dist/audit/auditor-registry.js.map +1 -0
  7. package/dist/audit/auditor.interface.d.ts +59 -0
  8. package/dist/audit/auditor.interface.d.ts.map +1 -0
  9. package/dist/audit/auditor.interface.js +36 -0
  10. package/dist/audit/auditor.interface.js.map +1 -0
  11. package/dist/audit/index.d.ts +39 -0
  12. package/dist/audit/index.d.ts.map +1 -0
  13. package/dist/audit/index.js +155 -0
  14. package/dist/audit/index.js.map +1 -0
  15. package/dist/audit/reporter/console-reporter.d.ts +4 -0
  16. package/dist/audit/reporter/console-reporter.d.ts.map +1 -0
  17. package/dist/audit/reporter/console-reporter.js +107 -0
  18. package/dist/audit/reporter/console-reporter.js.map +1 -0
  19. package/dist/audit/rules/dangerous-commands.d.ts +15 -0
  20. package/dist/audit/rules/dangerous-commands.d.ts.map +1 -0
  21. package/dist/audit/rules/dangerous-commands.js +189 -0
  22. package/dist/audit/rules/dangerous-commands.js.map +1 -0
  23. package/dist/audit/rules/prompt-injection.d.ts +15 -0
  24. package/dist/audit/rules/prompt-injection.d.ts.map +1 -0
  25. package/dist/audit/rules/prompt-injection.js +65 -0
  26. package/dist/audit/rules/prompt-injection.js.map +1 -0
  27. package/dist/audit/rules/suspicious-urls.d.ts +14 -0
  28. package/dist/audit/rules/suspicious-urls.d.ts.map +1 -0
  29. package/dist/audit/rules/suspicious-urls.js +42 -0
  30. package/dist/audit/rules/suspicious-urls.js.map +1 -0
  31. package/dist/audit/scanner/directory-scanner.d.ts +40 -0
  32. package/dist/audit/scanner/directory-scanner.d.ts.map +1 -0
  33. package/dist/audit/scanner/directory-scanner.js +288 -0
  34. package/dist/audit/scanner/directory-scanner.js.map +1 -0
  35. package/dist/audit/scanner/instruction-scanner.d.ts +20 -0
  36. package/dist/audit/scanner/instruction-scanner.d.ts.map +1 -0
  37. package/dist/audit/scanner/instruction-scanner.js +147 -0
  38. package/dist/audit/scanner/instruction-scanner.js.map +1 -0
  39. package/dist/audit/scanner/mcp-scanner.d.ts +17 -0
  40. package/dist/audit/scanner/mcp-scanner.d.ts.map +1 -0
  41. package/dist/audit/scanner/mcp-scanner.js +181 -0
  42. package/dist/audit/scanner/mcp-scanner.js.map +1 -0
  43. package/dist/audit/scanner/permission-scanner.d.ts +19 -0
  44. package/dist/audit/scanner/permission-scanner.d.ts.map +1 -0
  45. package/dist/audit/scanner/permission-scanner.js +143 -0
  46. package/dist/audit/scanner/permission-scanner.js.map +1 -0
  47. package/dist/index.js +86 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/mapper/default.mapper.js +2 -2
  50. package/dist/mapper/default.mapper.js.map +1 -1
  51. package/dist/parser/cursor-rules.parser.d.ts +5 -0
  52. package/dist/parser/cursor-rules.parser.d.ts.map +1 -1
  53. package/dist/parser/cursor-rules.parser.js +28 -5
  54. package/dist/parser/cursor-rules.parser.js.map +1 -1
  55. package/dist/renderer/cursor-rules.renderer.d.ts.map +1 -1
  56. package/dist/renderer/cursor-rules.renderer.js +3 -5
  57. package/dist/renderer/cursor-rules.renderer.js.map +1 -1
  58. package/dist/renderer/mdc.renderer.d.ts.map +1 -1
  59. package/dist/renderer/mdc.renderer.js +3 -2
  60. package/dist/renderer/mdc.renderer.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,155 @@
1
+ import { computeScore, SEVERITY_ORDER } from './auditor.interface.js';
2
+ import { getAuditors } from './auditor-registry.js';
3
+ import { renderConsoleReport } from './reporter/console-reporter.js';
4
+ import { DirectoryScanner } from './scanner/directory-scanner.js';
5
+ /**
6
+ * AuditEngine — the main entry point for security auditing.
7
+ *
8
+ * Flow:
9
+ * 1. Get all registered auditors
10
+ * 2. Filter by options (minSeverity, specific auditors)
11
+ * 3. Run each applicable auditor against the parsed skill
12
+ * 4. Aggregate findings
13
+ * 5. Compute score + generate report
14
+ */
15
+ export class AuditEngine {
16
+ options;
17
+ constructor(options = {}) {
18
+ this.options = {
19
+ minSeverity: options.minSeverity ?? 'info',
20
+ auditors: options.auditors ?? [],
21
+ noDirectory: options.noDirectory ?? false,
22
+ };
23
+ }
24
+ /**
25
+ * Audit a single parsed skill file.
26
+ */
27
+ auditSkill(skill, filePath, target) {
28
+ const auditors = this.resolveAuditors(skill.metadata.sourceFormat);
29
+ const findings = [];
30
+ for (const auditor of auditors) {
31
+ try {
32
+ const result = auditor.audit(skill, filePath);
33
+ findings.push(...result);
34
+ }
35
+ catch (err) {
36
+ findings.push({
37
+ id: 'ERR',
38
+ severity: 'info',
39
+ title: `Auditor "${auditor.id}" 执行出错`,
40
+ description: String(err),
41
+ filePath,
42
+ recommendation: '检查 auditor 实现是否正确',
43
+ });
44
+ }
45
+ }
46
+ return this.buildReport(findings, target ?? filePath, skill.metadata.sourceFormat, false);
47
+ }
48
+ /**
49
+ * Audit a skill directory, including file-level and directory-level checks.
50
+ */
51
+ auditDirectory(skill, rootPath, skillFilePath, target) {
52
+ const auditors = this.resolveAuditors(skill.metadata.sourceFormat);
53
+ const findings = [];
54
+ // Run all applicable auditors on the parsed skill
55
+ for (const auditor of auditors) {
56
+ try {
57
+ const result = auditor.audit(skill, skillFilePath);
58
+ findings.push(...result);
59
+ }
60
+ catch (err) {
61
+ findings.push({
62
+ id: 'ERR',
63
+ severity: 'info',
64
+ title: `Auditor "${auditor.id}" 执行出错`,
65
+ description: String(err),
66
+ filePath: skillFilePath,
67
+ recommendation: '检查 auditor 实现是否正确',
68
+ });
69
+ }
70
+ }
71
+ // Run directory-specific scanner
72
+ const dirScanner = new DirectoryScanner();
73
+ try {
74
+ const dirFindings = dirScanner.auditDirectory(rootPath, skillFilePath);
75
+ findings.push(...dirFindings);
76
+ }
77
+ catch (err) {
78
+ // Directory scan is best-effort
79
+ }
80
+ return this.buildReport(findings, target ?? rootPath, skill.metadata.sourceFormat, true);
81
+ }
82
+ /**
83
+ * Run all auditors and return the report object.
84
+ */
85
+ run(skill, filePath, isDirectory) {
86
+ return this.auditSkill(skill, filePath, filePath);
87
+ }
88
+ /**
89
+ * Generate console-friendly report string.
90
+ */
91
+ reportToString(report) {
92
+ return renderConsoleReport(report);
93
+ }
94
+ /**
95
+ * Generate JSON report string.
96
+ */
97
+ reportToJson(report, pretty = true) {
98
+ return JSON.stringify(report, null, pretty ? 2 : undefined);
99
+ }
100
+ resolveAuditors(format) {
101
+ const all = getAuditors();
102
+ let filtered = all;
103
+ // Filter by format support
104
+ filtered = filtered.filter((a) => !a.supportedFormats ||
105
+ a.supportedFormats.length === 0 ||
106
+ a.supportedFormats.includes(format));
107
+ // Filter by specific auditors if requested
108
+ if (this.options.auditors.length > 0) {
109
+ filtered = filtered.filter((a) => this.options.auditors.includes(a.id));
110
+ }
111
+ return filtered;
112
+ }
113
+ buildReport(findings, target, format, isDirectory) {
114
+ // Apply severity filter
115
+ const minIdx = SEVERITY_ORDER.indexOf(this.options.minSeverity);
116
+ const filtered = findings.filter((f) => {
117
+ const idx = SEVERITY_ORDER.indexOf(f.severity);
118
+ return idx <= minIdx; // higher severity = lower index
119
+ });
120
+ // Count by severity
121
+ const counts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
122
+ for (const f of filtered) {
123
+ counts[f.severity]++;
124
+ }
125
+ const score = computeScore(counts.critical, counts.high, counts.medium, counts.low, counts.info);
126
+ // Generate summary
127
+ const parts = [];
128
+ if (filtered.length === 0) {
129
+ parts.push('未发现安全问题,请继续保持');
130
+ }
131
+ else {
132
+ if (counts.critical > 0)
133
+ parts.push(`发现 ${counts.critical} 个严重问题`);
134
+ if (counts.high > 0)
135
+ parts.push(`发现 ${counts.high} 个高危问题`);
136
+ if (counts.medium > 0)
137
+ parts.push(`发现 ${counts.medium} 个中危问题`);
138
+ if (filtered.length > 0)
139
+ parts.push(`共 ${filtered.length} 项发现`);
140
+ }
141
+ const hasIssues = counts.critical > 0 || counts.high > 0 || counts.medium > 0;
142
+ return {
143
+ target,
144
+ format,
145
+ isDirectory,
146
+ findings: filtered,
147
+ score,
148
+ summary: hasIssues
149
+ ? `存在安全风险 (${score.level}级/${score.total}分) — ${parts.join('; ')}`
150
+ : `安全 (${score.level}级/${score.total}分) — ${parts.join('; ')}`,
151
+ timestamp: new Date().toISOString(),
152
+ };
153
+ }
154
+ }
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuditReport } from '../auditor.interface.js';
2
+ /** Render findings grouped by file, with severity coloring */
3
+ export declare function renderConsoleReport(report: AuditReport): string;
4
+ //# sourceMappingURL=console-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-reporter.d.ts","sourceRoot":"","sources":["../../../src/audit/reporter/console-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,yBAAyB,CAAC;AAqBnF,8DAA8D;AAC9D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA2E/D"}
@@ -0,0 +1,107 @@
1
+ import { SEVERITY_LABELS } from '../auditor.interface.js';
2
+ const COLORS = {
3
+ critical: '\x1b[1;31m', // bold red
4
+ high: '\x1b[33m', // yellow/orange
5
+ medium: '\x1b[93m', // bright yellow
6
+ low: '\x1b[32m', // green
7
+ info: '\x1b[36m', // cyan
8
+ };
9
+ const RESET = '\x1b[0m';
10
+ const BOLD = '\x1b[1m';
11
+ const DIM = '\x1b[2m';
12
+ const GRAY = '\x1b[90m';
13
+ const HEADER_BG = '\x1b[44m'; // blue bg
14
+ const HEADER_FG = '\x1b[37m'; // white fg
15
+ const RED_BG = '\x1b[41m';
16
+ const YELLOW_BG = '\x1b[43m';
17
+ const GREEN_BG = '\x1b[42m';
18
+ /** Render findings grouped by file, with severity coloring */
19
+ export function renderConsoleReport(report) {
20
+ const lines = [];
21
+ // ── Header box ──
22
+ const width = 50;
23
+ lines.push('');
24
+ lines.push(formatSeparator('═', width, HEADER_BG, HEADER_FG));
25
+ lines.push(padCenter(' 🔍 TransSkill Security Audit', width));
26
+ lines.push(formatSeparator('─', width, DIM));
27
+ lines.push(padCenter(` Target: ${report.target}`, width));
28
+ lines.push(padCenter(` Format: ${report.format}${report.isDirectory ? ' (directory)' : ''}`, width));
29
+ lines.push(formatSeparator('═', width, HEADER_BG, HEADER_FG));
30
+ lines.push('');
31
+ // ── Group findings by filePath ──
32
+ const grouped = groupBy(report.findings, (f) => f.filePath);
33
+ for (const [filePath, findings] of Object.entries(grouped)) {
34
+ lines.push(` ${BOLD}📄 ${filePath}${RESET}`);
35
+ lines.push('');
36
+ for (const finding of findings) {
37
+ const color = COLORS[finding.severity];
38
+ const label = SEVERITY_LABELS[finding.severity];
39
+ const loc = finding.lineNumber ? ` (line ${finding.lineNumber})` : '';
40
+ lines.push(` ${color}${finding.id}${RESET} ${BOLD}${finding.title}${RESET}${loc}`);
41
+ if (finding.snippet) {
42
+ lines.push(` ${GRAY}→ ${finding.snippet}${RESET}`);
43
+ }
44
+ if (finding.recommendation) {
45
+ lines.push(` ${GRAY}💡 ${finding.recommendation}${RESET}`);
46
+ }
47
+ lines.push('');
48
+ }
49
+ }
50
+ // ── Score box ──
51
+ const score = report.score;
52
+ const totalWidth = 50;
53
+ lines.push(formatSeparator('━', totalWidth, DIM));
54
+ lines.push('');
55
+ // Score badge
56
+ const scoreColor = score.level === 'A' || score.level === 'B'
57
+ ? GREEN_BG
58
+ : score.level === 'C'
59
+ ? YELLOW_BG
60
+ : RED_BG;
61
+ const scoreStr = ` ${BOLD}📊 安全评分: ${score.total}/100 (${score.level}级)${RESET}`;
62
+ lines.push(` ${scoreColor}${scoreStr}${RESET}`);
63
+ lines.push('');
64
+ lines.push(formatLine('🔴 Critical', score.critical, totalWidth));
65
+ lines.push(formatLine('🟠 High', score.high, totalWidth));
66
+ lines.push(formatLine('🟡 Medium', score.medium, totalWidth));
67
+ lines.push(formatLine('🟢 Low', score.low, totalWidth));
68
+ lines.push(formatLine('ℹ️ Info', score.info, totalWidth));
69
+ // Summary
70
+ if (score.level === 'A' || score.level === 'B') {
71
+ lines.push('');
72
+ lines.push(` ${GREEN_BG} ✅ ${report.summary} ${RESET}`);
73
+ }
74
+ else {
75
+ lines.push('');
76
+ lines.push(` ${RED_BG} ⚠️ ${report.summary} ${RESET}`);
77
+ }
78
+ lines.push(formatSeparator('━', totalWidth, DIM));
79
+ lines.push('');
80
+ return lines.join('\n');
81
+ }
82
+ // ── Helpers ──
83
+ function formatLine(label, count, totalWidth) {
84
+ const countStr = `${count}`;
85
+ const padding = totalWidth - label.length - countStr.length - 4;
86
+ return ` ${label}${' '.repeat(Math.max(1, padding))}${countStr}`;
87
+ }
88
+ function padCenter(text, width) {
89
+ if (text.length >= width)
90
+ return text;
91
+ const pad = Math.floor((width - text.length) / 2);
92
+ return ' '.repeat(Math.max(0, pad)) + text;
93
+ }
94
+ function formatSeparator(char, width, ...styles) {
95
+ return styles.join('') + char.repeat(width) + RESET;
96
+ }
97
+ function groupBy(items, keyFn) {
98
+ const result = {};
99
+ for (const item of items) {
100
+ const key = keyFn(item);
101
+ if (!result[key])
102
+ result[key] = [];
103
+ result[key].push(item);
104
+ }
105
+ return result;
106
+ }
107
+ //# sourceMappingURL=console-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../src/audit/reporter/console-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Severity } from '../auditor.interface.js';
2
+ export interface CommandRule {
3
+ id: string;
4
+ pattern: RegExp;
5
+ severity: Severity;
6
+ description: string;
7
+ recommendation: string;
8
+ cwe?: string;
9
+ }
10
+ /**
11
+ * Rules for detecting dangerous shell commands and patterns
12
+ * in agent skill instructions.
13
+ */
14
+ export declare const DANGEROUS_COMMAND_RULES: CommandRule[];
15
+ //# sourceMappingURL=dangerous-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangerous-commands.d.ts","sourceRoot":"","sources":["../../../src/audit/rules/dangerous-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,EA8LhD,CAAC"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Rules for detecting dangerous shell commands and patterns
3
+ * in agent skill instructions.
4
+ */
5
+ export const DANGEROUS_COMMAND_RULES = [
6
+ // ── System destruction ──
7
+ {
8
+ id: 'L1-001a',
9
+ pattern: /rm\s+-rf\s+(\/|\/\*|~\/?\*?)/i,
10
+ severity: 'critical',
11
+ description: '递归强制删除系统根目录或 home 目录,可能导致系统崩溃',
12
+ recommendation: '移除 rm -rf 指令,使用更安全的临时目录清理方式',
13
+ cwe: 'CWE-22',
14
+ },
15
+ {
16
+ id: 'L1-001b',
17
+ pattern: /\b(?:mkfs|format)\s+/i,
18
+ severity: 'critical',
19
+ description: '格式化磁盘指令,可能导致数据永久丢失',
20
+ recommendation: '不要在 skill 中包含格式化磁盘的指令',
21
+ cwe: 'CWE-22',
22
+ },
23
+ {
24
+ id: 'L1-001c',
25
+ pattern: /\bshutdown\b|\bpoweroff\b|\breboot\b|:\(\)\s*\{[^}]*\}:\s*;/i,
26
+ severity: 'critical',
27
+ description: '关机/重启命令或 fork bomb,可导致拒绝服务',
28
+ recommendation: '移除所有关机/重启/fork bomb 指令',
29
+ cwe: 'CWE-835',
30
+ },
31
+ // ── Privilege escalation ──
32
+ {
33
+ id: 'L1-001d',
34
+ pattern: /\bsudo\s+(?!apt\b|-u\s+\w+\s+(?:echo|printf|true)\b)/i,
35
+ severity: 'critical',
36
+ description: '使用 sudo 提权执行操作',
37
+ recommendation: '避免在 skill 中使用 sudo,如需安装依赖应提示用户手动操作',
38
+ cwe: 'CWE-269',
39
+ },
40
+ {
41
+ id: 'L1-001e',
42
+ pattern: /\bchmod\s+777\b/i,
43
+ severity: 'high',
44
+ description: '将文件权限设为 777(任何人可读写执行)',
45
+ recommendation: '使用最小必要权限,如 chmod 755 或 chmod 644',
46
+ cwe: 'CWE-732',
47
+ },
48
+ {
49
+ id: 'L1-001f',
50
+ pattern: /\bchown\s+(?!\$\w+)/i,
51
+ severity: 'high',
52
+ description: '修改文件所有者,可能存在权限提升风险',
53
+ recommendation: '避免在 skill 中自动修改文件所有者',
54
+ cwe: 'CWE-732',
55
+ },
56
+ // ── Remote code execution ──
57
+ {
58
+ id: 'L1-002a',
59
+ pattern: /(?:curl|wget)\s+(?:-s\s*|-q\s*|--silent\s*|--quiet\s*)?['"]?(?:https?:\/\/)?[^\s'"]+?\s*[|;`]\s*(?:sh|bash|zsh|python|node)\b/i,
60
+ severity: 'critical',
61
+ description: '从网络下载脚本并直接执行(管道到 shell),典型的远程代码执行模式',
62
+ recommendation: '不要从不可信来源下载并执行脚本,建议使用包管理器安装',
63
+ cwe: 'CWE-494',
64
+ },
65
+ {
66
+ id: 'L1-002b',
67
+ pattern: /\b(?:eval|exec)\s*\(/i,
68
+ severity: 'critical',
69
+ description: '动态代码执行函数调用,可能被用于执行任意代码',
70
+ recommendation: '避免使用 eval/exec,使用更安全的替代方案',
71
+ cwe: 'CWE-95',
72
+ },
73
+ {
74
+ id: 'L1-002c',
75
+ pattern: /\b(?:subprocess|Popen|execSync|execFile)\b/i,
76
+ severity: 'high',
77
+ description: '子进程创建/代码执行调用',
78
+ recommendation: '审查子进程调用的参数,确保没有注入风险',
79
+ cwe: 'CWE-78',
80
+ },
81
+ {
82
+ id: 'L1-002d',
83
+ pattern: /\b(?:Invoke-Expression|iex)\b/i,
84
+ severity: 'critical',
85
+ description: 'PowerShell 动态代码执行',
86
+ recommendation: '避免使用 Invoke-Expression,使用安全的替代方案',
87
+ cwe: 'CWE-95',
88
+ },
89
+ {
90
+ id: 'L1-002e',
91
+ pattern: /spawn\s*\(/i,
92
+ severity: 'high',
93
+ description: '子进程创建(spawn),可能执行任意命令',
94
+ recommendation: '审查 spawn 调用的参数是否安全',
95
+ cwe: 'CWE-78',
96
+ },
97
+ // ── Network exfiltration ──
98
+ {
99
+ id: 'L1-003a',
100
+ pattern: /(?:curl|wget)\s+.*?(?:-d\b|--data\b|--data-raw\b|--post-file\b|--upload-file\b)/i,
101
+ severity: 'critical',
102
+ description: '通过 HTTP 请求向外发送数据,可能用于数据窃取',
103
+ recommendation: '审查数据发送操作,确保不包含敏感信息',
104
+ cwe: 'CWE-201',
105
+ },
106
+ {
107
+ id: 'L1-003b',
108
+ pattern: /\b(?:nc|ncat)\s+/i,
109
+ severity: 'high',
110
+ description: '使用 netcat 建立网络连接,可被用于反向 shell 或数据窃取',
111
+ recommendation: '避免在 skill 中使用 nc/ncat',
112
+ cwe: 'CWE-201',
113
+ },
114
+ // ── SSH / key compromise ──
115
+ {
116
+ id: 'L1-004a',
117
+ pattern: /(?:cat|type)\s+.*(?:id_rsa|id_ed25519|\.ssh|\.pem|secret|token|\.env)/i,
118
+ severity: 'high',
119
+ description: '读取 SSH 私钥、令牌或环境变量文件,可能导致凭证泄露',
120
+ recommendation: '不要读取或共享敏感凭证文件',
121
+ cwe: 'CWE-522',
122
+ },
123
+ {
124
+ id: 'L1-004b',
125
+ pattern: /(?:>>?)\s*.*(?:id_rsa|authorized_keys|\.ssh)/i,
126
+ severity: 'critical',
127
+ description: '向 SSH 配置目录写入内容,可能安装后门持久化',
128
+ recommendation: '禁止向 SSH 配置目录写入内容',
129
+ cwe: 'CWE-276',
130
+ },
131
+ // ── Dangerous git operations ──
132
+ {
133
+ id: 'L1-005a',
134
+ pattern: /git\s+push\s+.*--force/i,
135
+ severity: 'medium',
136
+ description: '强制推送 git 历史,可能覆盖远程分支',
137
+ recommendation: '避免使用 --force 推送,使用 --force-with-lease 替代',
138
+ cwe: 'CWE-348',
139
+ },
140
+ {
141
+ id: 'L1-005b',
142
+ pattern: /git\s+.*--config\s+(?:credential|user\.(?:email|name))/i,
143
+ severity: 'low',
144
+ description: '修改 git 凭证或用户配置',
145
+ recommendation: '不要在 skill 中修改 git 配置',
146
+ },
147
+ // ── Environment / secrets ──
148
+ {
149
+ id: 'L1-006a',
150
+ pattern: /\$(?:SECRET|TOKEN|API_KEY|PASSWORD|PASSWD|CREDENTIALS|AUTH)\b/i,
151
+ severity: 'medium',
152
+ description: '引用环境变量中的敏感信息(API Key、Token、密码)',
153
+ recommendation: '避免在 skill 中暴露敏感环境变量名',
154
+ cwe: 'CWE-200',
155
+ },
156
+ {
157
+ id: 'L1-006b',
158
+ pattern: /export\s+\w+=(?:(?!["']\w).)*[A-Za-z0-9+/=]{40,}/i,
159
+ severity: 'high',
160
+ description: 'export 命令中包含疑似 Token/Key 的长字符串',
161
+ recommendation: '不要在 skill 中硬编码密钥,使用环境变量引用',
162
+ cwe: 'CWE-798',
163
+ },
164
+ // ── Misc dangerous patterns ──
165
+ {
166
+ id: 'L1-007a',
167
+ pattern: /\bnpm\s+publish\b/i,
168
+ severity: 'medium',
169
+ description: '自动发布 npm 包,可能导致意外发布',
170
+ recommendation: '避免自动发布命令,使用手动确认',
171
+ },
172
+ {
173
+ id: 'L1-007b',
174
+ pattern: /\bdangerouslySetInnerHTML\b/i,
175
+ severity: 'medium',
176
+ description: 'React 危险 HTML 渲染,可能导致 XSS',
177
+ recommendation: '避免使用 dangerouslySetInnerHTML,使用安全渲染',
178
+ cwe: 'CWE-79',
179
+ },
180
+ {
181
+ id: 'L1-007c',
182
+ pattern: /(?:innerHTML|outerHTML)\s*=.*(?:document|cookie|localStorage)/i,
183
+ severity: 'high',
184
+ description: '直接操作 DOM 可能导致 XSS 攻击',
185
+ recommendation: '使用安全的 DOM 操作方式',
186
+ cwe: 'CWE-79',
187
+ },
188
+ ];
189
+ //# sourceMappingURL=dangerous-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangerous-commands.js","sourceRoot":"","sources":["../../../src/audit/rules/dangerous-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Severity } from '../auditor.interface.js';
2
+ export interface PromptInjectionRule {
3
+ id: string;
4
+ pattern: RegExp;
5
+ severity: Severity;
6
+ description: string;
7
+ recommendation: string;
8
+ cwe?: string;
9
+ }
10
+ /**
11
+ * Rules for detecting prompt injection and system override attempts
12
+ * in agent skill instructions.
13
+ */
14
+ export declare const PROMPT_INJECTION_RULES: PromptInjectionRule[];
15
+ //# sourceMappingURL=prompt-injection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.d.ts","sourceRoot":"","sources":["../../../src/audit/rules/prompt-injection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EA6DvD,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Rules for detecting prompt injection and system override attempts
3
+ * in agent skill instructions.
4
+ */
5
+ export const PROMPT_INJECTION_RULES = [
6
+ // ── System override attempts ──
7
+ {
8
+ id: 'L1-010a',
9
+ pattern: /ignore\s+(?:all\s+)?(?:previous|above|your|my|the)\s+(?:instructions?|directives?|rules?|commands?|prompts?|orders?)/i,
10
+ severity: 'high',
11
+ description: '尝试覆盖/忽略系统指令,典型的 prompt 注入模式',
12
+ recommendation: '正常 skill 不应要求忽略已有指令',
13
+ cwe: 'CWE-940',
14
+ },
15
+ {
16
+ id: 'L1-010b',
17
+ pattern: /(?:SYSTEM|SYS)\s*(?:OVERRIDE|MODE|PROMPT|COMMAND)[:\s]/i,
18
+ severity: 'high',
19
+ description: '模拟系统级指令覆盖,可能是恶意注入',
20
+ recommendation: '正常 skill 不应模拟系统指令',
21
+ cwe: 'CWE-940',
22
+ },
23
+ {
24
+ id: 'L1-010c',
25
+ pattern: /\byou\s+(?:are\s+)?(?:now|must|will|should)\s+(?!be|not|only|able)(?:a\s+)?(?:free|released|unleashed|unconstrained|uncensored|unfiltered|ungoverned|unrestricted)\b/i,
26
+ severity: 'high',
27
+ description: '尝试"释放"AI 约束,典型 jailbreak 模式',
28
+ recommendation: '合法 skill 不应试图解除 AI 约束',
29
+ cwe: 'CWE-940',
30
+ },
31
+ {
32
+ id: 'L1-010d',
33
+ pattern: /\b(?:disregard|forget|erase|delete|remove|overwrite)\s+(?:all|previous|above|the)\s+(?:instructions?|rules?|context|memory|prompts?)/i,
34
+ severity: 'high',
35
+ description: '试图清除 AI 上下文或记忆',
36
+ recommendation: '正常 skill 不应要求清除上下文或记忆',
37
+ cwe: 'CWE-940',
38
+ },
39
+ // ── Role manipulation ──
40
+ {
41
+ id: 'L1-010e',
42
+ pattern: /\byou\s+(?:are\s+)?(?:now\s+)?(?:DAN|Jail(?:brea)?k|GPT-\d+Override|Developer\s+Mode)\b/i,
43
+ severity: 'medium',
44
+ description: '引用已知 jailbreak 角色(如 DAN/Developer Mode)',
45
+ recommendation: '合法 skill 不应使用 jailbreak 角色设定',
46
+ cwe: 'CWE-940',
47
+ },
48
+ {
49
+ id: 'L1-010f',
50
+ pattern: /\boutput\s+(?:your\s+)?(?:system\s+)?(?:prompt|instructions?|rules?)\s+(?:verbatim|exactly|as\s+is|at\s+the\s+beginning)/i,
51
+ severity: 'medium',
52
+ description: '试图提取系统提示词,可能是信息收集行为',
53
+ recommendation: '正常 skill 不应尝试提取系统提示',
54
+ cwe: 'CWE-200',
55
+ },
56
+ // ── Urgency manipulation ──
57
+ {
58
+ id: 'L1-010g',
59
+ pattern: /\b(?:URGENT|IMPORTANT|CRITICAL|VITAL|ABSOLUTELY)\s*:\s*(?!NOTE|NOTEBOOK|REMINDER|ANNOUNCEMENT|UPDATE)/i,
60
+ severity: 'low',
61
+ description: '使用紧急/重要词汇引导 AI 行为(组合其他模式时风险更高)',
62
+ recommendation: '避免在 skill 中使用过度强调性语言引导 AI',
63
+ },
64
+ ];
65
+ //# sourceMappingURL=prompt-injection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-injection.js","sourceRoot":"","sources":["../../../src/audit/rules/prompt-injection.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA0B;IAC3D,iCAAiC;IACjC;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,uHAAuH;QAChI,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,6BAA6B;QAC1C,cAAc,EAAE,qBAAqB;QACrC,GAAG,EAAE,SAAS;KACf;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,yDAAyD;QAClE,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,mBAAmB;QAChC,cAAc,EAAE,mBAAmB;QACnC,GAAG,EAAE,SAAS;KACf;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,uKAAuK;QAChL,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,6BAA6B;QAC1C,cAAc,EAAE,uBAAuB;QACvC,GAAG,EAAE,SAAS;KACf;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,uIAAuI;QAChJ,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,gBAAgB;QAC7B,cAAc,EAAE,uBAAuB;QACvC,GAAG,EAAE,SAAS;KACf;IAED,0BAA0B;IAC1B;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,0FAA0F;QACnG,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,yCAAyC;QACtD,cAAc,EAAE,8BAA8B;QAC9C,GAAG,EAAE,SAAS;KACf;IACD;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,2HAA2H;QACpI,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,qBAAqB;QAClC,cAAc,EAAE,qBAAqB;QACrC,GAAG,EAAE,SAAS;KACf;IAED,6BAA6B;IAC7B;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,wGAAwG;QACjH,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,gCAAgC;QAC7C,cAAc,EAAE,2BAA2B;KAC5C;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Severity } from '../auditor.interface.js';
2
+ export interface UrlRule {
3
+ id: string;
4
+ pattern: RegExp;
5
+ severity: Severity;
6
+ description: string;
7
+ recommendation: string;
8
+ }
9
+ /**
10
+ * Rules for detecting suspicious URLs and network references
11
+ * in agent skill instructions.
12
+ */
13
+ export declare const URL_PATTERNS: UrlRule[];
14
+ //# sourceMappingURL=suspicious-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspicious-urls.d.ts","sourceRoot":"","sources":["../../../src/audit/rules/suspicious-urls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,EAoCjC,CAAC"}