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,630 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taint Analysis Module for JavaScript/TypeScript
|
|
3
|
+
* Tracks data flow from untrusted sources to dangerous sinks
|
|
4
|
+
*
|
|
5
|
+
* Inspired by CodeQL's taint tracking methodology
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { SourceLocation, Severity, ThreatType, FindingCategory, SecurityStandard } from '../../types';
|
|
9
|
+
import { getStandardsForThreat } from '../../rules/standards';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Represents a taint source - where untrusted data enters
|
|
13
|
+
*/
|
|
14
|
+
export interface TaintSource {
|
|
15
|
+
/** Source type identifier */
|
|
16
|
+
type: string;
|
|
17
|
+
/** Pattern to match the source */
|
|
18
|
+
pattern: RegExp;
|
|
19
|
+
/** Description of the source */
|
|
20
|
+
description: string;
|
|
21
|
+
/** Variable capture group index in regex */
|
|
22
|
+
captureGroup?: number;
|
|
23
|
+
/** Context hints for better detection */
|
|
24
|
+
contextHints?: string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Represents a taint sink - dangerous operations
|
|
29
|
+
*/
|
|
30
|
+
export interface TaintSink {
|
|
31
|
+
/** Sink type identifier */
|
|
32
|
+
type: string;
|
|
33
|
+
/** Pattern to match the sink */
|
|
34
|
+
pattern: RegExp;
|
|
35
|
+
/** Threat type this sink can cause */
|
|
36
|
+
threatType: ThreatType;
|
|
37
|
+
/** Severity level */
|
|
38
|
+
severity: Severity;
|
|
39
|
+
/** Description of the vulnerability */
|
|
40
|
+
description: string;
|
|
41
|
+
/** CWE/OWASP references */
|
|
42
|
+
standards?: SecurityStandard[];
|
|
43
|
+
/** Remediation advice */
|
|
44
|
+
remediation: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Represents a taint flow from source to sink
|
|
49
|
+
*/
|
|
50
|
+
export interface TaintFlow {
|
|
51
|
+
/** The source of tainted data */
|
|
52
|
+
source: {
|
|
53
|
+
type: string;
|
|
54
|
+
variable: string;
|
|
55
|
+
line: number;
|
|
56
|
+
code: string;
|
|
57
|
+
};
|
|
58
|
+
/** The sink where tainted data is used */
|
|
59
|
+
sink: {
|
|
60
|
+
type: string;
|
|
61
|
+
line: number;
|
|
62
|
+
code: string;
|
|
63
|
+
threatType: ThreatType;
|
|
64
|
+
severity: Severity;
|
|
65
|
+
};
|
|
66
|
+
/** Intermediate steps (if any) */
|
|
67
|
+
propagation: {
|
|
68
|
+
variable: string;
|
|
69
|
+
line: number;
|
|
70
|
+
code: string;
|
|
71
|
+
}[];
|
|
72
|
+
/** Confidence score 0-100 */
|
|
73
|
+
confidence: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Taint sources - entry points for untrusted data
|
|
78
|
+
*/
|
|
79
|
+
export const TAINT_SOURCES: TaintSource[] = [
|
|
80
|
+
// Express/Node.js request data
|
|
81
|
+
{
|
|
82
|
+
type: 'request_body',
|
|
83
|
+
pattern: /\breq(?:uest)?\.body(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
84
|
+
description: 'User input from request body',
|
|
85
|
+
contextHints: ['express', 'http', 'request']
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: 'request_query',
|
|
89
|
+
pattern: /\breq(?:uest)?\.query(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
90
|
+
description: 'User input from query string',
|
|
91
|
+
contextHints: ['express', 'http', 'request']
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
type: 'request_params',
|
|
95
|
+
pattern: /\breq(?:uest)?\.params(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
96
|
+
description: 'User input from URL parameters',
|
|
97
|
+
contextHints: ['express', 'http', 'request']
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
type: 'request_headers',
|
|
101
|
+
pattern: /\breq(?:uest)?\.headers(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
102
|
+
description: 'User-controlled HTTP headers',
|
|
103
|
+
contextHints: ['express', 'http', 'request']
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
type: 'request_cookies',
|
|
107
|
+
pattern: /\breq(?:uest)?\.cookies(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
108
|
+
description: 'User-controlled cookies',
|
|
109
|
+
contextHints: ['express', 'cookie']
|
|
110
|
+
},
|
|
111
|
+
// Browser APIs
|
|
112
|
+
{
|
|
113
|
+
type: 'url_location',
|
|
114
|
+
pattern: /\b(?:window\.)?location\.(?:href|search|hash|pathname)/g,
|
|
115
|
+
description: 'Browser URL location (user-controllable)',
|
|
116
|
+
contextHints: ['browser', 'window', 'document']
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
type: 'document_url',
|
|
120
|
+
pattern: /\bdocument\.(?:URL|documentURI|referrer)/g,
|
|
121
|
+
description: 'Document URL properties',
|
|
122
|
+
contextHints: ['browser', 'document']
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
type: 'url_search_params',
|
|
126
|
+
pattern: /new\s+URLSearchParams\s*\([^)]*\)\.get\s*\(/g,
|
|
127
|
+
description: 'URL search parameters',
|
|
128
|
+
contextHints: ['browser', 'URL']
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
type: 'local_storage',
|
|
132
|
+
pattern: /\b(?:localStorage|sessionStorage)\.getItem\s*\(['"`](\w+)['"`]\)/g,
|
|
133
|
+
description: 'Browser storage (potentially attacker-controlled)',
|
|
134
|
+
contextHints: ['browser', 'storage']
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'post_message',
|
|
138
|
+
pattern: /\bevent\.data\b|\bmessage\.data\b/g,
|
|
139
|
+
description: 'PostMessage data (cross-origin)',
|
|
140
|
+
contextHints: ['postMessage', 'addEventListener', 'message']
|
|
141
|
+
},
|
|
142
|
+
// Environment variables
|
|
143
|
+
{
|
|
144
|
+
type: 'env_variable',
|
|
145
|
+
pattern: /\bprocess\.env(?:\[['"`](\w+)['"`]\]|\.(\w+))/g,
|
|
146
|
+
description: 'Environment variable (may contain sensitive data)',
|
|
147
|
+
contextHints: ['node', 'process', 'env']
|
|
148
|
+
},
|
|
149
|
+
// Form data
|
|
150
|
+
{
|
|
151
|
+
type: 'form_data',
|
|
152
|
+
pattern: /\b(?:formData|form)\.get\s*\(['"`](\w+)['"`]\)/g,
|
|
153
|
+
description: 'Form input data',
|
|
154
|
+
contextHints: ['form', 'FormData']
|
|
155
|
+
},
|
|
156
|
+
// File uploads
|
|
157
|
+
{
|
|
158
|
+
type: 'file_upload',
|
|
159
|
+
pattern: /\breq(?:uest)?\.files?(?:\[['"`](\w+)['"`]\]|\.(\w+))?/g,
|
|
160
|
+
description: 'Uploaded file data',
|
|
161
|
+
contextHints: ['multer', 'upload', 'file']
|
|
162
|
+
}
|
|
163
|
+
];
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Taint sinks - dangerous operations
|
|
167
|
+
*/
|
|
168
|
+
export const TAINT_SINKS: TaintSink[] = [
|
|
169
|
+
// Code Execution (RCE)
|
|
170
|
+
{
|
|
171
|
+
type: 'eval',
|
|
172
|
+
pattern: /\beval\s*\(/g,
|
|
173
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
174
|
+
severity: Severity.CRITICAL,
|
|
175
|
+
description: 'Direct code execution via eval()',
|
|
176
|
+
remediation: 'Never use eval() with user input. Use safer alternatives like JSON.parse() for data.'
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'function_constructor',
|
|
180
|
+
pattern: /\bnew\s+Function\s*\(/g,
|
|
181
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
182
|
+
severity: Severity.CRITICAL,
|
|
183
|
+
description: 'Dynamic function creation (equivalent to eval)',
|
|
184
|
+
remediation: 'Avoid new Function() with dynamic input. Use predefined functions instead.'
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
type: 'setTimeout_string',
|
|
188
|
+
pattern: /\bsetTimeout\s*\(\s*['"`]/g,
|
|
189
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
190
|
+
severity: Severity.HIGH,
|
|
191
|
+
description: 'setTimeout with string argument (eval-like)',
|
|
192
|
+
remediation: 'Pass a function reference to setTimeout instead of a string.'
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
type: 'setInterval_string',
|
|
196
|
+
pattern: /\bsetInterval\s*\(\s*['"`]/g,
|
|
197
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
198
|
+
severity: Severity.HIGH,
|
|
199
|
+
description: 'setInterval with string argument (eval-like)',
|
|
200
|
+
remediation: 'Pass a function reference to setInterval instead of a string.'
|
|
201
|
+
},
|
|
202
|
+
// Command Injection (OS)
|
|
203
|
+
{
|
|
204
|
+
type: 'child_process_exec',
|
|
205
|
+
pattern: /\b(?:child_process\.)?exec\s*\(/g,
|
|
206
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
207
|
+
severity: Severity.CRITICAL,
|
|
208
|
+
description: 'OS command execution via exec()',
|
|
209
|
+
remediation: 'Use execFile() with argument arrays instead of exec(). Validate and sanitize all inputs.'
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
type: 'child_process_spawn_shell',
|
|
213
|
+
pattern: /\bspawn\s*\([^)]+,\s*\{[^}]*shell\s*:\s*true/g,
|
|
214
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
215
|
+
severity: Severity.CRITICAL,
|
|
216
|
+
description: 'spawn() with shell option (vulnerable to injection)',
|
|
217
|
+
remediation: 'Avoid shell: true in spawn(). Pass arguments as an array.'
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'exec_sync',
|
|
221
|
+
pattern: /\b(?:execSync|spawnSync)\s*\(/g,
|
|
222
|
+
threatType: ThreatType.COMMAND_INJECTION,
|
|
223
|
+
severity: Severity.CRITICAL,
|
|
224
|
+
description: 'Synchronous command execution',
|
|
225
|
+
remediation: 'Use execFileSync() with argument arrays. Never pass user input directly.'
|
|
226
|
+
},
|
|
227
|
+
// XSS Sinks
|
|
228
|
+
{
|
|
229
|
+
type: 'innerHTML',
|
|
230
|
+
pattern: /\.innerHTML\s*=/g,
|
|
231
|
+
threatType: ThreatType.XSS,
|
|
232
|
+
severity: Severity.HIGH,
|
|
233
|
+
description: 'DOM XSS via innerHTML assignment',
|
|
234
|
+
remediation: 'Use textContent for text, or sanitize HTML with DOMPurify before innerHTML.'
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
type: 'outerHTML',
|
|
238
|
+
pattern: /\.outerHTML\s*=/g,
|
|
239
|
+
threatType: ThreatType.XSS,
|
|
240
|
+
severity: Severity.HIGH,
|
|
241
|
+
description: 'DOM XSS via outerHTML assignment',
|
|
242
|
+
remediation: 'Use textContent for text, or sanitize HTML with DOMPurify.'
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
type: 'document_write',
|
|
246
|
+
pattern: /\bdocument\.(?:write|writeln)\s*\(/g,
|
|
247
|
+
threatType: ThreatType.XSS,
|
|
248
|
+
severity: Severity.HIGH,
|
|
249
|
+
description: 'DOM XSS via document.write()',
|
|
250
|
+
remediation: 'Avoid document.write(). Use DOM methods like createElement() and textContent.'
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
type: 'insertAdjacentHTML',
|
|
254
|
+
pattern: /\.insertAdjacentHTML\s*\(/g,
|
|
255
|
+
threatType: ThreatType.XSS,
|
|
256
|
+
severity: Severity.HIGH,
|
|
257
|
+
description: 'DOM XSS via insertAdjacentHTML()',
|
|
258
|
+
remediation: 'Sanitize HTML content with DOMPurify before insertion.'
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
type: 'jquery_html',
|
|
262
|
+
pattern: /\$\([^)]+\)\.html\s*\(/g,
|
|
263
|
+
threatType: ThreatType.XSS,
|
|
264
|
+
severity: Severity.HIGH,
|
|
265
|
+
description: 'DOM XSS via jQuery .html()',
|
|
266
|
+
remediation: 'Use .text() for plain text, or sanitize with DOMPurify before .html().'
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
type: 'jquery_append',
|
|
270
|
+
pattern: /\$\([^)]+\)\.(?:append|prepend|after|before)\s*\(/g,
|
|
271
|
+
threatType: ThreatType.XSS,
|
|
272
|
+
severity: Severity.MEDIUM,
|
|
273
|
+
description: 'Potential DOM XSS via jQuery DOM manipulation',
|
|
274
|
+
remediation: 'Ensure HTML content is sanitized before DOM insertion.'
|
|
275
|
+
},
|
|
276
|
+
// SSRF Sinks
|
|
277
|
+
{
|
|
278
|
+
type: 'fetch',
|
|
279
|
+
pattern: /\bfetch\s*\(/g,
|
|
280
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
281
|
+
severity: Severity.HIGH,
|
|
282
|
+
description: 'Potential SSRF via fetch() with user-controlled URL',
|
|
283
|
+
remediation: 'Validate and whitelist URLs before making requests. Block internal IP ranges.'
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
type: 'axios_request',
|
|
287
|
+
pattern: /\baxios(?:\.(?:get|post|put|delete|patch|request))?\s*\(/g,
|
|
288
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
289
|
+
severity: Severity.HIGH,
|
|
290
|
+
description: 'Potential SSRF via axios with user-controlled URL',
|
|
291
|
+
remediation: 'Validate and whitelist URLs before making requests.'
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
type: 'http_request',
|
|
295
|
+
pattern: /\b(?:http|https)\.(?:get|request)\s*\(/g,
|
|
296
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
297
|
+
severity: Severity.HIGH,
|
|
298
|
+
description: 'Potential SSRF via Node.js HTTP module',
|
|
299
|
+
remediation: 'Validate and whitelist URLs. Block requests to internal networks.'
|
|
300
|
+
},
|
|
301
|
+
// SQL Injection
|
|
302
|
+
{
|
|
303
|
+
type: 'sql_query',
|
|
304
|
+
pattern: /\.query\s*\(\s*['"`](?:SELECT|INSERT|UPDATE|DELETE)/gi,
|
|
305
|
+
threatType: ThreatType.SQL_INJECTION,
|
|
306
|
+
severity: Severity.CRITICAL,
|
|
307
|
+
description: 'Potential SQL injection via raw query',
|
|
308
|
+
remediation: 'Use parameterized queries or prepared statements. Never concatenate user input.'
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
type: 'sql_raw',
|
|
312
|
+
pattern: /\.raw\s*\(\s*['"`]|\.unsafeRaw\s*\(/g,
|
|
313
|
+
threatType: ThreatType.SQL_INJECTION,
|
|
314
|
+
severity: Severity.CRITICAL,
|
|
315
|
+
description: 'Raw SQL query execution',
|
|
316
|
+
remediation: 'Avoid raw SQL. Use ORM methods or parameterized queries.'
|
|
317
|
+
},
|
|
318
|
+
// Path Traversal
|
|
319
|
+
{
|
|
320
|
+
type: 'fs_read',
|
|
321
|
+
pattern: /\b(?:fs\.)?(?:readFile|readFileSync|createReadStream)\s*\(/g,
|
|
322
|
+
threatType: ThreatType.PATH_TRAVERSAL,
|
|
323
|
+
severity: Severity.HIGH,
|
|
324
|
+
description: 'File read with potentially user-controlled path',
|
|
325
|
+
remediation: 'Validate file paths. Use path.resolve() and check against base directory.'
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
type: 'fs_write',
|
|
329
|
+
pattern: /\b(?:fs\.)?(?:writeFile|writeFileSync|createWriteStream|appendFile)\s*\(/g,
|
|
330
|
+
threatType: ThreatType.PATH_TRAVERSAL,
|
|
331
|
+
severity: Severity.HIGH,
|
|
332
|
+
description: 'File write with potentially user-controlled path',
|
|
333
|
+
remediation: 'Validate file paths. Never use user input directly in file operations.'
|
|
334
|
+
},
|
|
335
|
+
// Deserialization
|
|
336
|
+
{
|
|
337
|
+
type: 'json_parse',
|
|
338
|
+
pattern: /\bJSON\.parse\s*\(/g,
|
|
339
|
+
threatType: ThreatType.INSECURE_DESERIALIZATION,
|
|
340
|
+
severity: Severity.MEDIUM,
|
|
341
|
+
description: 'JSON parsing (safe by itself, but check usage)',
|
|
342
|
+
remediation: 'Validate JSON structure after parsing. Be careful with prototype pollution.'
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
type: 'unserialize',
|
|
346
|
+
pattern: /\b(?:unserialize|deserialize)\s*\(/g,
|
|
347
|
+
threatType: ThreatType.INSECURE_DESERIALIZATION,
|
|
348
|
+
severity: Severity.HIGH,
|
|
349
|
+
description: 'Object deserialization (potential RCE)',
|
|
350
|
+
remediation: 'Avoid deserializing untrusted data. Use safe serialization formats.'
|
|
351
|
+
},
|
|
352
|
+
// Header Injection
|
|
353
|
+
{
|
|
354
|
+
type: 'set_header',
|
|
355
|
+
pattern: /\.setHeader\s*\(/g,
|
|
356
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
357
|
+
severity: Severity.MEDIUM,
|
|
358
|
+
description: 'HTTP header injection if value is user-controlled',
|
|
359
|
+
remediation: 'Validate header values. Remove newlines and control characters.'
|
|
360
|
+
},
|
|
361
|
+
// Redirect
|
|
362
|
+
{
|
|
363
|
+
type: 'redirect',
|
|
364
|
+
pattern: /\.redirect\s*\(/g,
|
|
365
|
+
threatType: ThreatType.SECURITY_MISCONFIGURATION,
|
|
366
|
+
severity: Severity.MEDIUM,
|
|
367
|
+
description: 'Open redirect if URL is user-controlled',
|
|
368
|
+
remediation: 'Validate redirect URLs. Only allow relative paths or whitelisted domains.'
|
|
369
|
+
}
|
|
370
|
+
];
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Represents a tracked tainted variable
|
|
374
|
+
*/
|
|
375
|
+
interface TaintedVariable {
|
|
376
|
+
name: string;
|
|
377
|
+
sourceType: string;
|
|
378
|
+
sourceLine: number;
|
|
379
|
+
sourceCode: string;
|
|
380
|
+
assignments: { line: number; code: string }[];
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Taint Analyzer Class
|
|
385
|
+
* Performs intra-procedural taint analysis for JavaScript/TypeScript
|
|
386
|
+
*/
|
|
387
|
+
export class TaintAnalyzer {
|
|
388
|
+
private taintedVariables: Map<string, TaintedVariable> = new Map();
|
|
389
|
+
private lines: string[] = [];
|
|
390
|
+
private filePath: string = '';
|
|
391
|
+
|
|
392
|
+
/**
|
|
393
|
+
* Analyze code for taint flows
|
|
394
|
+
*/
|
|
395
|
+
analyze(content: string, filePath: string): TaintFlow[] {
|
|
396
|
+
this.lines = content.split('\n');
|
|
397
|
+
this.filePath = filePath;
|
|
398
|
+
this.taintedVariables.clear();
|
|
399
|
+
|
|
400
|
+
const flows: TaintFlow[] = [];
|
|
401
|
+
|
|
402
|
+
// Phase 1: Identify taint sources
|
|
403
|
+
this.identifySources();
|
|
404
|
+
|
|
405
|
+
// Phase 2: Track taint propagation
|
|
406
|
+
this.trackPropagation();
|
|
407
|
+
|
|
408
|
+
// Phase 3: Check sinks
|
|
409
|
+
flows.push(...this.checkSinks());
|
|
410
|
+
|
|
411
|
+
return flows;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Phase 1: Identify all taint sources in the code
|
|
416
|
+
*/
|
|
417
|
+
private identifySources(): void {
|
|
418
|
+
for (let i = 0; i < this.lines.length; i++) {
|
|
419
|
+
const line = this.lines[i];
|
|
420
|
+
const lineNum = i + 1;
|
|
421
|
+
|
|
422
|
+
// Check each source pattern
|
|
423
|
+
for (const source of TAINT_SOURCES) {
|
|
424
|
+
// Reset regex lastIndex
|
|
425
|
+
source.pattern.lastIndex = 0;
|
|
426
|
+
|
|
427
|
+
// Check for variable assignment from source
|
|
428
|
+
const assignmentPatterns = [
|
|
429
|
+
// const/let/var x = source
|
|
430
|
+
new RegExp(`(?:const|let|var)\\s+(\\w+)\\s*=\\s*${source.pattern.source}`, 'g'),
|
|
431
|
+
// x = source (reassignment)
|
|
432
|
+
new RegExp(`(\\w+)\\s*=\\s*${source.pattern.source}`, 'g'),
|
|
433
|
+
// destructuring: const { x } = req.body
|
|
434
|
+
new RegExp(`(?:const|let|var)\\s*\\{([^}]+)\\}\\s*=\\s*${source.pattern.source.replace(/\(\?:[^)]+\)?\?/g, '')}`, 'g')
|
|
435
|
+
];
|
|
436
|
+
|
|
437
|
+
for (const pattern of assignmentPatterns) {
|
|
438
|
+
pattern.lastIndex = 0;
|
|
439
|
+
let match;
|
|
440
|
+
while ((match = pattern.exec(line)) !== null) {
|
|
441
|
+
const varNames = match[1].split(',').map(v => v.trim().split(':')[0].trim());
|
|
442
|
+
|
|
443
|
+
for (const varName of varNames) {
|
|
444
|
+
if (varName && /^\w+$/.test(varName)) {
|
|
445
|
+
this.taintedVariables.set(varName, {
|
|
446
|
+
name: varName,
|
|
447
|
+
sourceType: source.type,
|
|
448
|
+
sourceLine: lineNum,
|
|
449
|
+
sourceCode: line.trim(),
|
|
450
|
+
assignments: []
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Phase 2: Track taint propagation through assignments
|
|
462
|
+
*/
|
|
463
|
+
private trackPropagation(): void {
|
|
464
|
+
for (let i = 0; i < this.lines.length; i++) {
|
|
465
|
+
const line = this.lines[i];
|
|
466
|
+
const lineNum = i + 1;
|
|
467
|
+
|
|
468
|
+
// Check for propagation: y = taintedVar or y = something(taintedVar)
|
|
469
|
+
for (const [taintedVar, taintInfo] of this.taintedVariables) {
|
|
470
|
+
// Skip the original source line
|
|
471
|
+
if (lineNum === taintInfo.sourceLine) continue;
|
|
472
|
+
|
|
473
|
+
// Check if tainted variable is used in an assignment
|
|
474
|
+
const propagationPattern = new RegExp(
|
|
475
|
+
`(?:const|let|var)?\\s*(\\w+)\\s*=\\s*(?:[^;]*\\b${taintedVar}\\b[^;]*)`,
|
|
476
|
+
'g'
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
let match;
|
|
480
|
+
while ((match = propagationPattern.exec(line)) !== null) {
|
|
481
|
+
const newVar = match[1];
|
|
482
|
+
if (newVar && newVar !== taintedVar && /^\w+$/.test(newVar)) {
|
|
483
|
+
// Propagate taint to new variable
|
|
484
|
+
if (!this.taintedVariables.has(newVar)) {
|
|
485
|
+
this.taintedVariables.set(newVar, {
|
|
486
|
+
name: newVar,
|
|
487
|
+
sourceType: taintInfo.sourceType,
|
|
488
|
+
sourceLine: taintInfo.sourceLine,
|
|
489
|
+
sourceCode: taintInfo.sourceCode,
|
|
490
|
+
assignments: [{ line: lineNum, code: line.trim() }]
|
|
491
|
+
});
|
|
492
|
+
} else {
|
|
493
|
+
// Add to existing tainted variable's propagation
|
|
494
|
+
const existing = this.taintedVariables.get(newVar)!;
|
|
495
|
+
existing.assignments.push({ line: lineNum, code: line.trim() });
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Phase 3: Check if tainted data reaches sinks
|
|
505
|
+
*/
|
|
506
|
+
private checkSinks(): TaintFlow[] {
|
|
507
|
+
const flows: TaintFlow[] = [];
|
|
508
|
+
|
|
509
|
+
for (let i = 0; i < this.lines.length; i++) {
|
|
510
|
+
const line = this.lines[i];
|
|
511
|
+
const lineNum = i + 1;
|
|
512
|
+
|
|
513
|
+
// Check each sink pattern
|
|
514
|
+
for (const sink of TAINT_SINKS) {
|
|
515
|
+
sink.pattern.lastIndex = 0;
|
|
516
|
+
|
|
517
|
+
if (sink.pattern.test(line)) {
|
|
518
|
+
// Check if any tainted variable is used in this line
|
|
519
|
+
for (const [varName, taintInfo] of this.taintedVariables) {
|
|
520
|
+
const varPattern = new RegExp(`\\b${varName}\\b`);
|
|
521
|
+
if (varPattern.test(line)) {
|
|
522
|
+
// Found taint flow!
|
|
523
|
+
flows.push({
|
|
524
|
+
source: {
|
|
525
|
+
type: taintInfo.sourceType,
|
|
526
|
+
variable: taintInfo.name,
|
|
527
|
+
line: taintInfo.sourceLine,
|
|
528
|
+
code: taintInfo.sourceCode
|
|
529
|
+
},
|
|
530
|
+
sink: {
|
|
531
|
+
type: sink.type,
|
|
532
|
+
line: lineNum,
|
|
533
|
+
code: line.trim(),
|
|
534
|
+
threatType: sink.threatType,
|
|
535
|
+
severity: sink.severity
|
|
536
|
+
},
|
|
537
|
+
propagation: taintInfo.assignments.map(a => ({ ...a, variable: taintInfo.name })),
|
|
538
|
+
confidence: this.calculateConfidence(taintInfo, sink, lineNum)
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Also check for direct source-to-sink (no intermediate variable)
|
|
544
|
+
for (const source of TAINT_SOURCES) {
|
|
545
|
+
source.pattern.lastIndex = 0;
|
|
546
|
+
if (source.pattern.test(line)) {
|
|
547
|
+
flows.push({
|
|
548
|
+
source: {
|
|
549
|
+
type: source.type,
|
|
550
|
+
variable: 'direct',
|
|
551
|
+
line: lineNum,
|
|
552
|
+
code: line.trim()
|
|
553
|
+
},
|
|
554
|
+
sink: {
|
|
555
|
+
type: sink.type,
|
|
556
|
+
line: lineNum,
|
|
557
|
+
code: line.trim(),
|
|
558
|
+
threatType: sink.threatType,
|
|
559
|
+
severity: sink.severity
|
|
560
|
+
},
|
|
561
|
+
propagation: [],
|
|
562
|
+
confidence: 95 // High confidence for direct flows
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Deduplicate flows
|
|
571
|
+
return this.deduplicateFlows(flows);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/**
|
|
575
|
+
* Calculate confidence score for a taint flow
|
|
576
|
+
*/
|
|
577
|
+
private calculateConfidence(
|
|
578
|
+
taintInfo: TaintedVariable,
|
|
579
|
+
sink: TaintSink,
|
|
580
|
+
sinkLine: number
|
|
581
|
+
): number {
|
|
582
|
+
let confidence = 70; // Base confidence
|
|
583
|
+
|
|
584
|
+
// Higher confidence for shorter flows
|
|
585
|
+
const distance = Math.abs(sinkLine - taintInfo.sourceLine);
|
|
586
|
+
if (distance < 5) confidence += 15;
|
|
587
|
+
else if (distance < 20) confidence += 10;
|
|
588
|
+
else if (distance > 100) confidence -= 10;
|
|
589
|
+
|
|
590
|
+
// Higher confidence for fewer propagation steps
|
|
591
|
+
if (taintInfo.assignments.length === 0) confidence += 10;
|
|
592
|
+
else if (taintInfo.assignments.length > 5) confidence -= 15;
|
|
593
|
+
|
|
594
|
+
// Adjust based on sink severity
|
|
595
|
+
if (sink.severity === Severity.CRITICAL) confidence += 5;
|
|
596
|
+
|
|
597
|
+
// Cap confidence
|
|
598
|
+
return Math.max(50, Math.min(100, confidence));
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Remove duplicate flows
|
|
603
|
+
*/
|
|
604
|
+
private deduplicateFlows(flows: TaintFlow[]): TaintFlow[] {
|
|
605
|
+
const seen = new Set<string>();
|
|
606
|
+
return flows.filter(flow => {
|
|
607
|
+
const key = `${flow.source.type}:${flow.source.line}:${flow.sink.type}:${flow.sink.line}`;
|
|
608
|
+
if (seen.has(key)) return false;
|
|
609
|
+
seen.add(key);
|
|
610
|
+
return true;
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Get human-readable description for a source type
|
|
616
|
+
*/
|
|
617
|
+
static getSourceDescription(sourceType: string): string {
|
|
618
|
+
const source = TAINT_SOURCES.find(s => s.type === sourceType);
|
|
619
|
+
return source?.description || 'User-controlled input';
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Get sink information
|
|
624
|
+
*/
|
|
625
|
+
static getSinkInfo(sinkType: string): TaintSink | undefined {
|
|
626
|
+
return TAINT_SINKS.find(s => s.type === sinkType);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
export default TaintAnalyzer;
|