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,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Exception Handling Security Checks
|
|
4
|
+
* OWASP A10:2025 - Mishandling of Exceptional Conditions
|
|
5
|
+
*
|
|
6
|
+
* Detects improper exception handling that can lead to security vulnerabilities.
|
|
7
|
+
* This is a completely NEW category in OWASP 2025.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkExceptionHandling = checkExceptionHandling;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for exception handling security vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: Bare except clauses (HIGH)
|
|
17
|
+
* - Check #2: Exception details exposed in responses (HIGH)
|
|
18
|
+
* - Check #3: Silent exception suppression (MEDIUM)
|
|
19
|
+
* - Check #4: Resource cleanup missing in exceptions (MEDIUM)
|
|
20
|
+
* - Check #5: Incorrect exception handling patterns (MEDIUM)
|
|
21
|
+
*
|
|
22
|
+
* @param lines - Array of code lines
|
|
23
|
+
* @returns Array of security vulnerabilities found
|
|
24
|
+
*/
|
|
25
|
+
function checkExceptionHandling(lines) {
|
|
26
|
+
const vulnerabilities = [];
|
|
27
|
+
let inMultiLineComment = false;
|
|
28
|
+
lines.forEach((line, index) => {
|
|
29
|
+
const trimmedLine = line.trim();
|
|
30
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
31
|
+
const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
|
|
32
|
+
if (hasTripleQuote) {
|
|
33
|
+
if (!inMultiLineComment) {
|
|
34
|
+
// Start of multi-line comment
|
|
35
|
+
inMultiLineComment = true;
|
|
36
|
+
// Check if it closes on the same line (single-line docstring)
|
|
37
|
+
const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
|
|
38
|
+
if (tripleQuoteCount >= 2) {
|
|
39
|
+
// Opens and closes on same line, reset flag
|
|
40
|
+
inMultiLineComment = false;
|
|
41
|
+
}
|
|
42
|
+
return; // Skip this line
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// End of multi-line comment
|
|
46
|
+
inMultiLineComment = false;
|
|
47
|
+
return; // Skip this line
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
51
|
+
if (!trimmedLine ||
|
|
52
|
+
inMultiLineComment ||
|
|
53
|
+
trimmedLine.startsWith('#')) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const lowerLine = trimmedLine.toLowerCase();
|
|
57
|
+
// Check #1: Bare except clauses
|
|
58
|
+
if (lowerLine.includes('except:') || lowerLine === 'except') {
|
|
59
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('bare-except-clause', 'Bare except clause catches all exceptions including system exits', 'Catch specific exception types instead of using bare except', index + 1, 'Bare except clauses can mask security-critical exceptions and prevent proper error handling', 'try:\n risky_operation()\nexcept:\n pass # catches SystemExit, KeyboardInterrupt, etc.', [
|
|
60
|
+
'Security exceptions masked and ignored',
|
|
61
|
+
'System exit and keyboard interrupt prevention',
|
|
62
|
+
'Debugging difficulties from hidden errors',
|
|
63
|
+
'Potential for silent security failures'
|
|
64
|
+
], 'except:', 'except ValueError as e:', 'Bare except clauses catch all exceptions including system-level ones that should not be suppressed'));
|
|
65
|
+
}
|
|
66
|
+
// Check #2: Exception details exposed in HTTP responses
|
|
67
|
+
if ((lowerLine.includes('return') || lowerLine.includes('response') ||
|
|
68
|
+
lowerLine.includes('jsonify') || lowerLine.includes('render_template')) &&
|
|
69
|
+
(lowerLine.includes('str(e)') || lowerLine.includes('str(ex)') ||
|
|
70
|
+
lowerLine.includes('exception') || lowerLine.includes('traceback'))) {
|
|
71
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('exception-details-exposed', 'Exception details may be exposed in HTTP responses', 'Log detailed errors server-side, return generic messages to clients', index + 1, 'Exposing exception details reveals sensitive internal application information', 'return jsonify({"error": str(e)}) # exposes full exception details to client', [
|
|
72
|
+
'Internal application structure exposure',
|
|
73
|
+
'File paths and system information disclosure',
|
|
74
|
+
'Database schema and connection details revelation',
|
|
75
|
+
'Third-party service configuration exposure'
|
|
76
|
+
], 'return str(exception)', 'logger.error("Operation failed", exc_info=True); return "Internal server error"', 'Exception details contain sensitive debugging information that should not be exposed to clients'));
|
|
77
|
+
}
|
|
78
|
+
// Check #3: Silent exception suppression with pass
|
|
79
|
+
if (lowerLine.includes('except') &&
|
|
80
|
+
lines.slice(index + 1, Math.min(index + 3, lines.length)).some(nextLine => nextLine.trim().toLowerCase() === 'pass')) {
|
|
81
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('silent-exception-suppression', 'Exception caught and silently ignored with pass statement', 'Add proper error handling, logging, or re-raise the exception', index + 1, 'Silent exception suppression can hide security vulnerabilities and cause unpredictable behavior', 'except Exception:\n pass # security errors completely ignored', [
|
|
82
|
+
'Security vulnerabilities hidden from detection',
|
|
83
|
+
'Authentication and authorization bypasses',
|
|
84
|
+
'Data integrity issues from ignored validation errors',
|
|
85
|
+
'Audit trail gaps from suppressed security events'
|
|
86
|
+
], 'except Exception:\n pass', 'except Exception as e:\n logger.warning("Operation failed, using fallback", exc_info=True)\n return fallback_value', 'Silent exception suppression prevents visibility into potentially security-critical failures'));
|
|
87
|
+
}
|
|
88
|
+
// Check #4: Resource cleanup missing in exception scenarios
|
|
89
|
+
if ((lowerLine.includes('open(') || lowerLine.includes('connect(') ||
|
|
90
|
+
lowerLine.includes('socket(') || lowerLine.includes('urlopen(')) &&
|
|
91
|
+
!lines.slice(index, Math.min(index + 10, lines.length)).some(nextLine => nextLine.toLowerCase().includes('finally:') ||
|
|
92
|
+
nextLine.toLowerCase().includes('with ') ||
|
|
93
|
+
nextLine.toLowerCase().includes('.close()'))) {
|
|
94
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('missing-resource-cleanup', 'Resource may not be properly cleaned up in exception scenarios', 'Use with statements or try-finally blocks to ensure resource cleanup', index + 1, 'Improper resource cleanup during exceptions can lead to resource leaks and denial of service', 'file = open("sensitive.txt"); data = file.read() # no finally or with statement', [
|
|
95
|
+
'Memory leaks from unclosed file handles',
|
|
96
|
+
'Connection pool exhaustion',
|
|
97
|
+
'Database connection leaks',
|
|
98
|
+
'Denial of service from resource exhaustion'
|
|
99
|
+
], 'file = open("data.txt")', 'with open("data.txt") as file:\n # operations here', 'Resources opened without guaranteed cleanup can cause leaks when exceptions occur'));
|
|
100
|
+
}
|
|
101
|
+
// Check #5: Incorrect exception handling patterns
|
|
102
|
+
if (lowerLine.includes('except') && lowerLine.includes(':')) {
|
|
103
|
+
// Check if continue or break appears in the next few lines (exception handler body)
|
|
104
|
+
const hasContinueOrBreak = lines.slice(index + 1, Math.min(index + 4, lines.length)).some(nextLine => {
|
|
105
|
+
const nextTrimmed = nextLine.trim().toLowerCase();
|
|
106
|
+
return nextTrimmed.startsWith('continue') || nextTrimmed.startsWith('break');
|
|
107
|
+
});
|
|
108
|
+
if (hasContinueOrBreak) {
|
|
109
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('incorrect-exception-pattern', 'Exception handling with continue/break may mask important errors', 'Handle exceptions appropriately instead of using flow control statements', index + 1, 'Using continue/break in exception handlers can mask security-critical errors', 'for item in items:\n try:\n process(item)\n except SecurityError:\n continue # security error ignored', [
|
|
110
|
+
'Security exceptions bypassed in loops',
|
|
111
|
+
'Incomplete processing of security-sensitive data',
|
|
112
|
+
'Error accumulation leading to system instability',
|
|
113
|
+
'Missing security validations in batch operations'
|
|
114
|
+
], 'except Exception:\n continue', 'except Exception as e:\n logger.error("Item processing failed", exc_info=True)\n # decide appropriate action based on error type', 'Flow control in exception handlers can hide important security errors that require attention'));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return vulnerabilities;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=exception-handling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handling.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/exception-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flask Framework Security Checks
|
|
3
|
+
* OWASP A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures, A03:2021 - Injection
|
|
4
|
+
*
|
|
5
|
+
* Detects Flask-specific security vulnerabilities including debug mode exposure,
|
|
6
|
+
* CSRF protection issues, template injection, and weak cryptographic keys.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for Flask framework security vulnerabilities
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #28: Debug mode enabled (CRITICAL) - Remote code execution risk
|
|
14
|
+
* - Check #29: Missing CSRF protection (HIGH) - CSRF vulnerability
|
|
15
|
+
* - Check #30: render_template_string() with user input (CRITICAL) - SSTI
|
|
16
|
+
* - Markup() with user input (HIGH) - XSS vulnerability (data flow tracked)
|
|
17
|
+
* - Check #31: Weak SECRET_KEY (HIGH) - Session security weakness
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @param userInputVariables - Map of variable names assigned from user input
|
|
21
|
+
* @returns Array of security vulnerabilities found
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkFlaskSecurity(lines: string[], userInputVariables: Map<string, number>): SecurityVulnerability[];
|
|
24
|
+
//# sourceMappingURL=flask-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flask-security.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/flask-security.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CA0LzB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Flask Framework Security Checks
|
|
4
|
+
* OWASP A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures, A03:2021 - Injection
|
|
5
|
+
*
|
|
6
|
+
* Detects Flask-specific security vulnerabilities including debug mode exposure,
|
|
7
|
+
* CSRF protection issues, template injection, and weak cryptographic keys.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkFlaskSecurity = checkFlaskSecurity;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for Flask framework security vulnerabilities
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #28: Debug mode enabled (CRITICAL) - Remote code execution risk
|
|
17
|
+
* - Check #29: Missing CSRF protection (HIGH) - CSRF vulnerability
|
|
18
|
+
* - Check #30: render_template_string() with user input (CRITICAL) - SSTI
|
|
19
|
+
* - Markup() with user input (HIGH) - XSS vulnerability (data flow tracked)
|
|
20
|
+
* - Check #31: Weak SECRET_KEY (HIGH) - Session security weakness
|
|
21
|
+
*
|
|
22
|
+
* @param lines - Array of code lines
|
|
23
|
+
* @param userInputVariables - Map of variable names assigned from user input
|
|
24
|
+
* @returns Array of security vulnerabilities found
|
|
25
|
+
*/
|
|
26
|
+
function checkFlaskSecurity(lines, userInputVariables) {
|
|
27
|
+
const vulnerabilities = [];
|
|
28
|
+
let inMultiLineComment = false;
|
|
29
|
+
lines.forEach((line, index) => {
|
|
30
|
+
const lineNumber = index + 1;
|
|
31
|
+
const trimmed = line.trim();
|
|
32
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
33
|
+
const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
|
|
34
|
+
if (hasTripleQuote) {
|
|
35
|
+
if (!inMultiLineComment) {
|
|
36
|
+
// Start of multi-line comment
|
|
37
|
+
inMultiLineComment = true;
|
|
38
|
+
// Check if it closes on the same line (single-line docstring)
|
|
39
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
40
|
+
if (tripleQuoteCount >= 2) {
|
|
41
|
+
// Opens and closes on same line, reset flag
|
|
42
|
+
inMultiLineComment = false;
|
|
43
|
+
}
|
|
44
|
+
return; // Skip this line
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// End of multi-line comment
|
|
48
|
+
inMultiLineComment = false;
|
|
49
|
+
return; // Skip this line
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
53
|
+
if (!trimmed ||
|
|
54
|
+
inMultiLineComment ||
|
|
55
|
+
trimmed.startsWith('#')) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// 28. Flask Debug Mode - CRITICAL (remote code execution)
|
|
59
|
+
if (trimmed.match(/app\.run\s*\([^)]*debug\s*=\s*True/)) {
|
|
60
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-debug-mode', 'Flask debug mode enabled allows remote code execution', 'Set debug=False in production or remove debug parameter', lineNumber, 'Running Flask with debug=True in production enables the interactive debugger, allowing anyone with access to error pages to execute arbitrary Python code on the server via the debug console.', 'app.run(debug=True) # Attacker gets interactive Python shell on any error page', [
|
|
61
|
+
'Remote code execution (RCE)',
|
|
62
|
+
'Full server compromise',
|
|
63
|
+
'Information disclosure (source code, env vars)',
|
|
64
|
+
'Arbitrary file read/write',
|
|
65
|
+
'Critical security bypass'
|
|
66
|
+
], 'app.run(debug=True, host="0.0.0.0")', 'import os\\nDEBUG = os.environ.get("FLASK_DEBUG", "False") == "True"\\napp.run(debug=DEBUG) # Or simply: app.run() (debug=False by default)', 'NEVER use debug=True in production. The Werkzeug debugger allows code execution'));
|
|
67
|
+
}
|
|
68
|
+
// 29. Flask Missing CSRF Protection - HIGH
|
|
69
|
+
// Only flag when Flask app is instantiated, not on import statement
|
|
70
|
+
if (trimmed.includes('Flask(__name__)') || trimmed.includes('app = Flask(')) {
|
|
71
|
+
// Check if CSRFProtect is imported/used in the file (skip comments)
|
|
72
|
+
const hasCSRF = lines.some(line => {
|
|
73
|
+
const lineTrimmed = line.trim();
|
|
74
|
+
return !lineTrimmed.startsWith('#') && (lineTrimmed.includes('CSRFProtect') || lineTrimmed.includes('flask_wtf') || lineTrimmed.includes('flask-wtf'));
|
|
75
|
+
});
|
|
76
|
+
if (!hasCSRF) {
|
|
77
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-missing-csrf', 'Flask application missing CSRF protection', 'Install flask-wtf and enable CSRFProtect for all forms', lineNumber, 'Flask does not include CSRF protection by default. Without flask-wtf\'s CSRFProtect, forms are vulnerable to Cross-Site Request Forgery attacks.', 'app = Flask(__name__) # No CSRF protection → Forms vulnerable to CSRF', [
|
|
78
|
+
'Cross-Site Request Forgery (CSRF)',
|
|
79
|
+
'Unauthorized state changes',
|
|
80
|
+
'Account takeover',
|
|
81
|
+
'Data manipulation',
|
|
82
|
+
'Form submission forgery'
|
|
83
|
+
], 'from flask import Flask\\napp = Flask(__name__)', 'from flask import Flask\\nfrom flask_wtf.csrf import CSRFProtect\\n\\napp = Flask(__name__)\\napp.config["SECRET_KEY"] = os.environ.get("SECRET_KEY")\\ncsrf = CSRFProtect(app) # Enable CSRF protection', 'Always use flask-wtf CSRFProtect. Include {{ csrf_token() }} in all forms'));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// 30. Flask Unsafe Template Rendering - CRITICAL (SSTI)
|
|
87
|
+
if (trimmed.includes('render_template_string(') && (trimmed.includes('request.') || trimmed.includes('user_') || trimmed.includes('input'))) {
|
|
88
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-ssti', 'render_template_string() with user input allows Server-Side Template Injection', 'Use render_template() with separate template files, never render user input', lineNumber, 'Flask\'s render_template_string() with user input allows Server-Side Template Injection (SSTI). Attackers can execute arbitrary Python code by injecting Jinja2 template expressions.', 'render_template_string(request.args.get("template")) # {{ config.__class__.__init__.__globals__[\'os\'].popen(\'ls\').read() }}', [
|
|
89
|
+
'Server-Side Template Injection (SSTI)',
|
|
90
|
+
'Remote code execution (RCE)',
|
|
91
|
+
'Full server compromise',
|
|
92
|
+
'Information disclosure',
|
|
93
|
+
'File system access'
|
|
94
|
+
], 'html = render_template_string(user_template)', 'from flask import render_template\\n# Use separate template files\\nhtml = render_template("page.html", user_data=user_input)\\n# Template: {{ user_data }} (auto-escaped)', 'Never use render_template_string() with user input. Use render_template() with files'));
|
|
95
|
+
}
|
|
96
|
+
// Flask Markup() XSS (with data flow analysis)
|
|
97
|
+
// PHASE 6 FIX (2025-11-22): Added data flow tracking for variables
|
|
98
|
+
if (trimmed.includes('Markup(')) {
|
|
99
|
+
// Check 1: Direct user input on same line
|
|
100
|
+
const hasDirectUserInput = trimmed.includes('request.') || trimmed.includes('user_') || trimmed.includes('input');
|
|
101
|
+
// Check 2: Using ANY tracked user input variable in the Markup() call
|
|
102
|
+
let usesUserInputVar = false;
|
|
103
|
+
for (const [varName] of userInputVariables) {
|
|
104
|
+
// Check if the variable name appears in the Markup() call (with word boundaries)
|
|
105
|
+
const varRegex = new RegExp(`\\b${varName}\\b`);
|
|
106
|
+
if (varRegex.test(trimmed)) {
|
|
107
|
+
usesUserInputVar = true;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (hasDirectUserInput || usesUserInputVar) {
|
|
112
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-markup-xss', 'Markup() with user input bypasses XSS protection', 'Use Flask template auto-escaping instead of Markup()', lineNumber, 'Flask\'s Markup() function marks strings as safe HTML, bypassing auto-escaping. When used with user input, it allows XSS attacks.', 'html = Markup(f"<p>{comment}</p>") # Where comment = request.args.get("text") → XSS!', [
|
|
113
|
+
'Cross-Site Scripting (XSS)',
|
|
114
|
+
'Session hijacking',
|
|
115
|
+
'Credential theft',
|
|
116
|
+
'Malicious script injection',
|
|
117
|
+
'Client-side code execution'
|
|
118
|
+
], 'from markupsafe import Markup\\nhtml = Markup(user_input)', 'from markupsafe import escape\\n# Let Jinja2 auto-escape in templates\\nhtml = escape(user_input)\\n# Or in template: {{ user_input }} (auto-escaped)', 'Never use Markup() with user input. Use Jinja2 auto-escaping in templates'));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 31. Flask Weak SECRET_KEY - HIGH (session security)
|
|
122
|
+
if (trimmed.match(/app\.config\[['"](SECRET_KEY|secret_key)['"]\]\s*=\s*['"]/)) {
|
|
123
|
+
const secretKeyMatch = trimmed.match(/app\.config\[['"](SECRET_KEY|secret_key)['"]\]\s*=\s*['"]([^'"]+)['"]/);
|
|
124
|
+
if (secretKeyMatch) {
|
|
125
|
+
const secretKey = secretKeyMatch[2];
|
|
126
|
+
const isWeak = secretKey.length < 32 ||
|
|
127
|
+
/^(secret|flask|12345|password|key|test|abc|demo)/i.test(secretKey) ||
|
|
128
|
+
secretKey === 'your-secret-key-here';
|
|
129
|
+
if (isWeak) {
|
|
130
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('flask-weak-secret-key', 'Flask SECRET_KEY is weak or hardcoded', 'Generate a strong random SECRET_KEY and store in environment variables', lineNumber, 'Flask\'s SECRET_KEY is used to cryptographically sign session cookies. A weak or hardcoded key allows attackers to forge session cookies and impersonate any user.', 'app.config["SECRET_KEY"] = "123" # Attacker can forge cookies to become admin', [
|
|
131
|
+
'Session forgery',
|
|
132
|
+
'Cookie tampering',
|
|
133
|
+
'Authentication bypass',
|
|
134
|
+
'Account takeover',
|
|
135
|
+
'Privilege escalation'
|
|
136
|
+
], 'app.config["SECRET_KEY"] = "flask-secret"', 'import os\\nimport secrets\\n\\nSECRET_KEY = os.environ.get("FLASK_SECRET_KEY")\\nif not SECRET_KEY:\\n raise ValueError("FLASK_SECRET_KEY environment variable not set")\\napp.config["SECRET_KEY"] = SECRET_KEY\\n# Generate with: python -c \'import secrets; print(secrets.token_hex(32))\'', 'Generate strong key: secrets.token_hex(32). Never hardcode. Use environment variables'));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return vulnerabilities;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=flask-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flask-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/flask-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Injection Attack Security Checks
|
|
3
|
+
* OWASP A03:2021 - Injection
|
|
4
|
+
*
|
|
5
|
+
* Detects code injection, SQL injection, and command injection vulnerabilities
|
|
6
|
+
* in Python code. These are among the most critical security risks.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for injection attack vulnerabilities in Python code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: eval() usage (CRITICAL)
|
|
14
|
+
* - Check #2: exec() usage (CRITICAL)
|
|
15
|
+
* - Check #3: compile() usage (HIGH)
|
|
16
|
+
* - Check #4: SQL Injection - Inline interpolation (CRITICAL)
|
|
17
|
+
* - Check #4b: SQL Injection - Data flow tracking (CRITICAL)
|
|
18
|
+
* - Check #5: Command Injection (CRITICAL)
|
|
19
|
+
* - Check #5b: subprocess.Popen without shell=False (HIGH)
|
|
20
|
+
* - Check #6: shell=True in subprocess (HIGH)
|
|
21
|
+
* - Check #6b: subprocess.Popen with shell=True (HIGH)
|
|
22
|
+
*
|
|
23
|
+
* @param lines - Array of code lines
|
|
24
|
+
* @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
|
|
25
|
+
* @returns Array of security vulnerabilities found
|
|
26
|
+
*/
|
|
27
|
+
export declare function checkInjectionAttacks(lines: string[], unsafeSqlVariables: Map<string, number>): SecurityVulnerability[];
|
|
28
|
+
//# sourceMappingURL=injection-attacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-attacks.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/injection-attacks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CAmQzB"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Injection Attack Security Checks
|
|
4
|
+
* OWASP A03:2021 - Injection
|
|
5
|
+
*
|
|
6
|
+
* Detects code injection, SQL injection, and command injection vulnerabilities
|
|
7
|
+
* in Python code. These are among the most critical security risks.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkInjectionAttacks = checkInjectionAttacks;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for injection attack vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: eval() usage (CRITICAL)
|
|
17
|
+
* - Check #2: exec() usage (CRITICAL)
|
|
18
|
+
* - Check #3: compile() usage (HIGH)
|
|
19
|
+
* - Check #4: SQL Injection - Inline interpolation (CRITICAL)
|
|
20
|
+
* - Check #4b: SQL Injection - Data flow tracking (CRITICAL)
|
|
21
|
+
* - Check #5: Command Injection (CRITICAL)
|
|
22
|
+
* - Check #5b: subprocess.Popen without shell=False (HIGH)
|
|
23
|
+
* - Check #6: shell=True in subprocess (HIGH)
|
|
24
|
+
* - Check #6b: subprocess.Popen with shell=True (HIGH)
|
|
25
|
+
*
|
|
26
|
+
* @param lines - Array of code lines
|
|
27
|
+
* @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
|
|
28
|
+
* @returns Array of security vulnerabilities found
|
|
29
|
+
*/
|
|
30
|
+
function checkInjectionAttacks(lines, unsafeSqlVariables) {
|
|
31
|
+
const vulnerabilities = [];
|
|
32
|
+
let inMultiLineComment = false;
|
|
33
|
+
lines.forEach((line, index) => {
|
|
34
|
+
const lineNumber = index + 1;
|
|
35
|
+
const trimmed = line.trim();
|
|
36
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
37
|
+
const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
|
|
38
|
+
if (hasTripleQuote) {
|
|
39
|
+
if (!inMultiLineComment) {
|
|
40
|
+
inMultiLineComment = true;
|
|
41
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
42
|
+
if (tripleQuoteCount >= 2) {
|
|
43
|
+
inMultiLineComment = false;
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
inMultiLineComment = false;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
53
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// OWASP A03:2021 - Injection
|
|
57
|
+
// 1. eval() - CRITICAL
|
|
58
|
+
if (trimmed.includes('eval(')) {
|
|
59
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'eval() allows arbitrary code execution', 'Use ast.literal_eval() for safe data or json.loads() for JSON', lineNumber, 'Python\'s eval() executes arbitrary Python expressions, allowing attackers to execute any code if user input reaches eval().', 'eval(user_input) where user_input = "__import__(\'os\').system(\'rm -rf /\')"', [
|
|
60
|
+
'Remote Code Execution (RCE)',
|
|
61
|
+
'Complete system compromise',
|
|
62
|
+
'Data theft and exfiltration',
|
|
63
|
+
'File system access'
|
|
64
|
+
], 'result = eval(user_input)', 'import ast\nresult = ast.literal_eval(user_input) # Safe for literals only\n# Or: import json; result = json.loads(user_input)', 'Use ast.literal_eval() for Python literals or json.loads() for JSON. Never use eval() with untrusted input'));
|
|
65
|
+
}
|
|
66
|
+
// 2. exec() - CRITICAL
|
|
67
|
+
if (trimmed.includes('exec(')) {
|
|
68
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'exec() allows arbitrary code execution', 'Redesign code to avoid dynamic execution entirely', lineNumber, 'exec() executes arbitrary Python code, including statements and function definitions, making it even more dangerous than eval().', 'exec(user_code) where user_code = "import subprocess; subprocess.run([\'rm\', \'-rf\', \'/\'])"', [
|
|
69
|
+
'Remote Code Execution (RCE)',
|
|
70
|
+
'Full system access',
|
|
71
|
+
'Data manipulation',
|
|
72
|
+
'Privilege escalation'
|
|
73
|
+
], 'exec(dynamic_code)', '# Refactor to avoid dynamic code execution\n# Use configuration files, function mappings, or plugins instead', 'exec() should never be used with untrusted input. Redesign architecture to eliminate need for dynamic code execution'));
|
|
74
|
+
}
|
|
75
|
+
// 3. compile() - HIGH
|
|
76
|
+
if (trimmed.includes('compile(')) {
|
|
77
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('eval-usage', 'compile() can execute arbitrary code', 'Avoid compile() with untrusted input, validate strictly if required', lineNumber, 'compile() creates code objects that can be executed with exec(), providing another vector for code injection.', 'code = compile(user_input, "<string>", "exec"); exec(code)', [
|
|
78
|
+
'Code injection',
|
|
79
|
+
'Remote code execution',
|
|
80
|
+
'Bypass of security controls'
|
|
81
|
+
], 'code_obj = compile(source, "<string>", "exec")', '# Avoid entirely or implement strict sandboxing\n# Consider using RestrictedPython for sandboxed execution', 'Avoid compile() with untrusted input. If absolutely necessary, use sandboxing libraries like RestrictedPython'));
|
|
82
|
+
}
|
|
83
|
+
// 4. SQL Injection - CRITICAL
|
|
84
|
+
// Pattern 1: Inline string interpolation in execute()
|
|
85
|
+
if (trimmed.match(/execute\s*\(\s*[f"'].*%.*[f"']/) ||
|
|
86
|
+
trimmed.match(/execute\s*\(\s*[f"'].*\+.*[f"']/) ||
|
|
87
|
+
trimmed.match(/execute\s*\(\s*f['"]/)) {
|
|
88
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('sql-injection', 'SQL Injection with string interpolation detected', 'Use parameterized queries with placeholders', lineNumber, 'String interpolation or concatenation in SQL queries allows attackers to inject malicious SQL code, bypassing authentication and accessing the entire database.', 'cursor.execute(f"SELECT * FROM users WHERE id = {user_id}") where user_id = "1 OR 1=1"', [
|
|
89
|
+
'Full database access (read/write/delete)',
|
|
90
|
+
'Authentication bypass',
|
|
91
|
+
'Data exfiltration',
|
|
92
|
+
'Data destruction',
|
|
93
|
+
'Privilege escalation'
|
|
94
|
+
], 'cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")', 'cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))\n# Or: cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))', 'Always use parameterized queries where user input is passed as separate parameters, never interpolated into the query string'));
|
|
95
|
+
}
|
|
96
|
+
// Pattern 2: Data flow - execute() with unsafe SQL variable (FIX #1)
|
|
97
|
+
// Detects: query = f"SELECT..."; cursor.execute(query)
|
|
98
|
+
if (trimmed.match(/execute\s*\(\s*(\w+)\s*[,)]/)) {
|
|
99
|
+
const executeVarMatch = trimmed.match(/execute\s*\(\s*(\w+)\s*[,)]/);
|
|
100
|
+
if (executeVarMatch) {
|
|
101
|
+
const varName = executeVarMatch[1];
|
|
102
|
+
if (unsafeSqlVariables.has(varName)) {
|
|
103
|
+
const unsafeVarLine = unsafeSqlVariables.get(varName);
|
|
104
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('sql-injection', `SQL Injection via unsafe variable '${varName}' (constructed on line ${unsafeVarLine})`, 'Use parameterized queries with placeholders', lineNumber, `Variable '${varName}' contains SQL query with string interpolation (line ${unsafeVarLine}), then passed to execute() without parameterization. This allows SQL injection attacks.`, `query = f"SELECT * FROM users WHERE id = {user_id}" # Line ${unsafeVarLine}\ncursor.execute(query) # Line ${lineNumber} - Vulnerable!`, [
|
|
105
|
+
'Full database access (read/write/delete)',
|
|
106
|
+
'Authentication bypass',
|
|
107
|
+
'Data exfiltration',
|
|
108
|
+
'Data destruction',
|
|
109
|
+
'Privilege escalation'
|
|
110
|
+
], `# Line ${unsafeVarLine}:\nquery = f"SELECT * FROM users WHERE id = {user_id}"\n# Line ${lineNumber}:\ncursor.execute(query)`, 'cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))\n# Or: cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))', 'Always use parameterized queries where user input is passed as separate parameters, never interpolated into the query string'));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// 5. Command Injection - CRITICAL
|
|
115
|
+
if ((trimmed.includes('os.system(') || trimmed.includes('subprocess.call(') ||
|
|
116
|
+
trimmed.includes('subprocess.run(') || trimmed.includes('subprocess.Popen(')) &&
|
|
117
|
+
(trimmed.includes('+') || trimmed.includes('f"') || trimmed.includes("f'"))) {
|
|
118
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'Command Injection vulnerability detected', 'Use subprocess with shell=False and pass command as list', lineNumber, 'Concatenating user input into shell commands allows attackers to execute arbitrary system commands with the application\'s privileges.', 'os.system(f"ls {user_path}") where user_path = "; rm -rf /"', [
|
|
119
|
+
'Remote Code Execution (RCE)',
|
|
120
|
+
'Complete system compromise',
|
|
121
|
+
'Data deletion',
|
|
122
|
+
'Privilege escalation',
|
|
123
|
+
'Backdoor installation'
|
|
124
|
+
], 'os.system(f"ls {user_dir}")', 'import subprocess\nsubprocess.run(["ls", user_dir], shell=False) # Arguments as list, shell=False', 'Use subprocess with shell=False and pass command and arguments as a list. Never concatenate user input into shell commands'));
|
|
125
|
+
}
|
|
126
|
+
// 5b. subprocess.Popen without explicit shell=False - HIGH (Priority 1 Improvement)
|
|
127
|
+
// Detects subprocess.Popen calls that don't explicitly set shell=False
|
|
128
|
+
if (trimmed.includes('subprocess.Popen(') &&
|
|
129
|
+
!trimmed.includes('shell=False') &&
|
|
130
|
+
!trimmed.includes('shell = False')) {
|
|
131
|
+
// Check if there are signs of user input or variable usage
|
|
132
|
+
const hasVariables = trimmed.match(/Popen\([^)]*[a-zA-Z_][a-zA-Z0-9_]*[^)]*\)/) ||
|
|
133
|
+
trimmed.includes('.format(') ||
|
|
134
|
+
trimmed.includes('.join(');
|
|
135
|
+
if (hasVariables) {
|
|
136
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess.Popen without explicit shell=False may be unsafe', 'Explicitly set shell=False and pass command as a list', lineNumber, 'subprocess.Popen without explicitly setting shell=False defaults to shell=False in Python 3, but for clarity and security, always explicitly set shell=False and pass commands as a list to prevent command injection.', 'subprocess.Popen(cmd) where cmd = ["sh", "-c", user_input]', [
|
|
137
|
+
'Potential command injection',
|
|
138
|
+
'Unclear security posture',
|
|
139
|
+
'Shell interpretation if command contains special chars',
|
|
140
|
+
'Difficult security audit'
|
|
141
|
+
], 'subprocess.Popen(command)', 'subprocess.Popen(command, shell=False) # Explicit is better than implicit', 'Always explicitly set shell=False in subprocess.Popen() calls and pass the command as a list of strings to prevent shell interpretation'));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// 6. shell=True in subprocess - HIGH
|
|
145
|
+
if (trimmed.match(/subprocess\.\w+\(.*shell\s*=\s*True/)) {
|
|
146
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess with shell=True enables command injection', 'Use shell=False (default) and pass command as list', lineNumber, 'shell=True invokes a shell interpreter, which interprets special characters and allows command injection if user input is present.', 'subprocess.run(cmd, shell=True) where cmd = "ls; rm -rf /"', [
|
|
147
|
+
'Command injection',
|
|
148
|
+
'Shell command execution',
|
|
149
|
+
'System compromise',
|
|
150
|
+
'Data loss'
|
|
151
|
+
], 'subprocess.run(command, shell=True)', 'subprocess.run(["command", "arg1", "arg2"], shell=False) # Safe, no shell interpretation', 'Always use shell=False and pass commands as lists. Only use shell=True for trusted, hardcoded commands'));
|
|
152
|
+
}
|
|
153
|
+
// 6b. subprocess.Popen specifically (additional check for multi-line or standalone Popen calls)
|
|
154
|
+
// PRIORITY 1 FIX: Ensure subprocess.Popen with shell=True is always detected
|
|
155
|
+
if (trimmed.includes('subprocess.Popen(') && trimmed.includes('shell') && trimmed.includes('True')) {
|
|
156
|
+
// Check if this Popen call has shell=True
|
|
157
|
+
if (trimmed.match(/subprocess\.Popen\([^)]*shell\s*=\s*True/) ||
|
|
158
|
+
trimmed.match(/shell\s*=\s*True[^)]*subprocess\.Popen/)) {
|
|
159
|
+
// Skip if already reported by previous check
|
|
160
|
+
const alreadyReported = vulnerabilities.some(v => v.line === lineNumber && v.message.includes('shell=True'));
|
|
161
|
+
if (!alreadyReported) {
|
|
162
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('command-injection', 'subprocess.Popen with shell=True enables command injection', 'Use shell=False (default) and pass command as list', lineNumber, 'subprocess.Popen() with shell=True invokes a shell interpreter, which interprets special characters and allows command injection if user input is present.', 'subprocess.Popen(cmd, shell=True) where cmd = "ls; rm -rf /"', [
|
|
163
|
+
'Command injection',
|
|
164
|
+
'Shell command execution',
|
|
165
|
+
'System compromise',
|
|
166
|
+
'Data loss'
|
|
167
|
+
], 'subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)', 'subprocess.Popen(["command", "arg1", "arg2"], shell=False, stdout=subprocess.PIPE) # Safe', 'Always use shell=False with Popen and pass commands as lists. Only use shell=True for trusted, hardcoded commands'));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
return vulnerabilities;
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=injection-attacks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-attacks.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/injection-attacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Insecure Design Security Checks
|
|
3
|
+
* OWASP A06:2025 - Insecure Design
|
|
4
|
+
*
|
|
5
|
+
* Detects design-level security flaws that cannot be fixed by implementation alone.
|
|
6
|
+
* This is a NEW category in OWASP 2025 focusing on missing security controls.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for insecure design vulnerabilities in Python code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: Missing rate limiting on sensitive endpoints (HIGH)
|
|
14
|
+
* - Check #2: Mass assignment vulnerabilities (HIGH)
|
|
15
|
+
*
|
|
16
|
+
* @param lines - Array of code lines
|
|
17
|
+
* @returns Array of security vulnerabilities found
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkInsecureDesign(lines: string[]): SecurityVulnerability[];
|
|
20
|
+
//# sourceMappingURL=insecure-design.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insecure-design.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/insecure-design.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAsMzB"}
|