verification-layer 0.27.6 → 0.27.7

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "package": "verification-layer",
3
- "version": "0.27.6",
3
+ "version": "0.27.7",
4
4
  "total": 143,
5
5
  "counts": {
6
6
  "phi-exposure": 29,
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=false-positives.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"false-positives.test.d.ts","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/false-positives.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { hipaa2026Scanner } from './index.js';
3
+ import * as fs from 'fs/promises';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ describe('HIPAA 2026 false-positive regressions', () => {
7
+ let tempDir = '';
8
+ beforeEach(async () => {
9
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hipaa2026-fp-'));
10
+ });
11
+ afterEach(async () => {
12
+ await fs.rm(tempDir, { recursive: true, force: true });
13
+ });
14
+ async function scan(filename, content) {
15
+ const file = path.join(tempDir, filename);
16
+ await fs.writeFile(file, content, 'utf-8');
17
+ return hipaa2026Scanner.scan([file], { path: tempDir });
18
+ }
19
+ it('does not treat metadata authors + PHI marketing copy as an MFA flow', async () => {
20
+ const findings = await scan('layout.tsx', `
21
+ export const metadata = {
22
+ authors: [{ name: 'vlayer' }],
23
+ description: 'Find PHI security risks before production',
24
+ };
25
+ `);
26
+ expect(findings.some((f) => f.id === 'HIPAA-MFA-001')).toBe(false);
27
+ });
28
+ it('does not treat supabase.auth.signUp as a PHI login flow', async () => {
29
+ const findings = await scan('signup.ts', `
30
+ const result = await supabase.auth.signUp({ email, password });
31
+ const healthProfile = await createHealthProfile(result.data.user?.id);
32
+ `);
33
+ expect(findings.some((f) => f.id === 'HIPAA-MFA-001')).toBe(false);
34
+ });
35
+ it('does not classify a single invalid-credentials response as a breach', async () => {
36
+ const findings = await scan('signin.ts', `
37
+ if (error) {
38
+ return Response.json({ error: 'Invalid credentials' }, { status: 401 });
39
+ }
40
+ `);
41
+ expect(findings.some((f) => f.id === 'HIPAA-BREACH-001')).toBe(false);
42
+ });
43
+ it('still detects repeated failed login attempts without monitoring', async () => {
44
+ const findings = await scan('auth-monitoring.ts', `
45
+ const failedLoginAttempts = getFailedLoginAttempts(user.id);
46
+ if (failedLoginAttempts > 5) {
47
+ lockAccount(user.id);
48
+ }
49
+ `);
50
+ expect(findings.some((f) => f.id === 'HIPAA-BREACH-001')).toBe(true);
51
+ });
52
+ });
53
+ //# sourceMappingURL=false-positives.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"false-positives.test.js","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/false-positives.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,IAAI,CAAC,QAAgB,EAAE,OAAe;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,YAAY,EACZ;;;;;OAKC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,WAAW,EACX;;;OAGC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,WAAW,EACX;;;;OAIC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,QAAQ,GAAG,MAAM,IAAI,CACzB,oBAAoB,EACpB;;;;;OAKC,CACF,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -23,35 +23,19 @@ export declare const MFA_PATTERNS: HIPAA2026Pattern;
23
23
  * HIPAA-ENC-REST-001: Encryption at Rest
24
24
  */
25
25
  export declare const ENCRYPTION_AT_REST_PATTERNS: HIPAA2026Pattern;
26
- /**
27
- * HIPAA-SESSION-001: Automatic Session Timeout
28
- */
26
+ /** HIPAA-SESSION-001: Automatic Session Timeout */
29
27
  export declare const SESSION_TIMEOUT_PATTERNS: HIPAA2026Pattern;
30
- /**
31
- * HIPAA-REVOKE-001: Immediate Access Revocation
32
- */
28
+ /** HIPAA-REVOKE-001: Immediate Access Revocation */
33
29
  export declare const ACCESS_REVOCATION_PATTERNS: HIPAA2026Pattern;
34
- /**
35
- * HIPAA-BREACH-001: 24-Hour Breach Notification
36
- */
30
+ /** HIPAA-BREACH-001: 24-Hour Breach Notification */
37
31
  export declare const BREACH_NOTIFICATION_PATTERNS: HIPAA2026Pattern;
38
- /**
39
- * HIPAA-SEGMENT-001: Network Segmentation
40
- */
32
+ /** HIPAA-SEGMENT-001: Network Segmentation */
41
33
  export declare const NETWORK_SEGMENTATION_PATTERNS: HIPAA2026Pattern;
42
- /**
43
- * HIPAA-ASSET-001: Technology Asset Inventory
44
- * Special pattern - triggers asset inventory generation
45
- */
34
+ /** HIPAA-ASSET-001: Technology Asset Inventory */
46
35
  export declare const ASSET_INVENTORY_PATTERNS: HIPAA2026Pattern;
47
- /**
48
- * HIPAA-FLOW-001: ePHI Flow Mapping
49
- * Special pattern - triggers flow map generation
50
- */
36
+ /** HIPAA-FLOW-001: ePHI Flow Mapping */
51
37
  export declare const PHI_FLOW_MAPPING_PATTERNS: HIPAA2026Pattern;
52
- /**
53
- * HIPAA-PENTEST-001: Vulnerability Scanning Configuration
54
- */
38
+ /** HIPAA-PENTEST-001: Vulnerability Scanning Configuration */
55
39
  export declare const VULNERABILITY_SCANNING_PATTERNS: HIPAA2026Pattern;
56
40
  export declare const ALL_HIPAA_2026_PATTERNS: HIPAA2026Pattern[];
57
41
  //# sourceMappingURL=patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,gBA2B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBA6BzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBA8BtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,gBA2BxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,gBAuB1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,gBAgC3C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,gBAmBtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,gBAmBvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,EAAE,gBAoB7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,gBAAgB,EAUrD,CAAC"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,gBA6B1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,gBAuBzC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,wBAAwB,EAAE,gBAqBtC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,0BAA0B,EAAE,gBAqBxC,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,4BAA4B,EAAE,gBAwB1C,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,6BAA6B,EAAE,gBAuB3C,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,wBAAwB,EAAE,gBAetC,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,yBAAyB,EAAE,gBAevC,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,EAAE,gBAmB7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,gBAAgB,EAUrD,CAAC"}
@@ -13,8 +13,10 @@ export const MFA_PATTERNS = {
13
13
  severity: 'critical',
14
14
  hipaaReference: '45 CFR §164.312(a)(2)(i) - Access Control (Required)',
15
15
  patterns: [
16
- // Login/auth without MFA
17
- /(?:login|authenticate|signin|auth).*?(?:patient|phi|medical|health)(?!.*?(?:mfa|multi.?factor|2fa|totp|authenticator))/i,
16
+ // Login/sign-in/authentication flows that also access PHI. Deliberately avoid
17
+ // the generic token "auth": provider namespaces such as supabase.auth.signUp
18
+ // and metadata keys such as "authors" are not evidence of a PHI login flow.
19
+ /(?:\blogin\b|\bauthenticate(?:User)?\b|\bsign(?:-|_)?in\b).*?(?:patient|phi|medical|health)(?!.*?(?:mfa|multi.?factor|2fa|totp|authenticator))/i,
18
20
  // Auth configs without MFA
19
21
  /(?:passport|auth0|okta|cognito)\.(?:use|configure).*?(?!.*?(?:mfa|multiFactor|requireMFA))/i,
20
22
  // Admin endpoints without MFA
@@ -44,17 +46,11 @@ export const ENCRYPTION_AT_REST_PATTERNS = {
44
46
  severity: 'critical',
45
47
  hipaaReference: '45 CFR §164.312(a)(2)(iv) - Encryption (Required)',
46
48
  patterns: [
47
- // Database without encryption
48
49
  /(?:mongoose|sequelize|typeorm|prisma)\.(?:connect|createConnection).*?(?!.*?(?:encrypt|ssl|tls))/i,
49
- // File storage without encryption
50
50
  /(?:fs\.writeFile|writeFileSync|s3\.putObject).*?(?:patient|phi|medical)(?!.*?(?:encrypt|cipher))/i,
51
- // LocalStorage with PHI
52
51
  /localStorage\.setItem.*?(?:patient|ssn|mrn|phi)/i,
53
- // Cookie with PHI unencrypted
54
52
  /(?:res\.cookie|setCookie).*?(?:patient|phi|medical)(?!.*?(?:encrypt|secure|httpOnly))/i,
55
- // MongoDB without encryption
56
53
  /MongoClient\.connect.*?(?!.*?(?:ssl|tls|encryption))/i,
57
- // PostgreSQL without encryption
58
54
  /(?:pg|postgres)\.(?:connect|Pool).*?(?!.*?ssl)/i,
59
55
  ],
60
56
  negativePatterns: [
@@ -67,9 +63,7 @@ export const ENCRYPTION_AT_REST_PATTERNS = {
67
63
  confidence: 'high',
68
64
  category: 'encryption',
69
65
  };
70
- /**
71
- * HIPAA-SESSION-001: Automatic Session Timeout
72
- */
66
+ /** HIPAA-SESSION-001: Automatic Session Timeout */
73
67
  export const SESSION_TIMEOUT_PATTERNS = {
74
68
  id: 'HIPAA-SESSION-001',
75
69
  name: 'Missing Automatic Session Timeout',
@@ -77,22 +71,13 @@ export const SESSION_TIMEOUT_PATTERNS = {
77
71
  severity: 'high',
78
72
  hipaaReference: '45 CFR §164.312(a)(2)(iii) - Session Control (Required)',
79
73
  patterns: [
80
- // Session config without expiration
81
74
  /(?:express-session|session)\.(?:configure|use)(?!.*?(?:maxAge|expires|timeout))/i,
82
- // Session with timeout > 15 min (900000 ms)
83
75
  /maxAge:\s*(?:9[0-9]{5}[0-9]+|[1-9][0-9]{6,})/i,
84
- // JWT without expiration
85
76
  /jwt\.sign\([^)]*(?!.*?expiresIn)/i,
86
- // Cookie session without expiration
87
77
  /cookie-session.*?(?!.*?maxAge)/i,
88
- // Missing idle timeout
89
78
  /session.*?(?!.*?(?:idle|inactivity).*?timeout)/i,
90
79
  ],
91
80
  negativePatterns: [
92
- // Compliant session length: maxAge with a 1–6 digit value (≤ 999999 ms,
93
- // i.e. ≤ ~16 min). The \b stops it matching a prefix of a longer (>15 min)
94
- // value, which the positive pattern above flags. Includes the exact 900000
95
- // (15 min) boundary the autofix recommends — the old [1-8][0-9]{5} excluded it.
96
81
  /maxAge:\s*[1-9][0-9]{0,5}\b/i,
97
82
  /expiresIn:\s*['"](?:1[0-5]m|[1-9]m)['"]/i,
98
83
  /idleTimeout/i,
@@ -101,9 +86,7 @@ export const SESSION_TIMEOUT_PATTERNS = {
101
86
  confidence: 'high',
102
87
  category: 'access-control',
103
88
  };
104
- /**
105
- * HIPAA-REVOKE-001: Immediate Access Revocation
106
- */
89
+ /** HIPAA-REVOKE-001: Immediate Access Revocation */
107
90
  export const ACCESS_REVOCATION_PATTERNS = {
108
91
  id: 'HIPAA-REVOKE-001',
109
92
  name: 'Missing Immediate Access Revocation',
@@ -111,15 +94,9 @@ export const ACCESS_REVOCATION_PATTERNS = {
111
94
  severity: 'critical',
112
95
  hipaaReference: '45 CFR §164.308(a)(3)(ii)(C) - Termination Procedures (Required)',
113
96
  patterns: [
114
- // Deactivate user without token revocation
115
97
  /(?:deactivate|disable|remove)User(?!.*?(?:revoke|invalidate|blacklist).*?(?:token|session))/i,
116
- // Delete user without session cleanup
117
98
  /(?:deleteUser|removeUser).*?(?!.*?(?:logout|invalidate|clearSessions))/i,
118
- // Termination/deactivation as an actual operation — identifier or method call.
119
- // Must NOT match prose/log strings like console.log('User deactivated ...'),
120
- // which describe an action rather than perform one (false positive).
121
99
  /(?:deactivat|terminat|disabl)e?(?:User|Account|Member|Employee)|(?:user|account|member|employee)(?:Deactivation|Termination)|(?:user|account|member)\.(?:deactivate|terminate|disable)\b/i,
122
- // Role change without re-auth
123
100
  /(?:updateRole|changePermissions)(?!.*?(?:logout|reauth|invalidate))/i,
124
101
  ],
125
102
  negativePatterns: [
@@ -132,9 +109,7 @@ export const ACCESS_REVOCATION_PATTERNS = {
132
109
  confidence: 'medium',
133
110
  category: 'access-control',
134
111
  };
135
- /**
136
- * HIPAA-BREACH-001: 24-Hour Breach Notification
137
- */
112
+ /** HIPAA-BREACH-001: 24-Hour Breach Notification */
138
113
  export const BREACH_NOTIFICATION_PATTERNS = {
139
114
  id: 'HIPAA-BREACH-001',
140
115
  name: 'Missing Breach Notification Mechanism',
@@ -144,8 +119,9 @@ export const BREACH_NOTIFICATION_PATTERNS = {
144
119
  patterns: [
145
120
  // Security errors without breach handler
146
121
  /catch\s*\(.*?error.*?\).*?(?:security|unauthorized|breach)(?!.*?(?:notifyBreach|incidentResponse|alertSecurity))/i,
147
- // Failed login attempts without monitoring
148
- /(?:failed|invalid).*?(?:login|auth)(?!.*?(?:monitor|alert|notify))/i,
122
+ // Repeated/aggregated failed-login signals without monitoring. A single
123
+ // "invalid credentials" response is an authentication outcome, not a breach.
124
+ /(?:failed|invalid).*?(?:login|auth).*?(?:attempts?|count|threshold|rate|repeated|multiple)(?!.*?(?:monitor|alert|notify))/i,
149
125
  // Data access anomaly without alert
150
126
  /(?:unusual|suspicious).*?access(?!.*?(?:alert|notify|incident))/i,
151
127
  ],
@@ -159,9 +135,7 @@ export const BREACH_NOTIFICATION_PATTERNS = {
159
135
  confidence: 'medium',
160
136
  category: 'audit-logging',
161
137
  };
162
- /**
163
- * HIPAA-SEGMENT-001: Network Segmentation
164
- */
138
+ /** HIPAA-SEGMENT-001: Network Segmentation */
165
139
  export const NETWORK_SEGMENTATION_PATTERNS = {
166
140
  id: 'HIPAA-SEGMENT-001',
167
141
  name: 'Missing Network Segmentation for PHI',
@@ -169,25 +143,16 @@ export const NETWORK_SEGMENTATION_PATTERNS = {
169
143
  severity: 'critical',
170
144
  hipaaReference: '45 CFR §164.312(e)(1) - Transmission Security (Required)',
171
145
  patterns: [
172
- // CORS allowing all origins for PHI
173
146
  /cors\(\{?\s*origin:\s*['"]?\*['"]?.*?(?:patient|phi|medical)/i,
174
- // PHI API without network restrictions
175
147
  /\/api.*?(?:patient|phi|medical)(?!.*?(?:firewall|vpc|subnet|private))/i,
176
- // Internal PHI service publicly accessible
177
148
  /(?:express|fastify|koa)\.listen.*?(?:patient|phi)(?!.*?(?:localhost|127\.0\.0\.1|private))/i,
178
- // Missing VPC/subnet config on a backend database/storage service.
179
- // `storage` is guarded against client-side browser APIs (localStorage,
180
- // sessionStorage) — network segmentation does not apply to those.
181
149
  /(?:database|(?<!local)(?<!session)storage).*?(?:patient|phi)(?!.*?(?:vpc|subnet|securityGroup))/i,
182
150
  ],
183
151
  negativePatterns: [
184
- /origin:\s*\[.*?\]/i, // Whitelist
152
+ /origin:\s*\[.*?\]/i,
185
153
  /private.*?subnet/i,
186
154
  /securityGroup/i,
187
155
  /firewall.*?rules/i,
188
- // Client-side HTTP *consumption* (fetch/axios) is not an exposed PHI
189
- // service. Network segmentation applies to the server/infra that exposes
190
- // the endpoint, not to a frontend call that reads from it.
191
156
  /\bfetch\s*\(/i,
192
157
  /\baxios\b/i,
193
158
  ],
@@ -195,10 +160,7 @@ export const NETWORK_SEGMENTATION_PATTERNS = {
195
160
  confidence: 'high',
196
161
  category: 'access-control',
197
162
  };
198
- /**
199
- * HIPAA-ASSET-001: Technology Asset Inventory
200
- * Special pattern - triggers asset inventory generation
201
- */
163
+ /** HIPAA-ASSET-001: Technology Asset Inventory */
202
164
  export const ASSET_INVENTORY_PATTERNS = {
203
165
  id: 'HIPAA-ASSET-001',
204
166
  name: 'Generate ePHI Technology Asset Inventory',
@@ -206,23 +168,16 @@ export const ASSET_INVENTORY_PATTERNS = {
206
168
  severity: 'high',
207
169
  hipaaReference: '45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
208
170
  patterns: [
209
- // Databases
210
171
  /(?:mongoose|sequelize|prisma|typeorm|knex)\.(?:connect|model)/i,
211
- // Storage services
212
172
  /(?:s3|azure\.storage|gcs)\./i,
213
- // Third-party integrations
214
173
  /(?:stripe|twilio|sendgrid|mailgun)\.(?:api|client)/i,
215
- // APIs
216
174
  /(?:axios|fetch|got|request)\./i,
217
175
  ],
218
176
  autoFix: 'Asset inventory will be generated automatically in scan report',
219
177
  confidence: 'high',
220
178
  category: 'data-retention',
221
179
  };
222
- /**
223
- * HIPAA-FLOW-001: ePHI Flow Mapping
224
- * Special pattern - triggers flow map generation
225
- */
180
+ /** HIPAA-FLOW-001: ePHI Flow Mapping */
226
181
  export const PHI_FLOW_MAPPING_PATTERNS = {
227
182
  id: 'HIPAA-FLOW-001',
228
183
  name: 'Generate ePHI Flow Map',
@@ -230,22 +185,16 @@ export const PHI_FLOW_MAPPING_PATTERNS = {
230
185
  severity: 'high',
231
186
  hipaaReference: '45 CFR §164.308(a)(1)(ii)(A) - Risk Analysis (Required)',
232
187
  patterns: [
233
- // Input points
234
188
  /(?:req\.body|req\.params|req\.query).*?(?:patient|phi|medical)/i,
235
- // Processing
236
189
  /(?:process|transform|validate).*?(?:patient|phi)/i,
237
- // Storage
238
190
  /(?:save|insert|update).*?(?:patient|phi)/i,
239
- // Output
240
191
  /(?:res\.(?:send|json)|return).*?(?:patient|phi)/i,
241
192
  ],
242
193
  autoFix: 'PHI flow map will be generated automatically in scan report',
243
194
  confidence: 'high',
244
195
  category: 'data-retention',
245
196
  };
246
- /**
247
- * HIPAA-PENTEST-001: Vulnerability Scanning Configuration
248
- */
197
+ /** HIPAA-PENTEST-001: Vulnerability Scanning Configuration */
249
198
  export const VULNERABILITY_SCANNING_PATTERNS = {
250
199
  id: 'HIPAA-PENTEST-001',
251
200
  name: 'Missing Vulnerability Scanning Configuration',
@@ -253,7 +202,6 @@ export const VULNERABILITY_SCANNING_PATTERNS = {
253
202
  severity: 'high',
254
203
  hipaaReference: '45 CFR §164.308(a)(8) - Evaluation (Required)',
255
204
  patterns: [
256
- // Missing security scanning configs
257
205
  /package\.json(?!.*?(?:snyk|audit|vulnerability))/i,
258
206
  ],
259
207
  negativePatterns: [
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/patterns.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/hipaa2026/patterns.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "verification-layer",
3
- "version": "0.27.6",
3
+ "version": "0.27.7",
4
4
  "description": "Open-source HIPAA compliance scanner for healthcare code. 143 rules, 5 HIPAA categories. CLI + CI/CD + VS Code.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",