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,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Insecure Design Security Checks
|
|
4
|
+
* OWASP A06:2025 - Insecure Design
|
|
5
|
+
*
|
|
6
|
+
* Detects design-level security flaws that cannot be fixed by implementation alone.
|
|
7
|
+
* This is a NEW category in OWASP 2025 focusing on missing security controls.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkInsecureDesign = checkInsecureDesign;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for insecure design vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: Missing rate limiting on sensitive endpoints (HIGH)
|
|
17
|
+
* - Check #2: Mass assignment vulnerabilities (HIGH)
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @returns Array of security vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
function checkInsecureDesign(lines) {
|
|
23
|
+
const vulnerabilities = [];
|
|
24
|
+
let inMultiLineComment = false;
|
|
25
|
+
// Track route context
|
|
26
|
+
let currentRoute = '';
|
|
27
|
+
let routeLineNumber = -1;
|
|
28
|
+
let hasRateLimiting = false;
|
|
29
|
+
lines.forEach((line, index) => {
|
|
30
|
+
const trimmedLine = line.trim();
|
|
31
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
32
|
+
const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
|
|
33
|
+
if (hasTripleQuote) {
|
|
34
|
+
if (!inMultiLineComment) {
|
|
35
|
+
// Start of multi-line comment
|
|
36
|
+
inMultiLineComment = true;
|
|
37
|
+
// Check if it closes on the same line (single-line docstring)
|
|
38
|
+
const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
|
|
39
|
+
if (tripleQuoteCount >= 2) {
|
|
40
|
+
// Opens and closes on same line, reset flag
|
|
41
|
+
inMultiLineComment = false;
|
|
42
|
+
}
|
|
43
|
+
return; // Skip this line
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// End of multi-line comment
|
|
47
|
+
inMultiLineComment = false;
|
|
48
|
+
return; // Skip this line
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
52
|
+
if (!trimmedLine ||
|
|
53
|
+
inMultiLineComment ||
|
|
54
|
+
trimmedLine.startsWith('#')) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const lowerLine = trimmedLine.toLowerCase();
|
|
58
|
+
// Check #1: Missing rate limiting on sensitive endpoints
|
|
59
|
+
// Detect rate limiting decorators
|
|
60
|
+
if (lowerLine.includes('@limiter.limit') ||
|
|
61
|
+
lowerLine.includes('@rate_limit') ||
|
|
62
|
+
lowerLine.includes('@throttle')) {
|
|
63
|
+
hasRateLimiting = true;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// Detect route decorators
|
|
67
|
+
if (lowerLine.includes('@app.route(') || lowerLine.includes('@route(')) {
|
|
68
|
+
currentRoute = trimmedLine.toLowerCase();
|
|
69
|
+
routeLineNumber = index + 1;
|
|
70
|
+
hasRateLimiting = false; // Reset for new route
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Detect function definitions (route handlers)
|
|
74
|
+
if (lowerLine.startsWith('def ')) {
|
|
75
|
+
// Check if route needs rate limiting
|
|
76
|
+
if (currentRoute && !hasRateLimiting) {
|
|
77
|
+
const isSensitiveRoute = currentRoute.includes('/login') ||
|
|
78
|
+
currentRoute.includes('/signin') ||
|
|
79
|
+
currentRoute.includes('/reset') ||
|
|
80
|
+
currentRoute.includes('/password') ||
|
|
81
|
+
currentRoute.includes('/api/') ||
|
|
82
|
+
currentRoute.includes('/verify') ||
|
|
83
|
+
currentRoute.includes('/otp') ||
|
|
84
|
+
currentRoute.includes('/auth') ||
|
|
85
|
+
currentRoute.includes('/token');
|
|
86
|
+
const isPublicStatic = currentRoute.includes('/about') ||
|
|
87
|
+
currentRoute.includes('/contact') ||
|
|
88
|
+
currentRoute.includes('/home') ||
|
|
89
|
+
currentRoute.includes('/static');
|
|
90
|
+
if (isSensitiveRoute && !isPublicStatic && routeLineNumber > 0) {
|
|
91
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('missing-rate-limiting', 'Sensitive endpoint missing rate limiting - vulnerable to brute-force and DoS attacks', 'Add rate limiting decorator (@limiter.limit, @rate_limit, or @throttle) to prevent abuse', routeLineNumber, 'Attackers can perform unlimited login attempts, password resets, or API calls, enabling credential stuffing, account enumeration, and denial of service attacks', '@app.route(\'/login\', methods=[\'POST\'])\ndef login():\n user = authenticate(request.form) # No rate limit!', [
|
|
92
|
+
'Brute-force attacks on login and authentication',
|
|
93
|
+
'Credential stuffing with stolen password lists',
|
|
94
|
+
'Account enumeration through timing attacks',
|
|
95
|
+
'Denial of service through resource exhaustion',
|
|
96
|
+
'OTP/2FA bypass through unlimited attempts'
|
|
97
|
+
], '@app.route(\'/login\', methods=[\'POST\'])\ndef login():\n return authenticate(request.form)', '@app.route(\'/login\', methods=[\'POST\'])\n@limiter.limit("5 per minute")\ndef login():\n return authenticate(request.form)', 'Add rate limiting to all sensitive endpoints. Use Flask-Limiter or similar middleware. Recommended limits: 5 attempts/minute for login, 3 attempts/hour for password reset.'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Reset route tracking
|
|
101
|
+
currentRoute = '';
|
|
102
|
+
routeLineNumber = -1;
|
|
103
|
+
hasRateLimiting = false;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Check #2: Mass assignment vulnerabilities
|
|
107
|
+
// Detect direct unpacking of request data to models
|
|
108
|
+
if ((lowerLine.includes('**request.json') ||
|
|
109
|
+
lowerLine.includes('**request.form') ||
|
|
110
|
+
lowerLine.includes('**request.data')) &&
|
|
111
|
+
!lowerLine.includes('form.data')) { // Exclude validated form data
|
|
112
|
+
// Check if there's a whitelist validation nearby
|
|
113
|
+
let hasWhitelist = false;
|
|
114
|
+
for (let i = Math.max(0, index - 5); i <= Math.min(index + 2, lines.length - 1); i++) {
|
|
115
|
+
const nearbyLine = lines[i].trim().toLowerCase();
|
|
116
|
+
if (nearbyLine.includes('allowed_fields') ||
|
|
117
|
+
nearbyLine.includes('whitelist') ||
|
|
118
|
+
nearbyLine.includes('if k in') ||
|
|
119
|
+
nearbyLine.includes('for k, v') && nearbyLine.includes('items()')) {
|
|
120
|
+
hasWhitelist = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!hasWhitelist) {
|
|
125
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('mass-assignment', 'Mass assignment vulnerability - allows attackers to modify unintended fields', 'Use explicit field whitelisting or validated form objects instead of direct request data unpacking', index + 1, 'Attackers can inject additional fields in requests to modify protected attributes (is_admin, role, password_hash), escalate privileges, or manipulate business logic', 'user = User(**request.json) # Attacker can set ANY field!\ndb.session.add(user) # Including is_admin=True', [
|
|
126
|
+
'Privilege escalation through role modification',
|
|
127
|
+
'Account takeover by changing email/password',
|
|
128
|
+
'Business logic bypass (price, discount manipulation)',
|
|
129
|
+
'Data integrity violations',
|
|
130
|
+
'Unauthorized access to protected resources'
|
|
131
|
+
], 'user = User(**request.json)\ndb.session.add(user)', 'allowed_fields = [\'name\', \'email\', \'bio\']\ndata = {k: v for k, v in request.json.items() if k in allowed_fields}\nuser = User(**data)', 'Always use explicit field whitelisting. Define allowed fields and filter request data before assignment. Use form validation libraries like WTForms or Marshmallow.'));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Detect .update() with request data
|
|
135
|
+
if (lowerLine.includes('.update(request.') &&
|
|
136
|
+
!lowerLine.includes('**') && // Already caught above
|
|
137
|
+
!lowerLine.includes('form.data')) {
|
|
138
|
+
// Check for whitelist
|
|
139
|
+
let hasWhitelist = false;
|
|
140
|
+
for (let i = Math.max(0, index - 5); i <= Math.min(index + 2, lines.length - 1); i++) {
|
|
141
|
+
const nearbyLine = lines[i].trim().toLowerCase();
|
|
142
|
+
if (nearbyLine.includes('allowed_fields') ||
|
|
143
|
+
nearbyLine.includes('whitelist')) {
|
|
144
|
+
hasWhitelist = true;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!hasWhitelist) {
|
|
149
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('mass-assignment', 'Mass assignment vulnerability in model update - allows modification of unintended fields', 'Use explicit field assignment or whitelist validation before updating', index + 1, 'Attackers can inject additional fields to modify protected model attributes, bypass business logic, or escalate privileges', 'user.update(request.json) # Attacker controls ALL updated fields', [
|
|
150
|
+
'Privilege escalation through protected field modification',
|
|
151
|
+
'Business logic bypass',
|
|
152
|
+
'Data integrity violations',
|
|
153
|
+
'Unauthorized attribute changes'
|
|
154
|
+
], 'user.update(request.json)', 'allowed_fields = [\'name\', \'email\']\ndata = {k: v for k, v in request.json.items() if k in allowed_fields}\nuser.update(data)', 'Whitelist allowed fields before calling update(). Only allow users to modify fields they should have access to.'));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return vulnerabilities;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=insecure-design.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-design.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/insecure-design.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Logging Failures Security Checks
|
|
3
|
+
* OWASP A09:2025 - Security Logging and Monitoring Failures
|
|
4
|
+
*
|
|
5
|
+
* Detects insufficient logging of security events and logging of sensitive data.
|
|
6
|
+
* Updated for OWASP 2025 with enhanced monitoring requirements.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for logging security vulnerabilities in Python code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: Missing security event logging (MEDIUM)
|
|
14
|
+
* - Check #2: Logging sensitive data (HIGH)
|
|
15
|
+
*
|
|
16
|
+
* @param lines - Array of code lines
|
|
17
|
+
* @returns Array of security vulnerabilities found
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkLoggingFailures(lines: string[]): SecurityVulnerability[];
|
|
20
|
+
//# sourceMappingURL=logging-failures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-failures.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/logging-failures.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CA0IzB"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Logging Failures Security Checks
|
|
4
|
+
* OWASP A09:2025 - Security Logging and Monitoring Failures
|
|
5
|
+
*
|
|
6
|
+
* Detects insufficient logging of security events and logging of sensitive data.
|
|
7
|
+
* Updated for OWASP 2025 with enhanced monitoring requirements.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkLoggingFailures = checkLoggingFailures;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for logging security vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: Missing security event logging (MEDIUM)
|
|
17
|
+
* - Check #2: Logging sensitive data (HIGH)
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @returns Array of security vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
function checkLoggingFailures(lines) {
|
|
23
|
+
const vulnerabilities = [];
|
|
24
|
+
let inMultiLineComment = false;
|
|
25
|
+
lines.forEach((line, index) => {
|
|
26
|
+
const trimmedLine = line.trim();
|
|
27
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
28
|
+
const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
|
|
29
|
+
if (hasTripleQuote) {
|
|
30
|
+
if (!inMultiLineComment) {
|
|
31
|
+
// Start of multi-line comment
|
|
32
|
+
inMultiLineComment = true;
|
|
33
|
+
// Check if it closes on the same line (single-line docstring)
|
|
34
|
+
const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
|
|
35
|
+
if (tripleQuoteCount >= 2) {
|
|
36
|
+
// Opens and closes on same line, reset flag
|
|
37
|
+
inMultiLineComment = false;
|
|
38
|
+
}
|
|
39
|
+
return; // Skip this line
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// End of multi-line comment
|
|
43
|
+
inMultiLineComment = false;
|
|
44
|
+
return; // Skip this line
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
48
|
+
if (!trimmedLine ||
|
|
49
|
+
inMultiLineComment ||
|
|
50
|
+
trimmedLine.startsWith('#')) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const lowerLine = trimmedLine.toLowerCase();
|
|
54
|
+
// Check #1: Missing security event logging
|
|
55
|
+
// Detect security failures without logging
|
|
56
|
+
const isSecurityFailure = (lowerLine.includes('return') || lowerLine.includes('abort(')) &&
|
|
57
|
+
(lowerLine.includes('401') || lowerLine.includes('403') ||
|
|
58
|
+
lowerLine.includes('"access denied"') || lowerLine.includes("'access denied'") ||
|
|
59
|
+
lowerLine.includes('"unauthorized"') || lowerLine.includes("'unauthorized'") ||
|
|
60
|
+
lowerLine.includes('"invalid credentials"') || lowerLine.includes("'invalid credentials'"));
|
|
61
|
+
if (isSecurityFailure) {
|
|
62
|
+
// Check if logging exists in nearby lines (within 5 lines before)
|
|
63
|
+
let hasLogging = false;
|
|
64
|
+
for (let i = Math.max(0, index - 5); i < index; i++) {
|
|
65
|
+
const prevLine = lines[i].trim().toLowerCase();
|
|
66
|
+
if (prevLine.includes('logger.') ||
|
|
67
|
+
prevLine.includes('logging.') ||
|
|
68
|
+
prevLine.includes('log.')) {
|
|
69
|
+
hasLogging = true;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (!hasLogging) {
|
|
74
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('missing-security-logging', 'Security event not logged - authentication/authorization failures should be logged for security monitoring', 'Add logging statement (logger.warning, logger.error) before security failures to track attack attempts', index + 1, 'Without logging security events, attackers can perform reconnaissance, brute-force attacks, and privilege escalation attempts undetected, making incident response and forensics impossible', 'if not user.check_password(password):\n return "Invalid credentials", 401 # No logging!', [
|
|
75
|
+
'Undetected brute-force and credential stuffing attacks',
|
|
76
|
+
'No audit trail for security incidents',
|
|
77
|
+
'Impossible forensics after breach',
|
|
78
|
+
'Compliance violations (PCI-DSS, HIPAA, SOC2)',
|
|
79
|
+
'Delayed incident detection and response'
|
|
80
|
+
], 'if not authenticate(username, password):\n return "Invalid credentials", 401', 'if not authenticate(username, password):\n logger.warning(f"Failed login attempt for {username} from {request.remote_addr}")\n return "Invalid credentials", 401', 'Always log security events: failed logins, authorization failures, access denials. Include username, IP address, and timestamp. Use centralized logging for monitoring.'));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Check #2: Logging sensitive data
|
|
84
|
+
// Detect logging of sensitive data
|
|
85
|
+
const hasLogging = lowerLine.includes('logger.') ||
|
|
86
|
+
lowerLine.includes('logging.') ||
|
|
87
|
+
lowerLine.includes('log.');
|
|
88
|
+
if (hasLogging) {
|
|
89
|
+
const sensitivePatterns = [
|
|
90
|
+
'password',
|
|
91
|
+
'token',
|
|
92
|
+
'secret',
|
|
93
|
+
'api_key',
|
|
94
|
+
'apikey',
|
|
95
|
+
'credit_card',
|
|
96
|
+
'creditcard',
|
|
97
|
+
'ssn',
|
|
98
|
+
'private_key',
|
|
99
|
+
'privatekey',
|
|
100
|
+
'session_id',
|
|
101
|
+
'sessionid',
|
|
102
|
+
'auth_token',
|
|
103
|
+
'bearer'
|
|
104
|
+
];
|
|
105
|
+
for (const pattern of sensitivePatterns) {
|
|
106
|
+
if (lowerLine.includes(pattern) && !lowerLine.includes('username')) {
|
|
107
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('sensitive-data-logging', 'Sensitive data logged in plaintext - exposes credentials and secrets in log files', 'Never log passwords, tokens, API keys, or other sensitive data. Log only non-sensitive identifiers', index + 1, 'Sensitive data in logs can be exposed through log aggregation systems, backup files, or compromised logging servers, leading to credential theft and unauthorized access', 'logger.info(f"User logged in with password: {password}") # Password exposed in logs!', [
|
|
108
|
+
'Credential exposure through log files',
|
|
109
|
+
'API key/token theft from logging systems',
|
|
110
|
+
'Compliance violations (PCI-DSS, GDPR)',
|
|
111
|
+
'Secrets leaked through log aggregation tools',
|
|
112
|
+
'Long-term exposure in log archives'
|
|
113
|
+
], 'logger.debug(f"Login attempt with password: {password}")', 'logger.info(f"Login attempt for user: {username}") # Only log username, not password', 'Never log passwords, tokens, API keys, credit cards, or other secrets. Log only non-sensitive identifiers like username, user ID, or transaction ID. Sanitize logs before storage.'));
|
|
114
|
+
break; // Only report once per line
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return vulnerabilities;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=logging-failures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging-failures.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/logging-failures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python NoSQL Injection Security Checks
|
|
3
|
+
* OWASP A03:2021 - Injection (CWE-943)
|
|
4
|
+
*
|
|
5
|
+
* Detects NoSQL injection vulnerabilities in Python code, particularly
|
|
6
|
+
* with MongoDB, Cassandra, Redis, and other NoSQL databases.
|
|
7
|
+
*
|
|
8
|
+
* Created: 2025-12-18 (Phase 0 - Priority 0 Critical Gap)
|
|
9
|
+
*/
|
|
10
|
+
import { SecurityVulnerability } from '../../types';
|
|
11
|
+
/**
|
|
12
|
+
* Checks for NoSQL injection vulnerabilities in Python code
|
|
13
|
+
*
|
|
14
|
+
* Covers:
|
|
15
|
+
* - Check #35: MongoDB operator injection (CRITICAL)
|
|
16
|
+
* - Check #36: MongoDB direct JSON payload (CRITICAL)
|
|
17
|
+
* - Check #37: Cassandra CQL string interpolation (CRITICAL)
|
|
18
|
+
* - Check #38: Redis command injection (HIGH)
|
|
19
|
+
* - Check #39: MongoDB $where JavaScript injection (CRITICAL)
|
|
20
|
+
*
|
|
21
|
+
* @param lines - Array of code lines
|
|
22
|
+
* @param userInputVariables - Map of variable names assigned from user input
|
|
23
|
+
* @returns Array of security vulnerabilities found
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkNoSQLInjection(lines: string[], userInputVariables: Map<string, number>): SecurityVulnerability[];
|
|
26
|
+
//# sourceMappingURL=nosql-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nosql-injection.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/nosql-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CAmTzB"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python NoSQL Injection Security Checks
|
|
4
|
+
* OWASP A03:2021 - Injection (CWE-943)
|
|
5
|
+
*
|
|
6
|
+
* Detects NoSQL injection vulnerabilities in Python code, particularly
|
|
7
|
+
* with MongoDB, Cassandra, Redis, and other NoSQL databases.
|
|
8
|
+
*
|
|
9
|
+
* Created: 2025-12-18 (Phase 0 - Priority 0 Critical Gap)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.checkNoSQLInjection = checkNoSQLInjection;
|
|
13
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
14
|
+
/**
|
|
15
|
+
* Checks for NoSQL injection vulnerabilities in Python code
|
|
16
|
+
*
|
|
17
|
+
* Covers:
|
|
18
|
+
* - Check #35: MongoDB operator injection (CRITICAL)
|
|
19
|
+
* - Check #36: MongoDB direct JSON payload (CRITICAL)
|
|
20
|
+
* - Check #37: Cassandra CQL string interpolation (CRITICAL)
|
|
21
|
+
* - Check #38: Redis command injection (HIGH)
|
|
22
|
+
* - Check #39: MongoDB $where JavaScript injection (CRITICAL)
|
|
23
|
+
*
|
|
24
|
+
* @param lines - Array of code lines
|
|
25
|
+
* @param userInputVariables - Map of variable names assigned from user input
|
|
26
|
+
* @returns Array of security vulnerabilities found
|
|
27
|
+
*/
|
|
28
|
+
function checkNoSQLInjection(lines, userInputVariables) {
|
|
29
|
+
const vulnerabilities = [];
|
|
30
|
+
let inMultiLineComment = false;
|
|
31
|
+
// Track MongoDB/NoSQL query variables that use dict-based queries
|
|
32
|
+
const noSqlQueryVariables = new Map(); // variable name -> line number
|
|
33
|
+
// Track CQL query variables with string interpolation
|
|
34
|
+
const cqlInterpolatedVariables = new Map(); // variable name -> line number
|
|
35
|
+
// Track Redis client variables (e.g., r = redis.Redis(), client = redis.StrictRedis())
|
|
36
|
+
const redisClientVariables = new Set(); // variable names
|
|
37
|
+
lines.forEach((line, index) => {
|
|
38
|
+
const lineNumber = index + 1;
|
|
39
|
+
const trimmed = line.trim();
|
|
40
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
41
|
+
const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
|
|
42
|
+
if (hasTripleQuote) {
|
|
43
|
+
if (!inMultiLineComment) {
|
|
44
|
+
inMultiLineComment = true;
|
|
45
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
46
|
+
if (tripleQuoteCount >= 2) {
|
|
47
|
+
inMultiLineComment = false;
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
inMultiLineComment = false;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
57
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// =============================================================================
|
|
61
|
+
// CHECK #35: MongoDB Operator Injection (CRITICAL)
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// Pattern: collection.find(query) where query contains user input that could be dict
|
|
64
|
+
// ENHANCED: Also handle multi-line calls like update_one(\n filter,\n update_data\n)
|
|
65
|
+
// Detect MongoDB query methods: find(), find_one(), update(), delete(), etc.
|
|
66
|
+
const mongoMethodMatch = trimmed.match(/\.(find|find_one|update|update_one|update_many|replace_one|delete|delete_one|delete_many|insert_one|insert_many|find_one_and_update|find_one_and_replace|count|aggregate)\s*\((.*)$/);
|
|
67
|
+
if (mongoMethodMatch) {
|
|
68
|
+
const methodName = mongoMethodMatch[1];
|
|
69
|
+
let allArgs = mongoMethodMatch[2].trim();
|
|
70
|
+
// ENHANCED: Handle multi-line calls (Test 3.3 fix)
|
|
71
|
+
// If the line doesn't end with ), check next few lines for arguments
|
|
72
|
+
if (!allArgs.includes(')')) {
|
|
73
|
+
const nextLines = lines.slice(index + 1, Math.min(index + 10, lines.length));
|
|
74
|
+
for (const nextLine of nextLines) {
|
|
75
|
+
allArgs += ' ' + nextLine.trim();
|
|
76
|
+
if (nextLine.includes(')')) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Remove trailing ) if present
|
|
82
|
+
allArgs = allArgs.replace(/\).*$/, '').trim();
|
|
83
|
+
// For update_one/update_many/replace_one: check SECOND argument (update document)
|
|
84
|
+
// For insert_one/insert_many: check FIRST argument (document to insert)
|
|
85
|
+
// For find/delete: check FIRST argument (query document)
|
|
86
|
+
const args = allArgs.split(',').map(arg => arg.trim());
|
|
87
|
+
let argToCheck;
|
|
88
|
+
if (methodName.match(/update|replace/)) {
|
|
89
|
+
// Update/replace operations: check second argument (update document)
|
|
90
|
+
argToCheck = args.length > 1 ? args[1] : '';
|
|
91
|
+
}
|
|
92
|
+
else if (methodName.match(/insert/)) {
|
|
93
|
+
// Insert operations: check first argument (document to insert)
|
|
94
|
+
argToCheck = args[0] || '';
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Read/delete operations: check first argument (query)
|
|
98
|
+
argToCheck = args[0] || '';
|
|
99
|
+
}
|
|
100
|
+
const queryArg = argToCheck || allArgs;
|
|
101
|
+
// Check if query argument is a user input variable
|
|
102
|
+
if (queryArg && userInputVariables.has(queryArg)) {
|
|
103
|
+
const userInputLine = userInputVariables.get(queryArg);
|
|
104
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('nosql-injection', `MongoDB ${methodName}() with user input variable '${queryArg}' (line ${userInputLine}) - operator injection risk`, 'Validate input structure, ensure only expected fields, reject $ operators', lineNumber, `MongoDB query methods accept dict-like objects. If user input contains MongoDB operators like {"$gt": ""}, {"$ne": null}, or {"$or": [...]}, attackers can bypass authentication or access unauthorized data. Variable '${queryArg}' was assigned from user input on line ${userInputLine}.`, `# Line ${userInputLine}:\ncredentials = request.json() # {"username": {"$ne": null}, "password": {"$ne": null}}\n# Line ${lineNumber}:\nuser = db.users.${methodName}(credentials) # Bypasses authentication!`, [
|
|
105
|
+
'Authentication bypass (login without credentials)',
|
|
106
|
+
'Unauthorized data access (read all records)',
|
|
107
|
+
'Data exfiltration via operator injection',
|
|
108
|
+
'Privilege escalation (access admin accounts)',
|
|
109
|
+
'Database enumeration'
|
|
110
|
+
], `user_query = request.json()\nresult = collection.${methodName}(user_query) # Vulnerable to operator injection`, `# Validate input structure and sanitize\nuser_query = request.json()\n\n# Only allow expected fields, reject operators\nallowed_fields = ["username", "email"]\nquery = {k: v for k, v in user_query.items() if k in allowed_fields and not k.startswith("$")}\n\n# Ensure values are strings, not dicts\nfor key, value in query.items():\n if isinstance(value, dict):\n raise ValueError(f"Invalid query structure for field {key}")\n\nresult = collection.${methodName}(query)`, 'Validate input structure: only allow expected fields, reject keys starting with $, ensure values are primitives (not dicts). Use schema validation libraries like pydantic or marshmallow.'));
|
|
111
|
+
}
|
|
112
|
+
// Check for direct request.json() or request.get_json() in query (check all args)
|
|
113
|
+
if (allArgs.includes('request.json') || allArgs.includes('request.get_json')) {
|
|
114
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('nosql-injection', `MongoDB ${methodName}() with direct request.json() - operator injection risk`, 'Validate input structure before using in queries', lineNumber, 'Passing request.json() directly to MongoDB query methods allows attackers to inject MongoDB operators like $gt, $ne, $or, bypassing authentication and accessing unauthorized data.', `user = db.users.${methodName}(request.json()) # {"username": {"$ne": null}} bypasses auth`, [
|
|
115
|
+
'Authentication bypass',
|
|
116
|
+
'Unauthorized data access',
|
|
117
|
+
'Data exfiltration',
|
|
118
|
+
'Privilege escalation',
|
|
119
|
+
'Complete database compromise'
|
|
120
|
+
], `result = collection.${methodName}(request.json())`, `# Validate input structure\nfrom pydantic import BaseModel\n\nclass UserQuery(BaseModel):\n username: str # Only string, not dict\n email: str\n\nuser_data = UserQuery(**request.json()) # Validates structure\nresult = collection.${methodName}(user_data.dict())`, 'Use schema validation (pydantic, marshmallow) to ensure query structure. Never pass request.json() directly to query methods.'));
|
|
121
|
+
}
|
|
122
|
+
// Track query variables for data flow analysis
|
|
123
|
+
if (queryArg && !queryArg.includes('(')) {
|
|
124
|
+
noSqlQueryVariables.set(queryArg, lineNumber);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// =============================================================================
|
|
128
|
+
// CHECK #36: MongoDB dict-based query construction with user input
|
|
129
|
+
// =============================================================================
|
|
130
|
+
// Pattern: query = {"field": user_input} where user_input could be dict
|
|
131
|
+
const dictQueryMatch = trimmed.match(/^(\w+)\s*=\s*\{[^}]*(\w+)[^}]*\}/);
|
|
132
|
+
if (dictQueryMatch) {
|
|
133
|
+
const queryVarName = dictQueryMatch[1];
|
|
134
|
+
const potentialUserInput = dictQueryMatch[2];
|
|
135
|
+
// Check if the value in the dict is a user input variable
|
|
136
|
+
if (userInputVariables.has(potentialUserInput)) {
|
|
137
|
+
noSqlQueryVariables.set(queryVarName, lineNumber);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// =============================================================================
|
|
141
|
+
// TRACK: Redis Client Variables
|
|
142
|
+
// =============================================================================
|
|
143
|
+
// Track variables assigned from redis.Redis(), redis.StrictRedis(), etc.
|
|
144
|
+
// Pattern: r = redis.Redis(), client = redis.StrictRedis()
|
|
145
|
+
const redisClientMatch = trimmed.match(/^(\w+)\s*=\s*redis\.(Redis|StrictRedis|Sentinel)/);
|
|
146
|
+
if (redisClientMatch) {
|
|
147
|
+
const varName = redisClientMatch[1];
|
|
148
|
+
redisClientVariables.add(varName);
|
|
149
|
+
}
|
|
150
|
+
// =============================================================================
|
|
151
|
+
// TRACK: CQL Query Variables with String Interpolation
|
|
152
|
+
// =============================================================================
|
|
153
|
+
// Track variables assigned with string interpolation (f-strings, .format(), %, +)
|
|
154
|
+
// Pattern: cql = f"SELECT ...", query = "...".format(), query = "..." % var
|
|
155
|
+
const cqlVarMatch = trimmed.match(/^(\w+)\s*=\s*(.+)/);
|
|
156
|
+
if (cqlVarMatch) {
|
|
157
|
+
const varName = cqlVarMatch[1];
|
|
158
|
+
const varValue = cqlVarMatch[2];
|
|
159
|
+
// Check if value contains string interpolation
|
|
160
|
+
const hasInterpolation = varValue.includes('f"') || varValue.includes("f'") ||
|
|
161
|
+
varValue.includes('.format(') ||
|
|
162
|
+
varValue.includes('%s') || varValue.includes('% ') ||
|
|
163
|
+
(varValue.includes('+') && (varValue.includes('"') || varValue.includes("'")));
|
|
164
|
+
if (hasInterpolation && (varValue.includes('SELECT') || varValue.includes('INSERT') || varValue.includes('UPDATE') || varValue.includes('DELETE'))) {
|
|
165
|
+
// This looks like a CQL query with interpolation
|
|
166
|
+
cqlInterpolatedVariables.set(varName, lineNumber);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// =============================================================================
|
|
170
|
+
// CHECK #37: Cassandra CQL String Interpolation (CRITICAL)
|
|
171
|
+
// =============================================================================
|
|
172
|
+
// Pattern: session.execute() with f-strings, .format(), or % in CQL (inline or variable)
|
|
173
|
+
if (trimmed.includes('session.execute(') || trimmed.includes('execute_async(')) {
|
|
174
|
+
const executeMatch = trimmed.match(/session\.execute(?:_async)?\s*\(([^)]+)\)/);
|
|
175
|
+
let hasVulnerability = false;
|
|
176
|
+
let vulnSource = '';
|
|
177
|
+
// Check 1: Inline string interpolation on same line
|
|
178
|
+
if (trimmed.includes('f"') || trimmed.includes("f'") ||
|
|
179
|
+
trimmed.includes('.format(') ||
|
|
180
|
+
trimmed.includes('%s') ||
|
|
181
|
+
trimmed.includes('+')) {
|
|
182
|
+
hasVulnerability = true;
|
|
183
|
+
vulnSource = 'inline';
|
|
184
|
+
}
|
|
185
|
+
// Check 2: Variable with tracked string interpolation
|
|
186
|
+
if (executeMatch) {
|
|
187
|
+
const executeArg = executeMatch[1].trim();
|
|
188
|
+
if (cqlInterpolatedVariables.has(executeArg)) {
|
|
189
|
+
hasVulnerability = true;
|
|
190
|
+
const interpolatedLine = cqlInterpolatedVariables.get(executeArg);
|
|
191
|
+
vulnSource = `variable '${executeArg}' (constructed with interpolation on line ${interpolatedLine})`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (hasVulnerability) {
|
|
195
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('nosql-injection', `Cassandra CQL injection via string interpolation ${vulnSource ? '(' + vulnSource + ')' : ''}`, 'Use session.prepare() with bound parameters', lineNumber, 'String interpolation in Cassandra CQL queries (using f-strings, .format(), % operators, or +) allows attackers to inject malicious CQL code, similar to SQL injection.', 'session.execute(f"SELECT * FROM users WHERE id = \'{user_id}\' ALLOW FILTERING") where user_id = "\' OR 1=1--"', [
|
|
196
|
+
'Unauthorized data access',
|
|
197
|
+
'CQL injection attacks',
|
|
198
|
+
'Data exfiltration',
|
|
199
|
+
'Authentication bypass',
|
|
200
|
+
'Database enumeration'
|
|
201
|
+
], 'cql = f"SELECT * FROM users WHERE id = \'{user_id}\' ALLOW FILTERING"\nsession.execute(cql)', 'from cassandra.cluster import Cluster\ncluster = Cluster()\nsession = cluster.connect("keyspace")\n\n# Use prepared statements\nprepared = session.prepare("SELECT * FROM users WHERE id = ?")\nsession.execute(prepared, (user_id,)) # Parameterized, safe', 'Always use session.prepare() with parameterized queries. Never use string interpolation (f-strings, .format(), %) in CQL queries.'));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// CHECK #38: Redis Command Injection (HIGH)
|
|
206
|
+
// =============================================================================
|
|
207
|
+
// Pattern: redis.get/set/delete with user-controlled keys or values
|
|
208
|
+
// Matches: redis.get(), r.get(), client.get(), etc. (only tracked Redis clients)
|
|
209
|
+
const redisMethodMatch = trimmed.match(/(\w+)\.(get|set|delete|hget|hset|lpush|rpush|sadd|zadd|incr|decr|append)\s*\(/);
|
|
210
|
+
if (redisMethodMatch) {
|
|
211
|
+
const clientVarName = redisMethodMatch[1];
|
|
212
|
+
// Only check if this is a tracked Redis client
|
|
213
|
+
if (redisClientVariables.has(clientVarName) || clientVarName === 'redis') {
|
|
214
|
+
// Check for user input in Redis commands
|
|
215
|
+
const hasUserInput = Array.from(userInputVariables.keys()).some(varName => trimmed.includes(varName));
|
|
216
|
+
if (hasUserInput) {
|
|
217
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('redis-injection', 'Redis command injection with user-controlled key or value', 'Validate and sanitize input, use allowlist for keys', lineNumber, 'Using user input directly in Redis keys or values can lead to key injection attacks, where attackers can access or modify unintended keys, enumerate the keyspace, or cause denial of service.', 'redis.get(user_key) # user_key = "*" (returns all keys), or "\nFLUSHDB\n" (deletes database)', [
|
|
218
|
+
'Unauthorized data access (read arbitrary keys)',
|
|
219
|
+
'Data manipulation (modify unintended keys)',
|
|
220
|
+
'Key enumeration (discover sensitive keys)',
|
|
221
|
+
'Denial of Service (FLUSHDB, FLUSHALL)',
|
|
222
|
+
'Cache poisoning'
|
|
223
|
+
], 'import redis\nr = redis.Redis()\nuser_key = request.args.get("key")\nvalue = r.get(user_key) # Vulnerable', 'import redis\nimport re\n\nr = redis.Redis()\nuser_key = request.args.get("key")\n\n# Validate key format (only alphanumeric + underscore)\nif not re.match(r\'^[a-zA-Z0-9_]+$\', user_key):\n raise ValueError("Invalid key format")\n\n# Prefix user keys to namespace them\nnamespaced_key = f"user:{user_key}"\nvalue = r.get(namespaced_key) # Safe', 'Validate Redis keys with strict allowlists or regex patterns. Namespace user-controlled keys with prefixes. Never allow special characters or newlines in keys.'));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// =============================================================================
|
|
228
|
+
// CHECK #39: MongoDB $where JavaScript Injection (CRITICAL)
|
|
229
|
+
// =============================================================================
|
|
230
|
+
// Pattern: collection.find({"$where": ...}) with string interpolation
|
|
231
|
+
if (trimmed.includes('$where') || trimmed.includes('"$where"') || trimmed.includes("'$where'")) {
|
|
232
|
+
// Check for string interpolation in $where clause
|
|
233
|
+
if (trimmed.includes('f"') || trimmed.includes("f'") ||
|
|
234
|
+
trimmed.includes('.format(') ||
|
|
235
|
+
trimmed.includes('+')) {
|
|
236
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('nosql-injection', 'MongoDB $where clause with JavaScript injection risk', 'Avoid $where entirely, use native MongoDB operators instead', lineNumber, 'MongoDB $where operator executes JavaScript on the server. If user input is interpolated into $where clauses, attackers can inject arbitrary JavaScript code, leading to code execution, data exfiltration, or DoS.', 'collection.find({"$where": f"this.username == \'{username}\'"}) # username = "\'; db.dropDatabase(); \'"', [
|
|
237
|
+
'Remote Code Execution (JavaScript in MongoDB)',
|
|
238
|
+
'Database compromise',
|
|
239
|
+
'Data exfiltration',
|
|
240
|
+
'Denial of Service (infinite loops)',
|
|
241
|
+
'Complete server takeover'
|
|
242
|
+
], 'query = {"$where": f"this.age > {min_age}"}\nresult = collection.find(query)', '# NEVER use $where - use native MongoDB operators instead\nquery = {"age": {"$gt": min_age}} # Native operator, safe\nresult = collection.find(query)', 'Never use MongoDB $where operator with user input. Use native MongoDB operators ($gt, $lt, $eq, etc.) which do not execute code. If $where is absolutely necessary, use prepared statements with proper escaping (but native operators are always preferred).'));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
return vulnerabilities;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=nosql-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nosql-injection.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/nosql-injection.ts"],"names":[],"mappings":"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"}
|