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,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python AI-Generated Code Detection Module
|
|
4
|
+
*
|
|
5
|
+
* Detects AI-generated code patterns as SECURITY RISKS:
|
|
6
|
+
* - 15 hallucination patterns (JavaScript influence, case errors)
|
|
7
|
+
* - 8 code smell heuristics (over-engineering, inconsistency)
|
|
8
|
+
* - Confidence scoring (HIGH/MEDIUM/LOW)
|
|
9
|
+
*
|
|
10
|
+
* OWASP A04:2025 - Insecure Design
|
|
11
|
+
* CWE-1120 - Excessive Code Complexity
|
|
12
|
+
* CWE-758 - Reliance on Undefined Behavior
|
|
13
|
+
*
|
|
14
|
+
* Phase 1.5, Week 5-7 (AI-Generated Code Detection)
|
|
15
|
+
* Created: January 8, 2026
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.checkAIGeneratedCode = checkAIGeneratedCode;
|
|
19
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
20
|
+
const ai_code_detection_utils_1 = require("../../helpers/ai-code-detection-utils");
|
|
21
|
+
/**
|
|
22
|
+
* Python hallucination patterns (15 patterns)
|
|
23
|
+
*
|
|
24
|
+
* AI code generators hallucinate methods from JavaScript:
|
|
25
|
+
* - JavaScript influence: .push(), .toUpperCase(), .indexOf()
|
|
26
|
+
* - Property vs method confusion: .length, .size
|
|
27
|
+
* - Non-existent methods: .hasKey(), .containsKey(), .charAt()
|
|
28
|
+
*/
|
|
29
|
+
const HALLUCINATION_PATTERNS = new Map([
|
|
30
|
+
// JavaScript-style methods in Python
|
|
31
|
+
['push', {
|
|
32
|
+
correct: '.append()',
|
|
33
|
+
description: 'Python lists use .append(), not .push(). This is a JavaScript method.'
|
|
34
|
+
}],
|
|
35
|
+
['toUpperCase', {
|
|
36
|
+
correct: '.upper()',
|
|
37
|
+
description: 'Python strings use .upper(), not .toUpperCase(). This is JavaScript/Java syntax.'
|
|
38
|
+
}],
|
|
39
|
+
['toLowerCase', {
|
|
40
|
+
correct: '.lower()',
|
|
41
|
+
description: 'Python strings use .lower(), not .toLowerCase(). This is JavaScript/Java syntax.'
|
|
42
|
+
}],
|
|
43
|
+
['indexOf', {
|
|
44
|
+
correct: '.find() or .index()',
|
|
45
|
+
description: 'Python strings use .find() or .index(), not .indexOf(). This is JavaScript syntax.'
|
|
46
|
+
}],
|
|
47
|
+
['substring', {
|
|
48
|
+
correct: '[start:end]',
|
|
49
|
+
description: 'Python uses slice notation [start:end], not .substring(). This is JavaScript syntax.'
|
|
50
|
+
}],
|
|
51
|
+
['charAt', {
|
|
52
|
+
correct: '[index]',
|
|
53
|
+
description: 'Python uses indexing [index], not .charAt(). This is JavaScript syntax.'
|
|
54
|
+
}],
|
|
55
|
+
// Case sensitivity errors (AI typos)
|
|
56
|
+
['toUpper', {
|
|
57
|
+
correct: '.upper()',
|
|
58
|
+
description: 'Incomplete method name. Correct Python method is .upper().'
|
|
59
|
+
}],
|
|
60
|
+
['toLower', {
|
|
61
|
+
correct: '.lower()',
|
|
62
|
+
description: 'Incomplete method name. Correct Python method is .lower().'
|
|
63
|
+
}],
|
|
64
|
+
// Property vs method confusion
|
|
65
|
+
['length', {
|
|
66
|
+
correct: 'len()',
|
|
67
|
+
description: 'Python uses len() function, not .length property. This is JavaScript syntax.'
|
|
68
|
+
}],
|
|
69
|
+
['size', {
|
|
70
|
+
correct: 'len()',
|
|
71
|
+
description: 'Python uses len() function, not .size property/method.'
|
|
72
|
+
}],
|
|
73
|
+
// Non-existent methods (hallucinations)
|
|
74
|
+
['add', {
|
|
75
|
+
correct: '.append() for lists',
|
|
76
|
+
description: 'Lists use .append(), not .add(). Sets use .add(). Context matters.'
|
|
77
|
+
}],
|
|
78
|
+
['remove_at', {
|
|
79
|
+
correct: '.pop(index)',
|
|
80
|
+
description: 'Non-existent method. Use .pop(index) to remove element at specific position.'
|
|
81
|
+
}],
|
|
82
|
+
['pop_front', {
|
|
83
|
+
correct: '.pop(0)',
|
|
84
|
+
description: 'Non-existent method. Use .pop(0) to remove first element.'
|
|
85
|
+
}],
|
|
86
|
+
['hasKey', {
|
|
87
|
+
correct: 'in operator',
|
|
88
|
+
description: 'Python dicts use "key in dict" syntax, not .hasKey(). This is JavaScript/Java syntax.'
|
|
89
|
+
}],
|
|
90
|
+
['containsKey', {
|
|
91
|
+
correct: 'in operator',
|
|
92
|
+
description: 'Python dicts use "key in dict" syntax, not .containsKey(). This is Java syntax.'
|
|
93
|
+
}],
|
|
94
|
+
]);
|
|
95
|
+
/**
|
|
96
|
+
* Detect AI-generated code in Python
|
|
97
|
+
*
|
|
98
|
+
* @param lines - Array of code lines
|
|
99
|
+
* @param filename - Optional filename (to skip test files)
|
|
100
|
+
* @returns Array of security vulnerabilities (0-1 aggregated vulnerability)
|
|
101
|
+
*/
|
|
102
|
+
function checkAIGeneratedCode(lines, filename) {
|
|
103
|
+
// Skip test files to reduce false positives
|
|
104
|
+
if ((0, ai_code_detection_utils_1.isTestFile)(filename)) {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
let hallucinationCount = 0;
|
|
108
|
+
const hallucinationLines = new Set();
|
|
109
|
+
const detectedPatterns = [];
|
|
110
|
+
// Combined regex for all 15 hallucination patterns (optimized)
|
|
111
|
+
const combinedPattern = new RegExp('\\.' +
|
|
112
|
+
'(push|toUpperCase|toLowerCase|indexOf|substring|charAt|toUpper|toLower|' +
|
|
113
|
+
'length|size|add|remove_at|pop_front|hasKey|containsKey)' +
|
|
114
|
+
'\\s*\\(', 'g');
|
|
115
|
+
let inMultiLineString = false;
|
|
116
|
+
let stringDelimiter = '';
|
|
117
|
+
// 1. Detect hallucination patterns
|
|
118
|
+
lines.forEach((line, index) => {
|
|
119
|
+
const lineNumber = index + 1;
|
|
120
|
+
const trimmed = line.trim();
|
|
121
|
+
// Track multi-line strings (""" or ''')
|
|
122
|
+
if (!inMultiLineString) {
|
|
123
|
+
if (trimmed.startsWith('"""')) {
|
|
124
|
+
inMultiLineString = true;
|
|
125
|
+
stringDelimiter = '"""';
|
|
126
|
+
}
|
|
127
|
+
else if (trimmed.startsWith("'''")) {
|
|
128
|
+
inMultiLineString = true;
|
|
129
|
+
stringDelimiter = "'''";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
if (trimmed.endsWith(stringDelimiter)) {
|
|
134
|
+
inMultiLineString = false;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
return; // Skip lines inside multi-line strings
|
|
138
|
+
}
|
|
139
|
+
// Skip comments and empty lines
|
|
140
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
141
|
+
return;
|
|
142
|
+
// Remove string literals to avoid false positives
|
|
143
|
+
const cleanedLine = (0, ai_code_detection_utils_1.removeCommentsAndStrings)(line, 'python');
|
|
144
|
+
// Match hallucination patterns
|
|
145
|
+
const matches = Array.from(cleanedLine.matchAll(combinedPattern));
|
|
146
|
+
for (const match of matches) {
|
|
147
|
+
const method = match[1];
|
|
148
|
+
const details = HALLUCINATION_PATTERNS.get(method);
|
|
149
|
+
if (details) {
|
|
150
|
+
hallucinationCount++;
|
|
151
|
+
hallucinationLines.add(lineNumber);
|
|
152
|
+
detectedPatterns.push(method);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// 2. Run heuristic detectors
|
|
157
|
+
const heuristicScores = {
|
|
158
|
+
overEngineeredErrors: (0, ai_code_detection_utils_1.detectOverEngineeredErrorHandling)(lines),
|
|
159
|
+
unnecessaryWrappers: (0, ai_code_detection_utils_1.detectUnnecessaryWrappers)(lines),
|
|
160
|
+
verboseComments: (0, ai_code_detection_utils_1.detectVerboseComments)(lines),
|
|
161
|
+
mixedNaming: (0, ai_code_detection_utils_1.detectMixedNamingConventions)(lines), // Detects camelCase in Python
|
|
162
|
+
redundantNullChecks: (0, ai_code_detection_utils_1.detectRedundantNullChecks)(lines),
|
|
163
|
+
unnecessaryAsync: (0, ai_code_detection_utils_1.detectUnnecessaryAsync)(lines),
|
|
164
|
+
genericVariables: (0, ai_code_detection_utils_1.detectGenericVariableOveruse)(lines),
|
|
165
|
+
inconsistentStrings: (0, ai_code_detection_utils_1.detectInconsistentStringConcatenation)(lines),
|
|
166
|
+
};
|
|
167
|
+
// 3. Calculate confidence and severity
|
|
168
|
+
const detection = (0, ai_code_detection_utils_1.calculateAICodeConfidence)(hallucinationCount, heuristicScores);
|
|
169
|
+
if (!detection) {
|
|
170
|
+
return []; // No AI-generated code detected
|
|
171
|
+
}
|
|
172
|
+
// 4. Create aggregated vulnerability
|
|
173
|
+
const categoryId = detection.severity === 'CRITICAL' ? 'ai-generated-code-high' :
|
|
174
|
+
detection.severity === 'HIGH' ? 'ai-generated-code-medium' :
|
|
175
|
+
'ai-generated-code-low';
|
|
176
|
+
// Build message based on detection type
|
|
177
|
+
let message = `AI-generated code detected (${detection.confidence} confidence): `;
|
|
178
|
+
if (hallucinationCount > 0) {
|
|
179
|
+
message += `${hallucinationCount} hallucinated method(s) found`;
|
|
180
|
+
if (detectedPatterns.length > 0) {
|
|
181
|
+
const uniquePatterns = Array.from(new Set(detectedPatterns)).slice(0, 3);
|
|
182
|
+
message += ` (.${uniquePatterns.join(', .')})`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
message += 'Multiple code smell patterns detected (over-engineering, camelCase naming, etc.)';
|
|
187
|
+
}
|
|
188
|
+
// Build suggestion
|
|
189
|
+
const suggestion = hallucinationCount > 0
|
|
190
|
+
? `Replace hallucinated methods with correct Python equivalents. Found: ${Array.from(new Set(detectedPatterns)).map(p => `.${p}()`).join(', ')}. Review and rewrite AI-generated code sections.`
|
|
191
|
+
: 'Simplify code structure, use consistent naming conventions (snake_case), and follow Python idioms (PEP 8). Remove unnecessary async functions, redundant None checks, and over-engineered error handling.';
|
|
192
|
+
// Find first occurrence line for reporting
|
|
193
|
+
const reportLine = hallucinationLines.size > 0
|
|
194
|
+
? Math.min(...hallucinationLines)
|
|
195
|
+
: 1; // Use first line if only heuristics detected
|
|
196
|
+
// Get first detected pattern details for remediation example
|
|
197
|
+
const firstPattern = detectedPatterns[0];
|
|
198
|
+
const firstPatternDetails = firstPattern ? HALLUCINATION_PATTERNS.get(firstPattern) : null;
|
|
199
|
+
return [
|
|
200
|
+
(0, createVulnerability_1.createPythonSecurityVulnerability)({
|
|
201
|
+
category: categoryId,
|
|
202
|
+
severity: detection.severity.toLowerCase(),
|
|
203
|
+
confidence: detection.confidence,
|
|
204
|
+
message,
|
|
205
|
+
line: reportLine,
|
|
206
|
+
suggestion,
|
|
207
|
+
owasp: 'A04:2025 - Insecure Design',
|
|
208
|
+
cwe: 'CWE-1120, CWE-758',
|
|
209
|
+
pciDss: '6.5',
|
|
210
|
+
remediation: {
|
|
211
|
+
explanation: 'AI code generators (like GitHub Copilot, ChatGPT, Claude) can hallucinate non-existent methods or generate over-engineered patterns. ' +
|
|
212
|
+
'This creates reliability issues and potential security vulnerabilities. Hallucinated methods cause AttributeError exceptions that expose stack traces with ' +
|
|
213
|
+
'sensitive information. Over-engineered code patterns make security audits difficult, hiding real vulnerabilities. ' +
|
|
214
|
+
'Always verify AI-generated code matches Python specifications (PEP 8) and follows security best practices.',
|
|
215
|
+
before: firstPatternDetails
|
|
216
|
+
? `items.${firstPattern}(value) # Hallucinated method`
|
|
217
|
+
: '# Over-engineered or inconsistent code patterns\n# Example: try: ... except Exception as e: if ...: if ...: if ...: pass',
|
|
218
|
+
after: firstPatternDetails
|
|
219
|
+
? `items${firstPatternDetails.correct} # Correct Python`
|
|
220
|
+
: '# Simplified, idiomatic code following Python conventions (PEP 8)\n# Example: try: ... except Exception as e: logger.error(e); raise',
|
|
221
|
+
},
|
|
222
|
+
attackVector: {
|
|
223
|
+
description: 'AI-generated code with hallucinated methods creates runtime AttributeError exceptions exposing system internals through stack traces. ' +
|
|
224
|
+
'Attackers can trigger these errors repeatedly to map application structure and identify vulnerable endpoints. ' +
|
|
225
|
+
'Inconsistent code patterns (mixing camelCase and snake_case) make security reviews difficult, allowing real vulnerabilities to hide among AI-generated noise. ' +
|
|
226
|
+
'Over-engineered error handling may leak sensitive information in except blocks.',
|
|
227
|
+
exploitExample: "User triggers: items.push(value)\n" +
|
|
228
|
+
"Result: AttributeError: 'list' object has no attribute 'push'\n" +
|
|
229
|
+
"Stack trace reveals: Internal file paths, function names, database schema hints\n" +
|
|
230
|
+
"Attacker uses this to map application architecture and plan targeted attacks.",
|
|
231
|
+
realWorldImpact: [
|
|
232
|
+
'Runtime errors revealing sensitive stack traces with internal paths',
|
|
233
|
+
'Logic bugs in access control or validation code (AI-generated if statements)',
|
|
234
|
+
'Performance degradation from inefficient AI-generated loops and algorithms',
|
|
235
|
+
'Maintenance burden: Developers spend hours debugging AI hallucinations',
|
|
236
|
+
'Hidden security vulnerabilities masked by over-engineered code patterns',
|
|
237
|
+
],
|
|
238
|
+
},
|
|
239
|
+
})
|
|
240
|
+
];
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=ai-generated-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-generated-code.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/ai-generated-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Authentication Logic Flaws Security Checks
|
|
3
|
+
* OWASP A07:2021 - Identification and Authentication Failures
|
|
4
|
+
*
|
|
5
|
+
* Detects broken authentication patterns that allow complete bypass of
|
|
6
|
+
* authentication systems, account takeover, and privilege escalation.
|
|
7
|
+
*
|
|
8
|
+
* Created: 2025-12-18 (Phase 0 - Priority 0 Critical Gap)
|
|
9
|
+
*/
|
|
10
|
+
import { SecurityVulnerability } from '../../types';
|
|
11
|
+
/**
|
|
12
|
+
* Checks for authentication logic flaws in Python code
|
|
13
|
+
*
|
|
14
|
+
* Covers:
|
|
15
|
+
* - Check #45: Plaintext password comparison (CRITICAL)
|
|
16
|
+
* - Check #46: Weak token generation (HIGH)
|
|
17
|
+
* - Check #47: Master password backdoor (HIGH)
|
|
18
|
+
* - Check #48: Fail-open authorization (CRITICAL)
|
|
19
|
+
*
|
|
20
|
+
* @param lines - Array of code lines
|
|
21
|
+
* @returns Array of security vulnerabilities found
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkAuthenticationFlaws(lines: string[]): SecurityVulnerability[];
|
|
24
|
+
//# sourceMappingURL=authentication-flaws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication-flaws.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/authentication-flaws.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAiQzB"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Authentication Logic Flaws Security Checks
|
|
4
|
+
* OWASP A07:2021 - Identification and Authentication Failures
|
|
5
|
+
*
|
|
6
|
+
* Detects broken authentication patterns that allow complete bypass of
|
|
7
|
+
* authentication systems, account takeover, and privilege escalation.
|
|
8
|
+
*
|
|
9
|
+
* Created: 2025-12-18 (Phase 0 - Priority 0 Critical Gap)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.checkAuthenticationFlaws = checkAuthenticationFlaws;
|
|
13
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
14
|
+
/**
|
|
15
|
+
* Checks for authentication logic flaws in Python code
|
|
16
|
+
*
|
|
17
|
+
* Covers:
|
|
18
|
+
* - Check #45: Plaintext password comparison (CRITICAL)
|
|
19
|
+
* - Check #46: Weak token generation (HIGH)
|
|
20
|
+
* - Check #47: Master password backdoor (HIGH)
|
|
21
|
+
* - Check #48: Fail-open authorization (CRITICAL)
|
|
22
|
+
*
|
|
23
|
+
* @param lines - Array of code lines
|
|
24
|
+
* @returns Array of security vulnerabilities found
|
|
25
|
+
*/
|
|
26
|
+
function checkAuthenticationFlaws(lines) {
|
|
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
|
+
inMultiLineComment = true;
|
|
37
|
+
const tripleQuoteCount = (trimmed.match(/"""/g) || []).length + (trimmed.match(/'''/g) || []).length;
|
|
38
|
+
if (tripleQuoteCount >= 2) {
|
|
39
|
+
inMultiLineComment = false;
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
inMultiLineComment = false;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// CRITICAL: Skip all lines inside multi-line comments and single-line comments
|
|
49
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('#')) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// =============================================================================
|
|
53
|
+
// CHECK #45: Plaintext Password Comparison (CRITICAL)
|
|
54
|
+
// =============================================================================
|
|
55
|
+
// Pattern: if password == user.password or if rows[0]['password'] == input_password
|
|
56
|
+
// Enhancement: Also detect tuple/list index access: user[2] == password
|
|
57
|
+
// Should use: bcrypt.checkpw() or secrets.compare_digest() with hashed passwords
|
|
58
|
+
// ENHANCED: Detect password comparison with == operator
|
|
59
|
+
// Pattern 1: password on both sides (original)
|
|
60
|
+
const plaintextPasswordMatch = trimmed.match(/(?:if|elif|and|or)\s+.*(?:password|passwd|pwd).*\s*==\s*.*(?:password|passwd|pwd)/i);
|
|
61
|
+
// Pattern 2: password on one side + tuple/list index on other side (NEW - Fix for Test 2.1)
|
|
62
|
+
// Matches: user[2] == password, password == user[0], row[1] == pwd, etc.
|
|
63
|
+
const tupleIndexPasswordMatch = trimmed.match(/(?:if|elif|and|or)\s+.*\w+\[\d+\]\s*==\s*(?:password|passwd|pwd)\b/i) ||
|
|
64
|
+
trimmed.match(/(?:if|elif|and|or)\s+.*(?:password|passwd|pwd)\b\s*==\s*\w+\[\d+\]/i);
|
|
65
|
+
// Pattern 3: password on one side + dictionary access on other (NEW)
|
|
66
|
+
// Matches: user['password'] == password, password == data['pwd'], etc.
|
|
67
|
+
const dictAccessPasswordMatch = trimmed.match(/(?:if|elif|and|or)\s+.*\w+\[['"]\w*(?:password|passwd|pwd)\w*['"]\]\s*==\s*(?:password|passwd|pwd)\b/i) ||
|
|
68
|
+
trimmed.match(/(?:if|elif|and|or)\s+.*(?:password|passwd|pwd)\b\s*==\s*\w+\[['"]\w*(?:password|passwd|pwd)\w*['"]\]/i);
|
|
69
|
+
if (plaintextPasswordMatch || tupleIndexPasswordMatch || dictAccessPasswordMatch) {
|
|
70
|
+
// Check if bcrypt or argon2 is being used (safe patterns)
|
|
71
|
+
const hasBcrypt = trimmed.includes('bcrypt.checkpw') ||
|
|
72
|
+
trimmed.includes('bcrypt.verify') ||
|
|
73
|
+
trimmed.includes('argon2.verify') ||
|
|
74
|
+
trimmed.includes('check_password_hash');
|
|
75
|
+
// Check if secrets.compare_digest is being used
|
|
76
|
+
const hasSecureCompare = trimmed.includes('secrets.compare_digest') ||
|
|
77
|
+
trimmed.includes('hmac.compare_digest');
|
|
78
|
+
if (!hasBcrypt && !hasSecureCompare) {
|
|
79
|
+
// Look back a few lines to see if there's a database query for password
|
|
80
|
+
const hasDbQuery = lines.slice(Math.max(0, index - 15), index).some(prevLine => (prevLine.includes('SELECT') || prevLine.includes('WHERE') ||
|
|
81
|
+
prevLine.includes('.get(') || prevLine.includes('[') && prevLine.includes('password')) &&
|
|
82
|
+
(prevLine.toLowerCase().includes('user') || prevLine.toLowerCase().includes('password')));
|
|
83
|
+
// ENHANCED: Also check for tuple/list index or dict access patterns (Test 2.1 fix)
|
|
84
|
+
const hasTupleOrDictAccess = tupleIndexPasswordMatch || dictAccessPasswordMatch ||
|
|
85
|
+
trimmed.includes('[') || trimmed.includes('.get(');
|
|
86
|
+
if (hasDbQuery || hasTupleOrDictAccess) {
|
|
87
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('plaintext-password-comparison', 'Plaintext password comparison detected - passwords should be hashed', 'Use bcrypt.checkpw() or argon2.verify() to compare hashed passwords', lineNumber, 'Direct password comparison with == indicates passwords are stored in plaintext in the database. This is a critical security flaw. Passwords must be hashed using bcrypt, argon2, or scrypt before storage, and compared using secure comparison functions.', 'if user.password == request.form["password"]: # Plaintext password stored in DB!', [
|
|
88
|
+
'Complete authentication system compromise',
|
|
89
|
+
'All user accounts accessible with plaintext passwords',
|
|
90
|
+
'Regulatory violations (PCI-DSS 8.2.1, GDPR)',
|
|
91
|
+
'Cannot detect password database breaches',
|
|
92
|
+
'Passwords exposed to DBAs and backups'
|
|
93
|
+
], 'if rows[0]["password"] == request.form["password"]:\n login_user(user)', 'import bcrypt\n\n# At registration:\nhashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt())\ndb.execute("INSERT INTO users (password) VALUES (?)", (hashed,))\n\n# At login:\nstored_hash = rows[0]["password"]\nif bcrypt.checkpw(password.encode(), stored_hash):\n login_user(user)', 'Always hash passwords with bcrypt, argon2, or scrypt before storage. Use bcrypt.checkpw() or argon2.verify() to compare passwords. Never store plaintext passwords.'));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// =============================================================================
|
|
98
|
+
// CHECK #46: Weak Token Generation (HIGH)
|
|
99
|
+
// =============================================================================
|
|
100
|
+
// Pattern: token = str(time.time()) or token = random.randint() or base64(timestamp)
|
|
101
|
+
// Should use: secrets.token_urlsafe() or secrets.token_hex() or uuid.uuid4()
|
|
102
|
+
const weakTokenPatterns = [
|
|
103
|
+
/token\w*\s*=\s*str\s*\(\s*time\./i,
|
|
104
|
+
/token\w*\s*=\s*str\s*\(\s*datetime\./i,
|
|
105
|
+
/token\w*\s*=\s*base64\.[^(]*\(\s*str\s*\(/i,
|
|
106
|
+
/token\w*\s*=\s*hashlib\.(md5|sha1)\s*\(/i,
|
|
107
|
+
/token\w*\s*=.*random\.(randint|random|choice)/i,
|
|
108
|
+
];
|
|
109
|
+
const hasWeakToken = weakTokenPatterns.some(pattern => pattern.test(trimmed));
|
|
110
|
+
if (hasWeakToken) {
|
|
111
|
+
// Check if secure token generation is being used
|
|
112
|
+
const hasSecureToken = trimmed.includes('secrets.token') ||
|
|
113
|
+
trimmed.includes('uuid.uuid4') ||
|
|
114
|
+
trimmed.includes('os.urandom');
|
|
115
|
+
if (!hasSecureToken) {
|
|
116
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('weak-token-generation', 'Weak token generation using predictable source', 'Use secrets.token_urlsafe() or secrets.token_hex() for cryptographic tokens', lineNumber, 'Tokens generated from timestamps, random.random(), or hashes of predictable data are completely predictable. Attackers can forge valid tokens for any user, bypassing authentication entirely.', 'token = str(time.time()) # Predictable: anyone can generate valid tokens', [
|
|
117
|
+
'Complete authentication bypass',
|
|
118
|
+
'Account takeover for any user',
|
|
119
|
+
'Session hijacking',
|
|
120
|
+
'Privilege escalation',
|
|
121
|
+
'Cannot revoke compromised tokens'
|
|
122
|
+
], 'import time\ntoken = base64.b64encode(str(time.time()).encode()).decode()', 'import secrets\n\n# Generate cryptographically secure token\ntoken = secrets.token_urlsafe(32) # 32 bytes = 256 bits of randomness\n\n# Or for hex tokens:\n# token = secrets.token_hex(32)', 'Use secrets.token_urlsafe() or secrets.token_hex() from Python\'s secrets module for authentication tokens. Never use time.time(), random module, or predictable data.'));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// =============================================================================
|
|
126
|
+
// CHECK #47: Master Password Backdoor (HIGH)
|
|
127
|
+
// =============================================================================
|
|
128
|
+
// Pattern: if password == user_password or password == MASTER_KEY
|
|
129
|
+
// Allows single password to access any account
|
|
130
|
+
// Check for pattern: password comparison + or/and + password comparison with master indicator
|
|
131
|
+
// Simpler approach: check if line has all three components
|
|
132
|
+
const hasPasswordComparison = /(password|passwd|pwd)\s*==/i.test(trimmed);
|
|
133
|
+
const hasLogicalOperator = /\s+(or|and|\|\|)\s+/i.test(trimmed);
|
|
134
|
+
const hasMasterPasswordIndicator = /(os\.environ|MASTER[_\s]*(?:PASSWORD|KEY|PASS)|SUPPORT[_\s]*(?:PASSWORD|KEY)|ADMIN[_\s]*(?:PASSWORD|KEY|OVERRIDE)|BACKDOOR|DEBUG[_\s]*(?:PASSWORD|KEY))/i.test(trimmed);
|
|
135
|
+
// Also check for two password comparisons (not just one)
|
|
136
|
+
const passwordComparisons = trimmed.match(/(password|passwd|pwd)\s*==/gi);
|
|
137
|
+
const hasTwoPasswordComparisons = passwordComparisons && passwordComparisons.length >= 2;
|
|
138
|
+
if (hasPasswordComparison && hasLogicalOperator && hasMasterPasswordIndicator && hasTwoPasswordComparisons) {
|
|
139
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('master-password-backdoor', 'Master password backdoor detected', 'Remove master password bypass - use proper admin authentication', lineNumber, 'Master password backdoors allow a single password to access any user account, completely bypassing normal authentication. This violates the principle of least privilege and creates a massive security risk if the master password is discovered.', 'if password == user.password or password == os.environ["SUPPORT_PASSWORD"]:', [
|
|
140
|
+
'Complete authentication bypass',
|
|
141
|
+
'Unauthorized access to all accounts',
|
|
142
|
+
'Insider threat amplification',
|
|
143
|
+
'Compliance violations',
|
|
144
|
+
'Cannot audit which admin accessed which account'
|
|
145
|
+
], 'if password == user.password or password == os.environ.get("MASTER_KEY"):\n login_user(user)', '# Remove master password entirely\nif bcrypt.checkpw(password.encode(), user.password_hash):\n login_user(user)\n\n# For admin access, use separate admin authentication:\nif user.is_admin and bcrypt.checkpw(password.encode(), user.password_hash):\n grant_admin_access(user)', 'Never use master passwords. Implement proper role-based access control (RBAC) with separate admin accounts and audit logging.'));
|
|
146
|
+
}
|
|
147
|
+
// =============================================================================
|
|
148
|
+
// CHECK #48: Fail-Open Authorization (CRITICAL)
|
|
149
|
+
// =============================================================================
|
|
150
|
+
// Pattern: if authorized: return data; else: return data (same data in both branches)
|
|
151
|
+
// Authorization check is ineffective
|
|
152
|
+
// Look for authorization patterns where both branches return same data
|
|
153
|
+
if (trimmed.match(/if\s+(is_authorized|authorized|has_permission|check_auth|is_admin)/i)) {
|
|
154
|
+
// Check next few lines for both if and else branches
|
|
155
|
+
const nextLines = lines.slice(index + 1, Math.min(index + 10, lines.length));
|
|
156
|
+
let ifBranchReturn = null;
|
|
157
|
+
let elseBranchReturn = null;
|
|
158
|
+
let inElse = false;
|
|
159
|
+
for (let i = 0; i < nextLines.length; i++) {
|
|
160
|
+
const nextLine = nextLines[i].trim();
|
|
161
|
+
if (nextLine.startsWith('else:') || nextLine.startsWith('else ')) {
|
|
162
|
+
inElse = true;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// Check for return statements
|
|
166
|
+
const returnMatch = nextLine.match(/return\s+(.+)/);
|
|
167
|
+
if (returnMatch) {
|
|
168
|
+
const returnValue = returnMatch[1].trim();
|
|
169
|
+
if (!inElse && !ifBranchReturn) {
|
|
170
|
+
ifBranchReturn = returnValue;
|
|
171
|
+
}
|
|
172
|
+
else if (inElse && !elseBranchReturn) {
|
|
173
|
+
elseBranchReturn = returnValue;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Check for response.send/jsonify statements
|
|
177
|
+
const responseMatch = nextLine.match(/(?:return\s+)?(?:jsonify|response|res\.send|res\.json)\s*\((.+)\)/);
|
|
178
|
+
if (responseMatch) {
|
|
179
|
+
const responseValue = responseMatch[1].trim();
|
|
180
|
+
if (!inElse && !ifBranchReturn) {
|
|
181
|
+
ifBranchReturn = responseValue;
|
|
182
|
+
}
|
|
183
|
+
else if (inElse && !elseBranchReturn) {
|
|
184
|
+
elseBranchReturn = responseValue;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// If we found both branches, check if they're the same
|
|
188
|
+
if (ifBranchReturn && elseBranchReturn) {
|
|
189
|
+
// Check if return values are identical (exact match only)
|
|
190
|
+
// Don't use .includes() to avoid false positives like "full_data" vs "public_data"
|
|
191
|
+
if (ifBranchReturn === elseBranchReturn) {
|
|
192
|
+
vulnerabilities.push((0, createVulnerability_1.createPythonSecurityVulnerability)('fail-open-authorization', 'Fail-open authorization: both authorized and unauthorized paths return same data', 'Fix authorization logic to deny access when not authorized', lineNumber, 'Authorization check is ineffective because both the authorized and unauthorized code paths return the same data. This makes the authorization check completely useless - all users get access regardless of authorization.', 'if is_authorized:\n return user_data\nelse:\n return user_data # Same data!', [
|
|
193
|
+
'Complete access control bypass',
|
|
194
|
+
'Unauthorized admin panel access',
|
|
195
|
+
'Privilege escalation',
|
|
196
|
+
'Data breach (all users access admin data)',
|
|
197
|
+
'Compliance violations'
|
|
198
|
+
], 'if is_authorized:\n return jsonify(user_data)\nelse:\n return jsonify(user_data) # Authorization is ineffective!', 'if is_authorized:\n return jsonify(user_data)\nelse:\n return jsonify({"error": "Unauthorized"}), 403 # Deny access', 'Ensure authorization checks actually prevent access. Unauthorized paths should return 403 Forbidden, not the same data as authorized paths.'));
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
return vulnerabilities;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=authentication-flaws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication-flaws.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/authentication-flaws.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,4DAmQC;AAjRD,sEAAiF;AAEjF;;;;;;;;;;;GAWG;AACH,SAAgB,wBAAwB,CACtC,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,gFAAgF;QAChF,sDAAsD;QACtD,gFAAgF;QAChF,oFAAoF;QACpF,wEAAwE;QACxE,iFAAiF;QAEjF,wDAAwD;QACxD,+CAA+C;QAC/C,MAAM,sBAAsB,GAAG,OAAO,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QAEnI,4FAA4F;QAC5F,yEAAyE;QACzE,MAAM,uBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC;YACnF,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAEtH,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,uBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC;YACrH,OAAO,CAAC,KAAK,CAAC,uGAAuG,CAAC,CAAC;QAExJ,IAAI,sBAAsB,IAAI,uBAAuB,IAAI,uBAAuB,EAAE,CAAC;YACjF,0DAA0D;YAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACjC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YAEzD,gDAAgD;YAChD,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBAC1C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YAEjE,IAAI,CAAC,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACpC,wEAAwE;gBACxE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC7E,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;oBACzD,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACvF,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CACzF,CAAC;gBAEF,mFAAmF;gBACnF,MAAM,oBAAoB,GAAG,uBAAuB,IAAI,uBAAuB;oBACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAEjF,IAAI,UAAU,IAAI,oBAAoB,EAAE,CAAC;oBACvC,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,+BAA+B,EAC/B,qEAAqE,EACrE,qEAAqE,EACrE,UAAU,EACV,4PAA4P,EAC5P,mFAAmF,EACnF;wBACE,2CAA2C;wBAC3C,uDAAuD;wBACvD,6CAA6C;wBAC7C,0CAA0C;wBAC1C,uCAAuC;qBACxC,EACD,2EAA2E,EAC3E,gSAAgS,EAChS,qKAAqK,CACtK,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,0CAA0C;QAC1C,gFAAgF;QAChF,qFAAqF;QACrF,6EAA6E;QAE7E,MAAM,iBAAiB,GAAG;YACxB,mCAAmC;YACnC,uCAAuC;YACvC,4CAA4C;YAC5C,0CAA0C;YAC1C,gDAAgD;SACjD,CAAC;QAEF,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAE9E,IAAI,YAAY,EAAE,CAAC;YACjB,iDAAiD;YACjD,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAErD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,uBAAuB,EACvB,gDAAgD,EAChD,6EAA6E,EAC7E,UAAU,EACV,gMAAgM,EAChM,2EAA2E,EAC3E;oBACE,gCAAgC;oBAChC,+BAA+B;oBAC/B,mBAAmB;oBACnB,sBAAsB;oBACtB,kCAAkC;iBACnC,EACD,2EAA2E,EAC3E,8LAA8L,EAC9L,wKAAwK,CACzK,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,6CAA6C;QAC7C,gFAAgF;QAChF,kEAAkE;QAClE,+CAA+C;QAE/C,8FAA8F;QAC9F,2DAA2D;QAC3D,MAAM,qBAAqB,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,0BAA0B,GAAG,0JAA0J,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5M,yDAAyD;QACzD,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC1E,MAAM,yBAAyB,GAAG,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,IAAI,CAAC,CAAC;QAEzF,IAAI,qBAAqB,IAAI,kBAAkB,IAAI,0BAA0B,IAAI,yBAAyB,EAAE,CAAC;YAC3G,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,0BAA0B,EAC1B,mCAAmC,EACnC,iEAAiE,EACjE,UAAU,EACV,oPAAoP,EACpP,6EAA6E,EAC7E;gBACE,gCAAgC;gBAChC,qCAAqC;gBACrC,8BAA8B;gBAC9B,uBAAuB;gBACvB,iDAAiD;aAClD,EACD,iGAAiG,EACjG,yRAAyR,EACzR,+HAA+H,CAChI,CAAC,CAAC;QACL,CAAC;QAED,gFAAgF;QAChF,gDAAgD;QAChD,gFAAgF;QAChF,sFAAsF;QACtF,qCAAqC;QAErC,uEAAuE;QACvE,IAAI,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,EAAE,CAAC;YACzF,qDAAqD;YACrD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAE7E,IAAI,cAAc,GAAkB,IAAI,CAAC;YACzC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;YAC3C,IAAI,MAAM,GAAG,KAAK,CAAC;YAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAErC,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACjE,MAAM,GAAG,IAAI,CAAC;oBACd,SAAS;gBACX,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACpD,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE1C,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC/B,cAAc,GAAG,WAAW,CAAC;oBAC/B,CAAC;yBAAM,IAAI,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACvC,gBAAgB,GAAG,WAAW,CAAC;oBACjC,CAAC;gBACH,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;gBAC1G,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAE9C,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC/B,cAAc,GAAG,aAAa,CAAC;oBACjC,CAAC;yBAAM,IAAI,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACvC,gBAAgB,GAAG,aAAa,CAAC;oBACnC,CAAC;gBACH,CAAC;gBAED,uDAAuD;gBACvD,IAAI,cAAc,IAAI,gBAAgB,EAAE,CAAC;oBACvC,0DAA0D;oBAC1D,mFAAmF;oBACnF,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;wBAExC,eAAe,CAAC,IAAI,CAAC,IAAA,uDAAiC,EACpD,yBAAyB,EACzB,kFAAkF,EAClF,4DAA4D,EAC5D,UAAU,EACV,4NAA4N,EAC5N,oFAAoF,EACpF;4BACE,gCAAgC;4BAChC,iCAAiC;4BACjC,sBAAsB;4BACtB,2CAA2C;4BAC3C,uBAAuB;yBACxB,EACD,yHAAyH,EACzH,4HAA4H,EAC5H,6IAA6I,CAC9I,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python Code Quality and Security Misconfiguration Checks
|
|
3
|
+
* OWASP A05:2021 - Security Misconfiguration, A06:2021 - Vulnerable Components
|
|
4
|
+
*
|
|
5
|
+
* Detects code quality issues that can lead to security vulnerabilities,
|
|
6
|
+
* including dangerous patterns, insecure practices, and configuration problems.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for code quality and misconfiguration issues
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #13: assert for security validation (MEDIUM)
|
|
14
|
+
* - Check #14: input() without validation (MEDIUM)
|
|
15
|
+
* - Check #15: Regex DoS (ReDoS) (MEDIUM)
|
|
16
|
+
* - Check #16: Empty except blocks (LOW)
|
|
17
|
+
* - Check #17: print() in production (LOW)
|
|
18
|
+
* - Check #18: tempfile.mktemp() race condition (MEDIUM)
|
|
19
|
+
* - Check #19: __import__() dynamic loading (HIGH)
|
|
20
|
+
* - Check #20: Wildcard imports (MEDIUM)
|
|
21
|
+
* - Check #21: Circular import patterns (MEDIUM)
|
|
22
|
+
*
|
|
23
|
+
* @param lines - Array of code lines
|
|
24
|
+
* @returns Array of security vulnerabilities found
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkCodeQuality(lines: string[]): SecurityVulnerability[];
|
|
27
|
+
//# sourceMappingURL=code-quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/python/security-checks/code-quality.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAySzB"}
|