verification-layer 0.21.0 → 0.22.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.
Files changed (157) hide show
  1. package/README.md +251 -615
  2. package/dist/cli.js +283 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/reporters/audit-report.d.ts.map +1 -1
  5. package/dist/reporters/audit-report.js +180 -0
  6. package/dist/reporters/audit-report.js.map +1 -1
  7. package/dist/reporters/index.d.ts.map +1 -1
  8. package/dist/reporters/index.js +2612 -5
  9. package/dist/reporters/index.js.map +1 -1
  10. package/dist/scan.d.ts.map +1 -1
  11. package/dist/scan.js +14 -1
  12. package/dist/scan.js.map +1 -1
  13. package/dist/scanners/api-security/index.d.ts +7 -0
  14. package/dist/scanners/api-security/index.d.ts.map +1 -0
  15. package/dist/scanners/api-security/index.js +139 -0
  16. package/dist/scanners/api-security/index.js.map +1 -0
  17. package/dist/scanners/api-security/index.test.d.ts +5 -0
  18. package/dist/scanners/api-security/index.test.d.ts.map +1 -0
  19. package/dist/scanners/api-security/index.test.js +360 -0
  20. package/dist/scanners/api-security/index.test.js.map +1 -0
  21. package/dist/scanners/api-security/patterns.d.ts +32 -0
  22. package/dist/scanners/api-security/patterns.d.ts.map +1 -0
  23. package/dist/scanners/api-security/patterns.js +159 -0
  24. package/dist/scanners/api-security/patterns.js.map +1 -0
  25. package/dist/scanners/authentication/index.d.ts +7 -0
  26. package/dist/scanners/authentication/index.d.ts.map +1 -0
  27. package/dist/scanners/authentication/index.js +107 -0
  28. package/dist/scanners/authentication/index.js.map +1 -0
  29. package/dist/scanners/authentication/index.test.d.ts +5 -0
  30. package/dist/scanners/authentication/index.test.d.ts.map +1 -0
  31. package/dist/scanners/authentication/index.test.js +379 -0
  32. package/dist/scanners/authentication/index.test.js.map +1 -0
  33. package/dist/scanners/authentication/patterns.d.ts +32 -0
  34. package/dist/scanners/authentication/patterns.d.ts.map +1 -0
  35. package/dist/scanners/authentication/patterns.js +133 -0
  36. package/dist/scanners/authentication/patterns.js.map +1 -0
  37. package/dist/scanners/configuration/index.d.ts +8 -0
  38. package/dist/scanners/configuration/index.d.ts.map +1 -0
  39. package/dist/scanners/configuration/index.js +87 -0
  40. package/dist/scanners/configuration/index.js.map +1 -0
  41. package/dist/scanners/configuration/index.test.d.ts +5 -0
  42. package/dist/scanners/configuration/index.test.d.ts.map +1 -0
  43. package/dist/scanners/configuration/index.test.js +344 -0
  44. package/dist/scanners/configuration/index.test.js.map +1 -0
  45. package/dist/scanners/configuration/patterns.d.ts +32 -0
  46. package/dist/scanners/configuration/patterns.d.ts.map +1 -0
  47. package/dist/scanners/configuration/patterns.js +146 -0
  48. package/dist/scanners/configuration/patterns.js.map +1 -0
  49. package/dist/scanners/credentials/index.d.ts +7 -0
  50. package/dist/scanners/credentials/index.d.ts.map +1 -0
  51. package/dist/scanners/credentials/index.js +129 -0
  52. package/dist/scanners/credentials/index.js.map +1 -0
  53. package/dist/scanners/credentials/index.test.d.ts +5 -0
  54. package/dist/scanners/credentials/index.test.d.ts.map +1 -0
  55. package/dist/scanners/credentials/index.test.js +395 -0
  56. package/dist/scanners/credentials/index.test.js.map +1 -0
  57. package/dist/scanners/credentials/patterns.d.ts +32 -0
  58. package/dist/scanners/credentials/patterns.d.ts.map +1 -0
  59. package/dist/scanners/credentials/patterns.js +140 -0
  60. package/dist/scanners/credentials/patterns.js.map +1 -0
  61. package/dist/scanners/errors/index.d.ts +8 -0
  62. package/dist/scanners/errors/index.d.ts.map +1 -0
  63. package/dist/scanners/errors/index.js +78 -0
  64. package/dist/scanners/errors/index.js.map +1 -0
  65. package/dist/scanners/errors/index.test.d.ts +5 -0
  66. package/dist/scanners/errors/index.test.d.ts.map +1 -0
  67. package/dist/scanners/errors/index.test.js +330 -0
  68. package/dist/scanners/errors/index.test.js.map +1 -0
  69. package/dist/scanners/errors/patterns.d.ts +27 -0
  70. package/dist/scanners/errors/patterns.d.ts.map +1 -0
  71. package/dist/scanners/errors/patterns.js +97 -0
  72. package/dist/scanners/errors/patterns.js.map +1 -0
  73. package/dist/scanners/hipaa2026/index.d.ts.map +1 -1
  74. package/dist/scanners/hipaa2026/index.js +49 -17
  75. package/dist/scanners/hipaa2026/index.js.map +1 -1
  76. package/dist/scanners/hipaa2026/index.test.js +26 -15
  77. package/dist/scanners/hipaa2026/index.test.js.map +1 -1
  78. package/dist/scanners/operational/index.d.ts +7 -0
  79. package/dist/scanners/operational/index.d.ts.map +1 -0
  80. package/dist/scanners/operational/index.js +171 -0
  81. package/dist/scanners/operational/index.js.map +1 -0
  82. package/dist/scanners/operational/index.test.d.ts +5 -0
  83. package/dist/scanners/operational/index.test.d.ts.map +1 -0
  84. package/dist/scanners/operational/index.test.js +406 -0
  85. package/dist/scanners/operational/index.test.js.map +1 -0
  86. package/dist/scanners/operational/patterns.d.ts +33 -0
  87. package/dist/scanners/operational/patterns.d.ts.map +1 -0
  88. package/dist/scanners/operational/patterns.js +151 -0
  89. package/dist/scanners/operational/patterns.js.map +1 -0
  90. package/dist/scanners/rbac/index.d.ts +7 -0
  91. package/dist/scanners/rbac/index.d.ts.map +1 -0
  92. package/dist/scanners/rbac/index.js +145 -0
  93. package/dist/scanners/rbac/index.js.map +1 -0
  94. package/dist/scanners/rbac/index.test.d.ts +5 -0
  95. package/dist/scanners/rbac/index.test.d.ts.map +1 -0
  96. package/dist/scanners/rbac/index.test.js +422 -0
  97. package/dist/scanners/rbac/index.test.js.map +1 -0
  98. package/dist/scanners/rbac/patterns.d.ts +32 -0
  99. package/dist/scanners/rbac/patterns.d.ts.map +1 -0
  100. package/dist/scanners/rbac/patterns.js +124 -0
  101. package/dist/scanners/rbac/patterns.js.map +1 -0
  102. package/dist/scanners/revocation/index.d.ts +8 -0
  103. package/dist/scanners/revocation/index.d.ts.map +1 -0
  104. package/dist/scanners/revocation/index.js +83 -0
  105. package/dist/scanners/revocation/index.js.map +1 -0
  106. package/dist/scanners/revocation/index.test.d.ts +5 -0
  107. package/dist/scanners/revocation/index.test.d.ts.map +1 -0
  108. package/dist/scanners/revocation/index.test.js +332 -0
  109. package/dist/scanners/revocation/index.test.js.map +1 -0
  110. package/dist/scanners/revocation/patterns.d.ts +27 -0
  111. package/dist/scanners/revocation/patterns.d.ts.map +1 -0
  112. package/dist/scanners/revocation/patterns.js +109 -0
  113. package/dist/scanners/revocation/patterns.js.map +1 -0
  114. package/dist/scanners/sanitization/index.d.ts +8 -0
  115. package/dist/scanners/sanitization/index.d.ts.map +1 -0
  116. package/dist/scanners/sanitization/index.js +98 -0
  117. package/dist/scanners/sanitization/index.js.map +1 -0
  118. package/dist/scanners/sanitization/index.test.d.ts +5 -0
  119. package/dist/scanners/sanitization/index.test.d.ts.map +1 -0
  120. package/dist/scanners/sanitization/index.test.js +370 -0
  121. package/dist/scanners/sanitization/index.test.js.map +1 -0
  122. package/dist/scanners/sanitization/patterns.d.ts +27 -0
  123. package/dist/scanners/sanitization/patterns.d.ts.map +1 -0
  124. package/dist/scanners/sanitization/patterns.js +117 -0
  125. package/dist/scanners/sanitization/patterns.js.map +1 -0
  126. package/dist/training/certificate.d.ts +26 -0
  127. package/dist/training/certificate.d.ts.map +1 -0
  128. package/dist/training/certificate.js +92 -0
  129. package/dist/training/certificate.js.map +1 -0
  130. package/dist/training/index.d.ts +3 -0
  131. package/dist/training/index.d.ts.map +1 -0
  132. package/dist/training/index.js +243 -0
  133. package/dist/training/index.js.map +1 -0
  134. package/dist/training/modules.d.ts +13 -0
  135. package/dist/training/modules.d.ts.map +1 -0
  136. package/dist/training/modules.js +608 -0
  137. package/dist/training/modules.js.map +1 -0
  138. package/dist/training/questions.d.ts +9 -0
  139. package/dist/training/questions.d.ts.map +1 -0
  140. package/dist/training/questions.js +505 -0
  141. package/dist/training/questions.js.map +1 -0
  142. package/dist/types.d.ts +45 -0
  143. package/dist/types.d.ts.map +1 -1
  144. package/dist/utils/npm-audit.d.ts +6 -0
  145. package/dist/utils/npm-audit.d.ts.map +1 -0
  146. package/dist/utils/npm-audit.js +95 -0
  147. package/dist/utils/npm-audit.js.map +1 -0
  148. package/dist/utils/scan-history.d.ts +59 -0
  149. package/dist/utils/scan-history.d.ts.map +1 -0
  150. package/dist/utils/scan-history.js +170 -0
  151. package/dist/utils/scan-history.js.map +1 -0
  152. package/package.json +4 -1
  153. package/templates/baa-verification-letter.md +105 -0
  154. package/templates/irp.md +545 -0
  155. package/templates/notice-of-privacy-practices.md +491 -0
  156. package/templates/physical-safeguards-checklist.md +247 -0
  157. package/templates/security-officer-designation.md +237 -0
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Role-Based Access Control (RBAC) Detection Patterns
3
+ * Enforces proper authorization and minimum necessary principle per HIPAA
4
+ */
5
+ /**
6
+ * RBAC-001: PHI Data Access Without Role/Permission Verification
7
+ * Detects database queries to PHI tables without authorization checks
8
+ */
9
+ export const PHI_ACCESS_NO_AUTHZ = {
10
+ id: 'RBAC-001',
11
+ name: 'PHI Data Access Without Role/Permission Verification',
12
+ description: 'Database query accessing PHI data (patient, health, medical, diagnosis, treatment, prescription) without role or permission verification',
13
+ severity: 'high',
14
+ hipaaReference: '45 CFR §164.312(a)(1) - Access Control',
15
+ patterns: [
16
+ // Database queries to PHI tables
17
+ /(?:from|FROM)\s+(?:patients?|health_records?|medical_records?|diagnos[ei]s|treatments?|prescriptions?|medications?|encounters?|visits?|lab_results?)/i,
18
+ /\.(?:from|table)\s*\(\s*['"`](?:patients?|health_records?|medical_records?|diagnos[ei]s|treatments?|prescriptions?|medications?|encounters?|visits?|lab_results?)['"`]/i,
19
+ // ORM queries
20
+ /(?:Patient|HealthRecord|MedicalRecord|Diagnosis|Treatment|Prescription|Medication|Encounter|Visit|LabResult)\.(?:find|findOne|findAll|findMany|query|where)/i,
21
+ // Supabase/Prisma queries
22
+ /supabase\.from\s*\(\s*['"`](?:patients?|health_records?|medical_records?|diagnos[ei]s|treatments?|prescriptions?|medications?)['"`]/i,
23
+ /prisma\.(?:patient|healthRecord|medicalRecord|diagnosis|treatment|prescription|medication)\.(?:findMany|findUnique|findFirst)/i,
24
+ ],
25
+ negativePatterns: [
26
+ // Indicators of authorization checks
27
+ /role/i,
28
+ /permission/i,
29
+ /authorize/i,
30
+ /isAdmin/i,
31
+ /canAccess/i,
32
+ /hasPermission/i,
33
+ /checkAccess/i,
34
+ /verifyRole/i,
35
+ /requireRole/i,
36
+ /isAuthorized/i,
37
+ /checkPermission/i,
38
+ ],
39
+ recommendation: 'Add role/permission verification before accessing PHI data. Example: if (!hasPermission(user, "read:patients")) throw new Error("Unauthorized"). Implement RBAC middleware to verify user roles before database queries.',
40
+ category: 'access-control',
41
+ };
42
+ /**
43
+ * RBAC-002: Service Role Keys in Client-Side Code
44
+ * Detects privileged keys exposed to client, admin defaults, or always-admin conditions
45
+ */
46
+ export const SERVICE_ROLE_CLIENT_SIDE = {
47
+ id: 'RBAC-002',
48
+ name: 'Service Role Key or Admin Default in Client Code',
49
+ description: 'Privileged service_role key exposed in client-side code, isAdmin set to true as default, or conditions that always grant admin access',
50
+ severity: 'critical',
51
+ hipaaReference: '45 CFR §164.312(a)(1) - Access Control',
52
+ patterns: [
53
+ // Service role keys in client files
54
+ /service_role/i,
55
+ /serviceRole/i,
56
+ /SERVICE_ROLE/i,
57
+ // Admin defaults
58
+ /isAdmin\s*[:=]\s*true/i,
59
+ /role\s*[:=]\s*['"`]admin['"`]/i,
60
+ /admin\s*:\s*true/i,
61
+ // Always-admin conditions
62
+ /if\s*\(\s*true\s*\).*admin/i,
63
+ /const\s+isAdmin\s*=\s*true/i,
64
+ /let\s+isAdmin\s*=\s*true/i,
65
+ // Hardcoded admin users
66
+ /userId\s*===?\s*['"`]admin['"`]/i,
67
+ /email\s*===?\s*['"`]admin@/i,
68
+ ],
69
+ negativePatterns: [
70
+ // Server-side context (API routes, server components)
71
+ /\/api\//i,
72
+ /\.server\./i,
73
+ /getServerSideProps/i,
74
+ /getStaticProps/i,
75
+ // Environment variables (should be server-side only)
76
+ /process\.env/i,
77
+ // Test files
78
+ /\.test\./i,
79
+ /\.spec\./i,
80
+ /describe\(/i,
81
+ ],
82
+ recommendation: 'Remove service_role keys from client-side code - these should only exist in server-side API routes. Never default isAdmin to true. Implement proper role assignment based on authenticated user data from secure backend.',
83
+ category: 'access-control',
84
+ };
85
+ /**
86
+ * RBAC-003: SELECT * on PHI Tables (Violates Minimum Necessary)
87
+ * Detects SELECT * queries that retrieve all columns from PHI tables
88
+ */
89
+ export const SELECT_ALL_PHI = {
90
+ id: 'RBAC-003',
91
+ name: 'SELECT * on PHI Tables Violates Minimum Necessary Principle',
92
+ description: 'Query uses SELECT * or .select("*") on tables containing PHI, retrieving more data than necessary in violation of HIPAA minimum necessary principle',
93
+ severity: 'medium',
94
+ hipaaReference: '45 CFR §164.502(b) - Minimum Necessary Requirement',
95
+ patterns: [
96
+ // SQL SELECT *
97
+ /SELECT\s+\*\s+FROM\s+(?:patients?|health_records?|medical_records?|diagnos[ei]s|treatments?|prescriptions?|medications?|encounters?|visits?|lab_results?)/i,
98
+ // ORM select all
99
+ /\.select\s*\(\s*['"`]\*['"`]\s*\)/i,
100
+ /\.select\s*\(\s*\*\s*\)/i,
101
+ // Prisma/TypeORM select all fields
102
+ /\.findMany\s*\(\s*\{[^}]*\}\s*\)(?!.*select)/i,
103
+ /\.find\s*\(\s*\{[^}]*\}\s*\)(?!.*select)/i,
104
+ // Supabase select all
105
+ /supabase\.from\s*\([^)]*(?:patient|health|medical|diagnosis|treatment|prescription)[^)]*\)\.select\s*\(\s*['"`]\*['"`]/i,
106
+ ],
107
+ negativePatterns: [
108
+ // Specific field selection
109
+ /\.select\s*\(\s*['"`][a-zA-Z_,\s]+['"`]\s*\)/i,
110
+ /SELECT\s+[a-zA-Z_,\s]+\s+FROM/i,
111
+ // Projection/pick specific fields
112
+ /select\s*:\s*\{/i,
113
+ /pick\s*\(/i,
114
+ /omit\s*\(/i,
115
+ ],
116
+ recommendation: 'Select only the minimum necessary fields required for the operation. Example: Instead of SELECT * FROM patients, use SELECT id, name, dob FROM patients. For ORMs: .select("id, name, dob") or use field projections.',
117
+ category: 'access-control',
118
+ };
119
+ export const ALL_RBAC_PATTERNS = [
120
+ PHI_ACCESS_NO_AUTHZ,
121
+ SERVICE_ROLE_CLIENT_SIDE,
122
+ SELECT_ALL_PHI,
123
+ ];
124
+ //# sourceMappingURL=patterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../../src/scanners/rbac/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAgB;IAC9C,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,sDAAsD;IAC5D,WAAW,EACT,0IAA0I;IAC5I,QAAQ,EAAE,MAAM;IAChB,cAAc,EAAE,wCAAwC;IACxD,QAAQ,EAAE;QACR,iCAAiC;QACjC,uJAAuJ;QACvJ,yKAAyK;QAEzK,cAAc;QACd,8JAA8J;QAE9J,0BAA0B;QAC1B,sIAAsI;QACtI,gIAAgI;KACjI;IACD,gBAAgB,EAAE;QAChB,qCAAqC;QACrC,OAAO;QACP,aAAa;QACb,YAAY;QACZ,UAAU;QACV,YAAY;QACZ,gBAAgB;QAChB,cAAc;QACd,aAAa;QACb,cAAc;QACd,eAAe;QACf,kBAAkB;KACnB;IACD,cAAc,EACZ,0NAA0N;IAC5N,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAgB;IACnD,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,kDAAkD;IACxD,WAAW,EACT,uIAAuI;IACzI,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,wCAAwC;IACxD,QAAQ,EAAE;QACR,oCAAoC;QACpC,eAAe;QACf,cAAc;QACd,eAAe;QAEf,iBAAiB;QACjB,wBAAwB;QACxB,gCAAgC;QAChC,mBAAmB;QAEnB,0BAA0B;QAC1B,6BAA6B;QAC7B,6BAA6B;QAC7B,2BAA2B;QAE3B,wBAAwB;QACxB,kCAAkC;QAClC,6BAA6B;KAC9B;IACD,gBAAgB,EAAE;QAChB,sDAAsD;QACtD,UAAU;QACV,aAAa;QACb,qBAAqB;QACrB,iBAAiB;QACjB,qDAAqD;QACrD,eAAe;QACf,aAAa;QACb,WAAW;QACX,WAAW;QACX,aAAa;KACd;IACD,cAAc,EACZ,2NAA2N;IAC7N,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,6DAA6D;IACnE,WAAW,EACT,qJAAqJ;IACvJ,QAAQ,EAAE,QAAQ;IAClB,cAAc,EACZ,oDAAoD;IACtD,QAAQ,EAAE;QACR,eAAe;QACf,4JAA4J;QAE5J,iBAAiB;QACjB,oCAAoC;QACpC,0BAA0B;QAE1B,mCAAmC;QACnC,+CAA+C;QAC/C,2CAA2C;QAE3C,sBAAsB;QACtB,yHAAyH;KAC1H;IACD,gBAAgB,EAAE;QAChB,2BAA2B;QAC3B,+CAA+C;QAC/C,gCAAgC;QAChC,kCAAkC;QAClC,kBAAkB;QAClB,YAAY;QACZ,YAAY;KACb;IACD,cAAc,EACZ,uNAAuN;IACzN,QAAQ,EAAE,gBAAgB;CAC3B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,mBAAmB;IACnB,wBAAwB;IACxB,cAAc;CACf,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Token Revocation Security Scanner
3
+ * Detects JWT usage without revocation and excessive token expiration
4
+ */
5
+ import type { Scanner } from '../../types.js';
6
+ export declare const revocationScanner: Scanner;
7
+ export default revocationScanner;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/revocation/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;AAGpE,eAAO,MAAM,iBAAiB,EAAE,OAyF/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Token Revocation Security Scanner
3
+ * Detects JWT usage without revocation and excessive token expiration
4
+ */
5
+ import * as fs from 'fs/promises';
6
+ import { ALL_REVOCATION_PATTERNS } from './patterns.js';
7
+ export const revocationScanner = {
8
+ name: 'Token Revocation Security Scanner',
9
+ category: 'access-control',
10
+ async scan(files, options) {
11
+ const findings = [];
12
+ // Filter to code files
13
+ const codeFiles = files.filter((f) => /\.(ts|tsx|js|jsx)$/.test(f));
14
+ for (const file of codeFiles) {
15
+ try {
16
+ const content = await fs.readFile(file, 'utf-8');
17
+ const lines = content.split('\n');
18
+ for (let i = 0; i < lines.length; i++) {
19
+ const line = lines[i];
20
+ const lineNumber = i + 1;
21
+ // Skip empty lines and comments
22
+ if (/^\s*$/.test(line) || /^\s*\/\//.test(line))
23
+ continue;
24
+ // Scan each pattern
25
+ for (const pattern of ALL_REVOCATION_PATTERNS) {
26
+ // Check if line matches violation pattern
27
+ const matched = pattern.patterns.some((regex) => regex.test(line));
28
+ if (!matched)
29
+ continue;
30
+ // Get surrounding context (20 lines before and 10 after for REVOKE-001)
31
+ // (10 lines before and 5 after for REVOKE-002)
32
+ const contextBefore = pattern.id === 'REVOKE-001' ? 20 : 10;
33
+ const contextAfter = pattern.id === 'REVOKE-001' ? 10 : 5;
34
+ const contextStart = Math.max(0, i - contextBefore);
35
+ const contextEnd = Math.min(lines.length, i + contextAfter + 1);
36
+ const contextLines = lines.slice(contextStart, contextEnd);
37
+ // Filter out comment lines from context
38
+ const codeOnlyContext = contextLines
39
+ .filter(l => !/^\s*\/\//.test(l) && !/^\s*\/\*/.test(l) && !/^\s*\*/.test(l))
40
+ .join('\n');
41
+ // Check negative patterns (safe usage indicators)
42
+ const isSafe = pattern.negativePatterns?.some((regex) => {
43
+ // For REVOKE-001, check wider context for revocation mechanisms
44
+ // For REVOKE-002, check current line and immediate context
45
+ if (pattern.id === 'REVOKE-001') {
46
+ // Check surrounding code for revocation mechanisms
47
+ return regex.test(codeOnlyContext);
48
+ }
49
+ if (pattern.id === 'REVOKE-002') {
50
+ // Check if this is a refresh token or other acceptable long-lived token
51
+ // Check both the line and surrounding context
52
+ return regex.test(line) || regex.test(codeOnlyContext);
53
+ }
54
+ return regex.test(line);
55
+ });
56
+ if (isSafe)
57
+ continue;
58
+ // Create finding
59
+ const finding = {
60
+ id: pattern.id,
61
+ category: pattern.category,
62
+ severity: pattern.severity,
63
+ title: pattern.name,
64
+ description: `${pattern.description}\n\nCode: ${line.trim()}`,
65
+ file: file,
66
+ line: lineNumber,
67
+ recommendation: pattern.recommendation,
68
+ hipaaReference: pattern.hipaaReference,
69
+ confidence: 'high',
70
+ };
71
+ findings.push(finding);
72
+ }
73
+ }
74
+ }
75
+ catch (error) {
76
+ // Skip files that can't be read
77
+ }
78
+ }
79
+ return findings;
80
+ },
81
+ };
82
+ export default revocationScanner;
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/revocation/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Token Revocation Security Scanner Tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/scanners/revocation/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Token Revocation Security Scanner Tests
3
+ */
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { revocationScanner } from './index.js';
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ describe('Token Revocation Security Scanner', () => {
10
+ let tempDir = '';
11
+ let testFiles = [];
12
+ beforeEach(async () => {
13
+ tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'revoke-test-'));
14
+ });
15
+ afterEach(async () => {
16
+ // Cleanup
17
+ for (const file of testFiles) {
18
+ try {
19
+ await fs.unlink(file);
20
+ }
21
+ catch {
22
+ // Ignore
23
+ }
24
+ }
25
+ try {
26
+ await fs.rm(tempDir, { recursive: true, force: true });
27
+ }
28
+ catch {
29
+ // Ignore
30
+ }
31
+ testFiles = [];
32
+ });
33
+ async function createTestFile(filename, content) {
34
+ const filePath = path.join(tempDir, filename);
35
+ await fs.writeFile(filePath, content, 'utf-8');
36
+ testFiles.push(filePath);
37
+ return filePath;
38
+ }
39
+ const scanOptions = {
40
+ path: tempDir,
41
+ };
42
+ describe('REVOKE-001: JWT Without Server-Side Revocation Mechanism', () => {
43
+ it('should detect jwt.sign without revocation', async () => {
44
+ const file = await createTestFile('jwt-sign.ts', `
45
+ import jwt from 'jsonwebtoken';
46
+
47
+ function createToken(userId: string) {
48
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
49
+ return token;
50
+ }
51
+ `);
52
+ const findings = await revocationScanner.scan([file], scanOptions);
53
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
54
+ expect(revokeFindings.length).toBeGreaterThan(0);
55
+ expect(revokeFindings[0].severity).toBe('high');
56
+ });
57
+ it('should detect jsonwebtoken.sign without revocation', async () => {
58
+ const file = await createTestFile('jsonwebtoken.ts', `
59
+ import * as jsonwebtoken from 'jsonwebtoken';
60
+
61
+ export function generateAccessToken(payload: any) {
62
+ return jsonwebtoken.sign(payload, process.env.JWT_SECRET);
63
+ }
64
+ `);
65
+ const findings = await revocationScanner.scan([file], scanOptions);
66
+ expect(findings.some((f) => f.id === 'REVOKE-001')).toBe(true);
67
+ });
68
+ it('should detect jose SignJWT without revocation', async () => {
69
+ const file = await createTestFile('jose-sign.ts', `
70
+ import { SignJWT } from 'jose';
71
+
72
+ async function createJWT(userId: string) {
73
+ const token = await new SignJWT({ userId })
74
+ .setProtectedHeader({ alg: 'HS256' })
75
+ .sign(secret);
76
+ return token;
77
+ }
78
+ `);
79
+ const findings = await revocationScanner.scan([file], scanOptions);
80
+ expect(findings.some((f) => f.id === 'REVOKE-001')).toBe(true);
81
+ });
82
+ it('should detect custom token generation without revocation', async () => {
83
+ const file = await createTestFile('custom-token.ts', `
84
+ function createAccessToken(user: User) {
85
+ const payload = { id: user.id, email: user.email };
86
+ return jwt.sign(payload, SECRET);
87
+ }
88
+ `);
89
+ const findings = await revocationScanner.scan([file], scanOptions);
90
+ expect(findings.some((f) => f.id === 'REVOKE-001')).toBe(true);
91
+ });
92
+ it('should NOT flag when blacklist is used', async () => {
93
+ const file = await createTestFile('jwt-blacklist.ts', `
94
+ import jwt from 'jsonwebtoken';
95
+ import { tokenBlacklist } from './blacklist';
96
+
97
+ function createToken(userId: string) {
98
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
99
+ return token;
100
+ }
101
+
102
+ async function revokeToken(token: string) {
103
+ await tokenBlacklist.add(token);
104
+ }
105
+ `);
106
+ const findings = await revocationScanner.scan([file], scanOptions);
107
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
108
+ expect(revokeFindings.length).toBe(0);
109
+ });
110
+ it('should NOT flag when Redis is used for token storage', async () => {
111
+ const file = await createTestFile('jwt-redis.ts', `
112
+ import jwt from 'jsonwebtoken';
113
+ import redis from './redis';
114
+
115
+ async function createToken(userId: string) {
116
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
117
+ await redis.set(\`token:\${userId}\`, token, 'EX', 3600);
118
+ return token;
119
+ }
120
+
121
+ async function revokeToken(userId: string) {
122
+ await redis.del(\`token:\${userId}\`);
123
+ }
124
+ `);
125
+ const findings = await revocationScanner.scan([file], scanOptions);
126
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
127
+ expect(revokeFindings.length).toBe(0);
128
+ });
129
+ it('should NOT flag when tokenStore is used', async () => {
130
+ const file = await createTestFile('jwt-store.ts', `
131
+ import jwt from 'jsonwebtoken';
132
+ import { tokenStore } from './store';
133
+
134
+ function createToken(userId: string) {
135
+ const token = jwt.sign({ userId }, SECRET);
136
+ tokenStore.save(userId, token);
137
+ return token;
138
+ }
139
+ `);
140
+ const findings = await revocationScanner.scan([file], scanOptions);
141
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
142
+ expect(revokeFindings.length).toBe(0);
143
+ });
144
+ it('should NOT flag when revoke function exists', async () => {
145
+ const file = await createTestFile('jwt-revoke.ts', `
146
+ import jwt from 'jsonwebtoken';
147
+
148
+ function createToken(userId: string) {
149
+ return jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
150
+ }
151
+
152
+ async function revokeUserTokens(userId: string) {
153
+ await revokedTokens.add(userId);
154
+ }
155
+ `);
156
+ const findings = await revocationScanner.scan([file], scanOptions);
157
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
158
+ expect(revokeFindings.length).toBe(0);
159
+ });
160
+ it('should NOT flag session-based authentication', async () => {
161
+ const file = await createTestFile('session-auth.ts', `
162
+ import jwt from 'jsonwebtoken';
163
+ import session from 'express-session';
164
+
165
+ function createToken(userId: string) {
166
+ return jwt.sign({ userId, sessionId: req.session.id }, SECRET);
167
+ }
168
+ `);
169
+ const findings = await revocationScanner.scan([file], scanOptions);
170
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-001');
171
+ expect(revokeFindings.length).toBe(0);
172
+ });
173
+ });
174
+ describe('REVOKE-002: Excessive Token Expiration Time', () => {
175
+ it('should detect expiresIn with 2 days', async () => {
176
+ const file = await createTestFile('expires-2d.ts', `
177
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '2d' });
178
+ `);
179
+ const findings = await revocationScanner.scan([file], scanOptions);
180
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
181
+ expect(revokeFindings.length).toBeGreaterThan(0);
182
+ expect(revokeFindings[0].severity).toBe('medium');
183
+ });
184
+ it('should detect expiresIn with 7 days', async () => {
185
+ const file = await createTestFile('expires-7d.ts', `
186
+ const accessToken = jwt.sign(payload, SECRET, { expiresIn: '7d' });
187
+ `);
188
+ const findings = await revocationScanner.scan([file], scanOptions);
189
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
190
+ });
191
+ it('should detect expiresIn with 30 days', async () => {
192
+ const file = await createTestFile('expires-30d.ts', `
193
+ const token = jwt.sign({ id: user.id }, SECRET, { expiresIn: '30d' });
194
+ `);
195
+ const findings = await revocationScanner.scan([file], scanOptions);
196
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
197
+ });
198
+ it('should detect expiresIn with 48 hours', async () => {
199
+ const file = await createTestFile('expires-48h.ts', `
200
+ const token = jwt.sign(data, SECRET, { expiresIn: '48h' });
201
+ `);
202
+ const findings = await revocationScanner.scan([file], scanOptions);
203
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
204
+ });
205
+ it('should detect expiresIn with 72 hours', async () => {
206
+ const file = await createTestFile('expires-72h.ts', `
207
+ jwt.sign({ userId: user.id }, process.env.SECRET, { expiresIn: '72h' });
208
+ `);
209
+ const findings = await revocationScanner.scan([file], scanOptions);
210
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
211
+ });
212
+ it('should detect expiresIn with 1 week', async () => {
213
+ const file = await createTestFile('expires-1w.ts', `
214
+ const token = jwt.sign(payload, SECRET, { expiresIn: '1w' });
215
+ `);
216
+ const findings = await revocationScanner.scan([file], scanOptions);
217
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
218
+ });
219
+ it('should detect numeric expiresIn exceeding 24 hours', async () => {
220
+ const file = await createTestFile('expires-numeric.ts', `
221
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: 172800 });
222
+ `);
223
+ const findings = await revocationScanner.scan([file], scanOptions);
224
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
225
+ });
226
+ it('should detect excessive maxAge', async () => {
227
+ const file = await createTestFile('maxage-excessive.ts', `
228
+ res.cookie('token', token, { maxAge: 864000000 });
229
+ `);
230
+ const findings = await revocationScanner.scan([file], scanOptions);
231
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
232
+ });
233
+ it('should NOT flag expiresIn with 1 hour', async () => {
234
+ const file = await createTestFile('expires-1h.ts', `
235
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
236
+ `);
237
+ const findings = await revocationScanner.scan([file], scanOptions);
238
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
239
+ expect(revokeFindings.length).toBe(0);
240
+ });
241
+ it('should NOT flag expiresIn with 15 minutes', async () => {
242
+ const file = await createTestFile('expires-15m.ts', `
243
+ const token = jwt.sign(payload, SECRET, { expiresIn: '15m' });
244
+ `);
245
+ const findings = await revocationScanner.scan([file], scanOptions);
246
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
247
+ expect(revokeFindings.length).toBe(0);
248
+ });
249
+ it('should NOT flag expiresIn with 24 hours', async () => {
250
+ const file = await createTestFile('expires-24h.ts', `
251
+ const accessToken = jwt.sign({ id: user.id }, SECRET, { expiresIn: '24h' });
252
+ `);
253
+ const findings = await revocationScanner.scan([file], scanOptions);
254
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
255
+ expect(revokeFindings.length).toBe(0);
256
+ });
257
+ it('should NOT flag expiresIn with 1 day', async () => {
258
+ const file = await createTestFile('expires-1d.ts', `
259
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '1d' });
260
+ `);
261
+ const findings = await revocationScanner.scan([file], scanOptions);
262
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
263
+ expect(revokeFindings.length).toBe(0);
264
+ });
265
+ it('should NOT flag refresh tokens with longer expiration', async () => {
266
+ const file = await createTestFile('refresh-token.ts', `
267
+ const refreshToken = jwt.sign({ userId }, SECRET, { expiresIn: '7d' });
268
+ `);
269
+ const findings = await revocationScanner.scan([file], scanOptions);
270
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
271
+ expect(revokeFindings.length).toBe(0);
272
+ });
273
+ it('should NOT flag remember me tokens', async () => {
274
+ const file = await createTestFile('remember-me.ts', `
275
+ if (rememberMe) {
276
+ const token = jwt.sign(payload, SECRET, { expiresIn: '30d' });
277
+ }
278
+ `);
279
+ const findings = await revocationScanner.scan([file], scanOptions);
280
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
281
+ expect(revokeFindings.length).toBe(0);
282
+ });
283
+ it('should NOT flag API keys', async () => {
284
+ const file = await createTestFile('api-key.ts', `
285
+ const apiKey = jwt.sign({ clientId }, SECRET, { expiresIn: '90d' });
286
+ `);
287
+ const findings = await revocationScanner.scan([file], scanOptions);
288
+ const revokeFindings = findings.filter((f) => f.id === 'REVOKE-002');
289
+ expect(revokeFindings.length).toBe(0);
290
+ });
291
+ });
292
+ describe('Combined violations', () => {
293
+ it('should detect both REVOKE-001 and REVOKE-002 in same file', async () => {
294
+ const file = await createTestFile('combined.ts', `
295
+ import jwt from 'jsonwebtoken';
296
+
297
+ function createToken(userId: string) {
298
+ const token = jwt.sign({ userId }, SECRET, { expiresIn: '7d' });
299
+ return token;
300
+ }
301
+ `);
302
+ const findings = await revocationScanner.scan([file], scanOptions);
303
+ expect(findings.some((f) => f.id === 'REVOKE-001')).toBe(true);
304
+ expect(findings.some((f) => f.id === 'REVOKE-002')).toBe(true);
305
+ });
306
+ });
307
+ it('should provide correct HIPAA references', async () => {
308
+ const file = await createTestFile('hipaa-refs.ts', `
309
+ import jwt from 'jsonwebtoken';
310
+ const token1 = jwt.sign({ userId }, SECRET, { expiresIn: '30d' });
311
+ `);
312
+ const findings = await revocationScanner.scan([file], scanOptions);
313
+ expect(findings.length).toBeGreaterThan(0);
314
+ expect(findings.every((f) => f.hipaaReference?.includes('164.308(a)(3)(ii)(C)'))).toBe(true);
315
+ });
316
+ it('should have correct severity levels', async () => {
317
+ const file1 = await createTestFile('severity-high.ts', `
318
+ import jwt from 'jsonwebtoken';
319
+ const token1 = jwt.sign({ userId }, SECRET, { expiresIn: '1h' });
320
+ `);
321
+ const file2 = await createTestFile('severity-medium.ts', `
322
+ const token2 = jwt.sign({ userId }, SECRET, { expiresIn: '48h' });
323
+ `);
324
+ const findings1 = await revocationScanner.scan([file1], scanOptions);
325
+ const findings2 = await revocationScanner.scan([file2], scanOptions);
326
+ const revoke001 = findings1.find((f) => f.id === 'REVOKE-001');
327
+ const revoke002 = findings2.find((f) => f.id === 'REVOKE-002');
328
+ expect(revoke001?.severity).toBe('high');
329
+ expect(revoke002?.severity).toBe('medium');
330
+ });
331
+ });
332
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/scanners/revocation/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Token Revocation Security Detection Patterns
3
+ * Detects JWT usage without revocation mechanisms and excessive token expiration
4
+ */
5
+ export interface RevocationPattern {
6
+ id: string;
7
+ name: string;
8
+ description: string;
9
+ severity: 'high' | 'medium';
10
+ hipaaReference: string;
11
+ patterns: RegExp[];
12
+ negativePatterns?: RegExp[];
13
+ recommendation: string;
14
+ category: string;
15
+ }
16
+ /**
17
+ * REVOKE-001: JWT Without Server-Side Revocation Mechanism
18
+ * Detects JWT usage without revocation support
19
+ */
20
+ export declare const JWT_WITHOUT_REVOCATION: RevocationPattern;
21
+ /**
22
+ * REVOKE-002: Excessive Token Expiration Time
23
+ * Detects tokens with expirations longer than recommended
24
+ */
25
+ export declare const EXCESSIVE_TOKEN_EXPIRATION: RevocationPattern;
26
+ export declare const ALL_REVOCATION_PATTERNS: RevocationPattern[];
27
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../src/scanners/revocation/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,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;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,iBAsDpC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBA2DxC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,EAGtD,CAAC"}