UNPKG

nullvoid

Version:
399 lines 12.5 kB
"use strict"; /** * Configuration Constants for NullVoid * Centralizes all configuration values and magic numbers */ Object.defineProperty(exports, "__esModule", { value: true }); exports.DETECTION_CONFIG = exports.PERFORMANCE_CONFIG = exports.SECURITY_CONFIG = exports.SCAN_CONFIG = exports.POPULAR_FRAMEWORKS = exports.DEPENDENCY_CONFUSION_CONFIG = exports.TEST_PATTERNS_CONFIG = exports.VALIDATION_CONFIG = exports.SECURITY_PATTERNS = exports.ENTROPY_THRESHOLDS = exports.FILE_CONFIG = exports.PARALLEL_CONFIG = exports.NETWORK_CONFIG = exports.CACHE_CONFIG = void 0; exports.updateConfigFromEnv = updateConfigFromEnv; /** * Cache configuration */ exports.CACHE_CONFIG = { TTL: 5 * 60 * 1000, // 5 minutes MAX_SIZE: 1000, // Maximum number of cached items CLEANUP_INTERVAL: 60 * 1000 // 1 minute cleanup interval }; /** * Network configuration */ exports.NETWORK_CONFIG = { TIMEOUT: 5000, // 5 seconds MAX_RETRIES: 3, RETRY_DELAY: 1000, // 1 second RATE_LIMIT: { MAX_REQUESTS: 100, // per minute WINDOW_SIZE: 60 * 1000 // 1 minute window } }; /** * Parallel processing configuration */ exports.PARALLEL_CONFIG = { MAX_WORKERS: 8, CHUNK_SIZE: 10, TIMEOUT: 30000, // 30 seconds RETRY_ATTEMPTS: 2, MIN_CHUNK_SIZE: 5, MAX_CHUNK_SIZE: 20 }; /** * File processing configuration */ exports.FILE_CONFIG = { MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB MAX_FILES_PER_PACKAGE: 1000, SCAN_TIMEOUT: 30000 // 30 seconds per file }; /** * Entropy thresholds for different content types */ exports.ENTROPY_THRESHOLDS = { JAVASCRIPT: 4.5, JSON: 3.0, TEXT: 2.5, BINARY: 6.0, DEFAULT: 4.0 }; /** * Security patterns and configurations */ exports.SECURITY_PATTERNS = { SUSPICIOUS_PATTERNS: [ /eval\s*\(/gi, /Function\s*\(/gi, /setTimeout\s*\(\s*['"`]/gi, /setInterval\s*\(\s*['"`]/gi, /document\.write\s*\(/gi, /innerHTML\s*=/gi, /outerHTML\s*=/gi, /insertAdjacentHTML\s*\(/gi ], DANGEROUS_FUNCTIONS: [ 'eval', 'Function', 'setTimeout', 'setInterval', 'setImmediate', 'process.nextTick', 'require', 'import', 'exec', 'spawn', 'execFile' ], NETWORK_PATTERNS: [ /fetch\s*\(/gi, /XMLHttpRequest/gi, /axios/gi, /request/gi, /http\./gi, /https\./gi, /net\./gi, /tls\./gi ], FILE_SYSTEM_PATTERNS: [ /fs\./gi, /readFile/gi, /writeFile/gi, /unlink/gi, /mkdir/gi, /rmdir/gi, /chmod/gi, /chown/gi ] }; /** * Validation configuration */ exports.VALIDATION_CONFIG = { PACKAGE_NAME_PATTERN: /^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]$/, PACKAGE_NAME_MAX_LENGTH: 214, PACKAGE_NAME_MIN_LENGTH: 1, VALID_FORMATS: ['json', 'table', 'yaml', 'sarif'], SEMVER_PATTERN: /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/, ALLOWED_EXTENSIONS: ['.js', '.mjs', '.ts', '.jsx', '.tsx', '.json'], SUSPICIOUS_PATTERNS: [ /malware/gi, /virus/gi, /trojan/gi, /backdoor/gi, /keylogger/gi, /spyware/gi, /rootkit/gi, /botnet/gi ], VALID_PACKAGE_NAME: /^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]$/, VALID_LOCAL_PATH: /^[a-zA-Z0-9._/-]+$/, TRAVERSAL_PATTERNS: [ /\.\.\//g, /\.\.\\/g, /\.\.%2f/gi, /\.\.%5c/gi, /\.\.%252f/gi, /\.\.%255c/gi ], DANGEROUS_PATTERNS: [ /<script/gi, /javascript:/gi, /vbscript:/gi, /data:text\/html/gi, /onload\s*=/gi, /onerror\s*=/gi, /onclick\s*=/gi ], MALICIOUS_PATTERNS: [ /eval\s*\(/gi, /Function\s*\(/gi, /document\.write/gi, /innerHTML\s*=/gi, /outerHTML\s*=/gi, /insertAdjacentHTML/gi, /setTimeout\s*\(\s*['"`]/gi, /setInterval\s*\(\s*['"`]/gi ], DANGEROUS_FILES: [ 'malware.js', 'virus.js', 'trojan.js', 'backdoor.js', 'keylogger.js', 'spyware.js', 'rootkit.js', 'botnet.js' ], SUSPICIOUS_SCRIPTS: [ 'curl http', 'wget http', 'rm -rf', 'chmod 777', 'chown root', 'sudo', 'su -', 'passwd', 'useradd', 'userdel' ] }; /** * Test patterns configuration */ exports.TEST_PATTERNS_CONFIG = { JEST_OUTPUT_PATTERNS: { PASSED: /✓ (.+)/g, FAILED: /✗ (.+)/g, SKIPPED: /○ (.+)/g, TOTAL: /Tests:\s*(\d+)\s*(?:passed|failed|skipped)/g, SUMMARY: /Test Suites: (.+)\s*Tests: (.+)\s*Snapshots: (.+)\s*Time: (.+)/ }, BADGE_REGEX: /!\[([^\]]*)\]\(([^)]+)\)/g }; /** * Dependency confusion configuration */ exports.DEPENDENCY_CONFUSION_CONFIG = { TIMELINE_THRESHOLDS: { SUSPICIOUS_AGE_DAYS: 7, RAPID_PUBLISHING_HOURS: 24, VERSION_GAP_DAYS: 30 }, SIMILARITY_THRESHOLDS: { HIGH_SIMILARITY: 0.8, MEDIUM_SIMILARITY: 0.6, LOW_SIMILARITY: 0.4 }, SCOPE_PATTERNS: [ /^@[a-z0-9-]+\/[a-z0-9._-]+$/, /^@[a-z0-9-]+$/, /^[a-z0-9._-]+$/ ], SUSPICIOUS_NAME_PATTERNS: [ /^[a-z0-9]{32,}$/, // Random-looking names /malware/i, /virus/i, /trojan/i, /backdoor/i, /keylogger/i, /spyware/i, /rootkit/i, /botnet/i ], REGISTRY_ENDPOINTS: { npm: 'https://registry.npmjs.org', yarn: 'https://registry.yarnpkg.com', github: 'https://npm.pkg.github.com' }, ANALYSIS_SETTINGS: { MAX_GIT_COMMITS: 100, MAX_PACKAGE_VERSIONS: 50, TIMEOUT_MS: 10000, RETRY_ATTEMPTS: 3 } }; /** * Popular frameworks and libraries */ exports.POPULAR_FRAMEWORKS = [ 'react', 'vue', 'angular', 'express', 'koa', 'fastify', 'next', 'nuxt', 'gatsby', 'webpack', 'rollup', 'vite', 'parcel', 'babel', 'typescript', 'eslint', 'prettier', 'jest', 'mocha', 'cypress', 'playwright', 'puppeteer' ]; /** * Main configuration objects */ exports.SCAN_CONFIG = { maxFileSize: exports.FILE_CONFIG.MAX_FILE_SIZE, maxTimeout: exports.FILE_CONFIG.SCAN_TIMEOUT, enableSandbox: true, sandboxTimeout: 100, maxMemory: 128 * 1024 * 1024, // 128MB enableParallel: true, maxWorkers: exports.PARALLEL_CONFIG.MAX_WORKERS }; exports.SECURITY_CONFIG = { allowedExtensions: [...exports.VALIDATION_CONFIG.ALLOWED_EXTENSIONS], blockedPatterns: exports.VALIDATION_CONFIG.SUSPICIOUS_PATTERNS.map(p => p.source), suspiciousPatterns: exports.VALIDATION_CONFIG.SUSPICIOUS_PATTERNS.map(p => p.source), dangerousFunctions: [...exports.SECURITY_PATTERNS.DANGEROUS_FUNCTIONS], networkPatterns: exports.SECURITY_PATTERNS.NETWORK_PATTERNS.map(p => p.source), fileSystemPatterns: exports.SECURITY_PATTERNS.FILE_SYSTEM_PATTERNS.map(p => p.source) }; exports.PERFORMANCE_CONFIG = { cacheTtl: exports.CACHE_CONFIG.TTL, maxCacheSize: exports.CACHE_CONFIG.MAX_SIZE, rateLimit: { requests: exports.NETWORK_CONFIG.RATE_LIMIT.MAX_REQUESTS, window: exports.NETWORK_CONFIG.RATE_LIMIT.WINDOW_SIZE }, timeouts: { network: exports.NETWORK_CONFIG.TIMEOUT, file: exports.FILE_CONFIG.SCAN_TIMEOUT, analysis: exports.FILE_CONFIG.SCAN_TIMEOUT } }; /** * Update configuration from environment variables */ function updateConfigFromEnv() { // Update cache TTL from environment if (process.env['NULLVOID_CACHE_TTL']) { const ttl = parseInt(process.env['NULLVOID_CACHE_TTL'], 10); if (!isNaN(ttl) && ttl > 0) { exports.CACHE_CONFIG.TTL = ttl; } } // Update network timeout from environment if (process.env['NULLVOID_NETWORK_TIMEOUT']) { const timeout = parseInt(process.env['NULLVOID_NETWORK_TIMEOUT'], 10); if (!isNaN(timeout) && timeout > 0) { exports.NETWORK_CONFIG.TIMEOUT = timeout; } } // Update max workers from environment if (process.env['NULLVOID_MAX_WORKERS']) { const workers = parseInt(process.env['NULLVOID_MAX_WORKERS'], 10); if (!isNaN(workers) && workers > 0 && workers <= 32) { exports.PARALLEL_CONFIG.MAX_WORKERS = workers; } } // Update dependency confusion settings if (process.env['NULLVOID_DEP_CONFUSION_ENABLED']) { const enabled = process.env['NULLVOID_DEP_CONFUSION_ENABLED'].toLowerCase() === 'true'; exports.DEPENDENCY_CONFUSION_CONFIG.ENABLED = enabled; } } // Detection configuration exports.DETECTION_CONFIG = { LEGITIMATE_PATTERNS: [ /module\.exports\s*=\s*[^;]+;\s*/, // module.exports = ...; /exports\s*=\s*[^;]+;\s*/, // exports = ...; /return\s+[^;]+;\s*/, // return ...; /const\s+\w+\s*=\s*[^;]+;\s*/, // const ... = ...; /let\s+\w+\s*=\s*[^;]+;\s*/, // let ... = ...; /var\s+\w+\s*=\s*[^;]+;\s*/, // var ... = ...; /module\.exports\s*=\s*\w+;?\s*/, // module.exports = router; (with optional semicolon) /exports\s*=\s*\w+;?\s*/ // exports = router; (with optional semicolon) ], MALWARE_PATTERNS: { // Variable mangling patterns variableMangling: [ /const\s+[a-z]\d+\s*=\s*[A-Z]/, // const b3=I /var\s+[a-z]\d+\s*=\s*[A-Z]/, // var b3=I /let\s+[a-z]\d+\s*=\s*[A-Z]/ // let b3=I ], // Obfuscation patterns obfuscation: [ /\[(0x[0-9a-fA-F]+,\s*){3,}/, // Hex arrays: [0x30,0xd0,0x59 /\[('[A-Za-z0-9+/=]{8,}',\s*){5,}/, // Base64 arrays: ['dXNlcm5hbW' /String\.fromCharCode\s*\(/, // String.fromCharCode obfuscation /atob\s*\(/, // Base64 decoding /btoa\s*\(/ // Base64 encoding ], // Suspicious function patterns suspiciousFunctions: [ /function\s+\w+\s*\(\s*\w+\s*,\s*\w+\s*\)\s*\{\s*const\s+\w+\s*=\s*\w+/, // Suspicious functions /eval\s*\(/, // eval calls /new\s+Function\s*\(/, // Function constructor /setTimeout\s*\(\s*['"`]/, // setTimeout with string /setInterval\s*\(\s*['"`]/ // setInterval with string ], // Dynamic module loading dynamicRequires: [ /require\s*\(\s*['"`][^'"`]*['"`]\s*\)/, // Dynamic requires /import\s*\(\s*['"`][^'"`]*['"`]\s*\)/, // Dynamic imports /__webpack_require__\s*\(/, // Webpack requires /System\.import\s*\(/ // System.import ], // Wallet hijacking patterns walletHijacking: [ /window\.ethereum\s*=\s*new\s+Proxy/, // Ethereum proxy /Object\.defineProperty\s*\(\s*window\s*,\s*['"`]ethereum/, // Ethereum property override /window\.__defineGetter__\s*\(\s*['"`]ethereum/, // Ethereum getter override /eth_sendTransaction.*?params.*?to\s*[:=]/, // Transaction manipulation /eth_requestAccounts.*?params.*?from\s*[:=]/, // Account request manipulation /web3\.eth\.sendTransaction/, // Web3 transaction sending /ethereum\.request.*?method.*?['"`]eth_sendTransaction['"`]/, // Ethereum RPC calls /wallet.*?address.*?replace/, // Address replacement /private.*?key.*?extract/, // Private key extraction /mnemonic.*?phrase.*?steal/, // Mnemonic phrase theft /seed.*?phrase.*?extract/ // Seed phrase extraction ] }, OBFUSCATION_PATTERNS: { VARIABLE_MANGLING: /const\s+[a-z]\d+\s*=\s*[A-Z]/, MASSIVE_BLOB: /.{5000,}/, HEX_ARRAYS: /\[(0x[0-9a-fA-F]+,\s*){3,}/g, MODULE_APPEND: /module\.exports\s*=\s*[^;]+;\s*[^;]{1000,}/ }, IOC_PATTERNS: { URLS: /https?:\/\/[^\s'"]+/g, IPS: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/g, DOMAINS: /\b[a-zA-Z0-9-]+\.[a-zA-Z]{2,}\b/g }, DYNAMIC_REQUIRE_PATTERNS: { REQUIRE: /require\s*\(\s*['"`][^'"`]*['"`]\s*\)/g, IMPORT: /import\s*\(\s*['"`][^'"`]*['"`]\s*\)/g } }; // Initialize configuration from environment updateConfigFromEnv(); //# sourceMappingURL=config.js.map