@oculum/scanner 1.0.2 → 1.0.3

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 (45) hide show
  1. package/dist/index.d.ts +4 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +60 -5
  4. package/dist/index.js.map +1 -1
  5. package/dist/layer1/entropy.d.ts.map +1 -1
  6. package/dist/layer1/entropy.js +6 -4
  7. package/dist/layer1/entropy.js.map +1 -1
  8. package/dist/layer1/index.d.ts +2 -2
  9. package/dist/layer1/index.d.ts.map +1 -1
  10. package/dist/layer1/index.js +14 -5
  11. package/dist/layer1/index.js.map +1 -1
  12. package/dist/layer2/dangerous-functions.d.ts.map +1 -1
  13. package/dist/layer2/dangerous-functions.js +319 -11
  14. package/dist/layer2/dangerous-functions.js.map +1 -1
  15. package/dist/layer2/index.d.ts +2 -2
  16. package/dist/layer2/index.d.ts.map +1 -1
  17. package/dist/layer2/index.js +14 -5
  18. package/dist/layer2/index.js.map +1 -1
  19. package/dist/layer3/anthropic.d.ts +5 -1
  20. package/dist/layer3/anthropic.d.ts.map +1 -1
  21. package/dist/layer3/anthropic.js +50 -1
  22. package/dist/layer3/anthropic.js.map +1 -1
  23. package/dist/layer3/index.d.ts +3 -1
  24. package/dist/layer3/index.d.ts.map +1 -1
  25. package/dist/layer3/index.js +21 -0
  26. package/dist/layer3/index.js.map +1 -1
  27. package/dist/types.d.ts +25 -0
  28. package/dist/types.d.ts.map +1 -1
  29. package/dist/types.js +40 -0
  30. package/dist/types.js.map +1 -1
  31. package/dist/utils/context-helpers.d.ts +12 -0
  32. package/dist/utils/context-helpers.d.ts.map +1 -1
  33. package/dist/utils/context-helpers.js +40 -0
  34. package/dist/utils/context-helpers.js.map +1 -1
  35. package/package.json +4 -2
  36. package/src/index.ts +75 -5
  37. package/src/layer1/entropy.ts +6 -4
  38. package/src/layer1/index.ts +23 -8
  39. package/src/layer2/__tests__/math-random-enhanced.test.ts +405 -0
  40. package/src/layer2/dangerous-functions.ts +368 -11
  41. package/src/layer2/index.ts +20 -8
  42. package/src/layer3/anthropic.ts +55 -1
  43. package/src/layer3/index.ts +27 -2
  44. package/src/types.ts +59 -0
  45. package/src/utils/context-helpers.ts +40 -0
@@ -14,6 +14,8 @@ exports.isFixtureFile = isFixtureFile;
14
14
  exports.isDocumentationFile = isDocumentationFile;
15
15
  exports.isScannerOrFixtureFile = isScannerOrFixtureFile;
16
16
  exports.isClientBundledFile = isClientBundledFile;
17
+ exports.isSeedOrDataGenFile = isSeedOrDataGenFile;
18
+ exports.isEducationalVulnerabilityFile = isEducationalVulnerabilityFile;
17
19
  exports.isEnvVarReference = isEnvVarReference;
18
20
  exports.isNextPublicEnvVar = isNextPublicEnvVar;
19
21
  exports.isComment = isComment;
@@ -204,6 +206,44 @@ function isClientBundledFile(filePath) {
204
206
  }
205
207
  return clientPatterns.some(pattern => pattern.test(filePath));
206
208
  }
209
+ /**
210
+ * Check if file is a seed or data generation file
211
+ * These files generate test/demo data and Math.random() usage is acceptable
212
+ * Used to reduce false positives for Math.random() detection
213
+ */
214
+ function isSeedOrDataGenFile(filePath) {
215
+ const patterns = [
216
+ /\/seed\//i,
217
+ /\/seeds\//i,
218
+ /seed-database\.(ts|js)$/i,
219
+ /\/seeder\./i,
220
+ /datacreator\.(ts|js)$/i,
221
+ /\/data\/.*creator/i,
222
+ /\/fixtures\//i,
223
+ /\.fixture\./i,
224
+ /\/generators?\//i,
225
+ /\/factories\//i,
226
+ /factory\.(ts|js)$/i,
227
+ ];
228
+ return patterns.some(p => p.test(filePath));
229
+ }
230
+ /**
231
+ * Check if file is educational/intentional vulnerability code
232
+ * These files (e.g., OWASP Juice Shop) contain intentional vulnerabilities for training
233
+ * Should be skipped entirely to avoid false positives
234
+ */
235
+ function isEducationalVulnerabilityFile(filePath) {
236
+ const patterns = [
237
+ /\/insecurity\.(ts|js)$/i,
238
+ /\/vulnerable\.(ts|js)$/i,
239
+ /\/intentionally-vulnerable/i,
240
+ /\/security-examples?\//i,
241
+ /\/vuln-examples?\//i,
242
+ /\/challenge-\d+/i, // OWASP Juice Shop challenges
243
+ /\/exploit-examples?\//i,
244
+ ];
245
+ return patterns.some(p => p.test(filePath));
246
+ }
207
247
  // ============================================================================
208
248
  // Code Line Context Detection
209
249
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"context-helpers.js","sourceRoot":"","sources":["../../src/utils/context-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-helpers.js","sourceRoot":"","sources":["../../src/utils/context-helpers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oculum/scanner",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "AI-native security scanner for detecting vulnerabilities in LLM-generated code",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,7 +24,9 @@
24
24
  "scripts": {
25
25
  "build": "tsc",
26
26
  "dev": "tsc --watch",
27
- "test": "echo \"No tests configured yet\"",
27
+ "test": "jest",
28
+ "test:watch": "jest --watch",
29
+ "test:coverage": "jest --coverage",
28
30
  "lint": "eslint src/"
29
31
  },
30
32
  "dependencies": {
package/src/index.ts CHANGED
@@ -13,6 +13,7 @@ import type {
13
13
  ScanMode,
14
14
  ScanModeConfig,
15
15
  ScanDepth,
16
+ CancellationToken,
16
17
  } from './types'
17
18
  import { SCANNABLE_EXTENSIONS, SPECIAL_FILES, MAX_FILE_SIZE, SCAN_MODE_DEFAULTS } from './types'
18
19
  import { runLayer1Scan } from './layer1'
@@ -140,6 +141,8 @@ export interface ScanOptions {
140
141
  scanDepth?: ScanDepth
141
142
  /** Suppress console.log output (for interactive CLI mode) */
142
143
  quiet?: boolean
144
+ /** Cancellation token for aborting scans gracefully */
145
+ cancellationToken?: CancellationToken
143
146
  }
144
147
 
145
148
  export interface ScanProgress {
@@ -211,12 +214,13 @@ export async function runScan(
211
214
  ): Promise<ScanResult> {
212
215
  const startTime = Date.now()
213
216
  const allVulnerabilities: Vulnerability[] = []
214
-
217
+
215
218
  // Resolve scan mode configuration
216
219
  const scanModeConfig = resolveScanModeConfig(options)
217
220
  const isIncremental = scanModeConfig.mode === 'incremental'
218
221
  const depth = scanModeConfig.scanDepth || 'cheap'
219
222
  const quiet = options.quiet ?? false
223
+ const cancellationToken = options.cancellationToken
220
224
 
221
225
  // Conditional logging helper - suppresses output in quiet mode (interactive CLI)
222
226
  const log = (message: string) => {
@@ -225,6 +229,13 @@ export async function runScan(
225
229
  }
226
230
  }
227
231
 
232
+ // Helper to check cancellation and throw if cancelled
233
+ const checkCancelled = () => {
234
+ if (cancellationToken?.cancelled) {
235
+ throw new Error(`Scan cancelled: ${cancellationToken.reason || 'user requested'}`)
236
+ }
237
+ }
238
+
228
239
  log(`[Scanner] repo=${repoInfo.name} mode=${scanModeConfig.mode} depth=${depth} files=${files.length}`)
229
240
  if (isIncremental && scanModeConfig.changedFiles) {
230
241
  log(`[Scanner] repo=${repoInfo.name} incremental_files=${scanModeConfig.changedFiles.length}`)
@@ -253,9 +264,15 @@ export async function runScan(
253
264
  ? files.filter(f => scanModeConfig.changedFiles!.some(cf => f.path.endsWith(cf) || f.path.includes(cf)))
254
265
  : files
255
266
 
267
+ // Declare variables that need to be accessible in catch block
268
+ let middlewareConfig: MiddlewareAuthConfig | undefined
269
+ let capturedValidationStats: ValidationStats | undefined
270
+
256
271
  try {
272
+ checkCancelled()
273
+
257
274
  // Detect global auth middleware before scanning (always on all files for context)
258
- const middlewareConfig = detectGlobalAuthMiddleware(files)
275
+ middlewareConfig = detectGlobalAuthMiddleware(files)
259
276
  if (middlewareConfig.hasAuthMiddleware) {
260
277
  log(`[Scanner] repo=${repoInfo.name} auth_middleware=${middlewareConfig.authType || 'unknown'} file=${middlewareConfig.middlewareFile}`)
261
278
  }
@@ -267,9 +284,11 @@ export async function runScan(
267
284
  log(`[Scanner] repo=${repoInfo.name} files_with_imported_auth=${filesWithImportedAuth}`)
268
285
  }
269
286
 
287
+ checkCancelled()
288
+
270
289
  // Layer 1: Surface Scan
271
290
  reportProgress('layer1', 'Running surface scan (patterns, entropy, config)...')
272
- let layer1Result = await runLayer1Scan(files, onProgress)
291
+ let layer1Result = await runLayer1Scan(files, onProgress, cancellationToken)
273
292
 
274
293
  // Aggregate repeated localhost findings
275
294
  const layer1RawCount = layer1Result.vulnerabilities.length
@@ -279,9 +298,11 @@ export async function runScan(
279
298
  }
280
299
  log(`[Layer1] repo=${repoInfo.name} findings_raw=${layer1RawCount} findings_deduped=${layer1Result.vulnerabilities.length}`)
281
300
 
301
+ checkCancelled()
302
+
282
303
  // Layer 2: Structural Scan
283
304
  reportProgress('layer2', 'Running structural scan (variables, logic gates)...', layer1Result.vulnerabilities.length)
284
- const layer2Result = await runLayer2Scan(files, { middlewareConfig, fileAuthImports }, onProgress)
305
+ const layer2Result = await runLayer2Scan(files, { middlewareConfig, fileAuthImports }, onProgress, cancellationToken)
285
306
 
286
307
  // Format heuristic breakdown for logging
287
308
  const heuristicBreakdown = Object.entries(layer2Result.stats.raw)
@@ -340,12 +361,15 @@ export async function runScan(
340
361
  const maxValidationFiles = scanModeConfig.maxAIValidationFiles || MAX_VALIDATION_CANDIDATES_PER_FILE
341
362
  const cappedValidation = capValidationCandidatesPerFile(afterAutoDismiss, maxValidationFiles)
342
363
 
364
+ checkCancelled()
365
+
343
366
  // AI Validation of selected findings (if AI is enabled and not skipped by scan mode)
344
367
  let validatedFindings = cappedValidation
345
368
  let capturedValidationStats: ValidationStats | undefined = undefined
346
369
  const shouldValidate = options.enableAI !== false && !scanModeConfig.skipAIValidation && cappedValidation.length > 0
347
370
 
348
371
  if (shouldValidate) {
372
+ checkCancelled()
349
373
  reportProgress('validating', 'AI validating findings (entropy, secrets, AI patterns)...', cappedValidation.length)
350
374
 
351
375
  // For incremental scans, only validate findings in changed files
@@ -354,7 +378,21 @@ export async function runScan(
354
378
  : cappedValidation
355
379
 
356
380
  if (findingsToValidate.length > 0) {
357
- const validationResult = await validateFindingsWithAI(findingsToValidate, filesForAI)
381
+ const validationResult = await validateFindingsWithAI(
382
+ findingsToValidate,
383
+ filesForAI,
384
+ undefined, // projectContext (uses default)
385
+ onProgress ? (progress) => {
386
+ // Convert AI validation progress to ScanProgress format
387
+ onProgress({
388
+ status: 'validating',
389
+ message: progress.status,
390
+ filesProcessed: progress.filesProcessed,
391
+ totalFiles: progress.totalFiles,
392
+ vulnerabilitiesFound: allVulnerabilities.length,
393
+ })
394
+ } : undefined
395
+ )
358
396
  validatedFindings = validationResult.vulnerabilities
359
397
  const { stats: validationStats } = validationResult
360
398
  capturedValidationStats = validationStats // Capture for return
@@ -378,6 +416,7 @@ export async function runScan(
378
416
  const shouldRunLayer3 = options.enableAI !== false && !scanModeConfig.skipLayer3
379
417
 
380
418
  if (shouldRunLayer3) {
419
+ checkCancelled()
381
420
  reportProgress('layer3', 'Running AI semantic analysis...', allVulnerabilities.length)
382
421
 
383
422
  // For incremental scans, only analyze changed files
@@ -401,6 +440,7 @@ export async function runScan(
401
440
  summary: authHelperContext.summary,
402
441
  } : undefined,
403
442
  },
443
+ cancellationToken,
404
444
  })
405
445
  allVulnerabilities.push(...layer3Result.vulnerabilities)
406
446
  log(`[Layer3] repo=${repoInfo.name} depth=${depth} files_analyzed=${layer3Result.aiAnalyzed} findings=${layer3Result.vulnerabilities.length}`)
@@ -439,6 +479,35 @@ export async function runScan(
439
479
  validationStats: capturedValidationStats,
440
480
  }
441
481
  } catch (error) {
482
+ if (cancellationToken?.cancelled) {
483
+ // Return partial results on cancellation
484
+ reportProgress('failed', 'Scan cancelled')
485
+
486
+ // Compute partial results
487
+ const uniqueVulnerabilities = deduplicateVulnerabilities(allVulnerabilities)
488
+ const resolvedVulnerabilities = resolveContradictions(uniqueVulnerabilities, middlewareConfig)
489
+ const sortedVulnerabilities = sortBySeverity(resolvedVulnerabilities)
490
+ const severityCounts = computeSeverityCounts(sortedVulnerabilities)
491
+ const categoryCounts = computeCategoryCounts(sortedVulnerabilities)
492
+
493
+ return {
494
+ repoName: repoInfo.name,
495
+ repoUrl: repoInfo.url,
496
+ branch: repoInfo.branch,
497
+ filesScanned: files.length,
498
+ filesSkipped: 0,
499
+ vulnerabilities: sortedVulnerabilities,
500
+ severityCounts,
501
+ categoryCounts,
502
+ hasBlockingIssues: false, // Don't block on partial results
503
+ scanDuration: Date.now() - startTime,
504
+ timestamp: new Date().toISOString(),
505
+ validationStats: capturedValidationStats,
506
+ cancelled: true,
507
+ cancelReason: cancellationToken.reason,
508
+ }
509
+ }
510
+
442
511
  reportProgress('failed', `Scan failed: ${error}`)
443
512
  throw error
444
513
  }
@@ -829,3 +898,4 @@ export { runLayer2Scan } from './layer2'
829
898
  export { runLayer3Scan } from './layer3'
830
899
  export { buildProjectContext, type ProjectContext } from './utils/project-context-builder'
831
900
  export { validateFindingsWithAI, type ValidationStats, type AIValidationResult } from './layer3/anthropic'
901
+ export { createCancellationToken } from './types'
@@ -37,11 +37,13 @@ function extractStringLiterals(content: string): Array<{ value: string; line: nu
37
37
  const strings: Array<{ value: string; line: number; lineContent: string }> = []
38
38
  const lines = content.split('\n')
39
39
 
40
- // Patterns for string literals
40
+ // Patterns for string literals using unrolled loop pattern to prevent catastrophic backtracking
41
+ // Pattern explanation: "start [non-special-chars]* (escape-sequence [non-special-chars]*)* end"
42
+ // This avoids nested quantifiers that cause exponential backtracking
41
43
  const patterns = [
42
- /"([^"\\]|\\.){20,}"/g, // Double-quoted strings 20+ chars
43
- /'([^'\\]|\\.){20,}'/g, // Single-quoted strings 20+ chars
44
- /`([^`\\]|\\.){20,}`/g, // Template literals 20+ chars
44
+ /"[^"\\]{20,}(?:\\.[^"\\]*)*"/g, // Double-quoted strings 20+ chars (unrolled loop)
45
+ /'[^'\\]{20,}(?:\\.[^'\\]*)*'/g, // Single-quoted strings 20+ chars (unrolled loop)
46
+ /`[^`\\]{20,}(?:\\.[^`\\]*)*`/g, // Template literals 20+ chars (unrolled loop)
45
47
  ]
46
48
 
47
49
  lines.forEach((line, index) => {
@@ -4,7 +4,7 @@
4
4
  * file flags, comment analysis, URL detection, and weak crypto detection
5
5
  */
6
6
 
7
- import type { Vulnerability, ScanFile } from '../types'
7
+ import type { Vulnerability, ScanFile, CancellationToken } from '../types'
8
8
  import type { ProgressCallback } from '../index'
9
9
  import { detectHighEntropyStrings } from './entropy'
10
10
  import { detectKnownPatterns } from './patterns'
@@ -92,10 +92,16 @@ function processFileLayer1(file: ScanFile): {
92
92
  }
93
93
  }
94
94
 
95
- // Parallel batch size for Layer 1 processing
95
+ // Parallel batch size for Layer 1 processing (larger batches for performance)
96
96
  const LAYER1_PARALLEL_BATCH_SIZE = 50
97
-
98
- export async function runLayer1Scan(files: ScanFile[], onProgress?: ProgressCallback): Promise<Layer1Result> {
97
+ // Progress update interval (report every N files for better UX)
98
+ const PROGRESS_UPDATE_INTERVAL = 10
99
+
100
+ export async function runLayer1Scan(
101
+ files: ScanFile[],
102
+ onProgress?: ProgressCallback,
103
+ cancellationToken?: CancellationToken
104
+ ): Promise<Layer1Result> {
99
105
  const startTime = Date.now()
100
106
  const vulnerabilities: Vulnerability[] = []
101
107
 
@@ -110,11 +116,18 @@ export async function runLayer1Scan(files: ScanFile[], onProgress?: ProgressCall
110
116
  ai_comments: 0,
111
117
  }
112
118
 
119
+ // Track progress for frequent updates
120
+ let filesProcessed = 0
121
+ let lastProgressUpdate = 0
122
+
113
123
  // Process files in parallel batches for better performance on large codebases
114
124
  for (let i = 0; i < files.length; i += LAYER1_PARALLEL_BATCH_SIZE) {
125
+ // Check for cancellation before processing batch
126
+ if (cancellationToken?.cancelled) break
127
+
115
128
  const batch = files.slice(i, i + LAYER1_PARALLEL_BATCH_SIZE)
116
129
  const results = await Promise.all(batch.map(file => Promise.resolve(processFileLayer1(file))))
117
-
130
+
118
131
  for (const result of results) {
119
132
  vulnerabilities.push(...result.findings)
120
133
  // Accumulate stats
@@ -123,9 +136,10 @@ export async function runLayer1Scan(files: ScanFile[], onProgress?: ProgressCall
123
136
  }
124
137
  }
125
138
 
126
- // Report progress after each batch
127
- if (onProgress) {
128
- const filesProcessed = Math.min(i + LAYER1_PARALLEL_BATCH_SIZE, files.length)
139
+ filesProcessed = Math.min(i + LAYER1_PARALLEL_BATCH_SIZE, files.length)
140
+
141
+ // Report progress every PROGRESS_UPDATE_INTERVAL files for better UX
142
+ if (onProgress && (filesProcessed - lastProgressUpdate >= PROGRESS_UPDATE_INTERVAL || filesProcessed === files.length)) {
129
143
  onProgress({
130
144
  status: 'layer1',
131
145
  message: 'Running surface scan (patterns, entropy, config)...',
@@ -133,6 +147,7 @@ export async function runLayer1Scan(files: ScanFile[], onProgress?: ProgressCall
133
147
  totalFiles: files.length,
134
148
  vulnerabilitiesFound: vulnerabilities.length,
135
149
  })
150
+ lastProgressUpdate = filesProcessed
136
151
  }
137
152
  }
138
153