verification-layer 0.4.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 +345 -0
- package/dist/audit/evidence.d.ts +25 -0
- package/dist/audit/evidence.d.ts.map +1 -0
- package/dist/audit/evidence.js +70 -0
- package/dist/audit/evidence.js.map +1 -0
- package/dist/audit/index.d.ts +54 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +159 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +199 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +77 -0
- package/dist/config.js.map +1 -0
- package/dist/fixer/index.d.ts +11 -0
- package/dist/fixer/index.d.ts.map +1 -0
- package/dist/fixer/index.js +171 -0
- package/dist/fixer/index.js.map +1 -0
- package/dist/fixer/strategies.d.ts +3 -0
- package/dist/fixer/strategies.d.ts.map +1 -0
- package/dist/fixer/strategies.js +199 -0
- package/dist/fixer/strategies.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/audit-report.d.ts +13 -0
- package/dist/reporters/audit-report.d.ts.map +1 -0
- package/dist/reporters/audit-report.js +526 -0
- package/dist/reporters/audit-report.js.map +1 -0
- package/dist/reporters/fix-report.d.ts +3 -0
- package/dist/reporters/fix-report.d.ts.map +1 -0
- package/dist/reporters/fix-report.js +70 -0
- package/dist/reporters/fix-report.js.map +1 -0
- package/dist/reporters/index.d.ts +3 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +425 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/remediation-guides.d.ts +25 -0
- package/dist/reporters/remediation-guides.d.ts.map +1 -0
- package/dist/reporters/remediation-guides.js +636 -0
- package/dist/reporters/remediation-guides.js.map +1 -0
- package/dist/scan.d.ts +3 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +96 -0
- package/dist/scan.js.map +1 -0
- package/dist/scanners/access/index.d.ts +3 -0
- package/dist/scanners/access/index.d.ts.map +1 -0
- package/dist/scanners/access/index.js +102 -0
- package/dist/scanners/access/index.js.map +1 -0
- package/dist/scanners/audit/index.d.ts +3 -0
- package/dist/scanners/audit/index.d.ts.map +1 -0
- package/dist/scanners/audit/index.js +94 -0
- package/dist/scanners/audit/index.js.map +1 -0
- package/dist/scanners/encryption/index.d.ts +3 -0
- package/dist/scanners/encryption/index.d.ts.map +1 -0
- package/dist/scanners/encryption/index.js +86 -0
- package/dist/scanners/encryption/index.js.map +1 -0
- package/dist/scanners/phi/index.d.ts +3 -0
- package/dist/scanners/phi/index.d.ts.map +1 -0
- package/dist/scanners/phi/index.js +47 -0
- package/dist/scanners/phi/index.js.map +1 -0
- package/dist/scanners/phi/patterns.d.ts +13 -0
- package/dist/scanners/phi/patterns.d.ts.map +1 -0
- package/dist/scanners/phi/patterns.js +242 -0
- package/dist/scanners/phi/patterns.js.map +1 -0
- package/dist/scanners/retention/index.d.ts +3 -0
- package/dist/scanners/retention/index.d.ts.map +1 -0
- package/dist/scanners/retention/index.js +102 -0
- package/dist/scanners/retention/index.js.map +1 -0
- package/dist/scanners/security/index.d.ts +3 -0
- package/dist/scanners/security/index.d.ts.map +1 -0
- package/dist/scanners/security/index.js +280 -0
- package/dist/scanners/security/index.js.map +1 -0
- package/dist/stack-detector/index.d.ts +26 -0
- package/dist/stack-detector/index.d.ts.map +1 -0
- package/dist/stack-detector/index.js +317 -0
- package/dist/stack-detector/index.js.map +1 -0
- package/dist/stack-detector/stack-guides.d.ts +16 -0
- package/dist/stack-detector/stack-guides.d.ts.map +1 -0
- package/dist/stack-detector/stack-guides.js +772 -0
- package/dist/stack-detector/stack-guides.js.map +1 -0
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/context.d.ts +3 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +14 -0
- package/dist/utils/context.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
function toScreamingSnakeCase(varName) {
|
|
2
|
+
return varName
|
|
3
|
+
.replace(/([a-z])([A-Z])/g, '$1_$2')
|
|
4
|
+
.replace(/[-\s]+/g, '_')
|
|
5
|
+
.toUpperCase();
|
|
6
|
+
}
|
|
7
|
+
function extractVarName(line) {
|
|
8
|
+
// Match variable declarations: const/let/var name = or name: or name =
|
|
9
|
+
const match = line.match(/(?:const|let|var)\s+(\w+)|(\w+)\s*[:=]/);
|
|
10
|
+
if (match) {
|
|
11
|
+
return match[1] || match[2];
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const fixStrategies = {
|
|
16
|
+
'sql-injection-template': (line) => {
|
|
17
|
+
// Pattern: query(`SELECT * FROM users WHERE id = ${userId}`)
|
|
18
|
+
// Convert to: query('SELECT * FROM users WHERE id = ?', [userId])
|
|
19
|
+
const templateMatch = line.match(/(\w+)\s*\(\s*`([^`]*)\$\{([^}]+)\}([^`]*)`\s*\)/);
|
|
20
|
+
if (templateMatch) {
|
|
21
|
+
const [, funcName, before, variable, after] = templateMatch;
|
|
22
|
+
// Replace all template interpolations with ?
|
|
23
|
+
let sql = before + '?' + after;
|
|
24
|
+
const vars = [variable.trim()];
|
|
25
|
+
// Handle multiple interpolations
|
|
26
|
+
let remaining = sql;
|
|
27
|
+
const additionalMatches = remaining.match(/\$\{([^}]+)\}/g);
|
|
28
|
+
if (additionalMatches) {
|
|
29
|
+
for (const match of additionalMatches) {
|
|
30
|
+
const varMatch = match.match(/\$\{([^}]+)\}/);
|
|
31
|
+
if (varMatch) {
|
|
32
|
+
vars.push(varMatch[1].trim());
|
|
33
|
+
remaining = remaining.replace(match, '?');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
sql = remaining;
|
|
37
|
+
}
|
|
38
|
+
return line.replace(/(\w+)\s*\(\s*`[^`]*`\s*\)/, `${funcName}('${sql}', [${vars.join(', ')}])`);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
},
|
|
42
|
+
'sql-injection-concat': (line) => {
|
|
43
|
+
// Pattern: query("SELECT * FROM users WHERE id = " + userId + " AND ...")
|
|
44
|
+
// Convert to: query("SELECT * FROM users WHERE id = ? AND ...", [userId])
|
|
45
|
+
// This is a complex pattern - we'll be conservative and only fix simple cases
|
|
46
|
+
// Match: func("sql part" + variable + "sql part")
|
|
47
|
+
const simpleMatch = line.match(/(\w+)\s*\(\s*"([^"]+)"\s*\+\s*(\w+)\s*\+\s*"([^"]*)"\s*\)/);
|
|
48
|
+
if (simpleMatch) {
|
|
49
|
+
const [, funcName, sqlBefore, variable, sqlAfter] = simpleMatch;
|
|
50
|
+
// Remove any trailing quote marks from sqlBefore that were meant for the variable
|
|
51
|
+
const cleanBefore = sqlBefore.replace(/'?\s*$/, '');
|
|
52
|
+
// Remove any leading quote marks from sqlAfter
|
|
53
|
+
const cleanAfter = sqlAfter.replace(/^\s*'?/, '');
|
|
54
|
+
const sql = cleanBefore + '?' + cleanAfter;
|
|
55
|
+
return line.replace(/(\w+)\s*\(\s*"[^"]+"\s*\+\s*\w+\s*\+\s*"[^"]*"\s*\)/, `${funcName}('${sql}', [${variable}])`);
|
|
56
|
+
}
|
|
57
|
+
// For more complex patterns, don't attempt auto-fix
|
|
58
|
+
return null;
|
|
59
|
+
},
|
|
60
|
+
'hardcoded-password': (line) => {
|
|
61
|
+
// Pattern: password = "secret" or password: "secret"
|
|
62
|
+
// Convert to: password = process.env.PASSWORD
|
|
63
|
+
const match = line.match(/(password|pwd)\s*[:=]\s*(['"`])[^'"`]+\2/i);
|
|
64
|
+
if (match) {
|
|
65
|
+
const varName = extractVarName(line);
|
|
66
|
+
const envVarName = varName ? toScreamingSnakeCase(varName) : 'PASSWORD';
|
|
67
|
+
return line.replace(/(password|pwd)\s*[:=]\s*(['"`])[^'"`]+\2/i, `$1 = process.env.${envVarName}`);
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
},
|
|
71
|
+
'hardcoded-secret': (line) => {
|
|
72
|
+
// Pattern: secret = "xyz"
|
|
73
|
+
// Convert to: secret = process.env.SECRET
|
|
74
|
+
const match = line.match(/secret\s*[:=]\s*(['"`])[^'"`]+\1/i);
|
|
75
|
+
if (match) {
|
|
76
|
+
const varName = extractVarName(line);
|
|
77
|
+
const envVarName = varName ? toScreamingSnakeCase(varName) : 'SECRET';
|
|
78
|
+
return line.replace(/secret\s*[:=]\s*(['"`])[^'"`]+\1/i, `secret = process.env.${envVarName}`);
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
},
|
|
82
|
+
'api-key-exposed': (line) => {
|
|
83
|
+
// Pattern: apiKey = "abc123xyz" or api_key: "abc123xyz"
|
|
84
|
+
// Convert to: apiKey = process.env.API_KEY
|
|
85
|
+
const match = line.match(/(api[_-]?key|apikey)\s*[:=]\s*(['"`])[^'"`]+\2/i);
|
|
86
|
+
if (match) {
|
|
87
|
+
const varName = extractVarName(line);
|
|
88
|
+
const envVarName = varName ? toScreamingSnakeCase(varName) : 'API_KEY';
|
|
89
|
+
return line.replace(/(api[_-]?key|apikey)\s*[:=]\s*(['"`])[^'"`]+\2/i, `$1 = process.env.${envVarName}`);
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
},
|
|
93
|
+
'phi-console-log': (line) => {
|
|
94
|
+
// Pattern: console.log(patient) or console.log("Patient:", patient)
|
|
95
|
+
// Convert to: // [VLAYER] PHI logging removed - review needed: console.log(...)
|
|
96
|
+
const match = line.match(/^(\s*)console\.(log|info|debug|warn|error)\s*\(/);
|
|
97
|
+
if (match) {
|
|
98
|
+
const indent = match[1];
|
|
99
|
+
return `${indent}// [VLAYER] PHI logging removed - review needed: ${line.trim()}`;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
},
|
|
103
|
+
'http-url': (line) => {
|
|
104
|
+
// Pattern: http://example.com
|
|
105
|
+
// Convert to: https://example.com
|
|
106
|
+
if (line.includes('http://') && !line.includes('http://localhost') && !line.includes('http://127.0.0.1')) {
|
|
107
|
+
return line.replace(/http:\/\//g, 'https://');
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
},
|
|
111
|
+
'innerhtml-unsanitized': (line) => {
|
|
112
|
+
// Pattern: element.innerHTML = userText
|
|
113
|
+
// Convert to: element.textContent = userText
|
|
114
|
+
const match = line.match(/\.innerHTML\s*=\s*/);
|
|
115
|
+
if (match) {
|
|
116
|
+
return line.replace(/\.innerHTML\s*=/, '.textContent =');
|
|
117
|
+
}
|
|
118
|
+
return null;
|
|
119
|
+
},
|
|
120
|
+
'phi-localstorage': (line) => {
|
|
121
|
+
// Pattern: localStorage.setItem("patientData", data)
|
|
122
|
+
// Convert to: comment with suggestion to use server-side session
|
|
123
|
+
const match = line.match(/^(\s*)localStorage\.(setItem|getItem)\s*\(/);
|
|
124
|
+
if (match) {
|
|
125
|
+
const indent = match[1];
|
|
126
|
+
return `${indent}// [VLAYER] PHI in localStorage removed - use server-side session storage instead\n${indent}// TODO: Replace with: await sessionApi.store(key, encryptedData)\n${indent}// Original: ${line.trim()}`;
|
|
127
|
+
}
|
|
128
|
+
return null;
|
|
129
|
+
},
|
|
130
|
+
'phi-url-param': (line) => {
|
|
131
|
+
// Pattern: fetch(`/api?patientId=${id}`)
|
|
132
|
+
// Convert to: suggestion to use POST with body
|
|
133
|
+
const match = line.match(/^(\s*)(fetch|axios\.get|http\.get)\s*\(\s*[`'"]/);
|
|
134
|
+
if (match) {
|
|
135
|
+
const indent = match[1];
|
|
136
|
+
const method = match[2];
|
|
137
|
+
return `${indent}// [VLAYER] PHI in URL params - use POST with encrypted body instead\n${indent}// TODO: Replace with: ${method === 'fetch' ? "fetch(url, { method: 'POST', body: JSON.stringify({ patientId }) })" : 'axios.post(url, { patientId })'}\n${indent}// Original: ${line.trim()}`;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
},
|
|
141
|
+
'phi-log-unredacted': (line) => {
|
|
142
|
+
// Pattern: logger.info("Patient data", patientData)
|
|
143
|
+
// Convert to: logger.info("Patient data", redactPHI(patientData))
|
|
144
|
+
const match = line.match(/(logger\.(log|info|debug|warn|error))\s*\(\s*(['"`][^'"`]*['"`])\s*,\s*(\w+)/);
|
|
145
|
+
if (match) {
|
|
146
|
+
const [, loggerCall, , message, variable] = match;
|
|
147
|
+
return line.replace(new RegExp(`(${loggerCall.replace('.', '\\.')}\\s*\\(\\s*${message.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\s*,\\s*)${variable}`), `$1redactPHI(${variable})`);
|
|
148
|
+
}
|
|
149
|
+
// Simpler pattern: logger.info(patientData)
|
|
150
|
+
const simpleMatch = line.match(/(logger\.(log|info|debug|warn|error))\s*\(\s*(\w*patient\w*)\s*\)/i);
|
|
151
|
+
if (simpleMatch) {
|
|
152
|
+
const [, loggerCall, , variable] = simpleMatch;
|
|
153
|
+
return line.replace(new RegExp(`(${loggerCall.replace('.', '\\.')}\\s*\\()${variable}(\\s*\\))`), `$1redactPHI(${variable})$2`);
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
},
|
|
157
|
+
'cookie-insecure': (line) => {
|
|
158
|
+
// Pattern: cookie: { maxAge: 3600 } or res.cookie('session', value)
|
|
159
|
+
// Add httpOnly: true, secure: true
|
|
160
|
+
// Pattern 1: cookie options object without httpOnly
|
|
161
|
+
const optionsMatch = line.match(/cookie\s*:\s*\{([^}]*)\}/);
|
|
162
|
+
if (optionsMatch && !line.includes('httpOnly')) {
|
|
163
|
+
const options = optionsMatch[1];
|
|
164
|
+
const newOptions = options.trim() ? `${options.trim()}, httpOnly: true, secure: true` : 'httpOnly: true, secure: true';
|
|
165
|
+
return line.replace(/cookie\s*:\s*\{[^}]*\}/, `cookie: { ${newOptions} }`);
|
|
166
|
+
}
|
|
167
|
+
// Pattern 2: res.cookie() without options
|
|
168
|
+
const resCookieMatch = line.match(/(res\.cookie\s*\(\s*['"`][^'"`]+['"`]\s*,\s*\w+)\s*\)/);
|
|
169
|
+
if (resCookieMatch && !line.includes('httpOnly')) {
|
|
170
|
+
return line.replace(/(res\.cookie\s*\(\s*['"`][^'"`]+['"`]\s*,\s*\w+)\s*\)/, '$1, { httpOnly: true, secure: true })');
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
},
|
|
174
|
+
'backup-unencrypted': (line) => {
|
|
175
|
+
// Pattern: writeFile('backup.sql', data) or backup.sql without encryption
|
|
176
|
+
// Add encryption suggestion
|
|
177
|
+
const match = line.match(/^(\s*)(fs\.)?writeFile\s*\(\s*(['"`][^'"`]*backup[^'"`]*['"`])/i);
|
|
178
|
+
if (match) {
|
|
179
|
+
const indent = match[1];
|
|
180
|
+
const filePath = match[3];
|
|
181
|
+
return `${indent}// [VLAYER] Unencrypted backup - encrypt before writing\n${indent}// TODO: const encrypted = await crypto.encrypt(data, process.env.BACKUP_KEY);\n${indent}// Then write encrypted data to ${filePath}.enc\n${indent}// Original: ${line.trim()}`;
|
|
182
|
+
}
|
|
183
|
+
// Pattern for backup config
|
|
184
|
+
const configMatch = line.match(/^(\s*).*backup.*=.*\.(sql|csv|json|txt)/i);
|
|
185
|
+
if (configMatch && !line.includes('encrypt') && !line.includes('gpg')) {
|
|
186
|
+
const indent = configMatch[1];
|
|
187
|
+
return `${indent}// [VLAYER] Use encrypted backup format (.gpg, .enc) or enable encryption\n${indent}${line.trim()}`;
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
export function applyFixStrategy(line, fixType) {
|
|
193
|
+
const strategy = fixStrategies[fixType];
|
|
194
|
+
if (!strategy) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
return strategy(line);
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/fixer/strategies.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { scan } from './scan.js';
|
|
2
|
+
export { generateReport } from './reporters/index.js';
|
|
3
|
+
export type { Finding, ScanResult, ScanOptions, Report, ReportOptions, Scanner, Severity, ComplianceCategory, VlayerConfig, ContextLine, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,MAAM,EACN,aAAa,EACb,OAAO,EACP,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AuditTrail, AuditReportOptions } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate PDF audit report
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateAuditReport(trail: AuditTrail, options: AuditReportOptions): Promise<{
|
|
6
|
+
path: string;
|
|
7
|
+
hash: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Generate text-based audit report (for environments without PDF support)
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateTextAuditReport(trail: AuditTrail): string;
|
|
13
|
+
//# sourceMappingURL=audit-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-report.d.ts","sourceRoot":"","sources":["../../src/reporters/audit-report.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAmC,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAsBnG;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAkDzC;AAghBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAuEjE"}
|