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.
Files changed (138) hide show
  1. package/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
  2. package/dist/packages/cli/src/commands/scan.js +7 -3
  3. package/dist/packages/cli/src/commands/scan.js.map +1 -1
  4. package/dist/packages/cli/src/reporters/cli-reporter.d.ts +11 -0
  5. package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -1
  6. package/dist/packages/cli/src/reporters/cli-reporter.js +150 -45
  7. package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -1
  8. package/dist/packages/cli/src/scanner/local-scanner.d.ts +2 -2
  9. package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -1
  10. package/dist/packages/cli/src/scanner/local-scanner.js +40 -9
  11. package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -1
  12. package/dist/src/lib/analyzers/go-analyzer.d.ts +12 -0
  13. package/dist/src/lib/analyzers/go-analyzer.d.ts.map +1 -1
  14. package/dist/src/lib/analyzers/go-analyzer.js +113 -0
  15. package/dist/src/lib/analyzers/go-analyzer.js.map +1 -1
  16. package/dist/src/lib/analyzers/iac/pii-detector.d.ts +27 -0
  17. package/dist/src/lib/analyzers/iac/pii-detector.d.ts.map +1 -0
  18. package/dist/src/lib/analyzers/iac/pii-detector.js +199 -0
  19. package/dist/src/lib/analyzers/iac/pii-detector.js.map +1 -0
  20. package/dist/src/lib/analyzers/iac/pii-patterns.d.ts +43 -0
  21. package/dist/src/lib/analyzers/iac/pii-patterns.d.ts.map +1 -0
  22. package/dist/src/lib/analyzers/iac/pii-patterns.js +228 -0
  23. package/dist/src/lib/analyzers/iac/pii-patterns.js.map +1 -0
  24. package/dist/src/lib/analyzers/java-analyzer.d.ts +5 -0
  25. package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -1
  26. package/dist/src/lib/analyzers/java-analyzer.js +51 -0
  27. package/dist/src/lib/analyzers/java-analyzer.js.map +1 -1
  28. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +8 -4
  29. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -1
  30. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +109 -13
  31. package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -1
  32. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -1
  33. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +7 -8
  34. package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -1
  35. package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -1
  36. package/dist/src/lib/analyzers/javascript-analyzer.js +16 -12
  37. package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -1
  38. package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts +33 -0
  39. package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts.map +1 -0
  40. package/dist/src/lib/analyzers/kubernetes/checks/network-security.js +184 -0
  41. package/dist/src/lib/analyzers/kubernetes/checks/network-security.js.map +1 -0
  42. package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts +60 -0
  43. package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts.map +1 -0
  44. package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js +418 -0
  45. package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js.map +1 -0
  46. package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts +44 -0
  47. package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts.map +1 -0
  48. package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js +275 -0
  49. package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js.map +1 -0
  50. package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts +32 -0
  51. package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts.map +1 -0
  52. package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js +176 -0
  53. package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js.map +1 -0
  54. package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts +38 -0
  55. package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts.map +1 -0
  56. package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js +266 -0
  57. package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js.map +1 -0
  58. package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts +26 -0
  59. package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts.map +1 -0
  60. package/dist/src/lib/analyzers/kubernetes/checks/service-security.js +120 -0
  61. package/dist/src/lib/analyzers/kubernetes/checks/service-security.js.map +1 -0
  62. package/dist/src/lib/analyzers/kubernetes/parser.d.ts +74 -0
  63. package/dist/src/lib/analyzers/kubernetes/parser.d.ts.map +1 -0
  64. package/dist/src/lib/analyzers/kubernetes/parser.js +233 -0
  65. package/dist/src/lib/analyzers/kubernetes/parser.js.map +1 -0
  66. package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts +34 -0
  67. package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts.map +1 -0
  68. package/dist/src/lib/analyzers/kubernetes/pii-detector.js +182 -0
  69. package/dist/src/lib/analyzers/kubernetes/pii-detector.js.map +1 -0
  70. package/dist/src/lib/analyzers/kubernetes/types.d.ts +266 -0
  71. package/dist/src/lib/analyzers/kubernetes/types.d.ts.map +1 -0
  72. package/dist/src/lib/analyzers/kubernetes/types.js +77 -0
  73. package/dist/src/lib/analyzers/kubernetes/types.js.map +1 -0
  74. package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts +93 -0
  75. package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts.map +1 -0
  76. package/dist/src/lib/analyzers/kubernetes-analyzer.js +215 -0
  77. package/dist/src/lib/analyzers/kubernetes-analyzer.js.map +1 -0
  78. package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -1
  79. package/dist/src/lib/analyzers/python-analyzer.js +32 -48
  80. package/dist/src/lib/analyzers/python-analyzer.js.map +1 -1
  81. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +1 -1
  82. package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -1
  83. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +1 -1
  84. package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -1
  85. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +1 -1
  86. package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -1
  87. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +1 -1
  88. package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -1
  89. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +1 -1
  90. package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -1
  91. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +1 -1
  92. package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -1
  93. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +1 -1
  94. package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -1
  95. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +1 -1
  96. package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -1
  97. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +1 -1
  98. package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -1
  99. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +1 -1
  100. package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -1
  101. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +1 -1
  102. package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -1
  103. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +2 -32
  104. package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -1
  105. package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -1
  106. package/dist/src/lib/analyzers/secrets/types.d.ts +40 -0
  107. package/dist/src/lib/analyzers/secrets/types.d.ts.map +1 -0
  108. package/dist/src/lib/analyzers/secrets/types.js +10 -0
  109. package/dist/src/lib/analyzers/secrets/types.js.map +1 -0
  110. package/dist/src/lib/analyzers/terraform-analyzer.d.ts +1 -0
  111. package/dist/src/lib/analyzers/terraform-analyzer.d.ts.map +1 -1
  112. package/dist/src/lib/analyzers/terraform-analyzer.js +28 -0
  113. package/dist/src/lib/analyzers/terraform-analyzer.js.map +1 -1
  114. package/dist/src/lib/analyzers/typescript-analyzer.d.ts +5 -0
  115. package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -1
  116. package/dist/src/lib/analyzers/typescript-analyzer.js +76 -0
  117. package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -1
  118. package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts +27 -0
  119. package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts.map +1 -0
  120. package/dist/src/lib/analyzers/utils/false-positive-filter.js +176 -0
  121. package/dist/src/lib/analyzers/utils/false-positive-filter.js.map +1 -0
  122. package/dist/src/lib/security/epss-service.d.ts.map +1 -1
  123. package/dist/src/lib/security/epss-service.js +27 -8
  124. package/dist/src/lib/security/epss-service.js.map +1 -1
  125. package/dist/src/lib/security/severity-scoring.d.ts.map +1 -1
  126. package/dist/src/lib/security/severity-scoring.js +24 -0
  127. package/dist/src/lib/security/severity-scoring.js.map +1 -1
  128. package/dist/src/lib/types/index.d.ts +3 -3
  129. package/dist/src/lib/types/index.d.ts.map +1 -1
  130. package/dist/src/lib/utils/ignore-patterns.d.ts +60 -0
  131. package/dist/src/lib/utils/ignore-patterns.d.ts.map +1 -0
  132. package/dist/src/lib/utils/ignore-patterns.js +212 -0
  133. package/dist/src/lib/utils/ignore-patterns.js.map +1 -0
  134. package/package.json +1 -1
  135. package/src/commands/scan.ts +7 -3
  136. package/src/reporters/cli-reporter.ts +174 -48
  137. package/src/scanner/local-scanner.ts +54 -10
  138. 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;AAuB7C,qBAAa,YAAa,YAAW,aAAa;IAChD,SAAgB,QAAQ,EAAE,iBAAiB,CAAU;IAE/C,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA6CtD,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBpD,eAAe;;;;;IAQf,OAAO,CAAC,aAAa;IA0FrB;;;;;;;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,uBAAuB;CA+BhC"}
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