codeslick-cli 1.0.0
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 +458 -0
- package/__tests__/cli-reporter.test.ts +86 -0
- package/__tests__/config-loader.test.ts +247 -0
- package/__tests__/local-scanner.test.ts +245 -0
- package/bin/codeslick.cjs +153 -0
- package/dist/packages/cli/src/commands/auth.d.ts +36 -0
- package/dist/packages/cli/src/commands/auth.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/auth.js +226 -0
- package/dist/packages/cli/src/commands/auth.js.map +1 -0
- package/dist/packages/cli/src/commands/config.d.ts +37 -0
- package/dist/packages/cli/src/commands/config.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/config.js +196 -0
- package/dist/packages/cli/src/commands/config.js.map +1 -0
- package/dist/packages/cli/src/commands/init.d.ts +32 -0
- package/dist/packages/cli/src/commands/init.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/init.js +171 -0
- package/dist/packages/cli/src/commands/init.js.map +1 -0
- package/dist/packages/cli/src/commands/scan.d.ts +40 -0
- package/dist/packages/cli/src/commands/scan.d.ts.map +1 -0
- package/dist/packages/cli/src/commands/scan.js +204 -0
- package/dist/packages/cli/src/commands/scan.js.map +1 -0
- package/dist/packages/cli/src/config/config-loader.d.ts +67 -0
- package/dist/packages/cli/src/config/config-loader.d.ts.map +1 -0
- package/dist/packages/cli/src/config/config-loader.js +146 -0
- package/dist/packages/cli/src/config/config-loader.js.map +1 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts +69 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -0
- package/dist/packages/cli/src/reporters/cli-reporter.js +244 -0
- package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -0
- package/dist/packages/cli/src/scanner/local-scanner.d.ts +92 -0
- package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -0
- package/dist/packages/cli/src/scanner/local-scanner.js +221 -0
- package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts +88 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js +371 -0
- package/dist/src/lib/analyzers/helpers/ai-code-detection-utils.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts +63 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.js +95 -0
- package/dist/src/lib/analyzers/helpers/jsx-helpers.js.map +1 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts +59 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.js +231 -0
- package/dist/src/lib/analyzers/helpers/variable-tracker.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.js +129 -0
- package/dist/src/lib/analyzers/java/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js +221 -0
- package/dist/src/lib/analyzers/java/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.js +84 -0
- package/dist/src/lib/analyzers/java/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js +161 -0
- package/dist/src/lib/analyzers/java/security-checks/crypto-validation.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js +163 -0
- package/dist/src/lib/analyzers/java/security-checks/deserialization-xxe.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts +24 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js +178 -0
- package/dist/src/lib/analyzers/java/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.js +179 -0
- package/dist/src/lib/analyzers/java/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts +17 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.js +67 -0
- package/dist/src/lib/analyzers/java/security-checks/file-operations.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts +25 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.js +396 -0
- package/dist/src/lib/analyzers/java/security-checks/framework-security.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js +123 -0
- package/dist/src/lib/analyzers/java/security-checks/hardcoded-credentials.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts +23 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js +201 -0
- package/dist/src/lib/analyzers/java/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.js +121 -0
- package/dist/src/lib/analyzers/java/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.js +89 -0
- package/dist/src/lib/analyzers/java/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js +309 -0
- package/dist/src/lib/analyzers/java/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts +18 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js +114 -0
- package/dist/src/lib/analyzers/java/security-checks/unsafe-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/java/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts +209 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.js +1720 -0
- package/dist/src/lib/analyzers/java-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +123 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts +44 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js +224 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/async-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts +50 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js +284 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/code-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js +86 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/comparison-issues.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts +32 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +44 -0
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts +22 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.js +168 -0
- package/dist/src/lib/analyzers/javascript/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js +232 -0
- package/dist/src/lib/analyzers/javascript/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js +222 -0
- package/dist/src/lib/analyzers/javascript/security-checks/authentication-failures.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js +176 -0
- package/dist/src/lib/analyzers/javascript/security-checks/credential-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js +113 -0
- package/dist/src/lib/analyzers/javascript/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js +227 -0
- package/dist/src/lib/analyzers/javascript/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts +32 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js +260 -0
- package/dist/src/lib/analyzers/javascript/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts +26 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js +164 -0
- package/dist/src/lib/analyzers/javascript/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js +775 -0
- package/dist/src/lib/analyzers/javascript/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts +25 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js +168 -0
- package/dist/src/lib/analyzers/javascript/security-checks/software-integrity.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts +27 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js +108 -0
- package/dist/src/lib/analyzers/javascript/security-checks/storage-security.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts +28 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js +143 -0
- package/dist/src/lib/analyzers/javascript/security-checks/xss-dom-security.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts +53 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js +144 -0
- package/dist/src/lib/analyzers/javascript/syntax/syntax-helpers.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts +72 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js +314 -0
- package/dist/src/lib/analyzers/javascript/syntax/typescript-syntax.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/javascript/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts +36 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js +70 -0
- package/dist/src/lib/analyzers/javascript/utils/metrics-calculator.js.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts +29 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js +55 -0
- package/dist/src/lib/analyzers/javascript/utils/performance-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts +95 -0
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/javascript-analyzer.js +2141 -0
- package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts +21 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.js +305 -0
- package/dist/src/lib/analyzers/python/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js +242 -0
- package/dist/src/lib/analyzers/python/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js +207 -0
- package/dist/src/lib/analyzers/python/security-checks/authentication-flaws.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts +27 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.js +206 -0
- package/dist/src/lib/analyzers/python/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js +113 -0
- package/dist/src/lib/analyzers/python/security-checks/credentials-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js +129 -0
- package/dist/src/lib/analyzers/python/security-checks/crypto-failures.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts +19 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.js +90 -0
- package/dist/src/lib/analyzers/python/security-checks/data-integrity.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.js +68 -0
- package/dist/src/lib/analyzers/python/security-checks/deserialization.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts +25 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.js +180 -0
- package/dist/src/lib/analyzers/python/security-checks/django-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js +127 -0
- package/dist/src/lib/analyzers/python/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.js +120 -0
- package/dist/src/lib/analyzers/python/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts +24 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.js +143 -0
- package/dist/src/lib/analyzers/python/security-checks/flask-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts +28 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js +174 -0
- package/dist/src/lib/analyzers/python/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.js +160 -0
- package/dist/src/lib/analyzers/python/security-checks/insecure-design.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts +20 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.js +121 -0
- package/dist/src/lib/analyzers/python/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js +248 -0
- package/dist/src/lib/analyzers/python/security-checks/nosql-injection.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js +375 -0
- package/dist/src/lib/analyzers/python/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts +26 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js +160 -0
- package/dist/src/lib/analyzers/python/security-checks/ssrf-detection.js.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts +23 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.js +117 -0
- package/dist/src/lib/analyzers/python/security-checks/web-security.js.map +1 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/python/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts +111 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.js +1600 -0
- package/dist/src/lib/analyzers/python-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +14 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js +47 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +13 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js +36 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +12 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js +45 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +14 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js +47 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +13 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js +36 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.js +32 -0
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js +68 -0
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +16 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.js +79 -0
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +15 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.js +58 -0
- package/dist/src/lib/analyzers/secrets/patterns/tokens.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +88 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +162 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts +56 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.js +199 -0
- package/dist/src/lib/analyzers/secrets/validators/context-checker.js.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts +56 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js +102 -0
- package/dist/src/lib/analyzers/secrets/validators/entropy-checker.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.d.ts +38 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.js +125 -0
- package/dist/src/lib/analyzers/security-checks/es6-security.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts +46 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.js +92 -0
- package/dist/src/lib/analyzers/security-checks/python-async-security.js.map +1 -0
- package/dist/src/lib/analyzers/security-checks/react-security.d.ts +49 -0
- package/dist/src/lib/analyzers/security-checks/react-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/security-checks/react-security.js +125 -0
- package/dist/src/lib/analyzers/security-checks/react-security.js.map +1 -0
- package/dist/src/lib/analyzers/types.d.ts +92 -0
- package/dist/src/lib/analyzers/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/types.js +3 -0
- package/dist/src/lib/analyzers/types.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.js +210 -0
- package/dist/src/lib/analyzers/typescript/security-checks/access-control.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts +25 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js +242 -0
- package/dist/src/lib/analyzers/typescript/security-checks/ai-generated-code.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts +28 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.js +357 -0
- package/dist/src/lib/analyzers/typescript/security-checks/authentication.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts +26 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js +380 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-injection.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js +109 -0
- package/dist/src/lib/analyzers/typescript/security-checks/code-quality.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts +21 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js +153 -0
- package/dist/src/lib/analyzers/typescript/security-checks/credentials-crypto.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js +146 -0
- package/dist/src/lib/analyzers/typescript/security-checks/enhanced-supply-chain.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts +23 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js +187 -0
- package/dist/src/lib/analyzers/typescript/security-checks/exception-handling.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js +97 -0
- package/dist/src/lib/analyzers/typescript/security-checks/information-disclosure.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts +29 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js +319 -0
- package/dist/src/lib/analyzers/typescript/security-checks/injection-attacks.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts +21 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js +121 -0
- package/dist/src/lib/analyzers/typescript/security-checks/logging-failures.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts +27 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js +213 -0
- package/dist/src/lib/analyzers/typescript/security-checks/security-misconfiguration.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts +19 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +59 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/type-checker.d.ts +17 -0
- package/dist/src/lib/analyzers/typescript/type-checker.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/type-checker.js +515 -0
- package/dist/src/lib/analyzers/typescript/type-checker.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts +58 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js +71 -0
- package/dist/src/lib/analyzers/typescript/utils/createVulnerability.js.map +1 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts +116 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js +1660 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -0
- package/dist/src/lib/security/compliance-mapping.d.ts +29 -0
- package/dist/src/lib/security/compliance-mapping.d.ts.map +1 -0
- package/dist/src/lib/security/compliance-mapping.js +1342 -0
- package/dist/src/lib/security/compliance-mapping.js.map +1 -0
- package/dist/src/lib/security/severity-scoring.d.ts +47 -0
- package/dist/src/lib/security/severity-scoring.d.ts.map +1 -0
- package/dist/src/lib/security/severity-scoring.js +965 -0
- package/dist/src/lib/security/severity-scoring.js.map +1 -0
- package/dist/src/lib/standards/references.d.ts +16 -0
- package/dist/src/lib/standards/references.d.ts.map +1 -0
- package/dist/src/lib/standards/references.js +1161 -0
- package/dist/src/lib/standards/references.js.map +1 -0
- package/dist/src/lib/types/index.d.ts +167 -0
- package/dist/src/lib/types/index.d.ts.map +1 -0
- package/dist/src/lib/types/index.js +3 -0
- package/dist/src/lib/types/index.js.map +1 -0
- package/dist/src/lib/utils/code-cleaner.d.ts +59 -0
- package/dist/src/lib/utils/code-cleaner.d.ts.map +1 -0
- package/dist/src/lib/utils/code-cleaner.js +283 -0
- package/dist/src/lib/utils/code-cleaner.js.map +1 -0
- package/package.json +51 -0
- package/src/commands/auth.ts +308 -0
- package/src/commands/config.ts +226 -0
- package/src/commands/init.ts +202 -0
- package/src/commands/scan.ts +238 -0
- package/src/config/config-loader.ts +175 -0
- package/src/reporters/cli-reporter.ts +282 -0
- package/src/scanner/local-scanner.ts +250 -0
- package/tsconfig.json +24 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JavaScript Injection Attack Detection Module
|
|
4
|
+
*
|
|
5
|
+
* Detects critical injection vulnerabilities:
|
|
6
|
+
* - Code injection (eval, Function constructor, setTimeout/setInterval)
|
|
7
|
+
* - SQL injection patterns
|
|
8
|
+
* - Command injection
|
|
9
|
+
* - Path traversal
|
|
10
|
+
* - Regex DoS (ReDoS)
|
|
11
|
+
*
|
|
12
|
+
* Part of modularized JavaScript analyzer (150-300 LOC per module)
|
|
13
|
+
* Extracted from monolithic javascript-analyzer.ts (2,672 LOC)
|
|
14
|
+
*
|
|
15
|
+
* @module injection-attacks
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.checkInjectionAttacks = checkInjectionAttacks;
|
|
19
|
+
/**
|
|
20
|
+
* Check for injection attack vulnerabilities in JavaScript code
|
|
21
|
+
*
|
|
22
|
+
* @param code - Full source code
|
|
23
|
+
* @param createVulnerability - Function to create vulnerability objects
|
|
24
|
+
* @returns Array of detected vulnerabilities
|
|
25
|
+
*/
|
|
26
|
+
function checkInjectionAttacks(code, createVulnerability) {
|
|
27
|
+
const vulnerabilities = [];
|
|
28
|
+
const lines = code.split('\n');
|
|
29
|
+
let inMultiLineComment = false;
|
|
30
|
+
lines.forEach((line, index) => {
|
|
31
|
+
const lineNumber = index + 1;
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
// Track multi-line comment blocks
|
|
34
|
+
if (trimmed.includes('/*')) {
|
|
35
|
+
inMultiLineComment = true;
|
|
36
|
+
}
|
|
37
|
+
if (trimmed.includes('*/')) {
|
|
38
|
+
inMultiLineComment = false;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Skip comments and empty lines
|
|
42
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('//') || trimmed.startsWith('*')) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// OWASP A03:2021 - Injection
|
|
46
|
+
// 1. eval() - CRITICAL
|
|
47
|
+
const lineWithoutStrings = removeStringLiterals(trimmed);
|
|
48
|
+
if (lineWithoutStrings.includes('eval(')) {
|
|
49
|
+
vulnerabilities.push(createVulnerability('eval-usage', 'eval() allows arbitrary code execution', 'Use JSON.parse() for data or refactor code to avoid dynamic execution', lineNumber, 'An attacker can inject malicious code through any input that reaches eval(), enabling complete control over the application\'s execution context.', 'eval(userInput) where userInput = "require(\'child_process\').exec(\'rm -rf /\')"', [
|
|
50
|
+
'Remote Code Execution (RCE)',
|
|
51
|
+
'Complete system compromise',
|
|
52
|
+
'Data theft and exfiltration',
|
|
53
|
+
'Malware installation'
|
|
54
|
+
], 'const result = eval(userInput);', 'const result = JSON.parse(userInput); // For data only', 'Replace eval() with JSON.parse() for data parsing, or refactor code to avoid dynamic execution entirely'));
|
|
55
|
+
}
|
|
56
|
+
// 2. Function constructor - HIGH
|
|
57
|
+
if (trimmed.match(/new\s+Function\s*\(/)) {
|
|
58
|
+
vulnerabilities.push(createVulnerability('function-constructor', 'Function constructor allows code injection similar to eval()', 'Avoid creating functions dynamically from strings', lineNumber, 'The Function constructor creates functions from strings at runtime, allowing arbitrary code execution if the input is attacker-controlled.', 'new Function(userInput)() where userInput = "return process.env"', [
|
|
59
|
+
'Code injection',
|
|
60
|
+
'Access to sensitive data',
|
|
61
|
+
'Bypass of security restrictions',
|
|
62
|
+
'Remote code execution in certain contexts'
|
|
63
|
+
], 'const fn = new Function(userCode); fn();', '// Refactor to avoid dynamic code generation\n// Use predefined functions or safer alternatives', 'Eliminate dynamic function creation. Use predefined functions, configuration objects, or refactor the architecture'));
|
|
64
|
+
}
|
|
65
|
+
// 3. setTimeout/setInterval with strings or variables - MEDIUM
|
|
66
|
+
if (trimmed.match(/set(Timeout|Interval)\s*\(\s*['"]/) ||
|
|
67
|
+
trimmed.match(/set(Timeout|Interval)\s*\(\s*[a-zA-Z_$][a-zA-Z0-9_$]*\s*,/)) {
|
|
68
|
+
vulnerabilities.push(createVulnerability('settimeout-string', 'setTimeout/setInterval with string or code variable executes code like eval()', 'Use function reference or arrow function instead', lineNumber, 'Passing a string or variable containing code to setTimeout/setInterval causes it to be evaluated as code, similar to eval().', 'setTimeout("alert(userInput)", 1000) or setTimeout(code, 1000) where code/userInput is attacker-controlled', [
|
|
69
|
+
'Code injection via timing functions',
|
|
70
|
+
'XSS attacks',
|
|
71
|
+
'Bypass of CSP (Content Security Policy)'
|
|
72
|
+
], 'setTimeout("doSomething()", 1000); // or setTimeout(code, 1000);', 'setTimeout(() => doSomething(), 1000);', 'Always pass a function reference or arrow function to setTimeout/setInterval, never a string or variable containing code'));
|
|
73
|
+
}
|
|
74
|
+
// 4. SQL Injection patterns - CRITICAL
|
|
75
|
+
if ((trimmed.match(/SELECT.*FROM.*WHERE.*[+`]/i) || trimmed.match(/SELECT.*FROM.*WHERE.*\$\{/i)) ||
|
|
76
|
+
trimmed.match(/query\s*=\s*[`'"].*\+/) ||
|
|
77
|
+
trimmed.match(/execute\(.*\+/)) {
|
|
78
|
+
vulnerabilities.push(createVulnerability('sql-injection', 'SQL Injection vulnerability detected', 'Use parameterized queries or prepared statements', lineNumber, 'An attacker can inject malicious SQL code through user input, bypassing authentication and accessing/modifying the entire database.', 'username = "admin\' OR \'1\'=\'1" results in: SELECT * FROM users WHERE username = \'admin\' OR \'1\'=\'1\'', [
|
|
79
|
+
'Full database access (read/write/delete)',
|
|
80
|
+
'Authentication bypass',
|
|
81
|
+
'Data exfiltration (passwords, credit cards, PII)',
|
|
82
|
+
'Data destruction (DROP TABLE attacks)',
|
|
83
|
+
'Privilege escalation'
|
|
84
|
+
], 'const query = "SELECT * FROM users WHERE id = " + userId;', 'const query = "SELECT * FROM users WHERE id = ?"; \ndb.query(query, [userId]);', 'Use parameterized queries where inputs are passed as separate parameters, never concatenated into the SQL string'));
|
|
85
|
+
}
|
|
86
|
+
// 5. Command Injection - CRITICAL
|
|
87
|
+
if (trimmed.match(/exec\(|spawn\(|execFile\(/) && (trimmed.includes('+') || trimmed.includes('${'))) {
|
|
88
|
+
vulnerabilities.push(createVulnerability('command-injection', 'Command Injection vulnerability detected', 'Use execFile() with array arguments, validate/sanitize all inputs', lineNumber, 'Concatenating user input into shell commands allows attackers to execute arbitrary system commands with the application\'s privileges.', 'exec("ls " + userInput) where userInput = "; rm -rf /" executes malicious command', [
|
|
89
|
+
'Remote Code Execution (RCE)',
|
|
90
|
+
'Complete system compromise',
|
|
91
|
+
'Data deletion',
|
|
92
|
+
'Privilege escalation',
|
|
93
|
+
'Backdoor installation'
|
|
94
|
+
], 'const { exec } = require("child_process");\nexec("ls " + userDir);', 'const { execFile } = require("child_process");\nexecFile("ls", [userDir]); // Arguments passed safely as array', 'Use execFile() with array of arguments, never concatenate strings. Validate all inputs against whitelist'));
|
|
95
|
+
}
|
|
96
|
+
// 6. Path Traversal - HIGH
|
|
97
|
+
if (trimmed.match(/readFile|writeFile|unlink|rmdir|createReadStream|createWriteStream/)) {
|
|
98
|
+
const hasTraversalPattern = trimmed.match(/\.\.\/|\.\.\\|\+.*path/);
|
|
99
|
+
const hasUserInput = trimmed.match(/req\.query|req\.body|req\.params|params\.|query\.|body\./);
|
|
100
|
+
if (hasTraversalPattern || hasUserInput) {
|
|
101
|
+
vulnerabilities.push(createVulnerability('path-traversal', 'Path Traversal vulnerability - unrestricted file access', 'Use path.resolve(), validate against whitelist, restrict to safe directories', lineNumber, 'Path traversal allows attackers to access files outside intended directories using "../" sequences or by directly passing malicious paths, potentially reading sensitive files like /etc/passwd, configuration files, or source code.', 'fs.readFile(req.query.filePath) where filePath = "../../../etc/passwd" // Attacker can read any file', [
|
|
102
|
+
'Unauthorized file access',
|
|
103
|
+
'Sensitive data exposure (passwords, keys, source code)',
|
|
104
|
+
'Configuration file theft',
|
|
105
|
+
'Potential for code execution if writable files accessed'
|
|
106
|
+
], 'const content = fs.readFileSync(req.query.filePath);', 'const path = require("path");\nconst baseDir = "/safe/upload/directory";\nconst safePath = path.resolve(baseDir, req.query.filePath);\nif (!safePath.startsWith(baseDir)) {\n throw new Error("Invalid path - traversal detected");\n}\nconst content = fs.readFileSync(safePath);', 'Always resolve and validate paths using path.resolve(). Verify the resolved path starts with your allowed base directory. Never trust user input directly in file operations'));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 7. Regex DoS (ReDoS) - MEDIUM
|
|
110
|
+
if (trimmed.match(/new\s+RegExp|\/.*\(.*\)/)) {
|
|
111
|
+
const nestedQuantInside = trimmed.match(/\([^)]*[+*][^)]*\)[+*]/);
|
|
112
|
+
const redundantQuantifier = trimmed.match(/\(\[[^\]]+\]\)[+*]/);
|
|
113
|
+
const complexGroupQuant = trimmed.match(/\([^)]{3,}\)[+*]/);
|
|
114
|
+
if (nestedQuantInside || redundantQuantifier || (complexGroupQuant && nestedQuantInside)) {
|
|
115
|
+
vulnerabilities.push(createVulnerability('regex-dos', 'Regular expression with nested/redundant quantifiers can cause ReDoS', 'Simplify regex pattern: use [a-z]+ instead of ([a-z])+, or use timeout/safe-regex libraries', lineNumber, 'Regular expressions with nested quantifiers can have exponential time complexity, allowing attackers to cause Denial of Service with carefully crafted input. Patterns like ([a-z])+ are redundant and should be simplified to [a-z]+.', 'const regex = /^([a-z0-9_])+@/; // Redundant - testing "aaa...aX" causes backtracking', [
|
|
116
|
+
'Denial of Service (DoS)',
|
|
117
|
+
'Application freeze/timeout',
|
|
118
|
+
'Resource exhaustion',
|
|
119
|
+
'Service unavailability'
|
|
120
|
+
], 'const regex = /^([a-z0-9_])+@/;', 'const regex = /^[a-z0-9_]+@/; // Simplified - no nested quantifiers', 'Simplify regex patterns to avoid nested quantifiers. Use [a-z]+ instead of ([a-z])+. Consider using safe-regex or regex-dos libraries to validate patterns'));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// PHASE B - Server-Side Template Injection (SSTI) (Dec 21, 2025)
|
|
125
|
+
// =============================================================================
|
|
126
|
+
// 8. SSTI - Server-Side Template Injection - CRITICAL
|
|
127
|
+
// Pattern: Handlebars.compile(userInput), Pug.compile(), EJS.render(), etc.
|
|
128
|
+
// Detects template compilation with user-controlled input
|
|
129
|
+
const templateMethods = [
|
|
130
|
+
'Handlebars.compile',
|
|
131
|
+
'Pug.compile',
|
|
132
|
+
'EJS.render',
|
|
133
|
+
'Nunjucks.renderString',
|
|
134
|
+
'res.render'
|
|
135
|
+
];
|
|
136
|
+
for (const method of templateMethods) {
|
|
137
|
+
if (trimmed.includes(method)) {
|
|
138
|
+
// Check for user input being passed to template method
|
|
139
|
+
const hasUserInput = trimmed.includes('req.body') ||
|
|
140
|
+
trimmed.includes('req.query') ||
|
|
141
|
+
trimmed.includes('req.params') ||
|
|
142
|
+
trimmed.includes('request.body') ||
|
|
143
|
+
trimmed.includes('request.query') ||
|
|
144
|
+
trimmed.includes('request.params');
|
|
145
|
+
if (hasUserInput) {
|
|
146
|
+
vulnerabilities.push(createVulnerability('ssti', `Server-Side Template Injection via ${method}() with user-controlled template`, 'Never compile user input as templates - only use user data in template variables', lineNumber, `Template engines like Handlebars, Pug, EJS, and Nunjucks execute code when compiling templates. If attackers control the template string, they can inject template expressions that execute arbitrary code on the server, leading to Remote Code Execution (RCE).`, `${method}(req.body.template) // Attack: template = "{{constructor.constructor('return process.env')()}}" exposes all environment variables including secrets`, [
|
|
147
|
+
'Remote Code Execution (RCE)',
|
|
148
|
+
'Complete server takeover',
|
|
149
|
+
'Environment variable disclosure (API keys, secrets)',
|
|
150
|
+
'File system access and data exfiltration',
|
|
151
|
+
'Denial of Service (infinite loops)',
|
|
152
|
+
'Lateral movement to other services'
|
|
153
|
+
], `const template = req.query.template;\nconst compiled = ${method}(template); // User controls template code!`, `// NEVER compile user input as templates\n// Use user input only as data in pre-defined templates:\nconst template = ${method}('Hello {{name}}'); // Safe: template is hardcoded\nconst result = template({ name: req.body.name }); // User data in variables only`, 'Never allow user input to be used as template code. Always use pre-defined, hardcoded templates and only pass user data as template variables. For dynamic content, use parameterized templates with user input in data context, never in template strings.'));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// =============================================================================
|
|
158
|
+
// 9. LDAP Injection - CRITICAL
|
|
159
|
+
// Pattern: LDAP filter construction with user input via template literals or concatenation
|
|
160
|
+
// Detects: client.search() with user-controlled filters OR filter variable assignments
|
|
161
|
+
// =============================================================================
|
|
162
|
+
// Pattern 1: Filter variable assignment with template literal + user input
|
|
163
|
+
// const filter = `(uid=${req.body.username})`;
|
|
164
|
+
// const dn = `uid=${req.body.user},ou=users,dc=example,dc=com`;
|
|
165
|
+
const hasFilterAssignment = (trimmed.match(/filter\s*[:=]\s*`[^`]*\$\{/) ||
|
|
166
|
+
trimmed.match(/dn\s*[:=]\s*`[^`]*\$\{/)) &&
|
|
167
|
+
(trimmed.includes('req.body') ||
|
|
168
|
+
trimmed.includes('req.query') ||
|
|
169
|
+
trimmed.includes('req.params'));
|
|
170
|
+
// Pattern 2: String concatenation in filter
|
|
171
|
+
// const filter = "(uid=" + req.body.username + ")";
|
|
172
|
+
const hasFilterConcat = (trimmed.match(/filter\s*[:=]\s*['"][^'"]*['"]?\s*\+/) ||
|
|
173
|
+
trimmed.match(/dn\s*[:=]\s*['"][^'"]*['"]?\s*\+/)) &&
|
|
174
|
+
(trimmed.includes('req.body') ||
|
|
175
|
+
trimmed.includes('req.query') ||
|
|
176
|
+
trimmed.includes('req.params'));
|
|
177
|
+
// Pattern 3: LDAP method with inline template literal filter
|
|
178
|
+
// client.search('ou=users', { filter: `(uid=${username})` })
|
|
179
|
+
const hasLDAPMethodWithFilter = trimmed.match(/\.(search|searchOne|bind)\s*\(/) &&
|
|
180
|
+
trimmed.match(/filter\s*:\s*`[^`]*\$\{/) &&
|
|
181
|
+
(trimmed.includes('req.body') ||
|
|
182
|
+
trimmed.includes('req.query') ||
|
|
183
|
+
trimmed.includes('req.params'));
|
|
184
|
+
if (hasFilterAssignment || hasFilterConcat || hasLDAPMethodWithFilter) {
|
|
185
|
+
vulnerabilities.push(createVulnerability('ldap-injection', `LDAP Injection via filter construction with user input`, 'Use parameterized LDAP queries or escape LDAP special characters', lineNumber, 'LDAP queries constructed with unescaped user input allow attackers to manipulate the query logic by injecting LDAP filter operators like *, (, ), &, |, or !. This can bypass authentication, access unauthorized data, or enumerate directory information.', 'const filter = `(uid=${req.body.username})`; // Attack: username = "*)(uid=*))(|(uid=*" bypasses authentication and returns all users', [
|
|
186
|
+
'Authentication bypass (login as any user)',
|
|
187
|
+
'Unauthorized data access (read sensitive directory information)',
|
|
188
|
+
'Directory enumeration (discover user accounts, groups)',
|
|
189
|
+
'Privilege escalation (access admin accounts)',
|
|
190
|
+
'Information disclosure (enumerate organizational structure)'
|
|
191
|
+
], 'const filter = `(uid=${req.body.username})`;\nclient.search(baseDN, { filter }); // Vulnerable', 'import { escape } from "ldap-escape";\nconst safeUsername = escape.filter(req.body.username);\nconst filter = `(uid=${safeUsername})`;\nclient.search(baseDN, { filter }); // Safe: user input escaped', 'Always escape LDAP special characters (*, (, ), &, |, !, =, >, <, ~) in user input before using in filters. Use ldap-escape library or equivalent. Consider using parameterized queries if your LDAP library supports them.'));
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
return vulnerabilities;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Helper: Remove string literals from a line for analysis
|
|
198
|
+
* Replaces content inside strings ('...', "...", `...`) with spaces
|
|
199
|
+
*
|
|
200
|
+
* @param line - Line of code to clean
|
|
201
|
+
* @returns Line with string content replaced by spaces
|
|
202
|
+
*/
|
|
203
|
+
function removeStringLiterals(line) {
|
|
204
|
+
let result = '';
|
|
205
|
+
let inString = false;
|
|
206
|
+
let stringChar = '';
|
|
207
|
+
let inTemplate = false;
|
|
208
|
+
let escaped = false;
|
|
209
|
+
for (let i = 0; i < line.length; i++) {
|
|
210
|
+
const char = line[i];
|
|
211
|
+
// Handle escape sequences
|
|
212
|
+
if (escaped) {
|
|
213
|
+
result += ' ';
|
|
214
|
+
escaped = false;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (char === '\\' && (inString || inTemplate)) {
|
|
218
|
+
escaped = true;
|
|
219
|
+
result += ' ';
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
// Template literal handling
|
|
223
|
+
if (char === '`') {
|
|
224
|
+
if (!inString) {
|
|
225
|
+
inTemplate = !inTemplate;
|
|
226
|
+
result += char;
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
result += ' ';
|
|
230
|
+
}
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
// String literal handling
|
|
234
|
+
if ((char === '"' || char === "'") && !inTemplate) {
|
|
235
|
+
if (!inString) {
|
|
236
|
+
inString = true;
|
|
237
|
+
stringChar = char;
|
|
238
|
+
result += char;
|
|
239
|
+
}
|
|
240
|
+
else if (char === stringChar) {
|
|
241
|
+
inString = false;
|
|
242
|
+
stringChar = '';
|
|
243
|
+
result += char;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
result += ' ';
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
// Replace string content with spaces
|
|
251
|
+
if (inString || inTemplate) {
|
|
252
|
+
result += ' ';
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
result += char;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return result;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=injection-attacks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-attacks.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/javascript/security-checks/injection-attacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Insecure Design Security Checks
|
|
3
|
+
* OWASP A04:2025 - Insecure Design
|
|
4
|
+
*
|
|
5
|
+
* Detects business logic flaws and design-level security issues.
|
|
6
|
+
* This is a NEW category in OWASP 2025 that focuses on fundamental design flaws
|
|
7
|
+
* rather than implementation bugs.
|
|
8
|
+
*
|
|
9
|
+
* Created: Dec 30, 2025
|
|
10
|
+
* Purpose: Detect business logic vulnerabilities that can't be caught by traditional security scanners
|
|
11
|
+
*/
|
|
12
|
+
import { SecurityVulnerability } from '../../types';
|
|
13
|
+
/**
|
|
14
|
+
* Checks for insecure design vulnerabilities in JavaScript code
|
|
15
|
+
*
|
|
16
|
+
* Covers:
|
|
17
|
+
* - Check #1: Client-controlled pricing/discounts (CRITICAL)
|
|
18
|
+
* - Check #2: Client-controlled quantity/amounts in financial operations (HIGH)
|
|
19
|
+
* - Check #3: Missing business rule validation (MEDIUM)
|
|
20
|
+
* - Check #4: Race conditions in state-changing operations (MEDIUM)
|
|
21
|
+
*
|
|
22
|
+
* @param lines - Array of code lines
|
|
23
|
+
* @returns Array of security vulnerabilities found
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkInsecureDesign(lines: string[]): SecurityVulnerability[];
|
|
26
|
+
//# sourceMappingURL=insecure-design.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-design.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/javascript/security-checks/insecure-design.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CA2NzB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* JavaScript Insecure Design Security Checks
|
|
4
|
+
* OWASP A04:2025 - Insecure Design
|
|
5
|
+
*
|
|
6
|
+
* Detects business logic flaws and design-level security issues.
|
|
7
|
+
* This is a NEW category in OWASP 2025 that focuses on fundamental design flaws
|
|
8
|
+
* rather than implementation bugs.
|
|
9
|
+
*
|
|
10
|
+
* Created: Dec 30, 2025
|
|
11
|
+
* Purpose: Detect business logic vulnerabilities that can't be caught by traditional security scanners
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.checkInsecureDesign = checkInsecureDesign;
|
|
15
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
16
|
+
/**
|
|
17
|
+
* Checks for insecure design vulnerabilities in JavaScript code
|
|
18
|
+
*
|
|
19
|
+
* Covers:
|
|
20
|
+
* - Check #1: Client-controlled pricing/discounts (CRITICAL)
|
|
21
|
+
* - Check #2: Client-controlled quantity/amounts in financial operations (HIGH)
|
|
22
|
+
* - Check #3: Missing business rule validation (MEDIUM)
|
|
23
|
+
* - Check #4: Race conditions in state-changing operations (MEDIUM)
|
|
24
|
+
*
|
|
25
|
+
* @param lines - Array of code lines
|
|
26
|
+
* @returns Array of security vulnerabilities found
|
|
27
|
+
*/
|
|
28
|
+
function checkInsecureDesign(lines) {
|
|
29
|
+
const vulnerabilities = [];
|
|
30
|
+
let inMultiLineComment = false;
|
|
31
|
+
lines.forEach((line, index) => {
|
|
32
|
+
const trimmedLine = line.trim();
|
|
33
|
+
// Track multi-line comment blocks (/* ... */)
|
|
34
|
+
if (trimmedLine.includes('/*')) {
|
|
35
|
+
inMultiLineComment = true;
|
|
36
|
+
}
|
|
37
|
+
if (trimmedLine.includes('*/')) {
|
|
38
|
+
inMultiLineComment = false;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Skip comments and empty lines
|
|
42
|
+
if (!trimmedLine ||
|
|
43
|
+
inMultiLineComment ||
|
|
44
|
+
trimmedLine.startsWith('//') ||
|
|
45
|
+
trimmedLine.startsWith('*')) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const lowerLine = trimmedLine.toLowerCase();
|
|
49
|
+
// Check #1: Client-controlled pricing/discounts
|
|
50
|
+
// Pattern: const { price, discount, amount } = req.body; finalPrice = price - discount;
|
|
51
|
+
// This is a critical business logic flaw
|
|
52
|
+
const financialFieldsPattern = /(price|discount|amount|total|subtotal|finalprice|cost)\s*[=:]/i;
|
|
53
|
+
const reqBodyPattern = /req\.body\.(price|discount|amount|total|subtotal|finalprice|cost)/i;
|
|
54
|
+
const destructurePattern = /\{\s*(price|discount|amount|total|subtotal|finalprice|cost)[,\s\}]/i;
|
|
55
|
+
if ((trimmedLine.match(destructurePattern) && trimmedLine.includes('req.body')) ||
|
|
56
|
+
trimmedLine.match(reqBodyPattern)) {
|
|
57
|
+
// Check next 15 lines for direct calculation without validation
|
|
58
|
+
const nextLines = lines.slice(index, Math.min(index + 15, lines.length));
|
|
59
|
+
const hasCalculation = nextLines.some(l => {
|
|
60
|
+
const lowerNextLine = l.toLowerCase();
|
|
61
|
+
return ((lowerNextLine.includes('price') && (lowerNextLine.includes('-') || lowerNextLine.includes('*'))) ||
|
|
62
|
+
(lowerNextLine.includes('discount') && (lowerNextLine.includes('-') || lowerNextLine.includes('*'))) ||
|
|
63
|
+
(lowerNextLine.includes('amount') && (lowerNextLine.includes('-') || lowerNextLine.includes('*'))));
|
|
64
|
+
});
|
|
65
|
+
// Check if there's validation
|
|
66
|
+
const hasValidation = nextLines.some(l => {
|
|
67
|
+
const lowerNextLine = l.toLowerCase();
|
|
68
|
+
return (lowerNextLine.includes('validate') ||
|
|
69
|
+
lowerNextLine.includes('verify') ||
|
|
70
|
+
lowerNextLine.includes('check') ||
|
|
71
|
+
(lowerNextLine.includes('if') && (lowerNextLine.includes('>') || lowerNextLine.includes('<'))) ||
|
|
72
|
+
lowerNextLine.includes('max') ||
|
|
73
|
+
lowerNextLine.includes('min') ||
|
|
74
|
+
lowerNextLine.includes('throw') ||
|
|
75
|
+
lowerNextLine.includes('error'));
|
|
76
|
+
});
|
|
77
|
+
if (hasCalculation && !hasValidation) {
|
|
78
|
+
vulnerabilities.push((0, createVulnerability_1.createJavaScriptSecurityVulnerability)('client-controlled-pricing', 'CRITICAL: Client controls pricing/discount - attackers can set $0 prices or negative discounts', 'Validate ALL financial values server-side against business rules. Never trust client-provided prices/discounts.', index + 1, 'Trusting client-provided pricing, discounts, or amounts allows attackers to manipulate financial calculations. An attacker can set price=0, discount=1000000, or amount=-1000 to steal money or get free products.', 'const { price, discount } = req.body; finalPrice = price - discount; → Attacker sends { price: 0.01, discount: -1000000 } to get money', [
|
|
79
|
+
'Financial fraud - attacker gets products for $0',
|
|
80
|
+
'Negative pricing attacks - attacker gets paid to take products',
|
|
81
|
+
'Business revenue loss',
|
|
82
|
+
'Accounting manipulation',
|
|
83
|
+
'Regulatory violations (SOX, PCI-DSS)',
|
|
84
|
+
'Business logic bypass for discounts/promotions'
|
|
85
|
+
], 'const { price, discount } = req.body;\nconst finalPrice = price - discount;', '// Server-side: Fetch actual price from database\nconst product = await db.products.findById(productId);\nconst discount = validateDiscount(req.body.discountCode); // Validate discount code\nif (discount < 0 || discount > product.price) throw new Error("Invalid discount");\nconst finalPrice = product.price - discount;', 'Never trust client-provided financial values. Always fetch prices from server-side database and validate all calculations against business rules.'));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Check #2: Client-controlled quantity in financial operations
|
|
89
|
+
// Pattern: const { quantity } = req.body; totalPrice = price * quantity; (without max quantity check)
|
|
90
|
+
if (lowerLine.includes('quantity') && lowerLine.includes('req.body')) {
|
|
91
|
+
const nextLines = lines.slice(index, Math.min(index + 10, lines.length));
|
|
92
|
+
const hasMultiplication = nextLines.some(l => l.toLowerCase().includes('quantity') && l.includes('*'));
|
|
93
|
+
const hasMaxCheck = nextLines.some(l => {
|
|
94
|
+
const lowerNextLine = l.toLowerCase();
|
|
95
|
+
return ((lowerNextLine.includes('quantity') && (lowerNextLine.includes('>') || lowerNextLine.includes('max'))) ||
|
|
96
|
+
lowerNextLine.includes('maxquantity') ||
|
|
97
|
+
lowerNextLine.includes('max_quantity'));
|
|
98
|
+
});
|
|
99
|
+
if (hasMultiplication && !hasMaxCheck) {
|
|
100
|
+
vulnerabilities.push((0, createVulnerability_1.createJavaScriptSecurityVulnerability)('uncapped-quantity', 'Client-controlled quantity without max limit - enables DoS and overflow attacks', 'Enforce maximum quantity limits (e.g., max 100 per order) to prevent abuse', index + 1, 'Allowing unlimited client-controlled quantities can cause integer overflows, database exhaustion, and denial of service attacks.', 'const { quantity } = req.body; totalPrice = price * quantity; → Attacker sends quantity=999999999999 causing overflow or system crash', [
|
|
101
|
+
'Integer overflow in price calculations',
|
|
102
|
+
'Denial of Service via resource exhaustion',
|
|
103
|
+
'Inventory manipulation',
|
|
104
|
+
'Database overload',
|
|
105
|
+
'Memory exhaustion'
|
|
106
|
+
], 'const { quantity } = req.body;\nconst totalPrice = price * quantity;', 'const { quantity } = req.body;\nconst MAX_QUANTITY = 100;\nif (quantity < 1 || quantity > MAX_QUANTITY) {\n return res.status(400).send("Invalid quantity");\n}\nconst totalPrice = price * quantity;', 'Always enforce reasonable maximum limits on client-provided quantities to prevent abuse and overflow attacks.'));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Check #3: Race conditions in state-changing operations
|
|
110
|
+
// Pattern: balance checks without atomic operations (check-then-act)
|
|
111
|
+
// Example: if (balance >= amount) { balance -= amount; } (vulnerable to TOCTOU)
|
|
112
|
+
const balanceCheckPattern = /if\s*\(\s*(balance|currentBalance|account\.balance)\s*>=?\s*(amount|withdrawAmount|price)/i;
|
|
113
|
+
if (trimmedLine.match(balanceCheckPattern)) {
|
|
114
|
+
// Check if there's a transaction/lock mechanism
|
|
115
|
+
const nextLines = lines.slice(index, Math.min(index + 10, lines.length));
|
|
116
|
+
const hasAtomicOperation = nextLines.some(l => {
|
|
117
|
+
const lowerNextLine = l.toLowerCase();
|
|
118
|
+
return (lowerNextLine.includes('transaction') ||
|
|
119
|
+
lowerNextLine.includes('lock') ||
|
|
120
|
+
lowerNextLine.includes('atomic') ||
|
|
121
|
+
lowerNextLine.includes('$inc') || // MongoDB atomic
|
|
122
|
+
lowerNextLine.includes('increment') ||
|
|
123
|
+
lowerNextLine.includes('decrement'));
|
|
124
|
+
});
|
|
125
|
+
if (!hasAtomicOperation) {
|
|
126
|
+
vulnerabilities.push((0, createVulnerability_1.createJavaScriptSecurityVulnerability)('race-condition-toctou', 'Race condition (TOCTOU): Balance check not atomic - double-spending possible', 'Use atomic database operations or transactions to prevent race conditions', index + 1, 'Time-Of-Check-Time-Of-Use (TOCTOU) race conditions occur when checking a value and then acting on it in separate steps. Between the check and the action, the value can change, allowing double-spending and other race condition exploits.', 'if (balance >= amount) { balance -= amount; } → Two concurrent requests both pass the check before either updates balance, allowing double-spending', [
|
|
127
|
+
'Double-spending attacks',
|
|
128
|
+
'Overdraft exploitation',
|
|
129
|
+
'Inventory overselling',
|
|
130
|
+
'Account balance manipulation',
|
|
131
|
+
'Concurrent request exploitation'
|
|
132
|
+
], 'if (user.balance >= amount) {\n user.balance -= amount; // Race condition!\n await user.save();\n}', '// Use atomic database operations\nawait User.updateOne(\n { _id: userId, balance: { $gte: amount } },\n { $inc: { balance: -amount } }\n);\n// OR use database transactions', 'Use atomic operations or database transactions to prevent race conditions in concurrent scenarios.'));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Check #4: Sequential operation without idempotency key
|
|
136
|
+
// Pattern: Payment processing without idempotency check
|
|
137
|
+
const paymentPattern = /(charge|payment|transfer|transaction|bill|invoice)\s*\(/i;
|
|
138
|
+
const paymentRoutePattern = /\.(post|put)\s*\(\s*['"`].*\/(payment|charge|checkout|purchase|buy|order)/i;
|
|
139
|
+
if (trimmedLine.match(paymentPattern) || trimmedLine.match(paymentRoutePattern)) {
|
|
140
|
+
// Check for idempotency key validation
|
|
141
|
+
const contextLines = lines.slice(Math.max(0, index - 5), Math.min(index + 10, lines.length));
|
|
142
|
+
const hasIdempotencyCheck = contextLines.some(l => {
|
|
143
|
+
const lowerContextLine = l.toLowerCase();
|
|
144
|
+
return (lowerContextLine.includes('idempotency') ||
|
|
145
|
+
lowerContextLine.includes('requestid') ||
|
|
146
|
+
lowerContextLine.includes('request_id') ||
|
|
147
|
+
lowerContextLine.includes('transactionid') ||
|
|
148
|
+
lowerContextLine.includes('transaction_id') ||
|
|
149
|
+
(lowerContextLine.includes('cache') && lowerContextLine.includes('check')));
|
|
150
|
+
});
|
|
151
|
+
if (!hasIdempotencyCheck) {
|
|
152
|
+
vulnerabilities.push((0, createVulnerability_1.createJavaScriptSecurityVulnerability)('missing-idempotency', 'Payment operation without idempotency - duplicate charges possible from retries', 'Implement idempotency keys to prevent duplicate transactions on retries', index + 1, 'Payment and financial operations without idempotency protection can result in duplicate charges when users retry failed requests or network issues cause duplicate requests.', 'app.post("/charge", async (req, res) => stripe.charges.create(...)) → Network timeout causes retry, charging customer twice', [
|
|
153
|
+
'Duplicate payment charges',
|
|
154
|
+
'Customer overcharging',
|
|
155
|
+
'Financial reconciliation issues',
|
|
156
|
+
'Chargeback risks',
|
|
157
|
+
'Customer trust erosion'
|
|
158
|
+
], 'app.post("/charge", async (req, res) => {\n await stripe.charges.create({ amount, currency });\n});', 'app.post("/charge", async (req, res) => {\n const idempotencyKey = req.headers["idempotency-key"];\n if (!idempotencyKey) return res.status(400).send("Missing idempotency key");\n \n // Check if already processed\n const existing = await cache.get(idempotencyKey);\n if (existing) return res.json(existing);\n \n const charge = await stripe.charges.create({ amount, currency }, { idempotencyKey });\n await cache.set(idempotencyKey, charge, 86400); // 24h TTL\n res.json(charge);\n});', 'Always implement idempotency for payment and state-changing operations to prevent duplicate processing from retries.'));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
return vulnerabilities;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=insecure-design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-design.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/javascript/security-checks/insecure-design.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JavaScript Security Misconfiguration Checks
|
|
3
|
+
* OWASP A02:2025 - Security Misconfiguration
|
|
4
|
+
*
|
|
5
|
+
* Detects security misconfigurations that moved from #5 to #2 in OWASP 2025.
|
|
6
|
+
* Focus: Cloud configs, app settings, security headers, debug modes, etc.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for security misconfiguration vulnerabilities in JavaScript code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: Debug mode enabled in production (MEDIUM)
|
|
14
|
+
* - Check #2: Detailed error messages exposed (MEDIUM)
|
|
15
|
+
* - Check #3: CORS misconfiguration allowing all origins (HIGH)
|
|
16
|
+
* - Check #4: Missing security headers (MEDIUM)
|
|
17
|
+
* - Check #5: Insecure session configuration (MEDIUM)
|
|
18
|
+
* - Check #6: Default credentials usage (CRITICAL)
|
|
19
|
+
* - Check #7: Administrative interfaces exposed (HIGH)
|
|
20
|
+
* - Check #8: Unnecessary HTTP methods enabled (MEDIUM)
|
|
21
|
+
*
|
|
22
|
+
* @param lines - Array of code lines
|
|
23
|
+
* @returns Array of security vulnerabilities found
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkSecurityMisconfiguration(lines: string[]): SecurityVulnerability[];
|
|
26
|
+
//# sourceMappingURL=security-misconfiguration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-misconfiguration.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/javascript/security-checks/security-misconfiguration.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAm0BzB"}
|