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,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Data Integrity Failures Security Checks
|
|
4
|
+
* OWASP A08:2025 - Software and Data Integrity Failures
|
|
5
|
+
*
|
|
6
|
+
* Detects insecure deserialization with pickle module.
|
|
7
|
+
* Updated for OWASP 2025 with enhanced detection patterns.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkDataIntegrity = checkDataIntegrity;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for data integrity vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: Insecure deserialization with pickle (CRITICAL)
|
|
17
|
+
*
|
|
18
|
+
* @param lines - Array of code lines
|
|
19
|
+
* @returns Array of security vulnerabilities found
|
|
20
|
+
*/
|
|
21
|
+
function checkDataIntegrity(lines) {
|
|
22
|
+
const vulnerabilities = [];
|
|
23
|
+
let inMultiLineComment = false;
|
|
24
|
+
lines.forEach((line, index) => {
|
|
25
|
+
const trimmedLine = line.trim();
|
|
26
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
27
|
+
const hasTripleQuote = trimmedLine.includes('"""') || trimmedLine.includes("'''");
|
|
28
|
+
if (hasTripleQuote) {
|
|
29
|
+
if (!inMultiLineComment) {
|
|
30
|
+
// Start of multi-line comment
|
|
31
|
+
inMultiLineComment = true;
|
|
32
|
+
// Check if it closes on the same line (single-line docstring)
|
|
33
|
+
const tripleQuoteCount = (trimmedLine.match(/"""/g) || []).length + (trimmedLine.match(/'''/g) || []).length;
|
|
34
|
+
if (tripleQuoteCount >= 2) {
|
|
35
|
+
// Opens and closes on same line, reset flag
|
|
36
|
+
inMultiLineComment = false;
|
|
37
|
+
}
|
|
38
|
+
return; // Skip this line
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// End of multi-line comment
|
|
42
|
+
inMultiLineComment = false;
|
|
43
|
+
return; // Skip this line
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
47
|
+
if (!trimmedLine ||
|
|
48
|
+
inMultiLineComment ||
|
|
49
|
+
trimmedLine.startsWith('#')) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const lowerLine = trimmedLine.toLowerCase();
|
|
53
|
+
// Check #1: Insecure deserialization with pickle
|
|
54
|
+
// Detect pickle module usage (all variants)
|
|
55
|
+
const hasPickleUsage =
|
|
56
|
+
// Standard pickle operations
|
|
57
|
+
lowerLine.includes('pickle.load(') ||
|
|
58
|
+
lowerLine.includes('pickle.loads(') ||
|
|
59
|
+
lowerLine.includes('pickle.dump(') ||
|
|
60
|
+
lowerLine.includes('pickle.dumps(') ||
|
|
61
|
+
lowerLine.includes('pickle.unpickler(') ||
|
|
62
|
+
// Import variants
|
|
63
|
+
/from\s+pickle\s+import\s+(load|loads|dump|dumps|unpickler)/i.test(trimmedLine) ||
|
|
64
|
+
// Direct usage after import
|
|
65
|
+
(/\b(load|loads|dump|dumps|unpickler)\s*\(/.test(lowerLine) &&
|
|
66
|
+
// Make sure we have imported pickle earlier
|
|
67
|
+
lines.slice(0, index).some(l => /from\s+pickle\s+import/i.test(l.trim()))) ||
|
|
68
|
+
// cPickle (Python 2)
|
|
69
|
+
lowerLine.includes('cpickle.load(') ||
|
|
70
|
+
lowerLine.includes('cpickle.loads(') ||
|
|
71
|
+
lowerLine.includes('cpickle.dump(') ||
|
|
72
|
+
lowerLine.includes('cpickle.dumps(') ||
|
|
73
|
+
// _pickle (internal module)
|
|
74
|
+
lowerLine.includes('_pickle.load(') ||
|
|
75
|
+
lowerLine.includes('_pickle.loads(') ||
|
|
76
|
+
lowerLine.includes('_pickle.dump(') ||
|
|
77
|
+
lowerLine.includes('_pickle.dumps(');
|
|
78
|
+
if (hasPickleUsage) {
|
|
79
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('insecure-deserialization', 'Insecure deserialization with pickle - allows arbitrary code execution when deserializing untrusted data', 'Use safe serialization formats (JSON, MessagePack) or implement strict validation before pickle deserialization', index + 1, 'Pickle can execute arbitrary Python code during deserialization. If an attacker controls the serialized data, they can achieve Remote Code Execution (RCE), install backdoors, steal credentials, or completely compromise the server. This is one of the most critical Python vulnerabilities.', 'import pickle\ndata = pickle.loads(request.data) # CRITICAL: RCE vulnerability!', [
|
|
80
|
+
'Remote Code Execution (RCE) when deserializing attacker-controlled data',
|
|
81
|
+
'Complete server compromise and backdoor installation',
|
|
82
|
+
'Data exfiltration and credential theft',
|
|
83
|
+
'Privilege escalation to system/root access',
|
|
84
|
+
'Chain attacks to internal infrastructure'
|
|
85
|
+
], 'import pickle\ndef load_user_session(session_data):\n return pickle.loads(session_data) # Dangerous!', 'import json\ndef load_user_session(session_data):\n return json.loads(session_data) # Safe - JSON cannot execute code', 'Never use pickle for untrusted data. Prefer JSON (json.loads), MessagePack (msgpack.unpackb), or Protocol Buffers. If pickle is absolutely required, implement HMAC signature verification, use restricted Unpickler with safe_load(), and validate all data in isolated sandbox.'));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return vulnerabilities;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data-integrity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-integrity.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/data-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Deserialization Security Checks
|
|
3
|
+
* OWASP A08:2021 - Software and Data Integrity Failures
|
|
4
|
+
*
|
|
5
|
+
* Detects insecure deserialization vulnerabilities in Python code,
|
|
6
|
+
* particularly with pickle and YAML libraries.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for insecure deserialization vulnerabilities
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #9: pickle.load() (HIGH) - Arbitrary code execution via pickle
|
|
14
|
+
* - Check #10: yaml.load() without SafeLoader (HIGH) - Code execution via YAML
|
|
15
|
+
*
|
|
16
|
+
* @param lines - Array of code lines
|
|
17
|
+
* @returns Array of security vulnerabilities found
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkDeserialization(lines: string[]): SecurityVulnerability[];
|
|
20
|
+
//# sourceMappingURL=deserialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deserialization.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/deserialization.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,CAyEzB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Deserialization Security Checks
|
|
4
|
+
* OWASP A08:2021 - Software and Data Integrity Failures
|
|
5
|
+
*
|
|
6
|
+
* Detects insecure deserialization vulnerabilities in Python code,
|
|
7
|
+
* particularly with pickle and YAML libraries.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkDeserialization = checkDeserialization;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for insecure deserialization vulnerabilities
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #9: pickle.load() (HIGH) - Arbitrary code execution via pickle
|
|
17
|
+
* - Check #10: yaml.load() without SafeLoader (HIGH) - Code execution via YAML
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @returns Array of security vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
function checkDeserialization(lines) {
|
|
23
|
+
const vulnerabilities = [];
|
|
24
|
+
let inMultiLineComment = false;
|
|
25
|
+
lines.forEach((line, index) => {
|
|
26
|
+
const lineNumber = index + 1;
|
|
27
|
+
const trimmed = line.trim();
|
|
28
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
29
|
+
const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
|
|
30
|
+
if (hasTripleQuote) {
|
|
31
|
+
if (!inMultiLineComment) {
|
|
32
|
+
inMultiLineComment = true;
|
|
33
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
34
|
+
if (tripleQuoteCount >= 2) {
|
|
35
|
+
inMultiLineComment = false;
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
inMultiLineComment = false;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
45
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// 9. pickle with untrusted data - HIGH
|
|
49
|
+
if (trimmed.match(/pickle\.load[s]?\(/) && !trimmed.includes('# trusted')) {
|
|
50
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('unsafe-pickle', 'pickle.load() can execute arbitrary code', 'Use json or msgpack for serialization, never unpickle untrusted data', lineNumber, 'Pickle deserialization can execute arbitrary Python code embedded in the pickled data, making it extremely dangerous with untrusted input.', 'pickle.loads(user_data) # Can execute __reduce__ methods with malicious code', [
|
|
51
|
+
'Remote Code Execution (RCE)',
|
|
52
|
+
'Complete system compromise',
|
|
53
|
+
'Data theft',
|
|
54
|
+
'Malware installation'
|
|
55
|
+
], 'import pickle\ndata = pickle.load(untrusted_file)', 'import json\ndata = json.load(file) # Safe, only data deserialization\n# Or use msgpack for binary', 'Never unpickle data from untrusted sources. Use json for text data or msgpack for binary serialization'));
|
|
56
|
+
}
|
|
57
|
+
// 10. yaml.load() without SafeLoader - HIGH
|
|
58
|
+
if (trimmed.match(/yaml\.load\(/) && !trimmed.includes('SafeLoader')) {
|
|
59
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('unsafe-yaml-load', 'yaml.load() without SafeLoader can execute arbitrary code', 'Use yaml.safe_load() or yaml.load() with SafeLoader', lineNumber, 'yaml.load() with default Loader can instantiate arbitrary Python objects, including those that execute code during construction.', 'yaml.load(user_config) # Can execute !!python/object/apply', [
|
|
60
|
+
'Remote Code Execution (RCE)',
|
|
61
|
+
'Object instantiation attacks',
|
|
62
|
+
'System compromise'
|
|
63
|
+
], 'import yaml\nconfig = yaml.load(file)', 'import yaml\nconfig = yaml.safe_load(file) # Safe, only loads basic types\n# Or: yaml.load(file, Loader=yaml.SafeLoader)', 'Always use yaml.safe_load() or explicitly pass Loader=yaml.SafeLoader to yaml.load()'));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return vulnerabilities;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=deserialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deserialization.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/deserialization.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAeH,oDA2EC;AAvFD,sEAAiF;AAEjF;;;;;;;;;GASG;AACH,SAAgB,oBAAoB,CAClC,KAAe;IAEf,MAAM,eAAe,GAA4B,EAAE,CAAC;IACpD,IAAI,kBAAkB,GAAG,KAAK,CAAC;IAE/B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,kFAAkF;QAClF,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE1E,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,kBAAkB,GAAG,IAAI,CAAC;gBAC1B,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACrG,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;oBAC1B,kBAAkB,GAAG,KAAK,CAAC;gBAC7B,CAAC;gBACD,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,kBAAkB,GAAG,KAAK,CAAC;gBAC3B,OAAO;YACT,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,CAAC,OAAO,IAAI,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,uCAAuC;QACvC,IAAI,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC1E,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,eAAe,EACf,0CAA0C,EAC1C,sEAAsE,EACtE,UAAU,EACV,4IAA4I,EAC5I,+EAA+E,EAC/E;gBACE,6BAA6B;gBAC7B,4BAA4B;gBAC5B,YAAY;gBACZ,sBAAsB;aACvB,EACD,mDAAmD,EACnD,qGAAqG,EACrG,wGAAwG,CACzG,CAAC,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACrE,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,kBAAkB,EAClB,2DAA2D,EAC3D,qDAAqD,EACrD,UAAU,EACV,kIAAkI,EAClI,6DAA6D,EAC7D;gBACE,6BAA6B;gBAC7B,8BAA8B;gBAC9B,mBAAmB;aACpB,EACD,uCAAuC,EACvC,2HAA2H,EAC3H,sFAAsF,CACvF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Django Framework Security Checks
|
|
3
|
+
* OWASP A03:2021 - Injection, A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures
|
|
4
|
+
*
|
|
5
|
+
* Detects Django-specific security vulnerabilities including CSRF issues,
|
|
6
|
+
* configuration errors, XSS bypasses, and authentication problems.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for Django framework security vulnerabilities
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #22: @csrf_exempt (HIGH) - Disables CSRF protection
|
|
14
|
+
* - Check #23: DEBUG=True (CRITICAL) - Information disclosure
|
|
15
|
+
* - Check #24: mark_safe() with user input (HIGH) - XSS vulnerability
|
|
16
|
+
* - Check #25: ORM raw() SQL injection (CRITICAL) - SQL injection via raw queries
|
|
17
|
+
* - Check #26: Missing @login_required (MEDIUM) - Missing authentication
|
|
18
|
+
* - Check #27: Weak SECRET_KEY (CRITICAL) - Cryptographic weakness
|
|
19
|
+
*
|
|
20
|
+
* @param lines - Array of code lines
|
|
21
|
+
* @param unsafeSqlVariables - Map of variable names with unsafe SQL string formatting
|
|
22
|
+
* @returns Array of security vulnerabilities found
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkDjangoSecurity(lines: string[], unsafeSqlVariables: Map<string, number>): SecurityVulnerability[];
|
|
25
|
+
//# sourceMappingURL=django-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"django-security.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/django-security.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EAAE,EACf,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,qBAAqB,EAAE,CAgPzB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Django Framework Security Checks
|
|
4
|
+
* OWASP A03:2021 - Injection, A01:2021 - Broken Access Control, A02:2021 - Cryptographic Failures
|
|
5
|
+
*
|
|
6
|
+
* Detects Django-specific security vulnerabilities including CSRF issues,
|
|
7
|
+
* configuration errors, XSS bypasses, and authentication problems.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkDjangoSecurity = checkDjangoSecurity;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for Django framework security vulnerabilities
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #22: @csrf_exempt (HIGH) - Disables CSRF protection
|
|
17
|
+
* - Check #23: DEBUG=True (CRITICAL) - Information disclosure
|
|
18
|
+
* - Check #24: mark_safe() with user input (HIGH) - XSS vulnerability
|
|
19
|
+
* - Check #25: ORM raw() SQL injection (CRITICAL) - SQL injection via raw queries
|
|
20
|
+
* - Check #26: Missing @login_required (MEDIUM) - Missing authentication
|
|
21
|
+
* - Check #27: Weak SECRET_KEY (CRITICAL) - Cryptographic weakness
|
|
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
|
+
function checkDjangoSecurity(lines, unsafeSqlVariables) {
|
|
28
|
+
const vulnerabilities = [];
|
|
29
|
+
let inMultiLineComment = false;
|
|
30
|
+
lines.forEach((line, index) => {
|
|
31
|
+
const lineNumber = index + 1;
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
// CRITICAL: Track Python triple-quote comment blocks (""" ... """ or ''' ... ''')
|
|
34
|
+
const hasTripleQuote = trimmed.includes('"""') || trimmed.includes("'''");
|
|
35
|
+
if (hasTripleQuote) {
|
|
36
|
+
if (!inMultiLineComment) {
|
|
37
|
+
inMultiLineComment = true;
|
|
38
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
39
|
+
if (tripleQuoteCount >= 2) {
|
|
40
|
+
inMultiLineComment = false;
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
inMultiLineComment = false;
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
50
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
// 22. Django CSRF Exempt - HIGH (disables CSRF protection)
|
|
54
|
+
if (trimmed.includes('@csrf_exempt') && !trimmed.startsWith('#')) {
|
|
55
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-csrf-exempt', '@csrf_exempt decorator disables CSRF protection', 'Remove @csrf_exempt or ensure alternative CSRF protection is in place', lineNumber, 'The @csrf_exempt decorator disables Django\'s built-in CSRF protection, leaving the view vulnerable to Cross-Site Request Forgery attacks where attackers can perform unauthorized actions.', '@csrf_exempt\\ndef upload_file(request): # Attacker can forge POST requests', [
|
|
56
|
+
'Cross-Site Request Forgery (CSRF)',
|
|
57
|
+
'Unauthorized state-changing operations',
|
|
58
|
+
'Account takeover',
|
|
59
|
+
'Data manipulation',
|
|
60
|
+
'Privilege escalation'
|
|
61
|
+
], '@csrf_exempt\\ndef process_payment(request):', 'def process_payment(request):\\n # CSRF protection enabled by default\\n if request.method == "POST":\\n # Verify CSRF token automatically', 'Only use @csrf_exempt for APIs with alternative authentication (e.g., API tokens). Never exempt user-facing forms'));
|
|
62
|
+
}
|
|
63
|
+
// 23. Django DEBUG=True - CRITICAL (information disclosure)
|
|
64
|
+
if (trimmed.match(/DEBUG\s*=\s*True/)) {
|
|
65
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-debug-true', 'DEBUG = True exposes sensitive information in production', 'Set DEBUG = False in production settings', lineNumber, 'Running Django with DEBUG=True in production exposes detailed error pages with stack traces, settings, environment variables, and SQL queries to end users, revealing sensitive application internals.', 'DEBUG = True # Exposes SECRET_KEY, database credentials, file paths', [
|
|
66
|
+
'Information disclosure',
|
|
67
|
+
'Exposure of secret keys and credentials',
|
|
68
|
+
'Exposure of application structure',
|
|
69
|
+
'Stack trace information leakage',
|
|
70
|
+
'Potential for targeted attacks'
|
|
71
|
+
], 'DEBUG = True', 'import os\\nDEBUG = os.environ.get("DEBUG", "False") == "True" # False by default\\n# Or: DEBUG = False # Production', 'Always set DEBUG=False in production. Use environment variables to control debug mode'));
|
|
72
|
+
}
|
|
73
|
+
// 24. Django mark_safe() - HIGH (XSS vulnerability)
|
|
74
|
+
// CRITICAL FIX (2025-11-21): Expanded detection pattern
|
|
75
|
+
// Old: Only detected mark_safe() with 'request.', 'user_', 'input' keywords
|
|
76
|
+
// New: Detects mark_safe() with ANY variable, f-string, or dynamic content
|
|
77
|
+
if (trimmed.includes('mark_safe(')) {
|
|
78
|
+
const hasDynamicContent = trimmed.includes('request.') || // request.GET, request.POST
|
|
79
|
+
trimmed.includes('user.') || // user.bio, user.name
|
|
80
|
+
trimmed.match(/user_\w+/) || // user_input, user_data
|
|
81
|
+
trimmed.includes('input') || // input variable
|
|
82
|
+
trimmed.match(/mark_safe\([^)]*\{/) || // f-string interpolation: f"...{var}..."
|
|
83
|
+
trimmed.match(/mark_safe\([^)]*\+/) || // string concatenation
|
|
84
|
+
trimmed.match(/mark_safe\([^)]*\.format\(/) || // .format() method
|
|
85
|
+
trimmed.match(/mark_safe\([^)]*%/) || // % string formatting
|
|
86
|
+
trimmed.match(/mark_safe\(\w+\)/) || // variable: mark_safe(content)
|
|
87
|
+
trimmed.match(/mark_safe\([^)]*\[/); // array/dict access: mark_safe(data['key'])
|
|
88
|
+
if (hasDynamicContent) {
|
|
89
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-mark-safe-xss', 'mark_safe() with user input bypasses XSS protection', 'Sanitize user input or use Django template auto-escaping instead', lineNumber, 'Django\'s mark_safe() function tells the template engine to trust the HTML content. When used with user input, it bypasses XSS protection and allows attackers to inject malicious scripts.', 'html = mark_safe(request.GET["content"]) # Attacker: ?content=<script>alert(1)</script>', [
|
|
90
|
+
'Cross-Site Scripting (XSS)',
|
|
91
|
+
'Session hijacking',
|
|
92
|
+
'Credential theft',
|
|
93
|
+
'Malicious script injection',
|
|
94
|
+
'Client-side code execution'
|
|
95
|
+
], 'from django.utils.safestring import mark_safe\\nhtml = mark_safe(user_input)', 'from django.utils.html import escape\\n# Let Django auto-escape in templates\\nhtml = escape(user_input) # Sanitizes HTML\\n# Or use template: {{ user_input }} (auto-escaped)', 'Never use mark_safe() with user-controlled input. Use Django\'s template auto-escaping'));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// 25. Django ORM Raw SQL Injection - CRITICAL (with data flow analysis)
|
|
99
|
+
if (trimmed.includes('.raw(')) {
|
|
100
|
+
// Check 1: Inline string formatting (same line as .raw())
|
|
101
|
+
const hasInlineFormatting = trimmed.includes('f"') ||
|
|
102
|
+
trimmed.includes('f\'') ||
|
|
103
|
+
trimmed.includes('%s"') ||
|
|
104
|
+
trimmed.includes('+') ||
|
|
105
|
+
trimmed.includes('.format(');
|
|
106
|
+
// Check 2: Using tracked unsafe variable
|
|
107
|
+
let usesUnsafeVariable = false;
|
|
108
|
+
let unsafeVarLine = 0;
|
|
109
|
+
let varName = '';
|
|
110
|
+
// Extract variable name from .raw(variable) call
|
|
111
|
+
const rawCallMatch = trimmed.match(/\.raw\((\w+)/);
|
|
112
|
+
if (rawCallMatch) {
|
|
113
|
+
varName = rawCallMatch[1];
|
|
114
|
+
if (unsafeSqlVariables.has(varName)) {
|
|
115
|
+
usesUnsafeVariable = true;
|
|
116
|
+
unsafeVarLine = unsafeSqlVariables.get(varName);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (hasInlineFormatting || usesUnsafeVariable) {
|
|
120
|
+
const message = usesUnsafeVariable
|
|
121
|
+
? `Django ORM raw() uses unsafe query variable '${varName}' (defined on line ${unsafeVarLine})`
|
|
122
|
+
: 'Django ORM raw() with string formatting allows SQL injection';
|
|
123
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-orm-sql-injection', message, 'Use parameterized queries with .raw() or switch to ORM query methods', lineNumber, 'Using string formatting (f-strings, %, +, .format()) with Django\'s .raw() method allows SQL injection attacks. Attackers can manipulate queries to access unauthorized data or modify the database.', 'User.objects.raw(f"SELECT * FROM users WHERE name = \'{name}\'") # name = "admin\'--" → bypasses WHERE', [
|
|
124
|
+
'SQL injection',
|
|
125
|
+
'Unauthorized data access',
|
|
126
|
+
'Data exfiltration',
|
|
127
|
+
'Data manipulation/deletion',
|
|
128
|
+
'Authentication bypass'
|
|
129
|
+
], 'query = f"SELECT * FROM users WHERE id = {user_id}"\\nUser.objects.raw(query)', '# Use parameterized queries\\nUser.objects.raw("SELECT * FROM users WHERE id = %s", [user_id])\\n# Or use ORM: User.objects.filter(id=user_id)', 'Always use parameterized queries with .raw(). Prefer Django ORM methods over raw SQL'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 26. Django Missing login_required - MEDIUM (missing authentication)
|
|
133
|
+
// PHASE 6 FIX (2025-11-22): Broadened detection to include admin, settings, dashboard, financial operations
|
|
134
|
+
const lowerTrimmed = trimmed.toLowerCase();
|
|
135
|
+
const sensitiveKeywords = [
|
|
136
|
+
'admin', 'delete', 'remove', 'update', 'edit',
|
|
137
|
+
'settings', 'dashboard', 'manage', 'create', 'transfer',
|
|
138
|
+
'invoice', 'payment', 'billing'
|
|
139
|
+
];
|
|
140
|
+
if ((trimmed.includes('def ') || trimmed.includes('class ')) &&
|
|
141
|
+
trimmed.includes('(request') && // Django view signature
|
|
142
|
+
sensitiveKeywords.some(keyword => lowerTrimmed.includes(keyword))) {
|
|
143
|
+
// Check if @login_required is in previous lines (must be actual decorator, not in comments)
|
|
144
|
+
const hasAuthRequired = lines.slice(Math.max(0, index - 5), index).some(prevLine => {
|
|
145
|
+
const prevTrimmed = prevLine.trim();
|
|
146
|
+
return !prevTrimmed.startsWith('#') && (prevTrimmed.includes('@login_required') || prevTrimmed.includes('@permission_required'));
|
|
147
|
+
});
|
|
148
|
+
if (!hasAuthRequired) {
|
|
149
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-missing-login-required', 'Sensitive view missing @login_required decorator', 'Add @login_required decorator to restrict access to authenticated users', lineNumber, 'Django views that perform sensitive operations (delete, update, admin actions, settings) should require authentication. Without @login_required, anonymous users can access these functions.', 'def admin_dashboard(request): # No @login_required → Anyone can access admin panel', [
|
|
150
|
+
'Unauthorized access to sensitive functions',
|
|
151
|
+
'Data manipulation by anonymous users',
|
|
152
|
+
'Privilege escalation',
|
|
153
|
+
'Missing access control',
|
|
154
|
+
'OWASP A01:2021 - Broken Access Control'
|
|
155
|
+
], 'def admin_dashboard(request):', 'from django.contrib.auth.decorators import login_required\\n\\n@login_required\\ndef admin_dashboard(request):\\n # Only authenticated users can access', 'Always use @login_required for sensitive views. Consider @permission_required for role-based access'));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// 27. Django Weak SECRET_KEY - CRITICAL (cryptographic weakness)
|
|
159
|
+
if (trimmed.match(/SECRET_KEY\s*=\s*['"]/)) {
|
|
160
|
+
const secretKeyMatch = trimmed.match(/SECRET_KEY\s*=\s*['"]([^'"]+)['"]/);
|
|
161
|
+
if (secretKeyMatch) {
|
|
162
|
+
const secretKey = secretKeyMatch[1];
|
|
163
|
+
const isWeak = secretKey.length < 50 ||
|
|
164
|
+
/^(secret|django|12345|password|key|test|abc|demo)/i.test(secretKey) ||
|
|
165
|
+
secretKey === 'your-secret-key-here';
|
|
166
|
+
if (isWeak) {
|
|
167
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('django-weak-secret-key', 'Django SECRET_KEY is weak or hardcoded', 'Generate a strong random SECRET_KEY and store in environment variables', lineNumber, 'Django\'s SECRET_KEY is used for cryptographic signing of sessions, cookies, and password reset tokens. A weak or hardcoded key allows attackers to forge sessions and decrypt sensitive data.', 'SECRET_KEY = "12345" # Attacker can forge session cookies and impersonate any user', [
|
|
168
|
+
'Session forgery',
|
|
169
|
+
'Cookie tampering',
|
|
170
|
+
'Password reset token forgery',
|
|
171
|
+
'CSRF token bypass',
|
|
172
|
+
'Cryptographic attack on signed data'
|
|
173
|
+
], 'SECRET_KEY = "django-insecure-123"', 'import os\\nfrom django.core.management.utils import get_random_secret_key\\n\\nSECRET_KEY = os.environ.get("DJANGO_SECRET_KEY")\\nif not SECRET_KEY:\\n raise ValueError("DJANGO_SECRET_KEY environment variable not set")', 'Generate with: python -c \'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())\''));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
return vulnerabilities;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=django-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"django-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/django-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Enhanced Supply Chain Security Checks
|
|
3
|
+
* OWASP A03:2025 - Software Supply Chain Failures (Enhanced)
|
|
4
|
+
*
|
|
5
|
+
* Enhanced supply chain security checks building on existing dependency scanning.
|
|
6
|
+
* Focuses on runtime dependencies, package integrity, and malicious code patterns.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for enhanced supply chain security vulnerabilities in Python code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: Dynamic imports without validation (HIGH)
|
|
14
|
+
* - Check #2: Runtime package installation (HIGH)
|
|
15
|
+
* - Check #3: Suspicious package patterns (HIGH)
|
|
16
|
+
* - Check #4: Untrusted package sources (MEDIUM)
|
|
17
|
+
* - Check #5: Package typosquatting patterns (MEDIUM)
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @returns Array of security vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkEnhancedSupplyChain(lines: string[]): SecurityVulnerability[];
|
|
23
|
+
//# sourceMappingURL=enhanced-supply-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-supply-chain.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/enhanced-supply-chain.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAkLzB"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Enhanced Supply Chain Security Checks
|
|
4
|
+
* OWASP A03:2025 - Software Supply Chain Failures (Enhanced)
|
|
5
|
+
*
|
|
6
|
+
* Enhanced supply chain security checks building on existing dependency scanning.
|
|
7
|
+
* Focuses on runtime dependencies, package integrity, and malicious code patterns.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkEnhancedSupplyChain = checkEnhancedSupplyChain;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for enhanced supply chain security vulnerabilities in Python code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #1: Dynamic imports without validation (HIGH)
|
|
17
|
+
* - Check #2: Runtime package installation (HIGH)
|
|
18
|
+
* - Check #3: Suspicious package patterns (HIGH)
|
|
19
|
+
* - Check #4: Untrusted package sources (MEDIUM)
|
|
20
|
+
* - Check #5: Package typosquatting patterns (MEDIUM)
|
|
21
|
+
*
|
|
22
|
+
* @param lines - Array of code lines
|
|
23
|
+
* @returns Array of security vulnerabilities found
|
|
24
|
+
*/
|
|
25
|
+
function checkEnhancedSupplyChain(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: Dynamic imports without validation
|
|
58
|
+
if ((lowerLine.includes('__import__(') || lowerLine.includes('importlib.import_module(')) &&
|
|
59
|
+
(lowerLine.includes('input(') || lowerLine.includes('sys.argv') ||
|
|
60
|
+
lowerLine.includes('request.') || lowerLine.includes('os.environ'))) {
|
|
61
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('dynamic-import-no-validation', 'Dynamic import from user input without validation', 'Validate and whitelist allowed module names before dynamic imports', index + 1, 'Dynamic imports from user input can execute arbitrary code and enable supply chain attacks', '__import__(user_input) # arbitrary module loading', [
|
|
62
|
+
'Arbitrary module execution from user input',
|
|
63
|
+
'Supply chain attacks through malicious packages',
|
|
64
|
+
'Code injection via module names',
|
|
65
|
+
'Bypass of static analysis and security tools'
|
|
66
|
+
], '__import__(user_input)', 'allowed_modules = ["safe_module"]; if module_name in allowed_modules: __import__(module_name)', 'Dynamic imports should validate module names against a whitelist to prevent arbitrary code execution'));
|
|
67
|
+
}
|
|
68
|
+
// Check #2: Runtime package installation
|
|
69
|
+
if ((lowerLine.includes('subprocess.') || lowerLine.includes('os.system(')) &&
|
|
70
|
+
(lowerLine.includes('pip install') || lowerLine.includes('pip3 install') ||
|
|
71
|
+
lowerLine.includes('easy_install') || lowerLine.includes('conda install'))) {
|
|
72
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('runtime-package-installation', 'Runtime package installation detected', 'Pre-install packages during build time instead of runtime installation', index + 1, 'Runtime package installation can introduce malicious code and supply chain vulnerabilities', 'subprocess.run(["pip", "install", user_package]) # runtime installation', [
|
|
73
|
+
'Installation of malicious packages at runtime',
|
|
74
|
+
'Supply chain attacks through compromised packages',
|
|
75
|
+
'Privilege escalation through package installation',
|
|
76
|
+
'Environment contamination with untrusted code'
|
|
77
|
+
], 'subprocess.run(["pip", "install", package_name])', '# Pre-install packages in requirements.txt or Dockerfile', 'Runtime package installation bypasses security controls and enables arbitrary code execution'));
|
|
78
|
+
}
|
|
79
|
+
// Check #3: Suspicious package patterns (common typosquatting names)
|
|
80
|
+
// Don't flag legitimate packages: bs4, requests, urllib, numpy, pandas (use word boundaries!)
|
|
81
|
+
const legitimatePackages = ['bs4', 'requests', 'urllib', 'numpy', 'pandas'];
|
|
82
|
+
const hasLegitimatePackage = legitimatePackages.some(pkg => {
|
|
83
|
+
// Match exact package name with word boundaries (import numpy, from numpy, import urllib.parse)
|
|
84
|
+
const importPattern = new RegExp(`\\b(import|from)\\s+${pkg}\\b`, 'i');
|
|
85
|
+
return importPattern.test(trimmedLine);
|
|
86
|
+
});
|
|
87
|
+
if ((lowerLine.includes('import ') || lowerLine.includes('from ')) &&
|
|
88
|
+
!hasLegitimatePackage &&
|
|
89
|
+
(lowerLine.includes('reqeusts') || lowerLine.includes('beautifulsoup') ||
|
|
90
|
+
lowerLine.includes('urlib') || lowerLine.includes('numpyy') ||
|
|
91
|
+
lowerLine.includes('pandass') || lowerLine.includes('pythn'))) {
|
|
92
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('suspicious-package-pattern', 'Potentially typosquatted package name detected', 'Verify package names carefully against PyPI official packages', index + 1, 'Typosquatting packages can contain malicious code that mimics legitimate packages', 'import reqeusts # should be "requests"', [
|
|
93
|
+
'Malicious code execution from fake packages',
|
|
94
|
+
'Data theft and credential harvesting',
|
|
95
|
+
'Backdoor installation and remote access',
|
|
96
|
+
'Supply chain compromise through package confusion'
|
|
97
|
+
], 'import reqeusts', 'import requests # verify correct package name', 'Typosquatting packages exploit common typos to distribute malicious code'));
|
|
98
|
+
}
|
|
99
|
+
// Check #4: Untrusted package sources
|
|
100
|
+
if ((lowerLine.includes('pip install') || lowerLine.includes('pip3 install')) &&
|
|
101
|
+
(lowerLine.includes('--index-url') || lowerLine.includes('-i ') ||
|
|
102
|
+
lowerLine.includes('--extra-index-url') || lowerLine.includes('--find-links'))) {
|
|
103
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('untrusted-package-source', 'Package installation from non-standard or untrusted source', 'Use official PyPI repository or verify custom repository security', index + 1, 'Installing packages from untrusted sources can introduce malicious code', 'pip install --index-url http://suspicious-repo.com/simple/ package', [
|
|
104
|
+
'Malicious packages from compromised repositories',
|
|
105
|
+
'Supply chain attacks through untrusted sources',
|
|
106
|
+
'Man-in-the-middle attacks on package downloads',
|
|
107
|
+
'Installation of backdoored or modified packages'
|
|
108
|
+
], 'pip install --index-url http://custom-repo.com/simple/ package', 'pip install package # use official PyPI or verify custom repo security', 'Custom package repositories should be verified for security before use'));
|
|
109
|
+
}
|
|
110
|
+
// Check #5: Package typosquatting patterns in pip commands
|
|
111
|
+
if ((lowerLine.includes('pip install') || lowerLine.includes('pip3 install')) &&
|
|
112
|
+
(lowerLine.includes('django-admin') || lowerLine.includes('flask-admin') ||
|
|
113
|
+
lowerLine.includes('python-') || lowerLine.includes('py-') ||
|
|
114
|
+
lowerLine.includes('djangoo') || lowerLine.includes('flaskk') ||
|
|
115
|
+
lowerLine.includes('requestss') || lowerLine.includes('numpy-') ||
|
|
116
|
+
lowerLine.includes('pandas-'))) {
|
|
117
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('package-typosquatting-pattern', 'Package name follows common typosquatting pattern', 'Verify official package names on PyPI before installation', index + 1, 'Package names that mimic popular packages may contain malicious code', 'pip install djangoo # should be "django"', [
|
|
118
|
+
'Installation of malicious packages instead of legitimate ones',
|
|
119
|
+
'Supply chain attacks through package confusion',
|
|
120
|
+
'Backdoor code execution in development and production',
|
|
121
|
+
'Credential theft and data exfiltration'
|
|
122
|
+
], 'pip install djangoo', 'pip install django # use official package name from PyPI', 'Package names should be verified against official PyPI listings to avoid typosquatting attacks'));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
return vulnerabilities;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=enhanced-supply-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-supply-chain.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/enhanced-supply-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Exception Handling Security Checks
|
|
3
|
+
* OWASP A10:2025 - Mishandling of Exceptional Conditions
|
|
4
|
+
*
|
|
5
|
+
* Detects improper exception handling that can lead to security vulnerabilities.
|
|
6
|
+
* This is a completely NEW category in OWASP 2025.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for exception handling security vulnerabilities in Python code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #1: Bare except clauses (HIGH)
|
|
14
|
+
* - Check #2: Exception details exposed in responses (HIGH)
|
|
15
|
+
* - Check #3: Silent exception suppression (MEDIUM)
|
|
16
|
+
* - Check #4: Resource cleanup missing in exceptions (MEDIUM)
|
|
17
|
+
* - Check #5: Incorrect exception handling patterns (MEDIUM)
|
|
18
|
+
*
|
|
19
|
+
* @param lines - Array of code lines
|
|
20
|
+
* @returns Array of security vulnerabilities found
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkExceptionHandling(lines: string[]): SecurityVulnerability[];
|
|
23
|
+
//# sourceMappingURL=exception-handling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exception-handling.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/exception-handling.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CA6KzB"}
|