verification-layer 0.25.3 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +38 -0
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rule-catalog.json +1491 -0
- package/dist/rules/catalog.d.ts +44 -0
- package/dist/rules/catalog.d.ts.map +1 -0
- package/dist/rules/catalog.js +196 -0
- package/dist/rules/catalog.js.map +1 -0
- package/dist/rules/catalog.test.d.ts +2 -0
- package/dist/rules/catalog.test.d.ts.map +1 -0
- package/dist/rules/catalog.test.js +80 -0
- package/dist/rules/catalog.test.js.map +1 -0
- package/dist/rules/schema.d.ts +13 -0
- package/dist/rules/schema.d.ts.map +1 -1
- package/dist/rules/schema.js +13 -1
- package/dist/rules/schema.js.map +1 -1
- package/dist/scanners/access/index.d.ts +22 -0
- package/dist/scanners/access/index.d.ts.map +1 -1
- package/dist/scanners/access/index.js +1 -1
- package/dist/scanners/access/index.js.map +1 -1
- package/dist/scanners/audit/index.d.ts +21 -0
- package/dist/scanners/audit/index.d.ts.map +1 -1
- package/dist/scanners/audit/index.js +24 -0
- package/dist/scanners/audit/index.js.map +1 -1
- package/dist/scanners/encryption/index.d.ts +25 -1
- package/dist/scanners/encryption/index.d.ts.map +1 -1
- package/dist/scanners/encryption/index.js +20 -20
- package/dist/scanners/encryption/index.js.map +1 -1
- package/dist/scanners/retention/index.d.ts +33 -0
- package/dist/scanners/retention/index.d.ts.map +1 -1
- package/dist/scanners/retention/index.js +1 -1
- package/dist/scanners/retention/index.js.map +1 -1
- package/dist/scanners/security/index.d.ts +10 -1
- package/dist/scanners/security/index.d.ts.map +1 -1
- package/dist/scanners/security/index.js +1 -1
- package/dist/scanners/security/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in rule catalog — the single source of truth for every detection rule
|
|
3
|
+
* shipped in vlayer. It is DERIVED from the scanners (and the AI rules), never a
|
|
4
|
+
* hand-maintained parallel list: each entry traces back to a real rule
|
|
5
|
+
* definition in `src/scanners/*` or `src/ai/rules`.
|
|
6
|
+
*
|
|
7
|
+
* Three forms of built-in rules are folded in here:
|
|
8
|
+
* 1. Exported pattern arrays (e.g. PHI_PATTERNS, ALL_*_PATTERNS).
|
|
9
|
+
* 2. Inline rule arrays that live in a scanner's index.ts (ACCESS_CONTROL_ISSUES,
|
|
10
|
+
* RETENTION_ISSUES, SECURITY_PATTERNS, WEAK_CRYPTO_PATTERNS,
|
|
11
|
+
* MISSING_ENCRYPTION_PATTERNS).
|
|
12
|
+
* 3. Scanners that build findings inline with dynamic per-finding ids. The
|
|
13
|
+
* audit scanner exposes an explicit metadata array of its STABLE rule
|
|
14
|
+
* families (AUDIT_RULES) — fixed ids only. (Encryption now carries a stable
|
|
15
|
+
* `id` on every pattern, so each distinct check is listed individually.)
|
|
16
|
+
*
|
|
17
|
+
* The category of a rule is ALWAYS the owning scanner's canonical `.category`
|
|
18
|
+
* (the AI rules are normalized from their short tokens). A module-load
|
|
19
|
+
* validation gate asserts every category is one of the five canonical tokens
|
|
20
|
+
* from `schema.ts`, permanently preventing category drift.
|
|
21
|
+
*/
|
|
22
|
+
import { type Category } from './schema.js';
|
|
23
|
+
export { type Category };
|
|
24
|
+
export type CatalogSeverity = 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
25
|
+
export interface CatalogRule {
|
|
26
|
+
id: string;
|
|
27
|
+
category: Category;
|
|
28
|
+
severity: CatalogSeverity;
|
|
29
|
+
title: string;
|
|
30
|
+
description: string;
|
|
31
|
+
recommendation?: string;
|
|
32
|
+
hipaaReference?: string;
|
|
33
|
+
source: 'pattern' | 'ai';
|
|
34
|
+
scanner: string;
|
|
35
|
+
}
|
|
36
|
+
/** The complete built-in rule catalog. Built and validated once at module load. */
|
|
37
|
+
export declare const RULE_CATALOG: CatalogRule[];
|
|
38
|
+
/** Return every catalog rule. */
|
|
39
|
+
export declare function getAllRules(): CatalogRule[];
|
|
40
|
+
/** Return the catalog rules belonging to a single canonical category. */
|
|
41
|
+
export declare function getRulesByCategory(category: Category): CatalogRule[];
|
|
42
|
+
/** Return a per-category rule count keyed by all five canonical categories. */
|
|
43
|
+
export declare function getCategoryCounts(): Record<Category, number>;
|
|
44
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/rules/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0B1D,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAwKD,mFAAmF;AACnF,eAAO,MAAM,YAAY,EAAE,WAAW,EAAmB,CAAC;AAE1D,iCAAiC;AACjC,wBAAgB,WAAW,IAAI,WAAW,EAAE,CAE3C;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAAE,CAEpE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAQ5D"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in rule catalog — the single source of truth for every detection rule
|
|
3
|
+
* shipped in vlayer. It is DERIVED from the scanners (and the AI rules), never a
|
|
4
|
+
* hand-maintained parallel list: each entry traces back to a real rule
|
|
5
|
+
* definition in `src/scanners/*` or `src/ai/rules`.
|
|
6
|
+
*
|
|
7
|
+
* Three forms of built-in rules are folded in here:
|
|
8
|
+
* 1. Exported pattern arrays (e.g. PHI_PATTERNS, ALL_*_PATTERNS).
|
|
9
|
+
* 2. Inline rule arrays that live in a scanner's index.ts (ACCESS_CONTROL_ISSUES,
|
|
10
|
+
* RETENTION_ISSUES, SECURITY_PATTERNS, WEAK_CRYPTO_PATTERNS,
|
|
11
|
+
* MISSING_ENCRYPTION_PATTERNS).
|
|
12
|
+
* 3. Scanners that build findings inline with dynamic per-finding ids. The
|
|
13
|
+
* audit scanner exposes an explicit metadata array of its STABLE rule
|
|
14
|
+
* families (AUDIT_RULES) — fixed ids only. (Encryption now carries a stable
|
|
15
|
+
* `id` on every pattern, so each distinct check is listed individually.)
|
|
16
|
+
*
|
|
17
|
+
* The category of a rule is ALWAYS the owning scanner's canonical `.category`
|
|
18
|
+
* (the AI rules are normalized from their short tokens). A module-load
|
|
19
|
+
* validation gate asserts every category is one of the five canonical tokens
|
|
20
|
+
* from `schema.ts`, permanently preventing category drift.
|
|
21
|
+
*/
|
|
22
|
+
import { CategoryEnum } from './schema.js';
|
|
23
|
+
import { AI_RULES } from '../ai/rules/index.js';
|
|
24
|
+
// Form 1 — exported pattern arrays
|
|
25
|
+
import { PHI_PATTERNS } from '../scanners/phi/patterns.js';
|
|
26
|
+
import { ALL_SKILL_PATTERNS } from '../scanners/skills/patterns.js';
|
|
27
|
+
import { ALL_HIPAA_2026_PATTERNS } from '../scanners/hipaa2026/patterns.js';
|
|
28
|
+
import { ALL_API_SECURITY_PATTERNS } from '../scanners/api-security/patterns.js';
|
|
29
|
+
import { ALL_CONFIGURATION_PATTERNS } from '../scanners/configuration/patterns.js';
|
|
30
|
+
import { ALL_MFA_PATTERNS } from '../scanners/authentication/patterns.js';
|
|
31
|
+
import { ALL_ERROR_PATTERNS } from '../scanners/errors/patterns.js';
|
|
32
|
+
import { ALL_OPERATIONAL_PATTERNS } from '../scanners/operational/patterns.js';
|
|
33
|
+
import { ALL_CREDENTIAL_PATTERNS } from '../scanners/credentials/patterns.js';
|
|
34
|
+
import { ALL_RBAC_PATTERNS } from '../scanners/rbac/patterns.js';
|
|
35
|
+
import { ALL_SANITIZATION_PATTERNS } from '../scanners/sanitization/patterns.js';
|
|
36
|
+
import { ALL_REVOCATION_PATTERNS } from '../scanners/revocation/patterns.js';
|
|
37
|
+
// Form 2 — inline rule arrays exported from a scanner's index.ts
|
|
38
|
+
import { ACCESS_CONTROL_ISSUES } from '../scanners/access/index.js';
|
|
39
|
+
import { RETENTION_ISSUES } from '../scanners/retention/index.js';
|
|
40
|
+
import { SECURITY_PATTERNS } from '../scanners/security/index.js';
|
|
41
|
+
import { WEAK_CRYPTO_PATTERNS, MISSING_ENCRYPTION_PATTERNS } from '../scanners/encryption/index.js';
|
|
42
|
+
// Form 3 — stable families for scanners that emit dynamic per-finding ids
|
|
43
|
+
import { AUDIT_RULES } from '../scanners/audit/index.js';
|
|
44
|
+
const SEVERITIES = ['critical', 'high', 'medium', 'low', 'info'];
|
|
45
|
+
function normalizeSeverity(severity) {
|
|
46
|
+
const value = severity.toLowerCase();
|
|
47
|
+
return SEVERITIES.includes(value)
|
|
48
|
+
? value
|
|
49
|
+
: 'info';
|
|
50
|
+
}
|
|
51
|
+
function fromScanner(scanner, category, rules) {
|
|
52
|
+
return rules.map((rule) => ({
|
|
53
|
+
id: rule.id,
|
|
54
|
+
category,
|
|
55
|
+
severity: normalizeSeverity(rule.severity),
|
|
56
|
+
title: rule.title ?? rule.name ?? rule.id,
|
|
57
|
+
description: rule.description,
|
|
58
|
+
recommendation: rule.recommendation,
|
|
59
|
+
hipaaReference: rule.hipaaReference,
|
|
60
|
+
source: 'pattern',
|
|
61
|
+
scanner,
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
/** AI rules carry SHORT category tokens that must be normalized to the enum. */
|
|
65
|
+
const AI_CATEGORY_MAP = {
|
|
66
|
+
phi: 'phi-exposure',
|
|
67
|
+
encryption: 'encryption',
|
|
68
|
+
audit: 'audit-logging',
|
|
69
|
+
access: 'access-control',
|
|
70
|
+
retention: 'data-retention',
|
|
71
|
+
};
|
|
72
|
+
function fromAiRules() {
|
|
73
|
+
return AI_RULES.map((rule) => {
|
|
74
|
+
const category = AI_CATEGORY_MAP[rule.category];
|
|
75
|
+
if (!category) {
|
|
76
|
+
throw new Error(`[rule-catalog] Unknown AI rule category "${rule.category}" for ${rule.id}`);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
id: rule.id,
|
|
80
|
+
category,
|
|
81
|
+
// AI rules have no fixed severity (severity is decided by the LLM at runtime).
|
|
82
|
+
severity: 'info',
|
|
83
|
+
title: rule.name,
|
|
84
|
+
description: rule.name,
|
|
85
|
+
source: 'ai',
|
|
86
|
+
scanner: 'ai',
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The encryption scanner builds findings inline (with `<id>-<line>` finding ids),
|
|
92
|
+
* so its checks are mapped to catalog entries directly from the two pattern
|
|
93
|
+
* arrays. Each pattern carries a stable `id` and an `issue` (its short title);
|
|
94
|
+
* we attach an accurate HIPAA-relevant description, fix recommendation, and the
|
|
95
|
+
* same HIPAA reference the scanner emits. Detection logic is unchanged — these
|
|
96
|
+
* are the same checks, now enumerated individually.
|
|
97
|
+
*/
|
|
98
|
+
const WEAK_CRYPTO_HIPAA_REF = '§164.312(a)(2)(iv), §164.312(e)(2)(ii)';
|
|
99
|
+
const MISSING_ENCRYPTION_HIPAA_REF = '§164.312(e)(1)';
|
|
100
|
+
function encryptionRules() {
|
|
101
|
+
const weak = WEAK_CRYPTO_PATTERNS.map((pattern) => ({
|
|
102
|
+
id: pattern.id,
|
|
103
|
+
category: 'encryption',
|
|
104
|
+
severity: normalizeSeverity(pattern.severity),
|
|
105
|
+
title: pattern.issue,
|
|
106
|
+
description: `${pattern.issue} is not suitable for protecting PHI.`,
|
|
107
|
+
recommendation: 'Use AES-256-GCM for encryption and SHA-256 or stronger for hashing.',
|
|
108
|
+
hipaaReference: WEAK_CRYPTO_HIPAA_REF,
|
|
109
|
+
source: 'pattern',
|
|
110
|
+
scanner: 'encryption',
|
|
111
|
+
}));
|
|
112
|
+
const missing = MISSING_ENCRYPTION_PATTERNS.map((pattern) => ({
|
|
113
|
+
id: pattern.id,
|
|
114
|
+
category: 'encryption',
|
|
115
|
+
severity: normalizeSeverity(pattern.severity),
|
|
116
|
+
title: pattern.issue,
|
|
117
|
+
description: `${pattern.issue} may expose PHI in transit or at rest.`,
|
|
118
|
+
recommendation: 'Enforce TLS 1.2+ for PHI in transit and encrypt PHI (including backups) at rest.',
|
|
119
|
+
hipaaReference: MISSING_ENCRYPTION_HIPAA_REF,
|
|
120
|
+
source: 'pattern',
|
|
121
|
+
scanner: 'encryption',
|
|
122
|
+
}));
|
|
123
|
+
return [...weak, ...missing];
|
|
124
|
+
}
|
|
125
|
+
function buildCatalog() {
|
|
126
|
+
const rules = [
|
|
127
|
+
// Form 1 — exported pattern arrays (category = owning scanner's .category)
|
|
128
|
+
...fromScanner('phi', 'phi-exposure', PHI_PATTERNS),
|
|
129
|
+
...fromScanner('skills', 'access-control', ALL_SKILL_PATTERNS),
|
|
130
|
+
...fromScanner('hipaa2026', 'access-control', ALL_HIPAA_2026_PATTERNS),
|
|
131
|
+
...fromScanner('api-security', 'access-control', ALL_API_SECURITY_PATTERNS),
|
|
132
|
+
...fromScanner('configuration', 'audit-logging', ALL_CONFIGURATION_PATTERNS),
|
|
133
|
+
...fromScanner('authentication', 'access-control', ALL_MFA_PATTERNS),
|
|
134
|
+
...fromScanner('errors', 'audit-logging', ALL_ERROR_PATTERNS),
|
|
135
|
+
...fromScanner('operational', 'data-retention', ALL_OPERATIONAL_PATTERNS),
|
|
136
|
+
...fromScanner('credentials', 'encryption', ALL_CREDENTIAL_PATTERNS),
|
|
137
|
+
...fromScanner('rbac', 'access-control', ALL_RBAC_PATTERNS),
|
|
138
|
+
...fromScanner('sanitization', 'access-control', ALL_SANITIZATION_PATTERNS),
|
|
139
|
+
...fromScanner('revocation', 'access-control', ALL_REVOCATION_PATTERNS),
|
|
140
|
+
// Form 2 — inline arrays exported from index.ts
|
|
141
|
+
...fromScanner('access', 'access-control', ACCESS_CONTROL_ISSUES),
|
|
142
|
+
...fromScanner('retention', 'data-retention', RETENTION_ISSUES),
|
|
143
|
+
...fromScanner('security', 'access-control', SECURITY_PATTERNS),
|
|
144
|
+
// Form 3 — dynamic-id scanners
|
|
145
|
+
...fromScanner('audit', 'audit-logging', AUDIT_RULES),
|
|
146
|
+
// Encryption: one catalog entry per distinct check (stable ids on patterns).
|
|
147
|
+
...encryptionRules(),
|
|
148
|
+
// AI rules (normalized categories)
|
|
149
|
+
...fromAiRules(),
|
|
150
|
+
];
|
|
151
|
+
// Dedupe by id; THROW on duplicate id so a collision can never silently shadow
|
|
152
|
+
// a real rule (and so the catalog count stays honest).
|
|
153
|
+
const byId = new Map();
|
|
154
|
+
const duplicates = [];
|
|
155
|
+
for (const rule of rules) {
|
|
156
|
+
if (byId.has(rule.id)) {
|
|
157
|
+
duplicates.push(rule.id);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
byId.set(rule.id, rule);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (duplicates.length > 0) {
|
|
164
|
+
const unique = [...new Set(duplicates)].sort();
|
|
165
|
+
throw new Error(`[rule-catalog] Duplicate rule id(s): ${unique.join(', ')}`);
|
|
166
|
+
}
|
|
167
|
+
const catalog = [...byId.values()];
|
|
168
|
+
// VALIDATION GATE: every category must be one of the five canonical tokens.
|
|
169
|
+
// This runs at module load and permanently prevents category drift.
|
|
170
|
+
const valid = new Set(CategoryEnum.options);
|
|
171
|
+
const offenders = catalog.filter((rule) => !valid.has(rule.category));
|
|
172
|
+
if (offenders.length > 0) {
|
|
173
|
+
const detail = offenders.map((o) => `${o.id} -> ${o.category}`).join(', ');
|
|
174
|
+
throw new Error(`[rule-catalog] Non-canonical categories: ${detail}. Allowed: ${CategoryEnum.options.join(', ')}`);
|
|
175
|
+
}
|
|
176
|
+
return catalog;
|
|
177
|
+
}
|
|
178
|
+
/** The complete built-in rule catalog. Built and validated once at module load. */
|
|
179
|
+
export const RULE_CATALOG = buildCatalog();
|
|
180
|
+
/** Return every catalog rule. */
|
|
181
|
+
export function getAllRules() {
|
|
182
|
+
return RULE_CATALOG;
|
|
183
|
+
}
|
|
184
|
+
/** Return the catalog rules belonging to a single canonical category. */
|
|
185
|
+
export function getRulesByCategory(category) {
|
|
186
|
+
return RULE_CATALOG.filter((rule) => rule.category === category);
|
|
187
|
+
}
|
|
188
|
+
/** Return a per-category rule count keyed by all five canonical categories. */
|
|
189
|
+
export function getCategoryCounts() {
|
|
190
|
+
const counts = Object.fromEntries(CategoryEnum.options.map((category) => [category, 0]));
|
|
191
|
+
for (const rule of RULE_CATALOG) {
|
|
192
|
+
counts[rule.category] += 1;
|
|
193
|
+
}
|
|
194
|
+
return counts;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/rules/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.test.d.ts","sourceRoot":"","sources":["../../src/rules/catalog.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { RULE_CATALOG, getAllRules, getRulesByCategory, getCategoryCounts, } from './catalog.js';
|
|
3
|
+
import { CategoryEnum } from './schema.js';
|
|
4
|
+
describe('built-in rule catalog', () => {
|
|
5
|
+
it('is non-empty', () => {
|
|
6
|
+
expect(RULE_CATALOG.length).toBeGreaterThan(0);
|
|
7
|
+
expect(getAllRules()).toBe(RULE_CATALOG);
|
|
8
|
+
});
|
|
9
|
+
it('only contains the five canonical categories', () => {
|
|
10
|
+
const allowed = new Set(CategoryEnum.options);
|
|
11
|
+
for (const rule of RULE_CATALOG) {
|
|
12
|
+
expect(allowed.has(rule.category)).toBe(true);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
it('has no duplicate ids', () => {
|
|
16
|
+
const ids = RULE_CATALOG.map((r) => r.id);
|
|
17
|
+
expect(new Set(ids).size).toBe(ids.length);
|
|
18
|
+
});
|
|
19
|
+
it('getCategoryCounts returns all five keys, each populated', () => {
|
|
20
|
+
const counts = getCategoryCounts();
|
|
21
|
+
expect(Object.keys(counts).sort()).toEqual([...CategoryEnum.options].sort());
|
|
22
|
+
expect(counts['data-retention']).toBeGreaterThan(0);
|
|
23
|
+
expect(counts['access-control']).toBeGreaterThan(0);
|
|
24
|
+
for (const category of CategoryEnum.options) {
|
|
25
|
+
expect(counts[category]).toBeGreaterThan(0);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
it('getRulesByCategory matches counts and includes the known data-retention rules', () => {
|
|
29
|
+
const counts = getCategoryCounts();
|
|
30
|
+
for (const category of CategoryEnum.options) {
|
|
31
|
+
expect(getRulesByCategory(category).length).toBe(counts[category]);
|
|
32
|
+
}
|
|
33
|
+
const retentionIds = getRulesByCategory('data-retention').map((r) => r.id);
|
|
34
|
+
for (const id of [
|
|
35
|
+
'short-retention',
|
|
36
|
+
'unlogged-delete',
|
|
37
|
+
'bulk-delete',
|
|
38
|
+
'backup-disabled',
|
|
39
|
+
'phi-cache',
|
|
40
|
+
'HIPAA-RETENTION-001',
|
|
41
|
+
]) {
|
|
42
|
+
expect(retentionIds).toContain(id);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
it('lists every distinct encryption check with stable ids (no collapsed families)', () => {
|
|
46
|
+
const encryption = getRulesByCategory('encryption');
|
|
47
|
+
const ids = encryption.map((r) => r.id);
|
|
48
|
+
// 16 encryption-scanner patterns + 3 credentials + 1 AI (HIPAA-SEC-001)
|
|
49
|
+
expect(encryption.length).toBe(20);
|
|
50
|
+
// The collapsed families must be gone.
|
|
51
|
+
expect(ids).not.toContain('enc-weak');
|
|
52
|
+
expect(ids).not.toContain('enc-missing');
|
|
53
|
+
// Every distinct check is now individually enumerated.
|
|
54
|
+
const expectedEncryptionScannerIds = [
|
|
55
|
+
'enc-md5', 'enc-sha1', 'enc-des', 'enc-rc4', 'enc-deprecated-cipher', 'enc-ecb-mode',
|
|
56
|
+
'enc-http-url', 'enc-ssl-disabled', 'enc-ssl-verify-disabled',
|
|
57
|
+
'enc-tls-cert-validation-disabled', 'enc-backup-encryption-disabled',
|
|
58
|
+
'enc-db-backup-no-ssl', 'enc-backup-file-unencrypted', 'enc-phi-backup-unencrypted',
|
|
59
|
+
'enc-s3-backup-no-sse', 'enc-backup-storage-unencrypted',
|
|
60
|
+
];
|
|
61
|
+
for (const id of expectedEncryptionScannerIds) {
|
|
62
|
+
expect(ids).toContain(id);
|
|
63
|
+
}
|
|
64
|
+
// Severities are preserved from the patterns (not flattened to one value).
|
|
65
|
+
const desRule = encryption.find((r) => r.id === 'enc-des');
|
|
66
|
+
expect(desRule?.severity).toBe('critical');
|
|
67
|
+
const sha1Rule = encryption.find((r) => r.id === 'enc-sha1');
|
|
68
|
+
expect(sha1Rule?.severity).toBe('medium');
|
|
69
|
+
});
|
|
70
|
+
it('normalizes severity to lowercase and marks AI rules as info', () => {
|
|
71
|
+
const severities = new Set(['critical', 'high', 'medium', 'low', 'info']);
|
|
72
|
+
for (const rule of RULE_CATALOG) {
|
|
73
|
+
expect(severities.has(rule.severity)).toBe(true);
|
|
74
|
+
if (rule.source === 'ai') {
|
|
75
|
+
expect(rule.severity).toBe('info');
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=catalog.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.test.js","sourceRoot":"","sources":["../../src/rules/catalog.test.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/schema.d.ts
CHANGED
|
@@ -11,6 +11,19 @@ export declare const CustomRuleFixSchema: z.ZodObject<{
|
|
|
11
11
|
after: z.ZodString;
|
|
12
12
|
}, z.core.$strip>>;
|
|
13
13
|
}, z.core.$strip>;
|
|
14
|
+
/**
|
|
15
|
+
* Canonical HIPAA compliance categories. This is the single source of truth for
|
|
16
|
+
* the five category tokens used throughout vlayer (scanners, custom rules, and
|
|
17
|
+
* the built-in rule catalog). Never add a sixth without updating the scanners.
|
|
18
|
+
*/
|
|
19
|
+
export declare const CategoryEnum: z.ZodEnum<{
|
|
20
|
+
"phi-exposure": "phi-exposure";
|
|
21
|
+
encryption: "encryption";
|
|
22
|
+
"audit-logging": "audit-logging";
|
|
23
|
+
"access-control": "access-control";
|
|
24
|
+
"data-retention": "data-retention";
|
|
25
|
+
}>;
|
|
26
|
+
export type Category = z.infer<typeof CategoryEnum>;
|
|
14
27
|
export declare const CustomRuleSchema: z.ZodObject<{
|
|
15
28
|
id: z.ZodString;
|
|
16
29
|
name: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/rules/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAO9B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkB3B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG1B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/rules/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAO9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;EAMvB,CAAC;AAEH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAEpD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkB3B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG1B,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACpE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
package/dist/rules/schema.js
CHANGED
|
@@ -7,11 +7,23 @@ export const CustomRuleFixSchema = z.object({
|
|
|
7
7
|
after: z.string(),
|
|
8
8
|
}).optional(),
|
|
9
9
|
});
|
|
10
|
+
/**
|
|
11
|
+
* Canonical HIPAA compliance categories. This is the single source of truth for
|
|
12
|
+
* the five category tokens used throughout vlayer (scanners, custom rules, and
|
|
13
|
+
* the built-in rule catalog). Never add a sixth without updating the scanners.
|
|
14
|
+
*/
|
|
15
|
+
export const CategoryEnum = z.enum([
|
|
16
|
+
'phi-exposure',
|
|
17
|
+
'encryption',
|
|
18
|
+
'audit-logging',
|
|
19
|
+
'access-control',
|
|
20
|
+
'data-retention',
|
|
21
|
+
]);
|
|
10
22
|
export const CustomRuleSchema = z.object({
|
|
11
23
|
id: z.string().regex(/^[a-z0-9-]+$/, 'Rule ID must be lowercase alphanumeric with hyphens'),
|
|
12
24
|
name: z.string().min(1, 'Rule name is required'),
|
|
13
25
|
description: z.string().min(1, 'Rule description is required'),
|
|
14
|
-
category:
|
|
26
|
+
category: CategoryEnum,
|
|
15
27
|
severity: z.enum(['critical', 'high', 'medium', 'low', 'info']),
|
|
16
28
|
pattern: z.string().min(1, 'Pattern is required'),
|
|
17
29
|
flags: z.string().optional().default('gi'),
|
package/dist/rules/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/rules/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,qDAAqD,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,8BAA8B,CAAC;IAC9D,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/rules/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CAAC,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;IACjC,cAAc;IACd,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,gBAAgB;CACjB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,qDAAqD,CAAC;IAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;IAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,8BAA8B,CAAC;IAC9D,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IAC/D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IACnC,4BAA4B;IAC5B,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC/E,yBAAyB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAChE,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;CACjC,CAAC,CAAC"}
|
|
@@ -1,3 +1,25 @@
|
|
|
1
1
|
import type { Scanner } from '../../types.js';
|
|
2
|
+
export declare const ACCESS_CONTROL_ISSUES: ({
|
|
3
|
+
regex: RegExp;
|
|
4
|
+
id: string;
|
|
5
|
+
severity: "medium";
|
|
6
|
+
title: string;
|
|
7
|
+
description: string;
|
|
8
|
+
recommendation: string;
|
|
9
|
+
} | {
|
|
10
|
+
regex: RegExp;
|
|
11
|
+
id: string;
|
|
12
|
+
severity: "high";
|
|
13
|
+
title: string;
|
|
14
|
+
description: string;
|
|
15
|
+
recommendation: string;
|
|
16
|
+
} | {
|
|
17
|
+
regex: RegExp;
|
|
18
|
+
id: string;
|
|
19
|
+
severity: "critical";
|
|
20
|
+
title: string;
|
|
21
|
+
description: string;
|
|
22
|
+
recommendation: string;
|
|
23
|
+
})[];
|
|
2
24
|
export declare const accessScanner: Scanner;
|
|
3
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/access/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/access/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;AAIpE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;IAyDjC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OA2C3B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readFile } from 'fs/promises';
|
|
2
2
|
import { DEFAULT_CONFIG } from '../../config.js';
|
|
3
3
|
import { getContextLines } from '../../utils/context.js';
|
|
4
|
-
const ACCESS_CONTROL_ISSUES = [
|
|
4
|
+
export const ACCESS_CONTROL_ISSUES = [
|
|
5
5
|
{
|
|
6
6
|
regex: /\*\s*FROM\s+(patient|user|health|medical)/i,
|
|
7
7
|
id: 'select-star',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/access/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,qBAAqB,GAAG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/access/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
1
|
import type { Scanner } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stable rule families emitted by this scanner for the built-in rule catalog.
|
|
4
|
+
* Findings carry dynamic ids (`audit-no-framework`, `audit-unlogged-<action>-<line>`);
|
|
5
|
+
* these are the FIXED families only — never the per-finding suffix. The ids here
|
|
6
|
+
* match the stable id prefixes emitted in scan() below.
|
|
7
|
+
*/
|
|
8
|
+
export declare const AUDIT_RULES: ({
|
|
9
|
+
id: string;
|
|
10
|
+
severity: "high";
|
|
11
|
+
title: string;
|
|
12
|
+
description: string;
|
|
13
|
+
recommendation: string;
|
|
14
|
+
hipaaReference: string;
|
|
15
|
+
} | {
|
|
16
|
+
id: string;
|
|
17
|
+
severity: "medium";
|
|
18
|
+
title: string;
|
|
19
|
+
description: string;
|
|
20
|
+
recommendation: string;
|
|
21
|
+
hipaaReference: string;
|
|
22
|
+
})[];
|
|
2
23
|
export declare const auditScanner: Scanner;
|
|
3
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/audit/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;AAiBpE,eAAO,MAAM,YAAY,EAAE,OAuF1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/audit/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAwB,MAAM,gBAAgB,CAAC;AAiBpE;;;;;GAKG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;IAiBvB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OAuF1B,CAAC"}
|
|
@@ -12,6 +12,30 @@ const AUDIT_REQUIRED_ACTIONS = [
|
|
|
12
12
|
{ pattern: /\.(read|get|find|fetch|select)\s*\(/i, action: 'read' },
|
|
13
13
|
{ pattern: /\.(login|authenticate|authorize)\s*\(/i, action: 'auth' },
|
|
14
14
|
];
|
|
15
|
+
/**
|
|
16
|
+
* Stable rule families emitted by this scanner for the built-in rule catalog.
|
|
17
|
+
* Findings carry dynamic ids (`audit-no-framework`, `audit-unlogged-<action>-<line>`);
|
|
18
|
+
* these are the FIXED families only — never the per-finding suffix. The ids here
|
|
19
|
+
* match the stable id prefixes emitted in scan() below.
|
|
20
|
+
*/
|
|
21
|
+
export const AUDIT_RULES = [
|
|
22
|
+
{
|
|
23
|
+
id: 'audit-no-framework',
|
|
24
|
+
severity: 'high',
|
|
25
|
+
title: 'No audit logging framework detected',
|
|
26
|
+
description: 'No recognized logging framework found in dependencies.',
|
|
27
|
+
recommendation: 'Implement structured audit logging using winston, pino, or similar.',
|
|
28
|
+
hipaaReference: '§164.312(b)',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: 'audit-unlogged-action',
|
|
32
|
+
severity: 'medium',
|
|
33
|
+
title: 'PHI operation may lack audit logging',
|
|
34
|
+
description: 'A create, update, delete, read, or auth operation on PHI-related data was found without apparent audit logging in the same file.',
|
|
35
|
+
recommendation: 'Log all PHI operations with timestamp, user ID, and action details.',
|
|
36
|
+
hipaaReference: '§164.312(b)',
|
|
37
|
+
},
|
|
38
|
+
];
|
|
15
39
|
export const auditScanner = {
|
|
16
40
|
name: 'Audit Logging Scanner',
|
|
17
41
|
category: 'audit-logging',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/audit/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/audit/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,27 @@
|
|
|
1
|
-
import type { Scanner } from '../../types.js';
|
|
1
|
+
import type { Scanner, FixType } from '../../types.js';
|
|
2
|
+
export declare const WEAK_CRYPTO_PATTERNS: ({
|
|
3
|
+
id: string;
|
|
4
|
+
regex: RegExp;
|
|
5
|
+
issue: string;
|
|
6
|
+
severity: "high";
|
|
7
|
+
} | {
|
|
8
|
+
id: string;
|
|
9
|
+
regex: RegExp;
|
|
10
|
+
issue: string;
|
|
11
|
+
severity: "medium";
|
|
12
|
+
} | {
|
|
13
|
+
id: string;
|
|
14
|
+
regex: RegExp;
|
|
15
|
+
issue: string;
|
|
16
|
+
severity: "critical";
|
|
17
|
+
})[];
|
|
18
|
+
export declare const MISSING_ENCRYPTION_PATTERNS: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
regex: RegExp;
|
|
21
|
+
issue: string;
|
|
22
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
23
|
+
checkSafe?: boolean;
|
|
24
|
+
fixType?: FixType;
|
|
25
|
+
}>;
|
|
2
26
|
export declare const encryptionScanner: Scanner;
|
|
3
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/encryption/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/encryption/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAwB,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI7E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;IAOhC,CAAC;AAEF,eAAO,MAAM,2BAA2B,EAAE,KAAK,CAAC;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAYA,CAAC;AAeF,eAAO,MAAM,iBAAiB,EAAE,OA2E/B,CAAC"}
|