secure-scan 1.2.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/README.md +564 -0
- package/dist/ai/aiAnalyzer.d.ts +99 -0
- package/dist/ai/aiAnalyzer.d.ts.map +1 -0
- package/dist/ai/aiAnalyzer.js +669 -0
- package/dist/ai/aiAnalyzer.js.map +1 -0
- package/dist/ai/index.d.ts +5 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +21 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/analyzers/base/baseAnalyzer.d.ts +44 -0
- package/dist/analyzers/base/baseAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/base/baseAnalyzer.js +53 -0
- package/dist/analyzers/base/baseAnalyzer.js.map +1 -0
- package/dist/analyzers/base/index.d.ts +5 -0
- package/dist/analyzers/base/index.d.ts.map +1 -0
- package/dist/analyzers/base/index.js +21 -0
- package/dist/analyzers/base/index.js.map +1 -0
- package/dist/analyzers/c-cpp/cppAnalyzer.d.ts +60 -0
- package/dist/analyzers/c-cpp/cppAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/c-cpp/cppAnalyzer.js +218 -0
- package/dist/analyzers/c-cpp/cppAnalyzer.js.map +1 -0
- package/dist/analyzers/c-cpp/index.d.ts +5 -0
- package/dist/analyzers/c-cpp/index.d.ts.map +1 -0
- package/dist/analyzers/c-cpp/index.js +21 -0
- package/dist/analyzers/c-cpp/index.js.map +1 -0
- package/dist/analyzers/core/engine/index.d.ts +5 -0
- package/dist/analyzers/core/engine/index.d.ts.map +1 -0
- package/dist/analyzers/core/engine/index.js +21 -0
- package/dist/analyzers/core/engine/index.js.map +1 -0
- package/dist/analyzers/core/engine/ruleEngine.d.ts +46 -0
- package/dist/analyzers/core/engine/ruleEngine.d.ts.map +1 -0
- package/dist/analyzers/core/engine/ruleEngine.js +173 -0
- package/dist/analyzers/core/engine/ruleEngine.js.map +1 -0
- package/dist/analyzers/core/index.d.ts +8 -0
- package/dist/analyzers/core/index.d.ts.map +1 -0
- package/dist/analyzers/core/index.js +24 -0
- package/dist/analyzers/core/index.js.map +1 -0
- package/dist/analyzers/core/scanner/fileScanner.d.ts +31 -0
- package/dist/analyzers/core/scanner/fileScanner.d.ts.map +1 -0
- package/dist/analyzers/core/scanner/fileScanner.js +199 -0
- package/dist/analyzers/core/scanner/fileScanner.js.map +1 -0
- package/dist/analyzers/core/scanner/index.d.ts +5 -0
- package/dist/analyzers/core/scanner/index.d.ts.map +1 -0
- package/dist/analyzers/core/scanner/index.js +21 -0
- package/dist/analyzers/core/scanner/index.js.map +1 -0
- package/dist/analyzers/core/scoring/index.d.ts +5 -0
- package/dist/analyzers/core/scoring/index.d.ts.map +1 -0
- package/dist/analyzers/core/scoring/index.js +21 -0
- package/dist/analyzers/core/scoring/index.js.map +1 -0
- package/dist/analyzers/core/scoring/riskScoring.d.ts +49 -0
- package/dist/analyzers/core/scoring/riskScoring.d.ts.map +1 -0
- package/dist/analyzers/core/scoring/riskScoring.js +180 -0
- package/dist/analyzers/core/scoring/riskScoring.js.map +1 -0
- package/dist/analyzers/core/securityScanner.d.ts +47 -0
- package/dist/analyzers/core/securityScanner.d.ts.map +1 -0
- package/dist/analyzers/core/securityScanner.js +298 -0
- package/dist/analyzers/core/securityScanner.js.map +1 -0
- package/dist/analyzers/csharp/csharpAnalyzer.d.ts +64 -0
- package/dist/analyzers/csharp/csharpAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/csharp/csharpAnalyzer.js +232 -0
- package/dist/analyzers/csharp/csharpAnalyzer.js.map +1 -0
- package/dist/analyzers/csharp/index.d.ts +5 -0
- package/dist/analyzers/csharp/index.d.ts.map +1 -0
- package/dist/analyzers/csharp/index.js +21 -0
- package/dist/analyzers/csharp/index.js.map +1 -0
- package/dist/analyzers/iac/iacAnalyzer.d.ts +36 -0
- package/dist/analyzers/iac/iacAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/iac/iacAnalyzer.js +182 -0
- package/dist/analyzers/iac/iacAnalyzer.js.map +1 -0
- package/dist/analyzers/iac/index.d.ts +5 -0
- package/dist/analyzers/iac/index.d.ts.map +1 -0
- package/dist/analyzers/iac/index.js +21 -0
- package/dist/analyzers/iac/index.js.map +1 -0
- package/dist/analyzers/index.d.ts +30 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +80 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/java/index.d.ts +5 -0
- package/dist/analyzers/java/index.d.ts.map +1 -0
- package/dist/analyzers/java/index.js +21 -0
- package/dist/analyzers/java/index.js.map +1 -0
- package/dist/analyzers/java/javaAnalyzer.d.ts +64 -0
- package/dist/analyzers/java/javaAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/java/javaAnalyzer.js +224 -0
- package/dist/analyzers/java/javaAnalyzer.js.map +1 -0
- package/dist/analyzers/javascript/astUtils.d.ts +170 -0
- package/dist/analyzers/javascript/astUtils.d.ts.map +1 -0
- package/dist/analyzers/javascript/astUtils.js +700 -0
- package/dist/analyzers/javascript/astUtils.js.map +1 -0
- package/dist/analyzers/javascript/index.d.ts +18 -0
- package/dist/analyzers/javascript/index.d.ts.map +1 -0
- package/dist/analyzers/javascript/index.js +50 -0
- package/dist/analyzers/javascript/index.js.map +1 -0
- package/dist/analyzers/javascript/javascriptAnalyzer.d.ts +111 -0
- package/dist/analyzers/javascript/javascriptAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/javascript/javascriptAnalyzer.js +860 -0
- package/dist/analyzers/javascript/javascriptAnalyzer.js.map +1 -0
- package/dist/analyzers/javascript/malwareDetector.d.ts +102 -0
- package/dist/analyzers/javascript/malwareDetector.d.ts.map +1 -0
- package/dist/analyzers/javascript/malwareDetector.js +616 -0
- package/dist/analyzers/javascript/malwareDetector.js.map +1 -0
- package/dist/analyzers/javascript/packageJsonAnalyzer.d.ts +87 -0
- package/dist/analyzers/javascript/packageJsonAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/javascript/packageJsonAnalyzer.js +553 -0
- package/dist/analyzers/javascript/packageJsonAnalyzer.js.map +1 -0
- package/dist/analyzers/javascript/taintAnalyzer.d.ts +120 -0
- package/dist/analyzers/javascript/taintAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/javascript/taintAnalyzer.js +526 -0
- package/dist/analyzers/javascript/taintAnalyzer.js.map +1 -0
- package/dist/analyzers/php/index.d.ts +5 -0
- package/dist/analyzers/php/index.d.ts.map +1 -0
- package/dist/analyzers/php/index.js +21 -0
- package/dist/analyzers/php/index.js.map +1 -0
- package/dist/analyzers/php/phpAnalyzer.d.ts +56 -0
- package/dist/analyzers/php/phpAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/php/phpAnalyzer.js +202 -0
- package/dist/analyzers/php/phpAnalyzer.js.map +1 -0
- package/dist/analyzers/python/index.d.ts +5 -0
- package/dist/analyzers/python/index.d.ts.map +1 -0
- package/dist/analyzers/python/index.js +21 -0
- package/dist/analyzers/python/index.js.map +1 -0
- package/dist/analyzers/python/pythonAnalyzer.d.ts +64 -0
- package/dist/analyzers/python/pythonAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/python/pythonAnalyzer.js +226 -0
- package/dist/analyzers/python/pythonAnalyzer.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +281 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/engine/index.d.ts +5 -0
- package/dist/core/engine/index.d.ts.map +1 -0
- package/dist/core/engine/index.js +21 -0
- package/dist/core/engine/index.js.map +1 -0
- package/dist/core/engine/ruleEngine.d.ts +46 -0
- package/dist/core/engine/ruleEngine.d.ts.map +1 -0
- package/dist/core/engine/ruleEngine.js +173 -0
- package/dist/core/engine/ruleEngine.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +24 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/scanner/fileScanner.d.ts +31 -0
- package/dist/core/scanner/fileScanner.d.ts.map +1 -0
- package/dist/core/scanner/fileScanner.js +199 -0
- package/dist/core/scanner/fileScanner.js.map +1 -0
- package/dist/core/scanner/index.d.ts +5 -0
- package/dist/core/scanner/index.d.ts.map +1 -0
- package/dist/core/scanner/index.js +21 -0
- package/dist/core/scanner/index.js.map +1 -0
- package/dist/core/scoring/index.d.ts +5 -0
- package/dist/core/scoring/index.d.ts.map +1 -0
- package/dist/core/scoring/index.js +21 -0
- package/dist/core/scoring/index.js.map +1 -0
- package/dist/core/scoring/riskScoring.d.ts +49 -0
- package/dist/core/scoring/riskScoring.d.ts.map +1 -0
- package/dist/core/scoring/riskScoring.js +180 -0
- package/dist/core/scoring/riskScoring.js.map +1 -0
- package/dist/core/securityScanner.d.ts +47 -0
- package/dist/core/securityScanner.d.ts.map +1 -0
- package/dist/core/securityScanner.js +298 -0
- package/dist/core/securityScanner.js.map +1 -0
- package/dist/dependencies/aiDependencyAnalyzer.d.ts +96 -0
- package/dist/dependencies/aiDependencyAnalyzer.d.ts.map +1 -0
- package/dist/dependencies/aiDependencyAnalyzer.js +435 -0
- package/dist/dependencies/aiDependencyAnalyzer.js.map +1 -0
- package/dist/dependencies/database/cveDatabase.d.ts +32 -0
- package/dist/dependencies/database/cveDatabase.d.ts.map +1 -0
- package/dist/dependencies/database/cveDatabase.js +393 -0
- package/dist/dependencies/database/cveDatabase.js.map +1 -0
- package/dist/dependencies/database/index.d.ts +6 -0
- package/dist/dependencies/database/index.d.ts.map +1 -0
- package/dist/dependencies/database/index.js +22 -0
- package/dist/dependencies/database/index.js.map +1 -0
- package/dist/dependencies/database/maliciousPackages.d.ts +43 -0
- package/dist/dependencies/database/maliciousPackages.d.ts.map +1 -0
- package/dist/dependencies/database/maliciousPackages.js +279 -0
- package/dist/dependencies/database/maliciousPackages.js.map +1 -0
- package/dist/dependencies/dependencyAnalyzer.d.ts +74 -0
- package/dist/dependencies/dependencyAnalyzer.d.ts.map +1 -0
- package/dist/dependencies/dependencyAnalyzer.js +349 -0
- package/dist/dependencies/dependencyAnalyzer.js.map +1 -0
- package/dist/dependencies/detectors/index.d.ts +7 -0
- package/dist/dependencies/detectors/index.d.ts.map +1 -0
- package/dist/dependencies/detectors/index.js +28 -0
- package/dist/dependencies/detectors/index.js.map +1 -0
- package/dist/dependencies/detectors/securityStandards.d.ts +15 -0
- package/dist/dependencies/detectors/securityStandards.d.ts.map +1 -0
- package/dist/dependencies/detectors/securityStandards.js +178 -0
- package/dist/dependencies/detectors/securityStandards.js.map +1 -0
- package/dist/dependencies/detectors/vulnerabilityDetector.d.ts +53 -0
- package/dist/dependencies/detectors/vulnerabilityDetector.d.ts.map +1 -0
- package/dist/dependencies/detectors/vulnerabilityDetector.js +289 -0
- package/dist/dependencies/detectors/vulnerabilityDetector.js.map +1 -0
- package/dist/dependencies/index.d.ts +14 -0
- package/dist/dependencies/index.d.ts.map +1 -0
- package/dist/dependencies/index.js +43 -0
- package/dist/dependencies/index.js.map +1 -0
- package/dist/dependencies/installed/index.d.ts +8 -0
- package/dist/dependencies/installed/index.d.ts.map +1 -0
- package/dist/dependencies/installed/index.js +24 -0
- package/dist/dependencies/installed/index.js.map +1 -0
- package/dist/dependencies/installed/installedScanner.d.ts +91 -0
- package/dist/dependencies/installed/installedScanner.d.ts.map +1 -0
- package/dist/dependencies/installed/installedScanner.js +766 -0
- package/dist/dependencies/installed/installedScanner.js.map +1 -0
- package/dist/dependencies/installed/malwarePatterns.d.ts +32 -0
- package/dist/dependencies/installed/malwarePatterns.d.ts.map +1 -0
- package/dist/dependencies/installed/malwarePatterns.js +480 -0
- package/dist/dependencies/installed/malwarePatterns.js.map +1 -0
- package/dist/dependencies/installed/types.d.ts +274 -0
- package/dist/dependencies/installed/types.d.ts.map +1 -0
- package/dist/dependencies/installed/types.js +7 -0
- package/dist/dependencies/installed/types.js.map +1 -0
- package/dist/dependencies/parsers/base/baseParser.d.ts +44 -0
- package/dist/dependencies/parsers/base/baseParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/base/baseParser.js +80 -0
- package/dist/dependencies/parsers/base/baseParser.js.map +1 -0
- package/dist/dependencies/parsers/base/index.d.ts +6 -0
- package/dist/dependencies/parsers/base/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/base/index.js +27 -0
- package/dist/dependencies/parsers/base/index.js.map +1 -0
- package/dist/dependencies/parsers/cpp/cppParser.d.ts +36 -0
- package/dist/dependencies/parsers/cpp/cppParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/cpp/cppParser.js +196 -0
- package/dist/dependencies/parsers/cpp/cppParser.js.map +1 -0
- package/dist/dependencies/parsers/cpp/index.d.ts +6 -0
- package/dist/dependencies/parsers/cpp/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/cpp/index.js +27 -0
- package/dist/dependencies/parsers/cpp/index.js.map +1 -0
- package/dist/dependencies/parsers/csharp/csharpParser.d.ts +32 -0
- package/dist/dependencies/parsers/csharp/csharpParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/csharp/csharpParser.js +125 -0
- package/dist/dependencies/parsers/csharp/csharpParser.js.map +1 -0
- package/dist/dependencies/parsers/csharp/index.d.ts +6 -0
- package/dist/dependencies/parsers/csharp/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/csharp/index.js +27 -0
- package/dist/dependencies/parsers/csharp/index.js.map +1 -0
- package/dist/dependencies/parsers/index.d.ts +24 -0
- package/dist/dependencies/parsers/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/index.js +69 -0
- package/dist/dependencies/parsers/index.js.map +1 -0
- package/dist/dependencies/parsers/java/index.d.ts +6 -0
- package/dist/dependencies/parsers/java/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/java/index.js +27 -0
- package/dist/dependencies/parsers/java/index.js.map +1 -0
- package/dist/dependencies/parsers/java/javaParser.d.ts +32 -0
- package/dist/dependencies/parsers/java/javaParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/java/javaParser.js +168 -0
- package/dist/dependencies/parsers/java/javaParser.js.map +1 -0
- package/dist/dependencies/parsers/javascript/index.d.ts +6 -0
- package/dist/dependencies/parsers/javascript/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/javascript/index.js +27 -0
- package/dist/dependencies/parsers/javascript/index.js.map +1 -0
- package/dist/dependencies/parsers/javascript/javascriptParser.d.ts +55 -0
- package/dist/dependencies/parsers/javascript/javascriptParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/javascript/javascriptParser.js +266 -0
- package/dist/dependencies/parsers/javascript/javascriptParser.js.map +1 -0
- package/dist/dependencies/parsers/php/index.d.ts +6 -0
- package/dist/dependencies/parsers/php/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/php/index.js +27 -0
- package/dist/dependencies/parsers/php/index.js.map +1 -0
- package/dist/dependencies/parsers/php/phpParser.d.ts +35 -0
- package/dist/dependencies/parsers/php/phpParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/php/phpParser.js +162 -0
- package/dist/dependencies/parsers/php/phpParser.js.map +1 -0
- package/dist/dependencies/parsers/python/index.d.ts +6 -0
- package/dist/dependencies/parsers/python/index.d.ts.map +1 -0
- package/dist/dependencies/parsers/python/index.js +27 -0
- package/dist/dependencies/parsers/python/index.js.map +1 -0
- package/dist/dependencies/parsers/python/pythonParser.d.ts +60 -0
- package/dist/dependencies/parsers/python/pythonParser.d.ts.map +1 -0
- package/dist/dependencies/parsers/python/pythonParser.js +336 -0
- package/dist/dependencies/parsers/python/pythonParser.js.map +1 -0
- package/dist/dependencies/types.d.ts +280 -0
- package/dist/dependencies/types.d.ts.map +1 -0
- package/dist/dependencies/types.js +59 -0
- package/dist/dependencies/types.js.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +18 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/translations.d.ts +55 -0
- package/dist/i18n/translations.d.ts.map +1 -0
- package/dist/i18n/translations.js +119 -0
- package/dist/i18n/translations.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/reports/dependencyReportGenerator.d.ts +20 -0
- package/dist/reports/dependencyReportGenerator.d.ts.map +1 -0
- package/dist/reports/dependencyReportGenerator.js +690 -0
- package/dist/reports/dependencyReportGenerator.js.map +1 -0
- package/dist/reports/htmlReportGenerator.d.ts +43 -0
- package/dist/reports/htmlReportGenerator.d.ts.map +1 -0
- package/dist/reports/htmlReportGenerator.js +793 -0
- package/dist/reports/htmlReportGenerator.js.map +1 -0
- package/dist/reports/index.d.ts +7 -0
- package/dist/reports/index.d.ts.map +1 -0
- package/dist/reports/index.js +23 -0
- package/dist/reports/index.js.map +1 -0
- package/dist/reports/installedDepsReportGenerator.d.ts +14 -0
- package/dist/reports/installedDepsReportGenerator.d.ts.map +1 -0
- package/dist/reports/installedDepsReportGenerator.js +872 -0
- package/dist/reports/installedDepsReportGenerator.js.map +1 -0
- package/dist/rules/index.d.ts +31 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +95 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/malware/categories/backdoors.d.ts +12 -0
- package/dist/rules/malware/categories/backdoors.d.ts.map +1 -0
- package/dist/rules/malware/categories/backdoors.js +163 -0
- package/dist/rules/malware/categories/backdoors.js.map +1 -0
- package/dist/rules/malware/categories/cryptominers.d.ts +13 -0
- package/dist/rules/malware/categories/cryptominers.d.ts.map +1 -0
- package/dist/rules/malware/categories/cryptominers.js +415 -0
- package/dist/rules/malware/categories/cryptominers.js.map +1 -0
- package/dist/rules/malware/categories/exfiltration.d.ts +20 -0
- package/dist/rules/malware/categories/exfiltration.d.ts.map +1 -0
- package/dist/rules/malware/categories/exfiltration.js +658 -0
- package/dist/rules/malware/categories/exfiltration.js.map +1 -0
- package/dist/rules/malware/categories/keyloggers.d.ts +19 -0
- package/dist/rules/malware/categories/keyloggers.d.ts.map +1 -0
- package/dist/rules/malware/categories/keyloggers.js +763 -0
- package/dist/rules/malware/categories/keyloggers.js.map +1 -0
- package/dist/rules/malware/categories/loaders.d.ts +20 -0
- package/dist/rules/malware/categories/loaders.d.ts.map +1 -0
- package/dist/rules/malware/categories/loaders.js +702 -0
- package/dist/rules/malware/categories/loaders.js.map +1 -0
- package/dist/rules/malware/categories/network.d.ts +19 -0
- package/dist/rules/malware/categories/network.d.ts.map +1 -0
- package/dist/rules/malware/categories/network.js +622 -0
- package/dist/rules/malware/categories/network.js.map +1 -0
- package/dist/rules/malware/categories/obfuscation.d.ts +22 -0
- package/dist/rules/malware/categories/obfuscation.d.ts.map +1 -0
- package/dist/rules/malware/categories/obfuscation.js +766 -0
- package/dist/rules/malware/categories/obfuscation.js.map +1 -0
- package/dist/rules/malware/constants/index.d.ts +281 -0
- package/dist/rules/malware/constants/index.d.ts.map +1 -0
- package/dist/rules/malware/constants/index.js +327 -0
- package/dist/rules/malware/constants/index.js.map +1 -0
- package/dist/rules/malware/engine/index.d.ts +178 -0
- package/dist/rules/malware/engine/index.d.ts.map +1 -0
- package/dist/rules/malware/engine/index.js +552 -0
- package/dist/rules/malware/engine/index.js.map +1 -0
- package/dist/rules/malware/index.d.ts +205 -0
- package/dist/rules/malware/index.d.ts.map +1 -0
- package/dist/rules/malware/index.js +837 -0
- package/dist/rules/malware/index.js.map +1 -0
- package/dist/rules/malware/scoring/index.d.ts +84 -0
- package/dist/rules/malware/scoring/index.d.ts.map +1 -0
- package/dist/rules/malware/scoring/index.js +441 -0
- package/dist/rules/malware/scoring/index.js.map +1 -0
- package/dist/rules/malware/types/index.d.ts +616 -0
- package/dist/rules/malware/types/index.d.ts.map +1 -0
- package/dist/rules/malware/types/index.js +155 -0
- package/dist/rules/malware/types/index.js.map +1 -0
- package/dist/rules/malware/utils/index.d.ts +117 -0
- package/dist/rules/malware/utils/index.d.ts.map +1 -0
- package/dist/rules/malware/utils/index.js +514 -0
- package/dist/rules/malware/utils/index.js.map +1 -0
- package/dist/rules/standards.d.ts +26 -0
- package/dist/rules/standards.d.ts.map +1 -0
- package/dist/rules/standards.js +352 -0
- package/dist/rules/standards.js.map +1 -0
- package/dist/rules/vulnerabilities/constants/index.d.ts +835 -0
- package/dist/rules/vulnerabilities/constants/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/constants/index.js +544 -0
- package/dist/rules/vulnerabilities/constants/index.js.map +1 -0
- package/dist/rules/vulnerabilities/engine/index.d.ts +145 -0
- package/dist/rules/vulnerabilities/engine/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/engine/index.js +581 -0
- package/dist/rules/vulnerabilities/engine/index.js.map +1 -0
- package/dist/rules/vulnerabilities/index.d.ts +148 -0
- package/dist/rules/vulnerabilities/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/index.js +252 -0
- package/dist/rules/vulnerabilities/index.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/authentication.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/authentication.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/authentication.js +419 -0
- package/dist/rules/vulnerabilities/rules/authentication.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/commandInjection.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/commandInjection.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/commandInjection.js +300 -0
- package/dist/rules/vulnerabilities/rules/commandInjection.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/csrf.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/csrf.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/csrf.js +261 -0
- package/dist/rules/vulnerabilities/rules/csrf.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/deserialization.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/deserialization.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/deserialization.js +336 -0
- package/dist/rules/vulnerabilities/rules/deserialization.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/fileUpload.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/fileUpload.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/fileUpload.js +325 -0
- package/dist/rules/vulnerabilities/rules/fileUpload.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/hardcodedSecrets.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/hardcodedSecrets.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/hardcodedSecrets.js +446 -0
- package/dist/rules/vulnerabilities/rules/hardcodedSecrets.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/index.d.ts +17 -0
- package/dist/rules/vulnerabilities/rules/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/index.js +47 -0
- package/dist/rules/vulnerabilities/rules/index.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/pathTraversal.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/pathTraversal.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/pathTraversal.js +351 -0
- package/dist/rules/vulnerabilities/rules/pathTraversal.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/prototypePollution.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/prototypePollution.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/prototypePollution.js +272 -0
- package/dist/rules/vulnerabilities/rules/prototypePollution.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/securityMisconfiguration.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/securityMisconfiguration.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/securityMisconfiguration.js +438 -0
- package/dist/rules/vulnerabilities/rules/securityMisconfiguration.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/sqlInjection.d.ts +12 -0
- package/dist/rules/vulnerabilities/rules/sqlInjection.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/sqlInjection.js +636 -0
- package/dist/rules/vulnerabilities/rules/sqlInjection.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/ssrf.d.ts +8 -0
- package/dist/rules/vulnerabilities/rules/ssrf.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/ssrf.js +401 -0
- package/dist/rules/vulnerabilities/rules/ssrf.js.map +1 -0
- package/dist/rules/vulnerabilities/rules/xss.d.ts +11 -0
- package/dist/rules/vulnerabilities/rules/xss.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/rules/xss.js +724 -0
- package/dist/rules/vulnerabilities/rules/xss.js.map +1 -0
- package/dist/rules/vulnerabilities/scoring/index.d.ts +80 -0
- package/dist/rules/vulnerabilities/scoring/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/scoring/index.js +414 -0
- package/dist/rules/vulnerabilities/scoring/index.js.map +1 -0
- package/dist/rules/vulnerabilities/types/index.d.ts +830 -0
- package/dist/rules/vulnerabilities/types/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/types/index.js +164 -0
- package/dist/rules/vulnerabilities/types/index.js.map +1 -0
- package/dist/rules/vulnerabilities/utils/index.d.ts +206 -0
- package/dist/rules/vulnerabilities/utils/index.d.ts.map +1 -0
- package/dist/rules/vulnerabilities/utils/index.js +615 -0
- package/dist/rules/vulnerabilities/utils/index.js.map +1 -0
- package/dist/types/index.d.ts +359 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +61 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +82 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +326 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +139 -0
- package/dist/utils/logger.js.map +1 -0
- package/docs/ARCHITECTURE.md +320 -0
- package/docs/V1.2.1-IA_Performances.md +116 -0
- package/docs/images/WIN_Defender.png +0 -0
- package/package.json +68 -0
- package/secure-scan.config.json +134 -0
- package/secure-scan.sln +29 -0
- package/src/ai/aiAnalyzer.ts +714 -0
- package/src/ai/index.ts +5 -0
- package/src/analyzers/base/baseAnalyzer.ts +66 -0
- package/src/analyzers/base/index.ts +5 -0
- package/src/analyzers/c-cpp/cppAnalyzer.ts +308 -0
- package/src/analyzers/c-cpp/index.ts +5 -0
- package/src/analyzers/core/engine/index.ts +5 -0
- package/src/analyzers/core/engine/ruleEngine.ts +221 -0
- package/src/analyzers/core/index.ts +8 -0
- package/src/analyzers/core/scanner/fileScanner.ts +204 -0
- package/src/analyzers/core/scanner/index.ts +5 -0
- package/src/analyzers/core/scoring/index.ts +5 -0
- package/src/analyzers/core/scoring/riskScoring.ts +198 -0
- package/src/analyzers/core/securityScanner.ts +321 -0
- package/src/analyzers/csharp/csharpAnalyzer.ts +328 -0
- package/src/analyzers/csharp/index.ts +5 -0
- package/src/analyzers/iac/iacAnalyzer.ts +318 -0
- package/src/analyzers/iac/index.ts +5 -0
- package/src/analyzers/index.ts +67 -0
- package/src/analyzers/java/index.ts +5 -0
- package/src/analyzers/java/javaAnalyzer.ts +320 -0
- package/src/analyzers/javascript/PROMPT_JS_ANALYZER.md +267 -0
- package/src/analyzers/javascript/astUtils.ts +789 -0
- package/src/analyzers/javascript/index.ts +50 -0
- package/src/analyzers/javascript/javascriptAnalyzer.ts +984 -0
- package/src/analyzers/javascript/malwareDetector.ts +697 -0
- package/src/analyzers/javascript/packageJsonAnalyzer.ts +626 -0
- package/src/analyzers/javascript/taintAnalyzer.ts +630 -0
- package/src/analyzers/php/index.ts +5 -0
- package/src/analyzers/php/phpAnalyzer.ts +280 -0
- package/src/analyzers/python/index.ts +5 -0
- package/src/analyzers/python/pythonAnalyzer.ts +319 -0
- package/src/cli/index.ts +276 -0
- package/src/dependencies/aiDependencyAnalyzer.ts +496 -0
- package/src/dependencies/database/cveDatabase.ts +426 -0
- package/src/dependencies/database/index.ts +6 -0
- package/src/dependencies/database/maliciousPackages.ts +286 -0
- package/src/dependencies/dependencyAnalyzer.ts +394 -0
- package/src/dependencies/detectors/index.ts +7 -0
- package/src/dependencies/detectors/securityStandards.ts +200 -0
- package/src/dependencies/detectors/vulnerabilityDetector.ts +343 -0
- package/src/dependencies/index.ts +27 -0
- package/src/dependencies/installed/index.ts +8 -0
- package/src/dependencies/installed/installedScanner.ts +821 -0
- package/src/dependencies/installed/malwarePatterns.ts +492 -0
- package/src/dependencies/installed/types.ts +287 -0
- package/src/dependencies/parsers/base/baseParser.ts +108 -0
- package/src/dependencies/parsers/base/index.ts +6 -0
- package/src/dependencies/parsers/cpp/cppParser.ts +245 -0
- package/src/dependencies/parsers/cpp/index.ts +6 -0
- package/src/dependencies/parsers/csharp/csharpParser.ts +151 -0
- package/src/dependencies/parsers/csharp/index.ts +6 -0
- package/src/dependencies/parsers/index.ts +56 -0
- package/src/dependencies/parsers/java/index.ts +6 -0
- package/src/dependencies/parsers/java/javaParser.ts +203 -0
- package/src/dependencies/parsers/javascript/index.ts +6 -0
- package/src/dependencies/parsers/javascript/javascriptParser.ts +362 -0
- package/src/dependencies/parsers/php/index.ts +6 -0
- package/src/dependencies/parsers/php/phpParser.ts +208 -0
- package/src/dependencies/parsers/python/index.ts +6 -0
- package/src/dependencies/parsers/python/pythonParser.ts +437 -0
- package/src/dependencies/types.ts +330 -0
- package/src/i18n/index.ts +1 -0
- package/src/i18n/translations.ts +194 -0
- package/src/index.ts +16 -0
- package/src/reports/dependencyReportGenerator.ts +717 -0
- package/src/reports/htmlReportGenerator.ts +781 -0
- package/src/reports/index.ts +7 -0
- package/src/reports/installedDepsReportGenerator.ts +899 -0
- package/src/rules/index.ts +58 -0
- package/src/rules/malware/INFO.md +287 -0
- package/src/rules/malware/categories/backdoors.ts +174 -0
- package/src/rules/malware/categories/cryptominers.ts +434 -0
- package/src/rules/malware/categories/exfiltration.ts +677 -0
- package/src/rules/malware/categories/keyloggers.ts +780 -0
- package/src/rules/malware/categories/loaders.ts +721 -0
- package/src/rules/malware/categories/network.ts +639 -0
- package/src/rules/malware/categories/obfuscation.ts +788 -0
- package/src/rules/malware/constants/index.ts +358 -0
- package/src/rules/malware/engine/index.ts +758 -0
- package/src/rules/malware/index.ts +928 -0
- package/src/rules/malware/scoring/index.ts +549 -0
- package/src/rules/malware/types/index.ts +752 -0
- package/src/rules/malware/utils/index.ts +643 -0
- package/src/rules/standards.ts +372 -0
- package/src/rules/vulnerabilities/PROMPT_VULNERABILITIES.md +226 -0
- package/src/rules/vulnerabilities/constants/index.ts +625 -0
- package/src/rules/vulnerabilities/engine/index.ts +831 -0
- package/src/rules/vulnerabilities/index.ts +312 -0
- package/src/rules/vulnerabilities/rules/authentication.ts +426 -0
- package/src/rules/vulnerabilities/rules/commandInjection.ts +307 -0
- package/src/rules/vulnerabilities/rules/csrf.ts +268 -0
- package/src/rules/vulnerabilities/rules/deserialization.ts +343 -0
- package/src/rules/vulnerabilities/rules/fileUpload.ts +332 -0
- package/src/rules/vulnerabilities/rules/hardcodedSecrets.ts +453 -0
- package/src/rules/vulnerabilities/rules/index.ts +17 -0
- package/src/rules/vulnerabilities/rules/pathTraversal.ts +358 -0
- package/src/rules/vulnerabilities/rules/prototypePollution.ts +279 -0
- package/src/rules/vulnerabilities/rules/securityMisconfiguration.ts +445 -0
- package/src/rules/vulnerabilities/rules/sqlInjection.ts +669 -0
- package/src/rules/vulnerabilities/rules/ssrf.ts +408 -0
- package/src/rules/vulnerabilities/rules/xss.ts +753 -0
- package/src/rules/vulnerabilities/scoring/index.ts +543 -0
- package/src/rules/vulnerabilities/types/index.ts +1004 -0
- package/src/rules/vulnerabilities/utils/index.ts +709 -0
- package/src/types/index.ts +391 -0
- package/src/utils/index.ts +306 -0
- package/src/utils/logger.ts +150 -0
- package/test-installed-scanner.ts +136 -0
- package/tsconfig.json +30 -0
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package.json Security Analyzer
|
|
3
|
+
* Deep analysis of npm package manifests for supply chain threats
|
|
4
|
+
*
|
|
5
|
+
* Detects typosquatting, malicious scripts, suspicious dependencies
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Severity, ThreatType, FindingCategory } from '../../types';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Calculate Levenshtein distance between two strings
|
|
12
|
+
* (Simple implementation to avoid external dependency)
|
|
13
|
+
*/
|
|
14
|
+
function levenshteinDistance(a: string, b: string): number {
|
|
15
|
+
const matrix: number[][] = [];
|
|
16
|
+
|
|
17
|
+
for (let i = 0; i <= b.length; i++) {
|
|
18
|
+
matrix[i] = [i];
|
|
19
|
+
}
|
|
20
|
+
for (let j = 0; j <= a.length; j++) {
|
|
21
|
+
matrix[0][j] = j;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
for (let i = 1; i <= b.length; i++) {
|
|
25
|
+
for (let j = 1; j <= a.length; j++) {
|
|
26
|
+
if (b.charAt(i - 1) === a.charAt(j - 1)) {
|
|
27
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
28
|
+
} else {
|
|
29
|
+
matrix[i][j] = Math.min(
|
|
30
|
+
matrix[i - 1][j - 1] + 1, // substitution
|
|
31
|
+
matrix[i][j - 1] + 1, // insertion
|
|
32
|
+
matrix[i - 1][j] + 1 // deletion
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return matrix[b.length][a.length];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Package.json analysis finding
|
|
43
|
+
*/
|
|
44
|
+
export interface PackageJsonFinding {
|
|
45
|
+
/** Finding type */
|
|
46
|
+
type: PackageJsonFindingType;
|
|
47
|
+
/** Finding name */
|
|
48
|
+
name: string;
|
|
49
|
+
/** Description */
|
|
50
|
+
description: string;
|
|
51
|
+
/** Severity */
|
|
52
|
+
severity: Severity;
|
|
53
|
+
/** Threat type */
|
|
54
|
+
threatType: ThreatType;
|
|
55
|
+
/** Category */
|
|
56
|
+
category: FindingCategory;
|
|
57
|
+
/** Affected field */
|
|
58
|
+
field: string;
|
|
59
|
+
/** Value that triggered the finding */
|
|
60
|
+
value: string;
|
|
61
|
+
/** Confidence 0-100 */
|
|
62
|
+
confidence: number;
|
|
63
|
+
/** Remediation advice */
|
|
64
|
+
remediation: string;
|
|
65
|
+
/** Additional context */
|
|
66
|
+
context?: Record<string, string>;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Types of package.json findings
|
|
71
|
+
*/
|
|
72
|
+
export enum PackageJsonFindingType {
|
|
73
|
+
MALICIOUS_SCRIPT = 'malicious_script',
|
|
74
|
+
TYPOSQUATTING = 'typosquatting',
|
|
75
|
+
SUSPICIOUS_DEPENDENCY = 'suspicious_dependency',
|
|
76
|
+
PRIVATE_REGISTRY = 'private_registry',
|
|
77
|
+
GIT_DEPENDENCY = 'git_dependency',
|
|
78
|
+
LOCAL_PATH_DEPENDENCY = 'local_path_dependency',
|
|
79
|
+
OVERLY_PERMISSIVE_VERSION = 'overly_permissive_version',
|
|
80
|
+
DANGEROUS_POSTINSTALL = 'dangerous_postinstall',
|
|
81
|
+
OUTDATED_DEPENDENCY = 'outdated_dependency',
|
|
82
|
+
DEPRECATED_PACKAGE = 'deprecated_package',
|
|
83
|
+
INSTALL_SCRIPT_ABUSE = 'install_script_abuse',
|
|
84
|
+
SUSPICIOUS_MAINTAINER = 'suspicious_maintainer'
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Popular packages for typosquatting detection
|
|
89
|
+
*/
|
|
90
|
+
const POPULAR_PACKAGES = [
|
|
91
|
+
// Core npm packages
|
|
92
|
+
'lodash', 'underscore', 'express', 'react', 'vue', 'angular',
|
|
93
|
+
'moment', 'axios', 'request', 'bluebird', 'async', 'chalk',
|
|
94
|
+
'commander', 'debug', 'dotenv', 'fs-extra', 'glob', 'inquirer',
|
|
95
|
+
'jest', 'mocha', 'chai', 'webpack', 'babel-core', 'typescript',
|
|
96
|
+
'eslint', 'prettier', 'nodemon', 'pm2', 'mongoose', 'sequelize',
|
|
97
|
+
'mysql', 'pg', 'redis', 'socket.io', 'graphql', 'apollo-server',
|
|
98
|
+
'next', 'nuxt', 'gatsby', 'electron', 'puppeteer', 'cheerio',
|
|
99
|
+
'uuid', 'jsonwebtoken', 'bcrypt', 'passport', 'cors', 'helmet',
|
|
100
|
+
'morgan', 'winston', 'pino', 'bunyan', 'body-parser', 'cookie-parser',
|
|
101
|
+
'multer', 'formidable', 'sharp', 'jimp', 'node-fetch', 'got',
|
|
102
|
+
'superagent', 'cross-env', 'rimraf', 'mkdirp', 'semver', 'yargs',
|
|
103
|
+
'minimist', 'ora', 'listr', 'execa', 'shelljs', 'cross-spawn',
|
|
104
|
+
// React ecosystem
|
|
105
|
+
'react-dom', 'react-router', 'react-redux', 'redux', 'redux-thunk',
|
|
106
|
+
'redux-saga', 'mobx', 'mobx-react', 'styled-components', 'emotion',
|
|
107
|
+
'material-ui', '@mui/material', 'antd', 'bootstrap', 'tailwindcss',
|
|
108
|
+
// Vue ecosystem
|
|
109
|
+
'vue-router', 'vuex', 'vuetify', 'element-ui', 'vant',
|
|
110
|
+
// Angular ecosystem
|
|
111
|
+
'@angular/core', '@angular/common', '@angular/router', 'rxjs',
|
|
112
|
+
// Build tools
|
|
113
|
+
'rollup', 'parcel', 'esbuild', 'vite', 'snowpack',
|
|
114
|
+
'babel-loader', 'ts-loader', 'css-loader', 'style-loader',
|
|
115
|
+
// Testing
|
|
116
|
+
'cypress', 'playwright', '@testing-library/react', 'enzyme',
|
|
117
|
+
// Security sensitive
|
|
118
|
+
'crypto-js', 'node-forge', 'bcryptjs', 'argon2'
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Suspicious script patterns
|
|
123
|
+
*/
|
|
124
|
+
const SUSPICIOUS_SCRIPT_PATTERNS: Array<{
|
|
125
|
+
pattern: RegExp;
|
|
126
|
+
name: string;
|
|
127
|
+
description: string;
|
|
128
|
+
severity: Severity;
|
|
129
|
+
confidence: number;
|
|
130
|
+
}> = [
|
|
131
|
+
{
|
|
132
|
+
pattern: /curl\s+[^\s]+\s*\|\s*(?:sh|bash|zsh)/i,
|
|
133
|
+
name: 'Remote Script Execution',
|
|
134
|
+
description: 'Downloads and executes a remote script',
|
|
135
|
+
severity: Severity.CRITICAL,
|
|
136
|
+
confidence: 95
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
pattern: /wget\s+[^\s]+\s*(?:&&|;)\s*(?:sh|bash|chmod)/i,
|
|
140
|
+
name: 'wget Remote Execution',
|
|
141
|
+
description: 'Downloads and executes a remote script via wget',
|
|
142
|
+
severity: Severity.CRITICAL,
|
|
143
|
+
confidence: 95
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
pattern: /node\s+-e\s+["'][^"']*(?:http|https|fetch|require\(['"]child_process)/i,
|
|
147
|
+
name: 'Inline Node Execution',
|
|
148
|
+
description: 'Executes inline Node.js code with network or process access',
|
|
149
|
+
severity: Severity.HIGH,
|
|
150
|
+
confidence: 85
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
pattern: /powershell\s+(?:-(?:e|enc|encodedcommand))/i,
|
|
154
|
+
name: 'PowerShell Encoded Command',
|
|
155
|
+
description: 'Executes encoded PowerShell command',
|
|
156
|
+
severity: Severity.CRITICAL,
|
|
157
|
+
confidence: 90
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
pattern: /echo\s+[A-Za-z0-9+/=]{50,}\s*\|\s*base64\s+-d/i,
|
|
161
|
+
name: 'Base64 Decode Execution',
|
|
162
|
+
description: 'Decodes and potentially executes Base64 content',
|
|
163
|
+
severity: Severity.HIGH,
|
|
164
|
+
confidence: 85
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
pattern: /\$\(curl|`curl|\$\(wget|`wget/i,
|
|
168
|
+
name: 'Command Substitution Download',
|
|
169
|
+
description: 'Uses command substitution to download content',
|
|
170
|
+
severity: Severity.HIGH,
|
|
171
|
+
confidence: 85
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
pattern: /eval\s*["'`]?\$\(/i,
|
|
175
|
+
name: 'Eval Command Substitution',
|
|
176
|
+
description: 'Evaluates the output of a command',
|
|
177
|
+
severity: Severity.CRITICAL,
|
|
178
|
+
confidence: 90
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
pattern: />\s*\/dev\/tcp\//i,
|
|
182
|
+
name: 'Bash Network Redirect',
|
|
183
|
+
description: 'Uses bash /dev/tcp for network communication',
|
|
184
|
+
severity: Severity.CRITICAL,
|
|
185
|
+
confidence: 95
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
pattern: /nc\s+-[^|]*\s+(?:\||&)/i,
|
|
189
|
+
name: 'Netcat Usage',
|
|
190
|
+
description: 'Uses netcat for network communication',
|
|
191
|
+
severity: Severity.HIGH,
|
|
192
|
+
confidence: 80
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
pattern: /rm\s+-rf\s+(?:\/|~|\$HOME)/i,
|
|
196
|
+
name: 'Dangerous File Deletion',
|
|
197
|
+
description: 'Recursively deletes important directories',
|
|
198
|
+
severity: Severity.CRITICAL,
|
|
199
|
+
confidence: 90
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
pattern: /chmod\s+(?:\+s|u\+s|4755|2755)/i,
|
|
203
|
+
name: 'SetUID/SetGID Modification',
|
|
204
|
+
description: 'Changes file permissions to setuid/setgid',
|
|
205
|
+
severity: Severity.HIGH,
|
|
206
|
+
confidence: 85
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
pattern: /(?:\.ssh|id_rsa|authorized_keys)/i,
|
|
210
|
+
name: 'SSH Key Access',
|
|
211
|
+
description: 'Script accesses SSH keys or configuration',
|
|
212
|
+
severity: Severity.HIGH,
|
|
213
|
+
confidence: 75
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
pattern: /(?:\/etc\/passwd|\/etc\/shadow)/i,
|
|
217
|
+
name: 'System Password File Access',
|
|
218
|
+
description: 'Script accesses system password files',
|
|
219
|
+
severity: Severity.CRITICAL,
|
|
220
|
+
confidence: 90
|
|
221
|
+
}
|
|
222
|
+
];
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Known malicious or suspicious package names
|
|
226
|
+
*/
|
|
227
|
+
const KNOWN_MALICIOUS_PACKAGES = new Set([
|
|
228
|
+
// Historical malicious packages
|
|
229
|
+
'event-stream', 'flatmap-stream', 'ua-parser-js', 'coa', 'rc',
|
|
230
|
+
'colors', 'faker', // These were sabotaged by maintainers
|
|
231
|
+
// Common typosquatting targets that have been used maliciously
|
|
232
|
+
'loadsh', 'lodahs', 'lodashs', 'crossenv', 'cross-env.js',
|
|
233
|
+
'babelcli', 'http-proxy.js', 'mongose', 'mongoos',
|
|
234
|
+
'mssql.js', 'mssql-node', 'mysqljs', 'node-fabric',
|
|
235
|
+
'node-opencv', 'node-opensl', 'node-openssl', 'node-sqlite',
|
|
236
|
+
'node-tkinter', 'nodefabric', 'nodeffmpeg', 'nodemailer-js',
|
|
237
|
+
'noderequest', 'nodesass', 'nodesqlite', 'opencv.js',
|
|
238
|
+
'openssl.js', 'proxy.js', 'shadowsock', 'smb', 'sqlite.js',
|
|
239
|
+
'sqliter', 'sqlserver', 'tkinter'
|
|
240
|
+
]);
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Suspicious package name patterns
|
|
244
|
+
*/
|
|
245
|
+
const SUSPICIOUS_PACKAGE_PATTERNS = [
|
|
246
|
+
{ pattern: /^@[^/]+\/[^/]+--[^/]+$/, reason: 'Double hyphen in scoped package' },
|
|
247
|
+
{ pattern: /^[a-z]+-[0-9]+$/, reason: 'Package name with trailing numbers' },
|
|
248
|
+
{ pattern: /^node-(?!gyp|fetch|forge|uuid|notifier|schedule|html)/, reason: 'Suspicious node- prefix' },
|
|
249
|
+
{ pattern: /^js-(?!yaml|cookie|beautify)/, reason: 'Suspicious js- prefix' },
|
|
250
|
+
{ pattern: /\.(js|ts|json|node)$/, reason: 'Package name with file extension' },
|
|
251
|
+
{ pattern: /^npm-|^yarn-/i, reason: 'Package prefixed with package manager name' }
|
|
252
|
+
];
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Package.json Analyzer Class
|
|
256
|
+
*/
|
|
257
|
+
export class PackageJsonAnalyzer {
|
|
258
|
+
private findings: PackageJsonFinding[] = [];
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Analyze a package.json file
|
|
262
|
+
*/
|
|
263
|
+
analyze(content: string, filePath: string): PackageJsonFinding[] {
|
|
264
|
+
this.findings = [];
|
|
265
|
+
|
|
266
|
+
let pkg: Record<string, unknown>;
|
|
267
|
+
try {
|
|
268
|
+
pkg = JSON.parse(content);
|
|
269
|
+
} catch {
|
|
270
|
+
// Invalid JSON
|
|
271
|
+
return [];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Analyze scripts
|
|
275
|
+
if (pkg.scripts && typeof pkg.scripts === 'object') {
|
|
276
|
+
this.analyzeScripts(pkg.scripts as Record<string, string>);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Analyze dependencies
|
|
280
|
+
const depFields = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
|
|
281
|
+
for (const field of depFields) {
|
|
282
|
+
if (pkg[field] && typeof pkg[field] === 'object') {
|
|
283
|
+
this.analyzeDependencies(pkg[field] as Record<string, string>, field);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Check for bundledDependencies with version specifiers (unusual)
|
|
288
|
+
if (pkg.bundledDependencies || pkg.bundleDependencies) {
|
|
289
|
+
this.checkBundledDependencies(
|
|
290
|
+
(pkg.bundledDependencies || pkg.bundleDependencies) as string[]
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Check for suspicious package metadata
|
|
295
|
+
this.analyzeMetadata(pkg);
|
|
296
|
+
|
|
297
|
+
return this.findings;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Analyze npm scripts for malicious patterns
|
|
302
|
+
*/
|
|
303
|
+
private analyzeScripts(scripts: Record<string, string>): void {
|
|
304
|
+
// High-risk lifecycle scripts
|
|
305
|
+
const lifecycleScripts = ['preinstall', 'install', 'postinstall', 'preuninstall', 'postuninstall'];
|
|
306
|
+
|
|
307
|
+
for (const [scriptName, scriptContent] of Object.entries(scripts)) {
|
|
308
|
+
// Check lifecycle scripts more strictly
|
|
309
|
+
const isLifecycle = lifecycleScripts.includes(scriptName);
|
|
310
|
+
|
|
311
|
+
// Check against suspicious patterns
|
|
312
|
+
for (const { pattern, name, description, severity, confidence } of SUSPICIOUS_SCRIPT_PATTERNS) {
|
|
313
|
+
if (pattern.test(scriptContent)) {
|
|
314
|
+
this.findings.push({
|
|
315
|
+
type: PackageJsonFindingType.MALICIOUS_SCRIPT,
|
|
316
|
+
name: `${name} in ${scriptName}`,
|
|
317
|
+
description: `${description} found in npm script "${scriptName}"`,
|
|
318
|
+
severity: isLifecycle ? Severity.CRITICAL : severity,
|
|
319
|
+
threatType: ThreatType.MALICIOUS_LOADER,
|
|
320
|
+
category: FindingCategory.MALWARE,
|
|
321
|
+
field: `scripts.${scriptName}`,
|
|
322
|
+
value: scriptContent,
|
|
323
|
+
confidence: isLifecycle ? Math.min(confidence + 10, 100) : confidence,
|
|
324
|
+
remediation: isLifecycle
|
|
325
|
+
? 'Remove or thoroughly review this lifecycle script. Use npm config set ignore-scripts true for untrusted packages.'
|
|
326
|
+
: 'Review and remove suspicious commands from the script.',
|
|
327
|
+
context: { scriptName }
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Check for scripts that look obfuscated
|
|
333
|
+
if (this.looksObfuscated(scriptContent)) {
|
|
334
|
+
this.findings.push({
|
|
335
|
+
type: PackageJsonFindingType.MALICIOUS_SCRIPT,
|
|
336
|
+
name: 'Obfuscated Script',
|
|
337
|
+
description: `Script "${scriptName}" appears to contain obfuscated code`,
|
|
338
|
+
severity: isLifecycle ? Severity.CRITICAL : Severity.HIGH,
|
|
339
|
+
threatType: ThreatType.OBFUSCATED_CODE,
|
|
340
|
+
category: FindingCategory.MALWARE,
|
|
341
|
+
field: `scripts.${scriptName}`,
|
|
342
|
+
value: scriptContent.substring(0, 200),
|
|
343
|
+
confidence: 75,
|
|
344
|
+
remediation: 'Deobfuscate and analyze the script content.',
|
|
345
|
+
context: { scriptName }
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Analyze dependencies for security issues
|
|
353
|
+
*/
|
|
354
|
+
private analyzeDependencies(deps: Record<string, string>, field: string): void {
|
|
355
|
+
for (const [name, version] of Object.entries(deps)) {
|
|
356
|
+
// Check for known malicious packages
|
|
357
|
+
if (KNOWN_MALICIOUS_PACKAGES.has(name)) {
|
|
358
|
+
this.findings.push({
|
|
359
|
+
type: PackageJsonFindingType.SUSPICIOUS_DEPENDENCY,
|
|
360
|
+
name: 'Known Malicious Package',
|
|
361
|
+
description: `Package "${name}" has been flagged as malicious or compromised`,
|
|
362
|
+
severity: Severity.CRITICAL,
|
|
363
|
+
threatType: ThreatType.MALICIOUS_LOADER,
|
|
364
|
+
category: FindingCategory.MALWARE,
|
|
365
|
+
field: `${field}.${name}`,
|
|
366
|
+
value: `${name}@${version}`,
|
|
367
|
+
confidence: 95,
|
|
368
|
+
remediation: 'Remove this package immediately and find a legitimate alternative.'
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Check for typosquatting
|
|
373
|
+
const typosquatResult = this.checkTyposquatting(name);
|
|
374
|
+
if (typosquatResult) {
|
|
375
|
+
this.findings.push({
|
|
376
|
+
type: PackageJsonFindingType.TYPOSQUATTING,
|
|
377
|
+
name: 'Potential Typosquatting',
|
|
378
|
+
description: `Package "${name}" may be a typosquat of "${typosquatResult.target}"`,
|
|
379
|
+
severity: Severity.HIGH,
|
|
380
|
+
threatType: ThreatType.MALICIOUS_LOADER,
|
|
381
|
+
category: FindingCategory.MALWARE,
|
|
382
|
+
field: `${field}.${name}`,
|
|
383
|
+
value: `${name}@${version}`,
|
|
384
|
+
confidence: typosquatResult.confidence,
|
|
385
|
+
remediation: `Verify you intended to install "${name}" and not "${typosquatResult.target}".`,
|
|
386
|
+
context: { similarTo: typosquatResult.target }
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Check for suspicious package name patterns
|
|
391
|
+
for (const { pattern, reason } of SUSPICIOUS_PACKAGE_PATTERNS) {
|
|
392
|
+
if (pattern.test(name)) {
|
|
393
|
+
this.findings.push({
|
|
394
|
+
type: PackageJsonFindingType.SUSPICIOUS_DEPENDENCY,
|
|
395
|
+
name: 'Suspicious Package Name',
|
|
396
|
+
description: `Package "${name}" has a suspicious name pattern: ${reason}`,
|
|
397
|
+
severity: Severity.MEDIUM,
|
|
398
|
+
threatType: ThreatType.MALICIOUS_LOADER,
|
|
399
|
+
category: FindingCategory.MALWARE,
|
|
400
|
+
field: `${field}.${name}`,
|
|
401
|
+
value: `${name}@${version}`,
|
|
402
|
+
confidence: 60,
|
|
403
|
+
remediation: 'Verify this is the intended package before installing.'
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Check for git dependencies (can be risky)
|
|
409
|
+
if (version.startsWith('git') || version.startsWith('github:') || version.includes('://')) {
|
|
410
|
+
this.findings.push({
|
|
411
|
+
type: PackageJsonFindingType.GIT_DEPENDENCY,
|
|
412
|
+
name: 'Git URL Dependency',
|
|
413
|
+
description: `Package "${name}" is installed from a git URL instead of npm registry`,
|
|
414
|
+
severity: Severity.MEDIUM,
|
|
415
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
416
|
+
category: FindingCategory.VULNERABILITY,
|
|
417
|
+
field: `${field}.${name}`,
|
|
418
|
+
value: `${name}@${version}`,
|
|
419
|
+
confidence: 70,
|
|
420
|
+
remediation: 'Use npm registry versions when possible. Audit the git repository.'
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Check for local file dependencies
|
|
425
|
+
if (version.startsWith('file:') || version.startsWith('./') || version.startsWith('../')) {
|
|
426
|
+
this.findings.push({
|
|
427
|
+
type: PackageJsonFindingType.LOCAL_PATH_DEPENDENCY,
|
|
428
|
+
name: 'Local Path Dependency',
|
|
429
|
+
description: `Package "${name}" uses a local file path`,
|
|
430
|
+
severity: Severity.LOW,
|
|
431
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
432
|
+
category: FindingCategory.CODE_SMELL,
|
|
433
|
+
field: `${field}.${name}`,
|
|
434
|
+
value: `${name}@${version}`,
|
|
435
|
+
confidence: 80,
|
|
436
|
+
remediation: 'Consider publishing the package or using a workspace configuration.'
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Check for overly permissive version ranges
|
|
441
|
+
if (version === '*' || version === 'latest' || /^>=?\s*0\./.test(version)) {
|
|
442
|
+
this.findings.push({
|
|
443
|
+
type: PackageJsonFindingType.OVERLY_PERMISSIVE_VERSION,
|
|
444
|
+
name: 'Overly Permissive Version',
|
|
445
|
+
description: `Package "${name}" uses "${version}" which could install any version`,
|
|
446
|
+
severity: Severity.MEDIUM,
|
|
447
|
+
threatType: ThreatType.VULNERABLE_DEPENDENCY,
|
|
448
|
+
category: FindingCategory.BEST_PRACTICE,
|
|
449
|
+
field: `${field}.${name}`,
|
|
450
|
+
value: `${name}@${version}`,
|
|
451
|
+
confidence: 85,
|
|
452
|
+
remediation: 'Use a specific version or a caret/tilde range.'
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Check for typosquatting against popular packages
|
|
460
|
+
*/
|
|
461
|
+
private checkTyposquatting(packageName: string): { target: string; confidence: number } | null {
|
|
462
|
+
const lowerName = packageName.toLowerCase();
|
|
463
|
+
|
|
464
|
+
// Skip if it's a popular package itself
|
|
465
|
+
if (POPULAR_PACKAGES.includes(lowerName)) {
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Skip scoped packages for now (they're harder to typosquat)
|
|
470
|
+
if (packageName.startsWith('@')) {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
475
|
+
const distance = levenshteinDistance(lowerName, popular.toLowerCase());
|
|
476
|
+
const maxLength = Math.max(lowerName.length, popular.length);
|
|
477
|
+
const similarity = 1 - (distance / maxLength);
|
|
478
|
+
|
|
479
|
+
// If very similar but not exact
|
|
480
|
+
if (distance > 0 && distance <= 2 && similarity > 0.8) {
|
|
481
|
+
const confidence = Math.round(similarity * 100);
|
|
482
|
+
return { target: popular, confidence };
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Check for common typosquatting patterns
|
|
486
|
+
const patterns = [
|
|
487
|
+
`${popular}-js`,
|
|
488
|
+
`${popular}js`,
|
|
489
|
+
`${popular}.js`,
|
|
490
|
+
`js-${popular}`,
|
|
491
|
+
`node-${popular}`,
|
|
492
|
+
`${popular}-node`,
|
|
493
|
+
`${popular}2`,
|
|
494
|
+
`${popular}-v2`,
|
|
495
|
+
popular.replace(/-/g, ''),
|
|
496
|
+
popular.replace(/-/g, '_')
|
|
497
|
+
];
|
|
498
|
+
|
|
499
|
+
for (const pattern of patterns) {
|
|
500
|
+
if (lowerName === pattern.toLowerCase() && lowerName !== popular.toLowerCase()) {
|
|
501
|
+
return { target: popular, confidence: 75 };
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Check bundled dependencies
|
|
511
|
+
*/
|
|
512
|
+
private checkBundledDependencies(bundled: string[]): void {
|
|
513
|
+
if (!Array.isArray(bundled)) return;
|
|
514
|
+
|
|
515
|
+
for (const name of bundled) {
|
|
516
|
+
if (typeof name !== 'string') continue;
|
|
517
|
+
|
|
518
|
+
// Check for known malicious packages
|
|
519
|
+
if (KNOWN_MALICIOUS_PACKAGES.has(name)) {
|
|
520
|
+
this.findings.push({
|
|
521
|
+
type: PackageJsonFindingType.SUSPICIOUS_DEPENDENCY,
|
|
522
|
+
name: 'Malicious Bundled Dependency',
|
|
523
|
+
description: `Bundled package "${name}" is known to be malicious`,
|
|
524
|
+
severity: Severity.CRITICAL,
|
|
525
|
+
threatType: ThreatType.MALICIOUS_LOADER,
|
|
526
|
+
category: FindingCategory.MALWARE,
|
|
527
|
+
field: 'bundledDependencies',
|
|
528
|
+
value: name,
|
|
529
|
+
confidence: 95,
|
|
530
|
+
remediation: 'Remove this bundled dependency immediately.'
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Analyze package metadata for suspicious patterns
|
|
538
|
+
*/
|
|
539
|
+
private analyzeMetadata(pkg: Record<string, unknown>): void {
|
|
540
|
+
// Check for suspicious repository URLs
|
|
541
|
+
if (pkg.repository) {
|
|
542
|
+
const repoUrl = typeof pkg.repository === 'string'
|
|
543
|
+
? pkg.repository
|
|
544
|
+
: (pkg.repository as Record<string, string>).url;
|
|
545
|
+
|
|
546
|
+
if (repoUrl) {
|
|
547
|
+
// Check for IP-based repository URLs
|
|
548
|
+
if (/https?:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/.test(repoUrl)) {
|
|
549
|
+
this.findings.push({
|
|
550
|
+
type: PackageJsonFindingType.SUSPICIOUS_DEPENDENCY,
|
|
551
|
+
name: 'IP-Based Repository URL',
|
|
552
|
+
description: 'Repository uses a raw IP address instead of a domain',
|
|
553
|
+
severity: Severity.HIGH,
|
|
554
|
+
threatType: ThreatType.SUSPICIOUS_NETWORK,
|
|
555
|
+
category: FindingCategory.MALWARE,
|
|
556
|
+
field: 'repository',
|
|
557
|
+
value: repoUrl,
|
|
558
|
+
confidence: 75,
|
|
559
|
+
remediation: 'Verify the repository is legitimate.'
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// Check for non-standard git hosts
|
|
564
|
+
const trustedHosts = ['github.com', 'gitlab.com', 'bitbucket.org', 'dev.azure.com'];
|
|
565
|
+
const isStandardHost = trustedHosts.some(host => repoUrl.includes(host));
|
|
566
|
+
if (!isStandardHost && repoUrl.includes('://')) {
|
|
567
|
+
this.findings.push({
|
|
568
|
+
type: PackageJsonFindingType.SUSPICIOUS_DEPENDENCY,
|
|
569
|
+
name: 'Non-Standard Repository Host',
|
|
570
|
+
description: 'Repository is hosted on a non-standard git host',
|
|
571
|
+
severity: Severity.LOW,
|
|
572
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
573
|
+
category: FindingCategory.CODE_SMELL,
|
|
574
|
+
field: 'repository',
|
|
575
|
+
value: repoUrl,
|
|
576
|
+
confidence: 50,
|
|
577
|
+
remediation: 'Verify the repository host is trustworthy.'
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
// Check for very new package (less relevant for static analysis, but worth noting)
|
|
584
|
+
// This would normally require npm API access
|
|
585
|
+
|
|
586
|
+
// Check for private registry configuration
|
|
587
|
+
if (pkg.publishConfig && typeof pkg.publishConfig === 'object') {
|
|
588
|
+
const publishConfig = pkg.publishConfig as Record<string, string>;
|
|
589
|
+
if (publishConfig.registry && !publishConfig.registry.includes('registry.npmjs.org')) {
|
|
590
|
+
this.findings.push({
|
|
591
|
+
type: PackageJsonFindingType.PRIVATE_REGISTRY,
|
|
592
|
+
name: 'Private Registry Configuration',
|
|
593
|
+
description: 'Package is configured to publish to a private registry',
|
|
594
|
+
severity: Severity.INFO,
|
|
595
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
596
|
+
category: FindingCategory.CODE_SMELL,
|
|
597
|
+
field: 'publishConfig.registry',
|
|
598
|
+
value: publishConfig.registry,
|
|
599
|
+
confidence: 60,
|
|
600
|
+
remediation: 'Verify the registry configuration is intentional.'
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
/**
|
|
607
|
+
* Check if content looks obfuscated
|
|
608
|
+
*/
|
|
609
|
+
private looksObfuscated(content: string): boolean {
|
|
610
|
+
// Check for base64-like patterns
|
|
611
|
+
if (/[A-Za-z0-9+/=]{100,}/.test(content)) return true;
|
|
612
|
+
|
|
613
|
+
// Check for heavy use of hex escapes
|
|
614
|
+
if (/(?:\\x[0-9a-f]{2}){20,}/i.test(content)) return true;
|
|
615
|
+
|
|
616
|
+
// Check for unicode escapes
|
|
617
|
+
if (/(?:\\u[0-9a-f]{4}){15,}/i.test(content)) return true;
|
|
618
|
+
|
|
619
|
+
// Check for very long single-line strings
|
|
620
|
+
if (content.length > 500 && !content.includes(' ') && !content.includes('\n')) return true;
|
|
621
|
+
|
|
622
|
+
return false;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
export default PackageJsonAnalyzer;
|