verification-layer 0.19.0 → 0.21.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/README.md +53 -0
- package/dist/cli.js +362 -0
- package/dist/cli.js.map +1 -1
- package/dist/marketplace/index.d.ts +8 -0
- package/dist/marketplace/index.d.ts.map +1 -0
- package/dist/marketplace/index.js +7 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/installer.d.ts +62 -0
- package/dist/marketplace/installer.d.ts.map +1 -0
- package/dist/marketplace/installer.js +254 -0
- package/dist/marketplace/installer.js.map +1 -0
- package/dist/marketplace/registry.d.ts +52 -0
- package/dist/marketplace/registry.d.ts.map +1 -0
- package/dist/marketplace/registry.js +759 -0
- package/dist/marketplace/registry.js.map +1 -0
- package/dist/marketplace/types.d.ts +123 -0
- package/dist/marketplace/types.d.ts.map +1 -0
- package/dist/marketplace/types.js +6 -0
- package/dist/marketplace/types.js.map +1 -0
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +3 -1
- package/dist/scan.js.map +1 -1
- package/dist/scanners/hipaa2026/index.d.ts +8 -0
- package/dist/scanners/hipaa2026/index.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/index.js +313 -0
- package/dist/scanners/hipaa2026/index.js.map +1 -0
- package/dist/scanners/hipaa2026/index.test.d.ts +5 -0
- package/dist/scanners/hipaa2026/index.test.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/index.test.js +321 -0
- package/dist/scanners/hipaa2026/index.test.js.map +1 -0
- package/dist/scanners/hipaa2026/patterns.d.ts +57 -0
- package/dist/scanners/hipaa2026/patterns.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/patterns.js +268 -0
- package/dist/scanners/hipaa2026/patterns.js.map +1 -0
- package/dist/scanners/skills/index.d.ts +7 -0
- package/dist/scanners/skills/index.d.ts.map +1 -0
- package/dist/scanners/skills/index.js +159 -0
- package/dist/scanners/skills/index.js.map +1 -0
- package/dist/scanners/skills/patterns.d.ts +20 -0
- package/dist/scanners/skills/patterns.d.ts.map +1 -0
- package/dist/scanners/skills/patterns.js +215 -0
- package/dist/scanners/skills/patterns.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/skills/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;AAGpE,eAAO,MAAM,aAAa,EAAE,OAsH3B,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent Skills Security Scanner
|
|
3
|
+
* Scans SKILL.md files for HIPAA violations and security issues
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from 'fs/promises';
|
|
6
|
+
import { ALL_SKILL_PATTERNS } from './patterns.js';
|
|
7
|
+
export const skillsScanner = {
|
|
8
|
+
name: 'AI Agent Skills Scanner',
|
|
9
|
+
category: 'access-control',
|
|
10
|
+
async scan(files, options) {
|
|
11
|
+
const findings = [];
|
|
12
|
+
// Filter to only SKILL.md files
|
|
13
|
+
const skillFiles = files.filter((f) => f.endsWith('SKILL.md') ||
|
|
14
|
+
f.endsWith('skill.md') ||
|
|
15
|
+
f.endsWith('.skill.md') ||
|
|
16
|
+
f.includes('/skills/') ||
|
|
17
|
+
f.includes('/.clawrc/'));
|
|
18
|
+
if (skillFiles.length === 0) {
|
|
19
|
+
return findings;
|
|
20
|
+
}
|
|
21
|
+
console.log(`🔍 Scanning ${skillFiles.length} AI Agent Skill file(s)...`);
|
|
22
|
+
for (const file of skillFiles) {
|
|
23
|
+
try {
|
|
24
|
+
const content = await readFile(file, 'utf-8');
|
|
25
|
+
const lines = content.split('\n');
|
|
26
|
+
// Scan each pattern
|
|
27
|
+
for (const pattern of ALL_SKILL_PATTERNS) {
|
|
28
|
+
for (let i = 0; i < lines.length; i++) {
|
|
29
|
+
const line = lines[i];
|
|
30
|
+
const match = line.match(pattern.pattern);
|
|
31
|
+
if (match) {
|
|
32
|
+
// Extract context (±3 lines)
|
|
33
|
+
const contextStart = Math.max(0, i - 3);
|
|
34
|
+
const contextEnd = Math.min(lines.length, i + 4);
|
|
35
|
+
const context = lines
|
|
36
|
+
.slice(contextStart, contextEnd)
|
|
37
|
+
.map((l, idx) => ({
|
|
38
|
+
lineNumber: contextStart + idx + 1,
|
|
39
|
+
content: l,
|
|
40
|
+
isMatch: contextStart + idx === i,
|
|
41
|
+
}));
|
|
42
|
+
findings.push({
|
|
43
|
+
id: pattern.id,
|
|
44
|
+
category: mapCategoryToCompliance(pattern.category),
|
|
45
|
+
severity: pattern.severity,
|
|
46
|
+
title: pattern.name,
|
|
47
|
+
description: pattern.description,
|
|
48
|
+
file,
|
|
49
|
+
line: i + 1,
|
|
50
|
+
recommendation: pattern.recommendation,
|
|
51
|
+
hipaaReference: pattern.hipaaReference,
|
|
52
|
+
context,
|
|
53
|
+
confidence: 'high',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Additional analysis: check for skill metadata
|
|
59
|
+
const metadata = extractSkillMetadata(content);
|
|
60
|
+
// Warn if skill requests broad permissions
|
|
61
|
+
if (metadata.permissions?.includes('*') || metadata.permissions?.includes('all')) {
|
|
62
|
+
findings.push({
|
|
63
|
+
id: 'skill-excessive-permissions',
|
|
64
|
+
category: 'access-control',
|
|
65
|
+
severity: 'high',
|
|
66
|
+
title: 'Skill requests excessive permissions',
|
|
67
|
+
description: `Skill requests wildcard permissions (*). This violates principle of least privilege.`,
|
|
68
|
+
file,
|
|
69
|
+
line: metadata.permissionsLine || 1,
|
|
70
|
+
recommendation: 'Limit skill permissions to specific actions needed. Use whitelist approach.',
|
|
71
|
+
hipaaReference: '§164.308(a)(4) - Access Controls',
|
|
72
|
+
confidence: 'high',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Warn if skill has no author/source
|
|
76
|
+
if (!metadata.author && !metadata.source) {
|
|
77
|
+
findings.push({
|
|
78
|
+
id: 'skill-unknown-author',
|
|
79
|
+
category: 'access-control',
|
|
80
|
+
severity: 'medium',
|
|
81
|
+
title: 'Skill from unknown/unverified source',
|
|
82
|
+
description: 'Skill has no author or source attribution. Cannot verify authenticity.',
|
|
83
|
+
file,
|
|
84
|
+
line: 1,
|
|
85
|
+
recommendation: 'Only install skills from trusted sources (e.g., verified ClawHub publishers).',
|
|
86
|
+
confidence: 'medium',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// Check if skill modifies system files
|
|
90
|
+
if (/(?:rm|mv|chmod|chown)\s+-rf?\s+\//.test(content)) {
|
|
91
|
+
findings.push({
|
|
92
|
+
id: 'skill-system-modification',
|
|
93
|
+
category: 'access-control',
|
|
94
|
+
severity: 'critical',
|
|
95
|
+
title: 'Skill attempts to modify system files',
|
|
96
|
+
description: 'Skill contains commands that modify critical system files',
|
|
97
|
+
file,
|
|
98
|
+
line: content.split('\n').findIndex((l) => /(?:rm|mv|chmod|chown)\s+-rf?\s+\//.test(l)) + 1,
|
|
99
|
+
recommendation: 'REJECT THIS SKILL. System file modifications are extremely dangerous.',
|
|
100
|
+
confidence: 'high',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`Error scanning skill file ${file}:`, error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return findings;
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
function mapCategoryToCompliance(skillCategory) {
|
|
112
|
+
switch (skillCategory) {
|
|
113
|
+
case 'phi-exposure':
|
|
114
|
+
return 'phi-exposure';
|
|
115
|
+
case 'credential-leak':
|
|
116
|
+
return 'access-control';
|
|
117
|
+
case 'malicious':
|
|
118
|
+
return 'access-control';
|
|
119
|
+
case 'hipaa-violation':
|
|
120
|
+
return 'encryption'; // Map to encryption as many are about secure transmission
|
|
121
|
+
default:
|
|
122
|
+
return 'access-control';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function extractSkillMetadata(content) {
|
|
126
|
+
const metadata = {};
|
|
127
|
+
const lines = content.split('\n');
|
|
128
|
+
for (let i = 0; i < lines.length; i++) {
|
|
129
|
+
const line = lines[i];
|
|
130
|
+
// Extract author
|
|
131
|
+
const authorMatch = line.match(/(?:author|by|created.by):\s*(.+)/i);
|
|
132
|
+
if (authorMatch) {
|
|
133
|
+
metadata.author = authorMatch[1].trim();
|
|
134
|
+
}
|
|
135
|
+
// Extract source
|
|
136
|
+
const sourceMatch = line.match(/(?:source|repository|url):\s*(.+)/i);
|
|
137
|
+
if (sourceMatch) {
|
|
138
|
+
metadata.source = sourceMatch[1].trim();
|
|
139
|
+
}
|
|
140
|
+
// Extract permissions
|
|
141
|
+
const permMatch = line.match(/(?:permissions?|requires?):\s*(.+)/i);
|
|
142
|
+
if (permMatch) {
|
|
143
|
+
metadata.permissions = permMatch[1].split(',').map((p) => p.trim());
|
|
144
|
+
metadata.permissionsLine = i + 1;
|
|
145
|
+
}
|
|
146
|
+
// Extract version
|
|
147
|
+
const versionMatch = line.match(/(?:version):\s*(.+)/i);
|
|
148
|
+
if (versionMatch) {
|
|
149
|
+
metadata.version = versionMatch[1].trim();
|
|
150
|
+
}
|
|
151
|
+
// Extract name
|
|
152
|
+
const nameMatch = line.match(/^#\s+(.+)/);
|
|
153
|
+
if (nameMatch && !metadata.name) {
|
|
154
|
+
metadata.name = nameMatch[1].trim();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return metadata;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent Skills Security Patterns (HIPAA-focused)
|
|
3
|
+
* Detects vulnerabilities in SKILL.md files for Claude Code, MCP, Cursor, etc.
|
|
4
|
+
*/
|
|
5
|
+
export interface SkillPattern {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
pattern: RegExp;
|
|
9
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
10
|
+
description: string;
|
|
11
|
+
recommendation: string;
|
|
12
|
+
hipaaReference?: string;
|
|
13
|
+
category: 'phi-exposure' | 'credential-leak' | 'malicious' | 'hipaa-violation';
|
|
14
|
+
}
|
|
15
|
+
export declare const PHI_EXPOSURE_PATTERNS: SkillPattern[];
|
|
16
|
+
export declare const CREDENTIAL_LEAK_PATTERNS: SkillPattern[];
|
|
17
|
+
export declare const MALICIOUS_PATTERNS: SkillPattern[];
|
|
18
|
+
export declare const HIPAA_VIOLATION_PATTERNS: SkillPattern[];
|
|
19
|
+
export declare const ALL_SKILL_PATTERNS: SkillPattern[];
|
|
20
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/skills/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,cAAc,GAAG,iBAAiB,GAAG,WAAW,GAAG,iBAAiB,CAAC;CAChF;AAGD,eAAO,MAAM,qBAAqB,EAAE,YAAY,EAmD/C,CAAC;AAGF,eAAO,MAAM,wBAAwB,EAAE,YAAY,EA8ClD,CAAC;AAGF,eAAO,MAAM,kBAAkB,EAAE,YAAY,EA+C5C,CAAC;AAGF,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAmDlD,CAAC;AAGF,eAAO,MAAM,kBAAkB,EAAE,YAAY,EAK5C,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Agent Skills Security Patterns (HIPAA-focused)
|
|
3
|
+
* Detects vulnerabilities in SKILL.md files for Claude Code, MCP, Cursor, etc.
|
|
4
|
+
*/
|
|
5
|
+
// PHI Exposure Patterns
|
|
6
|
+
export const PHI_EXPOSURE_PATTERNS = [
|
|
7
|
+
{
|
|
8
|
+
id: 'skill-phi-hardcoded-ssn',
|
|
9
|
+
name: 'Hardcoded SSN in skill prompt',
|
|
10
|
+
pattern: /\b\d{3}[-\s]?\d{2}[-\s]?\d{4}\b/,
|
|
11
|
+
severity: 'critical',
|
|
12
|
+
description: 'Social Security Number found in skill definition',
|
|
13
|
+
recommendation: 'Never hardcode PHI in skill prompts. Use placeholders like {{patient_id}} instead.',
|
|
14
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
15
|
+
category: 'phi-exposure',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'skill-phi-patient-name',
|
|
19
|
+
name: 'Patient name in example',
|
|
20
|
+
pattern: /(?:patient|client|user)(?:\s+name)?[:=]\s*['"]?(?!{{)[A-Z][a-z]+\s+[A-Z][a-z]+['"]?/i,
|
|
21
|
+
severity: 'high',
|
|
22
|
+
description: 'Real patient name appears in skill prompt example',
|
|
23
|
+
recommendation: 'Use fictional names (e.g., "John Doe") or template variables {{patient_name}}',
|
|
24
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
25
|
+
category: 'phi-exposure',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'skill-phi-dob',
|
|
29
|
+
name: 'Date of birth in prompt',
|
|
30
|
+
pattern: /(?:dob|date.{0,5}birth|birthdate)[:=]\s*['"]?\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}['"]?/i,
|
|
31
|
+
severity: 'high',
|
|
32
|
+
description: 'Date of birth found in skill definition',
|
|
33
|
+
recommendation: 'Use template variable {{date_of_birth}} instead of actual dates',
|
|
34
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
35
|
+
category: 'phi-exposure',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'skill-phi-mrn',
|
|
39
|
+
name: 'Medical Record Number exposed',
|
|
40
|
+
pattern: /(?:mrn|medical.{0,10}record.{0,10}number)[:=]\s*['"]?\d{6,}['"]?/i,
|
|
41
|
+
severity: 'critical',
|
|
42
|
+
description: 'Medical Record Number found in skill prompt',
|
|
43
|
+
recommendation: 'Never include real MRNs. Use {{medical_record_number}} placeholder.',
|
|
44
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
45
|
+
category: 'phi-exposure',
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'skill-phi-diagnosis',
|
|
49
|
+
name: 'Diagnosis code in prompt',
|
|
50
|
+
pattern: /(?:diagnosis|icd.?10?|condition)[:=]\s*['"]?[A-Z]\d{2}(?:\.\d{1,2})?['"]?/i,
|
|
51
|
+
severity: 'medium',
|
|
52
|
+
description: 'ICD diagnosis code found in skill example',
|
|
53
|
+
recommendation: 'Use generic examples or template variables for diagnoses',
|
|
54
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
55
|
+
category: 'phi-exposure',
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
// Credential Leak Patterns
|
|
59
|
+
export const CREDENTIAL_LEAK_PATTERNS = [
|
|
60
|
+
{
|
|
61
|
+
id: 'skill-api-key-exposed',
|
|
62
|
+
name: 'API key in skill configuration',
|
|
63
|
+
pattern: /(?:api.{0,5}key|apikey|access.{0,5}key)[:=]\s*['"]?[A-Za-z0-9_\-]{20,}['"]?/i,
|
|
64
|
+
severity: 'critical',
|
|
65
|
+
description: 'Hardcoded API key found in skill',
|
|
66
|
+
recommendation: 'Use environment variables: ${ANTHROPIC_API_KEY} or prompt user for keys',
|
|
67
|
+
category: 'credential-leak',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: 'skill-aws-credentials',
|
|
71
|
+
name: 'AWS credentials exposed',
|
|
72
|
+
pattern: /(?:AKIA|aws_access_key_id|aws_secret_access_key)[:=\s]['"]?[A-Z0-9]{20,}['"]?/i,
|
|
73
|
+
severity: 'critical',
|
|
74
|
+
description: 'AWS credentials found in skill definition',
|
|
75
|
+
recommendation: 'Never hardcode AWS credentials. Use IAM roles or environment variables.',
|
|
76
|
+
category: 'credential-leak',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: 'skill-database-password',
|
|
80
|
+
name: 'Database password in connection string',
|
|
81
|
+
pattern: /(?:postgres|mysql|mongodb):\/\/[^:]+:([^@\s]{4,})@/i,
|
|
82
|
+
severity: 'critical',
|
|
83
|
+
description: 'Database password exposed in connection string',
|
|
84
|
+
recommendation: 'Use environment variables: ${DB_PASSWORD} or credential manager',
|
|
85
|
+
category: 'credential-leak',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
id: 'skill-bearer-token',
|
|
89
|
+
name: 'Bearer token hardcoded',
|
|
90
|
+
pattern: /bearer\s+[A-Za-z0-9_\-\.]{20,}/i,
|
|
91
|
+
severity: 'critical',
|
|
92
|
+
description: 'Bearer authentication token found in skill',
|
|
93
|
+
recommendation: 'Tokens should be fetched securely at runtime, not hardcoded',
|
|
94
|
+
category: 'credential-leak',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'skill-private-key',
|
|
98
|
+
name: 'Private key in skill',
|
|
99
|
+
pattern: /-----BEGIN (?:RSA |EC )?PRIVATE KEY-----/,
|
|
100
|
+
severity: 'critical',
|
|
101
|
+
description: 'Private cryptographic key found in skill definition',
|
|
102
|
+
recommendation: 'Never include private keys. Use key management service.',
|
|
103
|
+
category: 'credential-leak',
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
// Malicious Command Patterns
|
|
107
|
+
export const MALICIOUS_PATTERNS = [
|
|
108
|
+
{
|
|
109
|
+
id: 'skill-data-exfiltration',
|
|
110
|
+
name: 'Data exfiltration detected',
|
|
111
|
+
pattern: /curl\s+(?:-X\s+POST\s+)?(?:https?:\/\/)?(?!localhost|127\.0\.0\.1|api\.(?:anthropic|openai)\.com)[^\s]+.*?\|/,
|
|
112
|
+
severity: 'critical',
|
|
113
|
+
description: 'Potential data exfiltration via curl to external domain',
|
|
114
|
+
recommendation: 'Review external API calls. Healthcare data should not be sent to unknown endpoints.',
|
|
115
|
+
hipaaReference: '§164.308(a)(4) - Access Controls',
|
|
116
|
+
category: 'malicious',
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
id: 'skill-reverse-shell',
|
|
120
|
+
name: 'Reverse shell attempt',
|
|
121
|
+
pattern: /(?:bash|sh|zsh)\s+-[ci]\s+['"].*?\/dev\/tcp\/|nc\s+-[el]|ncat\s+--exec/,
|
|
122
|
+
severity: 'critical',
|
|
123
|
+
description: 'Reverse shell command detected - potential backdoor',
|
|
124
|
+
recommendation: 'REJECT THIS SKILL. This is a clear malicious pattern.',
|
|
125
|
+
category: 'malicious',
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
id: 'skill-atomic-stealer',
|
|
129
|
+
name: 'Atomic Stealer pattern',
|
|
130
|
+
pattern: /(?:curl|wget).*?\.sh\s*\|\s*(?:bash|sh)|base64\s+-d.*?\|\s*(?:bash|sh)/,
|
|
131
|
+
severity: 'critical',
|
|
132
|
+
description: 'Pattern matches known Atomic Stealer malware distribution',
|
|
133
|
+
recommendation: 'REJECT THIS SKILL. This matches malware signatures from Snyk analysis.',
|
|
134
|
+
category: 'malicious',
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: 'skill-credential-scraper',
|
|
138
|
+
name: 'Credential scraping detected',
|
|
139
|
+
pattern: /(?:cat|grep|find).*?(?:\.aws|\.ssh|\.env|password|credential|secret)/i,
|
|
140
|
+
severity: 'high',
|
|
141
|
+
description: 'Commands that search for credential files',
|
|
142
|
+
recommendation: 'Verify legitimacy. Skills should not scrape credential files.',
|
|
143
|
+
category: 'malicious',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: 'skill-obfuscated-command',
|
|
147
|
+
name: 'Obfuscated command execution',
|
|
148
|
+
pattern: /eval\s*\$\(|`.*?`|\$\{[^}]*?\}/,
|
|
149
|
+
severity: 'high',
|
|
150
|
+
description: 'Command substitution or eval - common in malware',
|
|
151
|
+
recommendation: 'Review carefully. Obfuscation often hides malicious intent.',
|
|
152
|
+
category: 'malicious',
|
|
153
|
+
},
|
|
154
|
+
];
|
|
155
|
+
// HIPAA-Specific Violations
|
|
156
|
+
export const HIPAA_VIOLATION_PATTERNS = [
|
|
157
|
+
{
|
|
158
|
+
id: 'skill-http-phi-transmission',
|
|
159
|
+
name: 'PHI transmitted over HTTP',
|
|
160
|
+
pattern: /(?:curl|fetch|axios|request).*?http:\/\/(?!localhost|127\.0\.0\.1).*?(?:patient|phi|health|medical)/i,
|
|
161
|
+
severity: 'critical',
|
|
162
|
+
description: 'Skill transmits PHI over unencrypted HTTP',
|
|
163
|
+
recommendation: 'Use HTTPS for all PHI transmission. HTTP violates HIPAA encryption requirements.',
|
|
164
|
+
hipaaReference: '§164.312(e)(1) - Transmission Security',
|
|
165
|
+
category: 'hipaa-violation',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: 'skill-no-audit-logging',
|
|
169
|
+
name: 'PHI access without audit logging',
|
|
170
|
+
pattern: /(?:SELECT|UPDATE|DELETE).*?FROM.*?(?:patient|phi|health_record)(?!.*?(?:log|audit))/i,
|
|
171
|
+
severity: 'high',
|
|
172
|
+
description: 'Skill accesses PHI database without audit logging',
|
|
173
|
+
recommendation: 'Add audit logging: auditLog.record({ action, userId, resourceId })',
|
|
174
|
+
hipaaReference: '§164.308(a)(1)(ii)(D) - Audit Controls',
|
|
175
|
+
category: 'hipaa-violation',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'skill-phi-in-logs',
|
|
179
|
+
name: 'PHI logged to console/files',
|
|
180
|
+
pattern: /(?:console\.log|print|echo|logger\.).*?(?:\$\{?patient|\$\{?phi|medical_record)/i,
|
|
181
|
+
severity: 'high',
|
|
182
|
+
description: 'Skill logs PHI to console or log files',
|
|
183
|
+
recommendation: 'Never log PHI. Use redacted logging: logger.info({ patientId: "***" })',
|
|
184
|
+
hipaaReference: '§164.502(a) - PHI Use and Disclosure',
|
|
185
|
+
category: 'hipaa-violation',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'skill-phi-in-url',
|
|
189
|
+
name: 'PHI in URL parameters',
|
|
190
|
+
pattern: /(?:\?|&)(?:ssn|dob|mrn|diagnosis)=/i,
|
|
191
|
+
severity: 'critical',
|
|
192
|
+
description: 'Skill passes PHI in URL query parameters',
|
|
193
|
+
recommendation: 'Use POST with encrypted body. URLs are logged by proxies/servers.',
|
|
194
|
+
hipaaReference: '§164.312(e)(1) - Transmission Security',
|
|
195
|
+
category: 'hipaa-violation',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 'skill-no-encryption',
|
|
199
|
+
name: 'Missing encryption for PHI storage',
|
|
200
|
+
pattern: /(?:localStorage|sessionStorage|\.setItem).*?(?:patient|phi|health)/i,
|
|
201
|
+
severity: 'critical',
|
|
202
|
+
description: 'Skill stores PHI in browser storage without encryption',
|
|
203
|
+
recommendation: 'Use encrypted storage or server-side session storage only.',
|
|
204
|
+
hipaaReference: '§164.312(a)(2)(iv) - Encryption',
|
|
205
|
+
category: 'hipaa-violation',
|
|
206
|
+
},
|
|
207
|
+
];
|
|
208
|
+
// All patterns combined
|
|
209
|
+
export const ALL_SKILL_PATTERNS = [
|
|
210
|
+
...PHI_EXPOSURE_PATTERNS,
|
|
211
|
+
...CREDENTIAL_LEAK_PATTERNS,
|
|
212
|
+
...MALICIOUS_PATTERNS,
|
|
213
|
+
...HIPAA_VIOLATION_PATTERNS,
|
|
214
|
+
];
|
|
215
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/skills/patterns.ts"],"names":[],"mappings":"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"}
|