codeslick-cli 1.4.0 → 1.4.2
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/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 +40 -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/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 +2 -32
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -1
- 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-analyzer.d.ts +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/terraform-analyzer.js +28 -0
- package/dist/src/lib/analyzers/terraform-analyzer.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 +27 -8
- 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 +24 -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 +1 -1
- package/src/commands/scan.ts +7 -3
- package/src/reporters/cli-reporter.ts +174 -48
- package/src/scanner/local-scanner.ts +54 -10
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -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
|