codeslick-cli 1.3.0 → 1.4.1
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/README.md +50 -11
- package/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
- package/dist/packages/cli/src/commands/scan.js +7 -3
- package/dist/packages/cli/src/commands/scan.js.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts +11 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.js +150 -45
- package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -1
- package/dist/packages/cli/src/scanner/local-scanner.d.ts +2 -2
- package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -1
- package/dist/packages/cli/src/scanner/local-scanner.js +49 -9
- package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -1
- package/dist/src/lib/analyzers/go-analyzer.d.ts +12 -0
- package/dist/src/lib/analyzers/go-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/go-analyzer.js +113 -0
- package/dist/src/lib/analyzers/go-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/iac/pii-detector.d.ts +27 -0
- package/dist/src/lib/analyzers/iac/pii-detector.d.ts.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-detector.js +199 -0
- package/dist/src/lib/analyzers/iac/pii-detector.js.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.d.ts +43 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.js +228 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/java-analyzer.js +51 -0
- package/dist/src/lib/analyzers/java-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +8 -4
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +109 -13
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +7 -8
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.js +16 -12
- package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts +33 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.js +184 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts +60 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js +418 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts +44 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js +275 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts +32 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js +176 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts +38 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js +266 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts +26 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.js +120 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/parser.d.ts +74 -0
- package/dist/src/lib/analyzers/kubernetes/parser.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/parser.js +233 -0
- package/dist/src/lib/analyzers/kubernetes/parser.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts +34 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.js +182 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/types.d.ts +266 -0
- package/dist/src/lib/analyzers/kubernetes/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/types.js +77 -0
- package/dist/src/lib/analyzers/kubernetes/types.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts +93 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.js +215 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/python-analyzer.js +32 -48
- package/dist/src/lib/analyzers/python-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +6 -32
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +48 -4
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/types.d.ts +40 -0
- package/dist/src/lib/analyzers/secrets/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/types.js +10 -0
- package/dist/src/lib/analyzers/secrets/types.js.map +1 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.d.ts +71 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.js +538 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.js.map +1 -0
- package/dist/src/lib/analyzers/terraform/parser.d.ts +14 -0
- package/dist/src/lib/analyzers/terraform/parser.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/parser.js +237 -0
- package/dist/src/lib/analyzers/terraform/parser.js.map +1 -0
- package/dist/src/lib/analyzers/terraform/types.d.ts +70 -0
- package/dist/src/lib/analyzers/terraform/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/types.js +9 -0
- package/dist/src/lib/analyzers/terraform/types.js.map +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts +50 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.js +168 -0
- package/dist/src/lib/analyzers/terraform-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +23 -8
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.js +76 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts +27 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts.map +1 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.js +176 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.js.map +1 -0
- package/dist/src/lib/security/epss-service.d.ts.map +1 -1
- package/dist/src/lib/security/epss-service.js +83 -50
- package/dist/src/lib/security/epss-service.js.map +1 -1
- package/dist/src/lib/security/severity-scoring.d.ts.map +1 -1
- package/dist/src/lib/security/severity-scoring.js +140 -0
- package/dist/src/lib/security/severity-scoring.js.map +1 -1
- package/dist/src/lib/types/index.d.ts +3 -3
- package/dist/src/lib/types/index.d.ts.map +1 -1
- package/dist/src/lib/utils/ignore-patterns.d.ts +60 -0
- package/dist/src/lib/utils/ignore-patterns.d.ts.map +1 -0
- package/dist/src/lib/utils/ignore-patterns.js +212 -0
- package/dist/src/lib/utils/ignore-patterns.js.map +1 -0
- package/package.json +10 -7
- package/src/commands/scan.ts +7 -3
- package/src/reporters/cli-reporter.ts +174 -48
- package/src/scanner/local-scanner.ts +65 -10
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PII Detection for Infrastructure as Code (IaC)
|
|
4
|
+
*
|
|
5
|
+
* Scans Terraform (and future Kubernetes/CloudFormation) files for hardcoded
|
|
6
|
+
* Personally Identifiable Information (PII) that violates GDPR/HIPAA compliance.
|
|
7
|
+
*
|
|
8
|
+
* Strategic Value: Closes competitive gap with Precogs.ai, applies to all IaC languages.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.checkResourcePII = checkResourcePII;
|
|
12
|
+
exports.checkVariablePII = checkVariablePII;
|
|
13
|
+
exports.checkLocalsPII = checkLocalsPII;
|
|
14
|
+
exports.checkOutputPII = checkOutputPII;
|
|
15
|
+
const pii_patterns_1 = require("./pii-patterns");
|
|
16
|
+
/**
|
|
17
|
+
* Scan text content for PII patterns
|
|
18
|
+
* @param text - Text to scan (attribute value, tag, variable default, etc.)
|
|
19
|
+
* @param context - Context info (resource name, attribute path, line number)
|
|
20
|
+
* @returns Array of vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
function scanTextForPII(text, context) {
|
|
23
|
+
const vulnerabilities = [];
|
|
24
|
+
// Check each PII pattern
|
|
25
|
+
for (const [type, pattern] of Object.entries(pii_patterns_1.PII_PATTERNS)) {
|
|
26
|
+
const matches = text.matchAll(pattern.regex);
|
|
27
|
+
for (const match of matches) {
|
|
28
|
+
const matchedText = match[0];
|
|
29
|
+
// Check if match should be excluded
|
|
30
|
+
if ((0, pii_patterns_1.shouldExcludeMatch)(matchedText, pattern)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Validate if pattern has custom validation function
|
|
34
|
+
if (pattern.validate && !pattern.validate(matchedText)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
vulnerabilities.push((0, pii_patterns_1.createPIIVulnerability)(type, pattern, matchedText, context));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return vulnerabilities;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recursively scan nested objects for PII
|
|
44
|
+
*/
|
|
45
|
+
function scanNestedObject(obj, context) {
|
|
46
|
+
const vulnerabilities = [];
|
|
47
|
+
if (typeof obj === 'string') {
|
|
48
|
+
vulnerabilities.push(...scanTextForPII(obj, context));
|
|
49
|
+
}
|
|
50
|
+
else if (Array.isArray(obj)) {
|
|
51
|
+
obj.forEach((item, index) => {
|
|
52
|
+
vulnerabilities.push(...scanNestedObject(item, {
|
|
53
|
+
...context,
|
|
54
|
+
attributePath: `${context.attributePath}[${index}]`,
|
|
55
|
+
}));
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else if (obj && typeof obj === 'object') {
|
|
59
|
+
Object.entries(obj).forEach(([key, value]) => {
|
|
60
|
+
vulnerabilities.push(...scanNestedObject(value, {
|
|
61
|
+
...context,
|
|
62
|
+
attributePath: `${context.attributePath}.${key}`,
|
|
63
|
+
}));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return vulnerabilities;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check Terraform resources for PII in attributes
|
|
70
|
+
*/
|
|
71
|
+
function checkResourcePII(resource) {
|
|
72
|
+
const vulnerabilities = [];
|
|
73
|
+
// Scan ALL attributes recursively (not just predefined list)
|
|
74
|
+
// This catches PII in any attribute location
|
|
75
|
+
for (const [key, value] of Object.entries(resource.attributes)) {
|
|
76
|
+
if (typeof value === 'string') {
|
|
77
|
+
const found = scanTextForPII(value, {
|
|
78
|
+
resourceName: resource.resourceName,
|
|
79
|
+
attributePath: key,
|
|
80
|
+
line: resource.startLine,
|
|
81
|
+
});
|
|
82
|
+
vulnerabilities.push(...found);
|
|
83
|
+
}
|
|
84
|
+
else if (value && typeof value === 'object') {
|
|
85
|
+
// Scan nested objects (tags, environment vars, metadata)
|
|
86
|
+
const found = scanNestedObject(value, {
|
|
87
|
+
resourceName: resource.resourceName,
|
|
88
|
+
attributePath: key,
|
|
89
|
+
line: resource.startLine,
|
|
90
|
+
});
|
|
91
|
+
vulnerabilities.push(...found);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Also scan nested blocks
|
|
95
|
+
if (resource.blocks) {
|
|
96
|
+
for (const block of resource.blocks) {
|
|
97
|
+
for (const [key, value] of Object.entries(block.attributes)) {
|
|
98
|
+
if (typeof value === 'string') {
|
|
99
|
+
const found = scanTextForPII(value, {
|
|
100
|
+
resourceName: resource.resourceName,
|
|
101
|
+
attributePath: `${block.type}.${key}`,
|
|
102
|
+
line: block.startLine,
|
|
103
|
+
});
|
|
104
|
+
vulnerabilities.push(...found);
|
|
105
|
+
}
|
|
106
|
+
else if (value && typeof value === 'object') {
|
|
107
|
+
const found = scanNestedObject(value, {
|
|
108
|
+
resourceName: resource.resourceName,
|
|
109
|
+
attributePath: `${block.type}.${key}`,
|
|
110
|
+
line: block.startLine,
|
|
111
|
+
});
|
|
112
|
+
vulnerabilities.push(...found);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return vulnerabilities;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check Terraform variables for PII in default values
|
|
121
|
+
*/
|
|
122
|
+
function checkVariablePII(variable) {
|
|
123
|
+
if (variable.type !== 'variable')
|
|
124
|
+
return [];
|
|
125
|
+
const defaultValue = variable.attributes.default;
|
|
126
|
+
if (!defaultValue)
|
|
127
|
+
return [];
|
|
128
|
+
const variableName = variable.labels[0] || 'unknown';
|
|
129
|
+
if (typeof defaultValue === 'string') {
|
|
130
|
+
return scanTextForPII(defaultValue, {
|
|
131
|
+
resourceName: 'variable',
|
|
132
|
+
attributePath: `${variableName}.default`,
|
|
133
|
+
line: variable.startLine,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else if (typeof defaultValue === 'object') {
|
|
137
|
+
return scanNestedObject(defaultValue, {
|
|
138
|
+
resourceName: 'variable',
|
|
139
|
+
attributePath: `${variableName}.default`,
|
|
140
|
+
line: variable.startLine,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check Terraform locals for PII in values
|
|
147
|
+
*/
|
|
148
|
+
function checkLocalsPII(locals) {
|
|
149
|
+
if (locals.type !== 'locals')
|
|
150
|
+
return [];
|
|
151
|
+
const vulnerabilities = [];
|
|
152
|
+
// Scan all local variable definitions
|
|
153
|
+
for (const [key, value] of Object.entries(locals.attributes)) {
|
|
154
|
+
if (typeof value === 'string') {
|
|
155
|
+
const found = scanTextForPII(value, {
|
|
156
|
+
resourceName: 'locals',
|
|
157
|
+
attributePath: key,
|
|
158
|
+
line: locals.startLine,
|
|
159
|
+
});
|
|
160
|
+
vulnerabilities.push(...found);
|
|
161
|
+
}
|
|
162
|
+
else if (typeof value === 'object') {
|
|
163
|
+
const found = scanNestedObject(value, {
|
|
164
|
+
resourceName: 'locals',
|
|
165
|
+
attributePath: key,
|
|
166
|
+
line: locals.startLine,
|
|
167
|
+
});
|
|
168
|
+
vulnerabilities.push(...found);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return vulnerabilities;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check Terraform outputs for PII exposure
|
|
175
|
+
*/
|
|
176
|
+
function checkOutputPII(output) {
|
|
177
|
+
if (output.type !== 'output')
|
|
178
|
+
return [];
|
|
179
|
+
const value = output.attributes.value;
|
|
180
|
+
if (!value)
|
|
181
|
+
return [];
|
|
182
|
+
const outputName = output.labels[0] || 'unknown';
|
|
183
|
+
if (typeof value === 'string') {
|
|
184
|
+
return scanTextForPII(value, {
|
|
185
|
+
resourceName: 'output',
|
|
186
|
+
attributePath: `${outputName}.value`,
|
|
187
|
+
line: output.startLine,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
else if (typeof value === 'object') {
|
|
191
|
+
return scanNestedObject(value, {
|
|
192
|
+
resourceName: 'output',
|
|
193
|
+
attributePath: `${outputName}.value`,
|
|
194
|
+
line: output.startLine,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
return [];
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=pii-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-detector.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/iac/pii-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII Detection Patterns for IaC Security Analysis
|
|
3
|
+
*
|
|
4
|
+
* Defines 12 PII pattern detectors for GDPR/HIPAA compliance:
|
|
5
|
+
* - 4 Critical: SSN, Credit Cards, Medical Records, Bank Accounts
|
|
6
|
+
* - 5 High: Emails, Passports, Driver's License, Tax IDs, IP Addresses
|
|
7
|
+
* - 3 Medium: Phone Numbers, Birth Dates, Full Names
|
|
8
|
+
*/
|
|
9
|
+
import { SecurityVulnerability } from '../types';
|
|
10
|
+
export interface PIIPattern {
|
|
11
|
+
regex: RegExp;
|
|
12
|
+
severity: 'critical' | 'high' | 'medium';
|
|
13
|
+
owasp: string;
|
|
14
|
+
cwe: string;
|
|
15
|
+
cvssScore: number;
|
|
16
|
+
description: string;
|
|
17
|
+
validate?: (match: string) => boolean;
|
|
18
|
+
excludePatterns?: RegExp[];
|
|
19
|
+
}
|
|
20
|
+
export declare const PII_PATTERNS: Record<string, PIIPattern>;
|
|
21
|
+
/**
|
|
22
|
+
* Validate credit card number using Luhn algorithm
|
|
23
|
+
* https://en.wikipedia.org/wiki/Luhn_algorithm
|
|
24
|
+
*/
|
|
25
|
+
export declare function validateCreditCard(cardNumber: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Validate IBAN bank account number
|
|
28
|
+
* https://en.wikipedia.org/wiki/International_Bank_Account_Number
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateIBAN(iban: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Check if a match should be excluded based on pattern exclusions
|
|
33
|
+
*/
|
|
34
|
+
export declare function shouldExcludeMatch(match: string, pattern: PIIPattern): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Create a SecurityVulnerability object for detected PII
|
|
37
|
+
*/
|
|
38
|
+
export declare function createPIIVulnerability(type: string, pattern: PIIPattern, match: string, context: {
|
|
39
|
+
resourceName: string;
|
|
40
|
+
attributePath: string;
|
|
41
|
+
line?: number;
|
|
42
|
+
}): SecurityVulnerability;
|
|
43
|
+
//# sourceMappingURL=pii-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-patterns.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/iac/pii-patterns.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAiHnD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA4B9D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA+BlD;AAeD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAM9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GACA,qBAAqB,CA4BvB"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PII Detection Patterns for IaC Security Analysis
|
|
4
|
+
*
|
|
5
|
+
* Defines 12 PII pattern detectors for GDPR/HIPAA compliance:
|
|
6
|
+
* - 4 Critical: SSN, Credit Cards, Medical Records, Bank Accounts
|
|
7
|
+
* - 5 High: Emails, Passports, Driver's License, Tax IDs, IP Addresses
|
|
8
|
+
* - 3 Medium: Phone Numbers, Birth Dates, Full Names
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.PII_PATTERNS = void 0;
|
|
12
|
+
exports.validateCreditCard = validateCreditCard;
|
|
13
|
+
exports.validateIBAN = validateIBAN;
|
|
14
|
+
exports.shouldExcludeMatch = shouldExcludeMatch;
|
|
15
|
+
exports.createPIIVulnerability = createPIIVulnerability;
|
|
16
|
+
exports.PII_PATTERNS = {
|
|
17
|
+
ssn: {
|
|
18
|
+
regex: /\b\d{3}-\d{2}-\d{4}\b/g,
|
|
19
|
+
severity: 'critical',
|
|
20
|
+
owasp: 'A02:2021',
|
|
21
|
+
cwe: 'CWE-359',
|
|
22
|
+
cvssScore: 9.0,
|
|
23
|
+
description: 'Social Security Number detected',
|
|
24
|
+
},
|
|
25
|
+
creditCard: {
|
|
26
|
+
regex: /\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b/g,
|
|
27
|
+
severity: 'critical',
|
|
28
|
+
owasp: 'A02:2021',
|
|
29
|
+
cwe: 'CWE-359',
|
|
30
|
+
cvssScore: 9.8,
|
|
31
|
+
description: 'Credit card number detected',
|
|
32
|
+
validate: validateCreditCard,
|
|
33
|
+
},
|
|
34
|
+
medicalRecord: {
|
|
35
|
+
regex: /\b(?:MRN|Medical Record|Patient ID)[\s:]+(\d{8,12})\b/gi,
|
|
36
|
+
severity: 'critical',
|
|
37
|
+
owasp: 'A02:2021',
|
|
38
|
+
cwe: 'CWE-359',
|
|
39
|
+
cvssScore: 9.5,
|
|
40
|
+
description: 'Medical record number detected',
|
|
41
|
+
},
|
|
42
|
+
bankAccount: {
|
|
43
|
+
regex: /\b[A-Z]{2}\d{2}[A-Z0-9]{10,30}\b/g,
|
|
44
|
+
severity: 'critical',
|
|
45
|
+
owasp: 'A02:2021',
|
|
46
|
+
cwe: 'CWE-359',
|
|
47
|
+
cvssScore: 9.3,
|
|
48
|
+
description: 'Bank account number (IBAN) detected',
|
|
49
|
+
validate: validateIBAN,
|
|
50
|
+
},
|
|
51
|
+
email: {
|
|
52
|
+
regex: /\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b/g,
|
|
53
|
+
severity: 'high',
|
|
54
|
+
owasp: 'A02:2021',
|
|
55
|
+
cwe: 'CWE-359',
|
|
56
|
+
cvssScore: 7.5,
|
|
57
|
+
description: 'Email address detected (GDPR personal data)',
|
|
58
|
+
excludePatterns: [
|
|
59
|
+
/\b(team|support|info|contact|admin|devops|noreply|no-reply|help|security)@/i,
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
passport: {
|
|
63
|
+
regex: /\b(?:PASSPORT|PP)[\s:]+([A-Z0-9]{6,9})\b/gi,
|
|
64
|
+
severity: 'high',
|
|
65
|
+
owasp: 'A02:2021',
|
|
66
|
+
cwe: 'CWE-359',
|
|
67
|
+
cvssScore: 8.0,
|
|
68
|
+
description: 'Passport number detected',
|
|
69
|
+
},
|
|
70
|
+
driversLicense: {
|
|
71
|
+
regex: /\b(?:DL|Driver(?:'s)?\s+License)[\s:]+([A-Z0-9]{8,20})\b/gi,
|
|
72
|
+
severity: 'high',
|
|
73
|
+
owasp: 'A02:2021',
|
|
74
|
+
cwe: 'CWE-359',
|
|
75
|
+
cvssScore: 7.8,
|
|
76
|
+
description: 'Driver\'s license number detected',
|
|
77
|
+
},
|
|
78
|
+
taxId: {
|
|
79
|
+
regex: /\b(?:EIN|Tax\s+ID|VAT)[\s:]+(\d{2}-\d{7}|\d{9})\b/gi,
|
|
80
|
+
severity: 'high',
|
|
81
|
+
owasp: 'A02:2021',
|
|
82
|
+
cwe: 'CWE-359',
|
|
83
|
+
cvssScore: 7.5,
|
|
84
|
+
description: 'Tax ID/EIN number detected',
|
|
85
|
+
},
|
|
86
|
+
ipAddress: {
|
|
87
|
+
regex: /\b(?:\d{1,3}\.){3}\d{1,3}\b|(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b/g,
|
|
88
|
+
severity: 'high',
|
|
89
|
+
owasp: 'A02:2021',
|
|
90
|
+
cwe: 'CWE-359',
|
|
91
|
+
cvssScore: 6.5,
|
|
92
|
+
description: 'IP address detected (GDPR identifiable under certain contexts)',
|
|
93
|
+
},
|
|
94
|
+
phoneNumber: {
|
|
95
|
+
regex: /\b\+?1?[-.\s]?\(?[2-9]\d{2}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g,
|
|
96
|
+
severity: 'medium',
|
|
97
|
+
owasp: 'A02:2021',
|
|
98
|
+
cwe: 'CWE-359',
|
|
99
|
+
cvssScore: 5.5,
|
|
100
|
+
description: 'Phone number detected',
|
|
101
|
+
},
|
|
102
|
+
birthDate: {
|
|
103
|
+
regex: /\b(?:DOB|Birth\s*Date|Date\s*of\s*Birth)[\s:]+(\d{1,2}[-/]\d{1,2}[-/]\d{2,4})\b/gi,
|
|
104
|
+
severity: 'medium',
|
|
105
|
+
owasp: 'A02:2021',
|
|
106
|
+
cwe: 'CWE-359',
|
|
107
|
+
cvssScore: 5.0,
|
|
108
|
+
description: 'Birth date detected',
|
|
109
|
+
},
|
|
110
|
+
fullName: {
|
|
111
|
+
regex: /\b(?:Name|Full\s*Name)[\s:]+([A-Z][a-z]+\s+(?:[A-Z][a-z]+\.?\s+)?[A-Z][a-z]+)\b/g,
|
|
112
|
+
severity: 'medium',
|
|
113
|
+
owasp: 'A02:2021',
|
|
114
|
+
cwe: 'CWE-359',
|
|
115
|
+
cvssScore: 4.5,
|
|
116
|
+
description: 'Full name detected',
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Validate credit card number using Luhn algorithm
|
|
121
|
+
* https://en.wikipedia.org/wiki/Luhn_algorithm
|
|
122
|
+
*/
|
|
123
|
+
function validateCreditCard(cardNumber) {
|
|
124
|
+
// Remove spaces and dashes
|
|
125
|
+
const digits = cardNumber.replace(/[\s-]/g, '');
|
|
126
|
+
// Must be 13-19 digits
|
|
127
|
+
if (!/^\d{13,19}$/.test(digits)) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
// Luhn algorithm
|
|
131
|
+
let sum = 0;
|
|
132
|
+
let isEven = false;
|
|
133
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
134
|
+
let digit = parseInt(digits[i], 10);
|
|
135
|
+
if (isEven) {
|
|
136
|
+
digit *= 2;
|
|
137
|
+
if (digit > 9) {
|
|
138
|
+
digit -= 9;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
sum += digit;
|
|
142
|
+
isEven = !isEven;
|
|
143
|
+
}
|
|
144
|
+
return sum % 10 === 0;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validate IBAN bank account number
|
|
148
|
+
* https://en.wikipedia.org/wiki/International_Bank_Account_Number
|
|
149
|
+
*/
|
|
150
|
+
function validateIBAN(iban) {
|
|
151
|
+
// Remove spaces
|
|
152
|
+
const normalized = iban.replace(/\s/g, '').toUpperCase();
|
|
153
|
+
// Must start with 2 letters (country code) followed by 2 digits (check digits)
|
|
154
|
+
if (!/^[A-Z]{2}\d{2}[A-Z0-9]+$/.test(normalized)) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
// Length check (IBAN is 15-34 characters)
|
|
158
|
+
if (normalized.length < 15 || normalized.length > 34) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
// Move first 4 characters to end
|
|
162
|
+
const rearranged = normalized.slice(4) + normalized.slice(0, 4);
|
|
163
|
+
// Convert letters to numbers (A=10, B=11, ..., Z=35)
|
|
164
|
+
const numericString = rearranged
|
|
165
|
+
.split('')
|
|
166
|
+
.map(char => {
|
|
167
|
+
const code = char.charCodeAt(0);
|
|
168
|
+
if (code >= 65 && code <= 90) {
|
|
169
|
+
return (code - 55).toString();
|
|
170
|
+
}
|
|
171
|
+
return char;
|
|
172
|
+
})
|
|
173
|
+
.join('');
|
|
174
|
+
// Mod 97 check
|
|
175
|
+
return mod97(numericString) === 1;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Calculate mod 97 for large numbers (used in IBAN validation)
|
|
179
|
+
*/
|
|
180
|
+
function mod97(numericString) {
|
|
181
|
+
let remainder = 0;
|
|
182
|
+
for (let i = 0; i < numericString.length; i++) {
|
|
183
|
+
remainder = (remainder * 10 + parseInt(numericString[i], 10)) % 97;
|
|
184
|
+
}
|
|
185
|
+
return remainder;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if a match should be excluded based on pattern exclusions
|
|
189
|
+
*/
|
|
190
|
+
function shouldExcludeMatch(match, pattern) {
|
|
191
|
+
if (!pattern.excludePatterns) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
return pattern.excludePatterns.some(excludePattern => excludePattern.test(match));
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create a SecurityVulnerability object for detected PII
|
|
198
|
+
*/
|
|
199
|
+
function createPIIVulnerability(type, pattern, match, context) {
|
|
200
|
+
return {
|
|
201
|
+
severity: pattern.severity,
|
|
202
|
+
message: `${pattern.description} in ${context.resourceName}.${context.attributePath}`,
|
|
203
|
+
line: context.line,
|
|
204
|
+
suggestion: 'Remove hardcoded PII. Use secrets manager or environment variables instead.',
|
|
205
|
+
category: 'PII Exposure',
|
|
206
|
+
cvssScore: pattern.cvssScore,
|
|
207
|
+
exploitLikelihood: 'high',
|
|
208
|
+
impact: 'data-breach',
|
|
209
|
+
owasp: pattern.owasp,
|
|
210
|
+
cwe: pattern.cwe,
|
|
211
|
+
pciDss: '3.2',
|
|
212
|
+
attackVector: {
|
|
213
|
+
description: `Hardcoded ${type} in IaC exposes sensitive data in version control`,
|
|
214
|
+
exploitExample: `git log reveals ${type} in commit history`,
|
|
215
|
+
realWorldImpact: [
|
|
216
|
+
'GDPR/HIPAA compliance violations',
|
|
217
|
+
'Data breach via repository access',
|
|
218
|
+
'PII exposure in CI/CD logs',
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
remediation: {
|
|
222
|
+
before: `${context.attributePath} = "${match}"`,
|
|
223
|
+
after: `${context.attributePath} = var.${type}_from_secrets`,
|
|
224
|
+
explanation: 'Store PII in secrets manager and reference via variables',
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=pii-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-patterns.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/iac/pii-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -205,6 +205,11 @@ export declare class JavaAnalyzer implements ICodeAnalyzer {
|
|
|
205
205
|
*/
|
|
206
206
|
private deduplicateVulnerabilities;
|
|
207
207
|
private calculateMetrics;
|
|
208
|
+
/**
|
|
209
|
+
* Detect AI Hallucinations - Common method name errors from AI code generators
|
|
210
|
+
* February 6, 2026 - Individual line detection for Monaco editor highlighting
|
|
211
|
+
*/
|
|
212
|
+
private detectAIHallucinations;
|
|
208
213
|
/**
|
|
209
214
|
* Detect if code is likely production code based on file path
|
|
210
215
|
* Feature 1 Phase 1: Environment context for smart triage
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"java-analyzer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/java-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAkD,MAAM,SAAS,CAAC;AACvH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"java-analyzer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/java-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAkD,MAAM,SAAS,CAAC;AACvH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAwB7C,qBAAa,YAAa,YAAW,aAAa;IAChD,SAAgB,QAAQ,EAAE,iBAAiB,CAAU;IAE/C,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IAmDtD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBpD,eAAe;;;;;IAQf,OAAO,CAAC,aAAa;IA2FrB;;;;;;;OAOG;IACH,OAAO,CAAC,2BAA2B;IAiFnC;;;;;;OAMG;IACH,OAAO,CAAC,sBAAsB;IA4D9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAyC9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6D/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA+D/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0D/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAqDzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAoCjC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4D/B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgD/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAkClC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkC3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoC5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA8B5B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAqD/B;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB;IAuEhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAwChC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqD1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoDxB;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IA0E/B;;;;OAIG;IACH,OAAO,CAAC,gCAAgC;IAsCxC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwD9B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA+DpC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAyErC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAoClC,OAAO,CAAC,cAAc;IAyDtB,OAAO,CAAC,kBAAkB;IAqC1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,eAAe;IAwCvB;;;;;;;;;;;;OAYG;IACH;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IA8ClC,OAAO,CAAC,gBAAgB;IA6BxB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAoD9B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CA+BhC"}
|
|
@@ -51,6 +51,7 @@ const logging_failures_1 = require("./java/security-checks/logging-failures");
|
|
|
51
51
|
const secrets_analyzer_1 = require("./secrets/secrets-analyzer");
|
|
52
52
|
const ai_generated_code_1 = require("./java/security-checks/ai-generated-code");
|
|
53
53
|
const triage_service_1 = require("../security/triage-service");
|
|
54
|
+
const ignore_patterns_1 = require("../utils/ignore-patterns");
|
|
54
55
|
class JavaAnalyzer {
|
|
55
56
|
constructor() {
|
|
56
57
|
this.language = 'java';
|
|
@@ -72,6 +73,8 @@ class JavaAnalyzer {
|
|
|
72
73
|
// AI-Generated Code Detection (Phase 1.5, Week 5-7)
|
|
73
74
|
const lines = input.code.split('\n');
|
|
74
75
|
result.security.vulnerabilities.push(...(0, ai_generated_code_1.checkAIGeneratedCode)(lines, input.filename));
|
|
76
|
+
// Filter suppressed vulnerabilities (inline comments: // codeslick-ignore-next-line)
|
|
77
|
+
result.security.vulnerabilities = (0, ignore_patterns_1.filterSuppressedVulnerabilities)(input.code, result.security.vulnerabilities);
|
|
75
78
|
// Feature 1 Phase 1: Smart Triage with EPSS scoring
|
|
76
79
|
// Enhance vulnerabilities with priority scores and exploit predictions
|
|
77
80
|
try {
|
|
@@ -188,6 +191,7 @@ class JavaAnalyzer {
|
|
|
188
191
|
this.detectExceptionHandling(code, lineErrors);
|
|
189
192
|
this.detectDuplicateVariables(code, lineErrors);
|
|
190
193
|
this.detectMethodNamingIssues(code, lineErrors);
|
|
194
|
+
this.detectAIHallucinations(code, lineErrors); // Feb 6, 2026: Individual line detection
|
|
191
195
|
this.detectMagicNumbers(code, lineErrors);
|
|
192
196
|
this.detectGodClasses(code, lineErrors);
|
|
193
197
|
this.detectTooManyParameters(code, lineErrors);
|
|
@@ -1733,6 +1737,53 @@ class JavaAnalyzer {
|
|
|
1733
1737
|
result.metrics.complexity = complexity;
|
|
1734
1738
|
result.metrics.maintainability = Math.max(0, 100 - complexity * 3);
|
|
1735
1739
|
}
|
|
1740
|
+
/**
|
|
1741
|
+
* Detect AI Hallucinations - Common method name errors from AI code generators
|
|
1742
|
+
* February 6, 2026 - Individual line detection for Monaco editor highlighting
|
|
1743
|
+
*/
|
|
1744
|
+
detectAIHallucinations(code, lineErrors) {
|
|
1745
|
+
const lines = code.split('\n');
|
|
1746
|
+
// Java AI hallucination patterns (22 patterns)
|
|
1747
|
+
const hallucinationMap = new Map([
|
|
1748
|
+
// Python-style methods in Java
|
|
1749
|
+
['append', { description: 'Lists use .add(), not .append() (Python method). Note: StringBuilder uses .append()', correct: '.add() for List' }],
|
|
1750
|
+
['len', { description: 'Use .length() for arrays, .size() for Collections (not Python .len())', correct: '.length() or .size()' }],
|
|
1751
|
+
['strip', { description: 'Use .trim() to remove whitespace (Python method)', correct: '.trim()' }],
|
|
1752
|
+
// JavaScript-style methods
|
|
1753
|
+
['push', { description: 'Collections use .add(), not .push() (JavaScript method)', correct: '.add()' }],
|
|
1754
|
+
// Rust/Python influence (snake_case)
|
|
1755
|
+
['to_string', { description: 'Java uses camelCase: .toString() not snake_case', correct: '.toString()' }],
|
|
1756
|
+
['is_empty', { description: 'Java uses camelCase: .isEmpty() not snake_case', correct: '.isEmpty()' }],
|
|
1757
|
+
// Non-existent methods
|
|
1758
|
+
['trim_', { description: 'Non-existent method. Use .trim() with no underscore', correct: '.trim()' }],
|
|
1759
|
+
['substring_of', { description: 'Non-existent method. Use .contains()', correct: '.contains()' }],
|
|
1760
|
+
['split_by', { description: 'Non-existent method. Use .split()', correct: '.split()' }],
|
|
1761
|
+
['contains_key', { description: 'Maps use .containsKey() with camelCase', correct: '.containsKey()' }],
|
|
1762
|
+
['get_or_default', { description: 'Use .getOrDefault() with camelCase', correct: '.getOrDefault()' }],
|
|
1763
|
+
['find_first', { description: 'Streams use .findFirst() with camelCase', correct: '.findFirst()' }],
|
|
1764
|
+
]);
|
|
1765
|
+
lines.forEach((line, index) => {
|
|
1766
|
+
const lineNumber = index + 1;
|
|
1767
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('/*'))
|
|
1768
|
+
return;
|
|
1769
|
+
// Remove comments to prevent false positives
|
|
1770
|
+
const lineWithoutComments = line.replace(/\/\/.*$/, '').replace(/\/\*.*?\*\//g, '');
|
|
1771
|
+
// Detect method hallucinations: .method(
|
|
1772
|
+
const methodMatches = lineWithoutComments.matchAll(/\.(\w+)\s*\(/g);
|
|
1773
|
+
for (const match of methodMatches) {
|
|
1774
|
+
const method = match[1];
|
|
1775
|
+
const details = hallucinationMap.get(method);
|
|
1776
|
+
if (details) {
|
|
1777
|
+
lineErrors.push({
|
|
1778
|
+
line: lineNumber,
|
|
1779
|
+
error: `NoSuchMethodError: ${details.description}`,
|
|
1780
|
+
suggestion: `Use ${details.correct}`,
|
|
1781
|
+
severity: 'error'
|
|
1782
|
+
});
|
|
1783
|
+
}
|
|
1784
|
+
}
|
|
1785
|
+
});
|
|
1786
|
+
}
|
|
1736
1787
|
/**
|
|
1737
1788
|
* Detect if code is likely production code based on file path
|
|
1738
1789
|
* Feature 1 Phase 1: Environment context for smart triage
|