verification-layer 0.27.6 → 0.27.8
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/dist/rule-catalog.json +2 -2
- package/dist/scanners/authentication/index.js +20 -5
- package/dist/scanners/authentication/index.js.map +1 -1
- package/dist/scanners/authentication/patterns.d.ts +5 -1
- package/dist/scanners/authentication/patterns.d.ts.map +1 -1
- package/dist/scanners/authentication/patterns.js +6 -5
- package/dist/scanners/authentication/patterns.js.map +1 -1
- package/dist/scanners/authentication/supabase-callsite.test.d.ts +2 -0
- package/dist/scanners/authentication/supabase-callsite.test.d.ts.map +1 -0
- package/dist/scanners/authentication/supabase-callsite.test.js +34 -0
- package/dist/scanners/authentication/supabase-callsite.test.js.map +1 -0
- package/dist/scanners/hipaa2026/false-positives.test.d.ts +2 -0
- package/dist/scanners/hipaa2026/false-positives.test.d.ts.map +1 -0
- package/dist/scanners/hipaa2026/false-positives.test.js +53 -0
- package/dist/scanners/hipaa2026/false-positives.test.js.map +1 -0
- package/dist/scanners/hipaa2026/patterns.d.ts +7 -23
- package/dist/scanners/hipaa2026/patterns.d.ts.map +1 -1
- package/dist/scanners/hipaa2026/patterns.js +15 -67
- package/dist/scanners/hipaa2026/patterns.js.map +1 -1
- package/package.json +1 -1
package/dist/rule-catalog.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "verification-layer",
|
|
3
|
-
"version": "0.27.
|
|
3
|
+
"version": "0.27.8",
|
|
4
4
|
"total": 143,
|
|
5
5
|
"counts": {
|
|
6
6
|
"phi-exposure": 29,
|
|
@@ -663,7 +663,7 @@
|
|
|
663
663
|
"severity": "critical",
|
|
664
664
|
"title": "Authentication Configuration Without MFA Enabled",
|
|
665
665
|
"description": "Auth provider configuration (NextAuth, Clerk, Auth0, Supabase) does not have MFA/2FA/TOTP enabled",
|
|
666
|
-
"recommendation": "Enable MFA in your auth provider configuration. For NextAuth: add adapter with MFA support. For Clerk: enable MFA in dashboard. For Auth0: enable MFA in tenant settings. For Supabase
|
|
666
|
+
"recommendation": "Enable MFA in your auth provider configuration. For NextAuth: add adapter with MFA support. For Clerk: enable MFA in dashboard. For Auth0: enable MFA in tenant settings. For Supabase, verify MFA policy at the project/provider configuration level rather than inferring it from runtime auth calls.",
|
|
667
667
|
"hipaaReference": "NPRM §164.312(d) - Person or Entity Authentication",
|
|
668
668
|
"source": "pattern",
|
|
669
669
|
"scanner": "authentication"
|
|
@@ -67,13 +67,21 @@ export const authenticationScanner = {
|
|
|
67
67
|
* Scan auth configuration files for missing MFA
|
|
68
68
|
*/
|
|
69
69
|
async function scanAuthConfig(file, content, lines, pattern, findings) {
|
|
70
|
+
// A Supabase auth call (signUp/signIn/etc.) is a runtime call site, not proof
|
|
71
|
+
// that this file owns provider MFA configuration. Treat Supabase client usage
|
|
72
|
+
// as configuration evidence only when the file imports the SDK directly and
|
|
73
|
+
// constructs the client itself. Shared-client consumers therefore do not fire.
|
|
74
|
+
const hasDirectSupabaseSdkImport = /(?:from\s+['"]@supabase\/supabase-js['"]|require\(\s*['"]@supabase\/supabase-js['"]\s*\))/i.test(content);
|
|
75
|
+
const hasDirectClientConstruction = lines.some((line) => !isImportLine(line) && /createClient\s*\(/i.test(line));
|
|
76
|
+
const supabaseClientConfig = hasDirectSupabaseSdkImport && hasDirectClientConstruction;
|
|
70
77
|
// Check if this is an auth-related file
|
|
71
78
|
const isAuthFile = /(?:auth|clerk|supabase|next-auth)/i.test(file) ||
|
|
72
|
-
pattern.patterns.some((p) => p.test(content))
|
|
79
|
+
pattern.patterns.some((p) => p.test(content)) ||
|
|
80
|
+
supabaseClientConfig;
|
|
73
81
|
if (!isAuthFile)
|
|
74
82
|
return;
|
|
75
83
|
// Check if file has any auth provider configuration
|
|
76
|
-
const hasAuthConfig = pattern.patterns.some((p) => p.test(content));
|
|
84
|
+
const hasAuthConfig = pattern.patterns.some((p) => p.test(content)) || supabaseClientConfig;
|
|
77
85
|
if (!hasAuthConfig)
|
|
78
86
|
return;
|
|
79
87
|
// Check if MFA is configured
|
|
@@ -81,9 +89,7 @@ async function scanAuthConfig(file, content, lines, pattern, findings) {
|
|
|
81
89
|
if (hasMfaConfig)
|
|
82
90
|
return;
|
|
83
91
|
// Find the line with auth configuration. Skip import/require lines — anchoring
|
|
84
|
-
// an "auth config without MFA" finding to an
|
|
85
|
-
// '@supabase/...'` line is a false-positive-looking trigger. If the only
|
|
86
|
-
// evidence is an import, don't fire at all.
|
|
92
|
+
// an "auth config without MFA" finding to an import line is misleading.
|
|
87
93
|
let configLine = 0;
|
|
88
94
|
for (let i = 0; i < lines.length; i++) {
|
|
89
95
|
if (isImportLine(lines[i]))
|
|
@@ -93,6 +99,15 @@ async function scanAuthConfig(file, content, lines, pattern, findings) {
|
|
|
93
99
|
break;
|
|
94
100
|
}
|
|
95
101
|
}
|
|
102
|
+
// For direct Supabase config, anchor the finding to the client constructor.
|
|
103
|
+
if (configLine === 0 && supabaseClientConfig) {
|
|
104
|
+
for (let i = 0; i < lines.length; i++) {
|
|
105
|
+
if (/createClient\s*\(/i.test(lines[i]) && !isImportLine(lines[i])) {
|
|
106
|
+
configLine = i + 1;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
96
111
|
if (configLine === 0)
|
|
97
112
|
return;
|
|
98
113
|
// Create finding for auth config without MFA
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/authentication/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/authentication/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAmB,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,CAAC,MAAM,qBAAqB,GAAY;IAC5C,IAAI,EAAE,qCAAqC;IAC3C,QAAQ,EAAE,gBAAgB,EAAE,mCAAmC;IAE/D,KAAK,CAAC,IAAI,CAAC,KAAe,EAAE,QAAqB;QAC/C,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,kCAAkC;QAClC,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,uCAAuC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChD,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAElC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;oBACvC,mDAAmD;oBACnD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;wBAC7B,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;wBAC9D,SAAS;oBACX,CAAC;oBAED,sEAAsE;oBACtE,oDAAoD;oBACpD,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxE,SAAS;oBACX,CAAC;oBAED,oEAAoE;oBACpE,oEAAoE;oBACpE,uEAAuE;oBACvE,oEAAoE;oBACpE,qEAAqE;oBACrE,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAC/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAClC,CAAC;oBACF,MAAM,UAAU,GAAG,sBAAsB,CACvC,KAAK,EACL,OAAO,CAAC,QAAQ,EAChB,iBAAiB,EACjB,EAAE,gBAAgB,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAClD,CAAC;oBAEF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;wBAC3B,mEAAmE;wBACnE,oCAAoC;wBACpC,IACE,OAAO,CAAC,EAAE,KAAK,SAAS;4BACxB,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EACvD,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,QAAQ,CAAC,IAAI,CAAC;4BACZ,EAAE,EAAE,OAAO,CAAC,EAAE;4BACd,QAAQ,EAAE,gBAAgB;4BAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;4BAC1B,KAAK,EAAE,OAAO,CAAC,IAAI;4BACnB,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,aAAa,CAAC,CAAC,IAAI,EAAE;4BACxD,IAAI,EAAE,IAAI;4BACV,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG,CAAC;4BACrB,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,UAAU,EAAE,MAAM;yBACnB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,OAAe,EACf,KAAe,EACf,OAAmB,EACnB,QAAmB;IAEnB,8EAA8E;IAC9E,8EAA8E;IAC9E,4EAA4E;IAC5E,+EAA+E;IAC/E,MAAM,0BAA0B,GAC9B,4FAA4F,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7G,MAAM,2BAA2B,GAAG,KAAK,CAAC,IAAI,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CACjE,CAAC;IACF,MAAM,oBAAoB,GACxB,0BAA0B,IAAI,2BAA2B,CAAC;IAE5D,wCAAwC;IACxC,MAAM,UAAU,GACd,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,oBAAoB,CAAC;IAEvB,IAAI,CAAC,UAAU;QAAE,OAAO;IAExB,oDAAoD;IACpD,MAAM,aAAa,GACjB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,oBAAoB,CAAC;IACxE,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,6BAA6B;IAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,IAAI,YAAY;QAAE,OAAO;IAEzB,+EAA+E;IAC/E,wEAAwE;IACxE,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QACrC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,IAAI,UAAU,KAAK,CAAC,IAAI,oBAAoB,EAAE,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO;IAE7B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,CAAC;QACZ,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,IAAI;QACnB,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,iEAAiE;QACpG,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EAAE,MAAM;KACnB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -15,7 +15,11 @@ export interface MFAPattern {
|
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* MFA-001: Auth Provider Configuration Without MFA
|
|
18
|
-
* Detects
|
|
18
|
+
* Detects code-local auth provider configuration without MFA enabled.
|
|
19
|
+
*
|
|
20
|
+
* Supabase runtime calls such as `supabase.auth.signUp()` are intentionally
|
|
21
|
+
* excluded. Supabase configuration is handled in the scanner with stronger
|
|
22
|
+
* evidence: a direct client construction that contains a Supabase project URL.
|
|
19
23
|
*/
|
|
20
24
|
export declare const AUTH_CONFIG_NO_MFA: MFAPattern;
|
|
21
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/authentication/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/authentication/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAyChC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,UAmCpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,UA2CxB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,UAAU,EAIxC,CAAC"}
|
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
6
6
|
* MFA-001: Auth Provider Configuration Without MFA
|
|
7
|
-
* Detects
|
|
7
|
+
* Detects code-local auth provider configuration without MFA enabled.
|
|
8
|
+
*
|
|
9
|
+
* Supabase runtime calls such as `supabase.auth.signUp()` are intentionally
|
|
10
|
+
* excluded. Supabase configuration is handled in the scanner with stronger
|
|
11
|
+
* evidence: a direct client construction that contains a Supabase project URL.
|
|
8
12
|
*/
|
|
9
13
|
export const AUTH_CONFIG_NO_MFA = {
|
|
10
14
|
id: 'MFA-001',
|
|
@@ -24,9 +28,6 @@ export const AUTH_CONFIG_NO_MFA = {
|
|
|
24
28
|
/Auth0Provider/i,
|
|
25
29
|
/auth0\.WebAuth/i,
|
|
26
30
|
/new\s+Auth0Client/i,
|
|
27
|
-
// Supabase Auth configuration
|
|
28
|
-
/supabase\.auth\.signUp/i,
|
|
29
|
-
/createClient.*?supabase/i,
|
|
30
31
|
// Generic auth configs
|
|
31
32
|
/authConfig\s*[:=]/i,
|
|
32
33
|
/authentication\s*:\s*\{/i,
|
|
@@ -43,7 +44,7 @@ export const AUTH_CONFIG_NO_MFA = {
|
|
|
43
44
|
/two[-_]factor/i,
|
|
44
45
|
/authenticator/i,
|
|
45
46
|
],
|
|
46
|
-
recommendation: 'Enable MFA in your auth provider configuration. For NextAuth: add adapter with MFA support. For Clerk: enable MFA in dashboard. For Auth0: enable MFA in tenant settings. For Supabase
|
|
47
|
+
recommendation: 'Enable MFA in your auth provider configuration. For NextAuth: add adapter with MFA support. For Clerk: enable MFA in dashboard. For Auth0: enable MFA in tenant settings. For Supabase, verify MFA policy at the project/provider configuration level rather than inferring it from runtime auth calls.',
|
|
47
48
|
category: 'authentication',
|
|
48
49
|
};
|
|
49
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/authentication/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/authentication/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAe;IAC5C,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,kDAAkD;IACxD,WAAW,EACT,mGAAmG;IACrG,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,oDAAoD;IACpE,QAAQ,EAAE;QACR,yBAAyB;QACzB,gBAAgB;QAChB,mCAAmC;QACnC,qBAAqB;QAErB,sBAAsB;QACtB,gBAAgB;QAChB,6BAA6B;QAE7B,sBAAsB;QACtB,gBAAgB;QAChB,iBAAiB;QACjB,oBAAoB;QAEpB,uBAAuB;QACvB,oBAAoB;QACpB,0BAA0B;KAC3B;IACD,gBAAgB,EAAE;QAChB,iCAAiC;QACjC,MAAM;QACN,MAAM;QACN,OAAO;QACP,MAAM;QACN,cAAc;QACd,kBAAkB;QAClB,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;KACjB;IACD,cAAc,EACZ,ySAAyS;IAC3S,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAe;IAChD,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,iDAAiD;IACvD,WAAW,EACT,4GAA4G;IAC9G,QAAQ,EAAE,MAAM;IAChB,cAAc,EAAE,oDAAoD;IACpE,QAAQ,EAAE;QACR,6BAA6B;QAC7B,yEAAyE;QACzE,qFAAqF;QAErF,qCAAqC;QACrC,kEAAkE;QAElE,iCAAiC;QACjC,yCAAyC;QACzC,yCAAyC;KAC1C;IACD,gBAAgB,EAAE;QAChB,iCAAiC;QACjC,WAAW;QACX,WAAW;QACX,mBAAmB;QACnB,gBAAgB;QAChB,oBAAoB;QACpB,MAAM;QACN,cAAc;QACd,aAAa;QACb,WAAW;QACX,YAAY;KACb;IACD,cAAc,EACZ,yNAAyN;IAC3N,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,6BAA6B;IACnC,WAAW,EACT,+DAA+D;IACjE,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,oDAAoD;IACpE,QAAQ,EAAE;QACR,4BAA4B;QAC5B,UAAU;QACV,YAAY;QACZ,aAAa;QACb,YAAY;QAEZ,yBAAyB;QACzB,4BAA4B;QAC5B,4BAA4B;QAC5B,wCAAwC;QACxC,qCAAqC;QACrC,wBAAwB;QAExB,qBAAqB;QACrB,wBAAwB;QACxB,kCAAkC;QAElC,iDAAiD;QACjD,6CAA6C;KAC9C;IACD,gBAAgB,EAAE;QAChB,4CAA4C;QAC5C,aAAa;QACb,aAAa;QACb,aAAa;QACb,OAAO;QACP,SAAS;QACT,WAAW;QACX,WAAW;QACX,8BAA8B;QAC9B,eAAe;KAChB;IACD,cAAc,EACZ,2KAA2K;IAC7K,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,kBAAkB;IAClB,sBAAsB;IACtB,UAAU;CACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-callsite.test.d.ts","sourceRoot":"","sources":["../../../src/scanners/authentication/supabase-callsite.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import { authenticationScanner } from './index.js';
|
|
3
|
+
import * as fs from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import * as os from 'os';
|
|
6
|
+
describe('MFA-001 Supabase call-site precision', () => {
|
|
7
|
+
let tempDir = '';
|
|
8
|
+
afterEach(async () => {
|
|
9
|
+
if (tempDir) {
|
|
10
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
it('does not treat a shared-client signup route as provider MFA configuration', async () => {
|
|
14
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'supabase-callsite-'));
|
|
15
|
+
const file = path.join(tempDir, 'route.ts');
|
|
16
|
+
await fs.writeFile(file, `
|
|
17
|
+
import { createClient } from '@/lib/supabase/server';
|
|
18
|
+
|
|
19
|
+
export async function POST(req: Request) {
|
|
20
|
+
const supabase = await createClient();
|
|
21
|
+
const { data, error } = await supabase.auth.signUp({
|
|
22
|
+
email: 'user@example.com',
|
|
23
|
+
password: 'example-password',
|
|
24
|
+
});
|
|
25
|
+
return Response.json({ data, error });
|
|
26
|
+
}
|
|
27
|
+
`, 'utf-8');
|
|
28
|
+
const options = { path: tempDir };
|
|
29
|
+
const findings = await authenticationScanner.scan([file], options);
|
|
30
|
+
const mfaConfigFindings = findings.filter((finding) => finding.id === 'MFA-001');
|
|
31
|
+
expect(mfaConfigFindings).toHaveLength(0);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=supabase-callsite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase-callsite.test.js","sourceRoot":"","sources":["../../../src/scanners/authentication/supabase-callsite.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAE5C,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,EACJ;;;;;;;;;;;CAWL,EACK,OAAO,CACR,CAAC;QAEF,MAAM,OAAO,GAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACnE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEjF,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -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,
|
|
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/
|
|
17
|
-
|
|
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
|
-
//
|
|
148
|
-
|
|
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,
|
|
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":"AAAA;;;;GAIG;AAgBH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAqB;IAC5C,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,oDAAoD;IAC1D,WAAW,EAAE,sGAAsG;IACnH,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,sDAAsD;IACtE,QAAQ,EAAE;QACR,
|
|
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.
|
|
3
|
+
"version": "0.27.8",
|
|
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",
|