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,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Python Async/Await Security Checks Module
|
|
4
|
+
*
|
|
5
|
+
* Security vulnerability detection for Python async/await patterns.
|
|
6
|
+
* Detects missing await keywords and asyncio.run() misuse.
|
|
7
|
+
*
|
|
8
|
+
* @module python-async-security
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.isAsyncFunctionStart = isAsyncFunctionStart;
|
|
12
|
+
exports.isAsyncFunctionEnd = isAsyncFunctionEnd;
|
|
13
|
+
exports.detectMissingAwait = detectMissingAwait;
|
|
14
|
+
exports.detectAsyncioRunMisuse = detectAsyncioRunMisuse;
|
|
15
|
+
/**
|
|
16
|
+
* Check if line starts an async function definition
|
|
17
|
+
*
|
|
18
|
+
* @param line - The code line to check
|
|
19
|
+
* @returns true if line starts async function
|
|
20
|
+
*/
|
|
21
|
+
function isAsyncFunctionStart(line) {
|
|
22
|
+
return line.trim().match(/\basync\s+def\s+\w+/) !== null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if line ends async function context (dedent back to module level)
|
|
26
|
+
*
|
|
27
|
+
* @param line - The code line to check
|
|
28
|
+
* @param prevIndent - Previous function body indent level
|
|
29
|
+
* @returns true if async context should end
|
|
30
|
+
*/
|
|
31
|
+
function isAsyncFunctionEnd(line, prevIndent) {
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
34
|
+
return false;
|
|
35
|
+
const currentIndent = line.length - line.trimStart().length;
|
|
36
|
+
// CRITICAL FIX: Don't end on async def lines (they start a NEW async context)
|
|
37
|
+
if (trimmed.startsWith('async def'))
|
|
38
|
+
return false;
|
|
39
|
+
// End when we dedent back to module level (currentIndent < prevIndent)
|
|
40
|
+
// This includes regular 'def' at module level, class definitions, etc.
|
|
41
|
+
return currentIndent < prevIndent && trimmed.match(/^\w/) !== null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect missing await on async function calls
|
|
45
|
+
*
|
|
46
|
+
* @param line - The code line to check
|
|
47
|
+
* @param lineNumber - The line number
|
|
48
|
+
* @param inAsyncContext - Whether we're inside an async function
|
|
49
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
50
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
51
|
+
*/
|
|
52
|
+
function detectMissingAwait(line, lineNumber, inAsyncContext, createVulnerability) {
|
|
53
|
+
if (!inAsyncContext)
|
|
54
|
+
return null;
|
|
55
|
+
const trimmed = line.trim();
|
|
56
|
+
// Check for assignment from function call
|
|
57
|
+
const hasAsyncCall = trimmed.match(/=\s*(fetch_|get_|query_|save_|update_|delete_|create_|process_|send_|request_)\w*\s*\(/);
|
|
58
|
+
const hasAwait = trimmed.includes('await ');
|
|
59
|
+
const isFunctionDef = trimmed.includes('def ');
|
|
60
|
+
if (hasAsyncCall && !hasAwait && !isFunctionDef) {
|
|
61
|
+
return createVulnerability('async-await-missing', 'Missing await on potentially async function call', 'Add await keyword before async function calls', lineNumber, 'Calling an async function without await causes the function to return a coroutine object instead of the expected result, leading to silent failures where code appears to run but does nothing.', 'result = fetch_user_data() # Returns coroutine, not user data', [
|
|
62
|
+
'Silent failures (no error, no result)',
|
|
63
|
+
'Data not saved/updated',
|
|
64
|
+
'Security checks bypassed',
|
|
65
|
+
'Logic errors',
|
|
66
|
+
'Hard to debug issues'
|
|
67
|
+
], 'user = get_user_by_id(user_id)', 'user = await get_user_by_id(user_id)', 'Always use await with async functions - missing await causes silent failures');
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Detect asyncio.run() called inside async function
|
|
73
|
+
*
|
|
74
|
+
* @param line - The code line to check
|
|
75
|
+
* @param lineNumber - The line number
|
|
76
|
+
* @param inAsyncContext - Whether we're inside an async function
|
|
77
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
78
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
79
|
+
*/
|
|
80
|
+
function detectAsyncioRunMisuse(line, lineNumber, inAsyncContext, createVulnerability) {
|
|
81
|
+
const trimmed = line.trim();
|
|
82
|
+
if (trimmed.includes('asyncio.run(') && inAsyncContext) {
|
|
83
|
+
return createVulnerability('asyncio-run-misuse', 'asyncio.run() called inside async function', 'Use await directly or use asyncio.create_task()', lineNumber, 'asyncio.run() creates a new event loop and cannot be called from within an async function that is already running in an event loop. This causes a RuntimeError.', 'async def process(): asyncio.run(fetch_data()) # RuntimeError', [
|
|
84
|
+
'RuntimeError crashes',
|
|
85
|
+
'Application failure',
|
|
86
|
+
'Event loop conflicts',
|
|
87
|
+
'Deadlocks'
|
|
88
|
+
], 'async def process_data():\n result = asyncio.run(fetch_data())', 'async def process_data():\n result = await fetch_data()', 'Inside async functions, use await - asyncio.run() is only for top-level entry points');
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=python-async-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-async-security.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/python-async-security.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAuBH,oDAEC;AASD,gDAYC;AAWD,gDAqCC;AAWD,wDA6BC;AArHD;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,qBAAqB,CAAC,KAAK,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,UAAkB;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;IAE5D,8EAA8E;IAC9E,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAElD,uEAAuE;IACvE,uEAAuE;IACvE,OAAO,aAAa,GAAG,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAChC,IAAY,EACZ,UAAkB,EAClB,cAAuB,EACvB,mBAA0C;IAE1C,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,0CAA0C;IAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;IAC7H,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE/C,IAAI,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAChD,OAAO,mBAAmB,CACxB,qBAAqB,EACrB,kDAAkD,EAClD,+CAA+C,EAC/C,UAAU,EACV,iMAAiM,EACjM,gEAAgE,EAChE;YACE,uCAAuC;YACvC,wBAAwB;YACxB,0BAA0B;YAC1B,cAAc;YACd,sBAAsB;SACvB,EACD,gCAAgC,EAChC,sCAAsC,EACtC,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CACpC,IAAY,EACZ,UAAkB,EAClB,cAAuB,EACvB,mBAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,cAAc,EAAE,CAAC;QACvD,OAAO,mBAAmB,CACxB,oBAAoB,EACpB,4CAA4C,EAC5C,iDAAiD,EACjD,UAAU,EACV,iKAAiK,EACjK,gEAAgE,EAChE;YACE,sBAAsB;YACtB,qBAAqB;YACrB,sBAAsB;YACtB,WAAW;SACZ,EACD,mEAAmE,EACnE,4DAA4D,EAC5D,sFAAsF,CACvF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Security Checks Module
|
|
3
|
+
*
|
|
4
|
+
* Security vulnerability detection for React-specific patterns.
|
|
5
|
+
* Detects XSS vulnerabilities, performance issues, and state management problems.
|
|
6
|
+
*
|
|
7
|
+
* @module react-security
|
|
8
|
+
*/
|
|
9
|
+
import { SecurityVulnerability } from '../types';
|
|
10
|
+
export type CreateVulnerabilityFn = (category: string, message: string, suggestion: string, line: number, description: string, exploitExample: string, realWorldImpact: string[], before: string, after: string, explanation: string) => SecurityVulnerability;
|
|
11
|
+
/**
|
|
12
|
+
* Detects dangerouslySetInnerHTML usage which can cause XSS
|
|
13
|
+
*
|
|
14
|
+
* @param line - The code line to check
|
|
15
|
+
* @param lineNumber - The line number
|
|
16
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
17
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectDangerouslySetInnerHTML(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
|
|
20
|
+
/**
|
|
21
|
+
* Detects missing key prop in React list rendering
|
|
22
|
+
*
|
|
23
|
+
* @param line - The code line to check
|
|
24
|
+
* @param lineNumber - The line number
|
|
25
|
+
* @param lines - All code lines (for multi-line JSX check)
|
|
26
|
+
* @param index - Current line index
|
|
27
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
28
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
29
|
+
*/
|
|
30
|
+
export declare function detectMissingKeyProp(line: string, lineNumber: number, lines: string[], index: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
|
|
31
|
+
/**
|
|
32
|
+
* Detects unsafe href attributes with user input (XSS risk)
|
|
33
|
+
*
|
|
34
|
+
* @param line - The code line to check
|
|
35
|
+
* @param lineNumber - The line number
|
|
36
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
37
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
38
|
+
*/
|
|
39
|
+
export declare function detectUnsafeHref(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
|
|
40
|
+
/**
|
|
41
|
+
* Detects direct React state mutation (anti-pattern)
|
|
42
|
+
*
|
|
43
|
+
* @param line - The code line to check
|
|
44
|
+
* @param lineNumber - The line number
|
|
45
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
46
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
47
|
+
*/
|
|
48
|
+
export declare function detectStateMutation(line: string, lineNumber: number, createVulnerability: CreateVulnerabilityFn): SecurityVulnerability | null;
|
|
49
|
+
//# sourceMappingURL=react-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-security.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/react-security.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EAAE,EACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,KAChB,qBAAqB,CAAC;AAE3B;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAwB9B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CA+B9B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAmC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,qBAAqB,GACzC,qBAAqB,GAAG,IAAI,CAwC9B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* React Security Checks Module
|
|
4
|
+
*
|
|
5
|
+
* Security vulnerability detection for React-specific patterns.
|
|
6
|
+
* Detects XSS vulnerabilities, performance issues, and state management problems.
|
|
7
|
+
*
|
|
8
|
+
* @module react-security
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.detectDangerouslySetInnerHTML = detectDangerouslySetInnerHTML;
|
|
12
|
+
exports.detectMissingKeyProp = detectMissingKeyProp;
|
|
13
|
+
exports.detectUnsafeHref = detectUnsafeHref;
|
|
14
|
+
exports.detectStateMutation = detectStateMutation;
|
|
15
|
+
/**
|
|
16
|
+
* Detects dangerouslySetInnerHTML usage which can cause XSS
|
|
17
|
+
*
|
|
18
|
+
* @param line - The code line to check
|
|
19
|
+
* @param lineNumber - The line number
|
|
20
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
21
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
22
|
+
*/
|
|
23
|
+
function detectDangerouslySetInnerHTML(line, lineNumber, createVulnerability) {
|
|
24
|
+
const trimmed = line.trim();
|
|
25
|
+
if (trimmed.match(/dangerouslySetInnerHTML\s*=\s*{{/)) {
|
|
26
|
+
return createVulnerability('xss', 'React dangerouslySetInnerHTML can cause XSS', 'Sanitize with DOMPurify or use safer alternatives', lineNumber, 'React\'s dangerouslySetInnerHTML bypasses XSS protection and directly sets HTML, making it vulnerable if content is not sanitized.', '<div dangerouslySetInnerHTML={{__html: userComment}} /> where userComment = "<img src=x onerror=alert(document.cookie)>"', [
|
|
27
|
+
'XSS attacks in React applications',
|
|
28
|
+
'Session hijacking',
|
|
29
|
+
'Credential theft',
|
|
30
|
+
'DOM-based XSS'
|
|
31
|
+
], '<div dangerouslySetInnerHTML={{__html: userContent}} />', 'import DOMPurify from "dompurify";\n<div dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(userContent)}} />', 'Always sanitize HTML with DOMPurify before using dangerouslySetInnerHTML, or avoid it entirely');
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Detects missing key prop in React list rendering
|
|
37
|
+
*
|
|
38
|
+
* @param line - The code line to check
|
|
39
|
+
* @param lineNumber - The line number
|
|
40
|
+
* @param lines - All code lines (for multi-line JSX check)
|
|
41
|
+
* @param index - Current line index
|
|
42
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
43
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
44
|
+
*/
|
|
45
|
+
function detectMissingKeyProp(line, lineNumber, lines, index, createVulnerability) {
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
// Only detect if map with JSX and no key= in the same line or next 2 lines
|
|
48
|
+
if (trimmed.match(/\.map\s*\(\s*\(?\w+\)?\s*=>\s*</) && !trimmed.includes('key=')) {
|
|
49
|
+
// Check next 2 lines for key prop (multi-line JSX)
|
|
50
|
+
const hasKeyInNextLines = (index + 1 < lines.length && lines[index + 1].includes('key=')) ||
|
|
51
|
+
(index + 2 < lines.length && lines[index + 2].includes('key='));
|
|
52
|
+
if (!hasKeyInNextLines) {
|
|
53
|
+
return createVulnerability('react-performance', 'Missing key prop in React list rendering', 'Add unique key prop to list items', lineNumber, 'React uses keys to identify elements in lists. Missing keys cause inefficient re-renders, potential bugs with component state, and poor performance.', '{items.map(item => <div>{item.name}</div>)} causes React to re-render all items when one changes', [
|
|
54
|
+
'Performance degradation (full list re-render)',
|
|
55
|
+
'Loss of component state',
|
|
56
|
+
'Incorrect DOM updates',
|
|
57
|
+
'Poor user experience'
|
|
58
|
+
], '{items.map(item => <div>{item.name}</div>)}', '{items.map(item => <div key={item.id}>{item.name}</div>)}', 'Always use stable, unique keys (IDs) in React lists - never use array index as key');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Detects unsafe href attributes with user input (XSS risk)
|
|
65
|
+
*
|
|
66
|
+
* @param line - The code line to check
|
|
67
|
+
* @param lineNumber - The line number
|
|
68
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
69
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
70
|
+
*/
|
|
71
|
+
function detectUnsafeHref(line, lineNumber, createVulnerability) {
|
|
72
|
+
const trimmed = line.trim();
|
|
73
|
+
// Pattern 1: props., request., params., query., userInput
|
|
74
|
+
// Pattern 2: destructured props like {url}, {link}, {redirect}, {path}
|
|
75
|
+
const hasPropsPattern = trimmed.match(/href\s*=\s*{[^}]*\b(props\.|userInput|user\.|request\.|params\.|query\.)/);
|
|
76
|
+
const hasDestructuredParam = trimmed.match(/href\s*=\s*{\s*(url|link|redirect|path|src|href)\s*}/);
|
|
77
|
+
if (hasPropsPattern || hasDestructuredParam) {
|
|
78
|
+
// Exclude if using sanitization function or static string
|
|
79
|
+
const isSanitized = trimmed.match(/href\s*=\s*{\s*(sanitize|validate|safe)/i);
|
|
80
|
+
const isStaticUrl = trimmed.match(/href\s*=\s*"(https?:\/\/|\/)/);
|
|
81
|
+
if (!isSanitized && !isStaticUrl) {
|
|
82
|
+
return createVulnerability('xss', 'Unsafe href attribute can cause XSS via javascript: protocol', 'Sanitize URLs or use rel="noopener noreferrer"', lineNumber, 'User-controlled href attributes can execute JavaScript using javascript: or data: protocols, leading to XSS attacks.', '<a href={userInput}> where userInput = "javascript:alert(document.cookie)"', [
|
|
83
|
+
'XSS via javascript: protocol',
|
|
84
|
+
'Session hijacking',
|
|
85
|
+
'Credential theft',
|
|
86
|
+
'Phishing attacks'
|
|
87
|
+
], '<a href={props.url}>Click here</a>', 'const sanitizeUrl = (url) => {\n if (url.startsWith("http://") || url.startsWith("https://")) return url;\n return "#";\n};\n<a href={sanitizeUrl(props.url)} rel="noopener noreferrer">Click here</a>', 'Validate URLs start with http:// or https://, or use a URL sanitization library');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Detects direct React state mutation (anti-pattern)
|
|
94
|
+
*
|
|
95
|
+
* @param line - The code line to check
|
|
96
|
+
* @param lineNumber - The line number
|
|
97
|
+
* @param createVulnerability - Function to create vulnerability object
|
|
98
|
+
* @returns SecurityVulnerability if detected, null otherwise
|
|
99
|
+
*/
|
|
100
|
+
function detectStateMutation(line, lineNumber, createVulnerability) {
|
|
101
|
+
const trimmed = line.trim();
|
|
102
|
+
// Pattern 1: this.state.prop = value (assignment)
|
|
103
|
+
// Pattern 2: this.state.array.push() (mutation methods)
|
|
104
|
+
// Pattern 3: this.state.array[index] = value (array mutation)
|
|
105
|
+
const hasDirectAssignment = trimmed.match(/this\.state\.\w+\s*=(?!=)/) || trimmed.match(/\w+State\.\w+\s*=(?!=)/);
|
|
106
|
+
const hasMutationMethod = trimmed.match(/this\.state\.\w+\.(push|pop|shift|unshift|splice|sort|reverse)\s*\(/);
|
|
107
|
+
const hasArrayMutation = trimmed.match(/this\.state\.\w+\[\w+\]\s*=/);
|
|
108
|
+
const hasDirectMutation = hasDirectAssignment || hasMutationMethod || hasArrayMutation;
|
|
109
|
+
if (hasDirectMutation) {
|
|
110
|
+
// Exclude setState calls, comparisons, and function definitions
|
|
111
|
+
const isSetStateCall = trimmed.includes('setState(');
|
|
112
|
+
const isComparison = trimmed.includes('===') || trimmed.includes('!==');
|
|
113
|
+
const isFunctionDef = trimmed.includes('=>') || trimmed.match(/function\s+\w+\s*\(/);
|
|
114
|
+
if (!isSetStateCall && !isComparison && !isFunctionDef) {
|
|
115
|
+
return createVulnerability('react-state-mutation', 'Direct state mutation in React', 'Use setState() or state setter functions', lineNumber, 'Directly mutating state in React bypasses React\'s change detection, causing bugs where UI doesn\'t update even though state changed.', 'this.state.count = 5 does not trigger re-render', [
|
|
116
|
+
'UI not updating (stale renders)',
|
|
117
|
+
'Component state inconsistency',
|
|
118
|
+
'Difficult to debug issues',
|
|
119
|
+
'Broken React lifecycle'
|
|
120
|
+
], 'this.state.count = this.state.count + 1;', 'this.setState({ count: this.state.count + 1 });', 'Never mutate state directly - always use setState() or state setter functions from useState()');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=react-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react-security.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/security-checks/react-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { SupportedLanguage, SecuritySeverity, ExploitLikelihood, SecurityImpact } from '../types';
|
|
2
|
+
export interface LineError {
|
|
3
|
+
line: number;
|
|
4
|
+
error: string;
|
|
5
|
+
suggestion: string;
|
|
6
|
+
severity: 'error' | 'warning' | 'info';
|
|
7
|
+
securityRelevant?: boolean;
|
|
8
|
+
references?: Array<{
|
|
9
|
+
title: string;
|
|
10
|
+
url: string;
|
|
11
|
+
description: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export interface QualityIssue {
|
|
15
|
+
type: 'error' | 'warning' | 'info';
|
|
16
|
+
message: string;
|
|
17
|
+
line?: number;
|
|
18
|
+
column?: number;
|
|
19
|
+
rule?: string;
|
|
20
|
+
severity: 'high' | 'medium' | 'low';
|
|
21
|
+
}
|
|
22
|
+
export interface SecurityVulnerability {
|
|
23
|
+
severity: SecuritySeverity;
|
|
24
|
+
message: string;
|
|
25
|
+
line?: number;
|
|
26
|
+
suggestion?: string;
|
|
27
|
+
category?: string;
|
|
28
|
+
securityRelevant?: boolean;
|
|
29
|
+
cvssScore?: number;
|
|
30
|
+
exploitLikelihood?: ExploitLikelihood;
|
|
31
|
+
impact?: SecurityImpact;
|
|
32
|
+
owasp?: string;
|
|
33
|
+
cwe?: string;
|
|
34
|
+
pciDss?: string;
|
|
35
|
+
attackVector?: {
|
|
36
|
+
description: string;
|
|
37
|
+
exploitExample: string;
|
|
38
|
+
realWorldImpact: string[];
|
|
39
|
+
};
|
|
40
|
+
remediation?: {
|
|
41
|
+
before: string;
|
|
42
|
+
after: string;
|
|
43
|
+
explanation: string;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export interface AnalysisMetrics {
|
|
47
|
+
complexity: number;
|
|
48
|
+
maintainability: number;
|
|
49
|
+
lines: number;
|
|
50
|
+
functions: number;
|
|
51
|
+
}
|
|
52
|
+
export interface AnalyzerResult {
|
|
53
|
+
syntax: {
|
|
54
|
+
valid: boolean;
|
|
55
|
+
errors: string[];
|
|
56
|
+
lineErrors: LineError[];
|
|
57
|
+
};
|
|
58
|
+
quality: {
|
|
59
|
+
score: number;
|
|
60
|
+
issues: QualityIssue[];
|
|
61
|
+
};
|
|
62
|
+
performance: {
|
|
63
|
+
score: number;
|
|
64
|
+
suggestions: string[];
|
|
65
|
+
};
|
|
66
|
+
security: {
|
|
67
|
+
vulnerabilities: SecurityVulnerability[];
|
|
68
|
+
};
|
|
69
|
+
metrics: AnalysisMetrics;
|
|
70
|
+
languageSpecific?: Record<string, unknown>;
|
|
71
|
+
}
|
|
72
|
+
export interface AnalyzerInput {
|
|
73
|
+
code: string;
|
|
74
|
+
filename?: string;
|
|
75
|
+
options?: Record<string, unknown>;
|
|
76
|
+
}
|
|
77
|
+
export interface ICodeAnalyzer {
|
|
78
|
+
language: SupportedLanguage;
|
|
79
|
+
analyze(input: AnalyzerInput): Promise<AnalyzerResult>;
|
|
80
|
+
validateSyntax(code: string): Promise<boolean>;
|
|
81
|
+
getLanguageInfo(): {
|
|
82
|
+
name: string;
|
|
83
|
+
extensions: string[];
|
|
84
|
+
description: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface AnalyzerFactory {
|
|
88
|
+
createAnalyzer(language: SupportedLanguage): ICodeAnalyzer;
|
|
89
|
+
getSupportedLanguages(): SupportedLanguage[];
|
|
90
|
+
isLanguageSupported(language: string): boolean;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/lib/analyzers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript Access Control Security Checks
|
|
3
|
+
* OWASP A01:2021 - Broken Access Control
|
|
4
|
+
*
|
|
5
|
+
* Detects Insecure Direct Object Reference (IDOR) vulnerabilities
|
|
6
|
+
* in TypeScript Express/Koa route handlers.
|
|
7
|
+
*/
|
|
8
|
+
import { SecurityVulnerability } from '../../types';
|
|
9
|
+
/**
|
|
10
|
+
* Checks for broken access control vulnerabilities in TypeScript code
|
|
11
|
+
*
|
|
12
|
+
* Covers:
|
|
13
|
+
* - Check #85: IDOR in Express/Koa routes with :id parameters (HIGH)
|
|
14
|
+
*
|
|
15
|
+
* @param lines - Array of code lines
|
|
16
|
+
* @returns Array of security vulnerabilities found
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkAccessControl(lines: string[]): SecurityVulnerability[];
|
|
19
|
+
//# sourceMappingURL=access-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/typescript/security-checks/access-control.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,GACd,qBAAqB,EAAE,CAqQzB"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* TypeScript Access Control Security Checks
|
|
4
|
+
* OWASP A01:2021 - Broken Access Control
|
|
5
|
+
*
|
|
6
|
+
* Detects Insecure Direct Object Reference (IDOR) vulnerabilities
|
|
7
|
+
* in TypeScript Express/Koa route handlers.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.checkAccessControl = checkAccessControl;
|
|
11
|
+
const createVulnerability_1 = require("../utils/createVulnerability");
|
|
12
|
+
/**
|
|
13
|
+
* Checks for broken access control vulnerabilities in TypeScript code
|
|
14
|
+
*
|
|
15
|
+
* Covers:
|
|
16
|
+
* - Check #85: IDOR in Express/Koa routes with :id parameters (HIGH)
|
|
17
|
+
*
|
|
18
|
+
* @param lines - Array of code lines
|
|
19
|
+
* @returns Array of security vulnerabilities found
|
|
20
|
+
*/
|
|
21
|
+
function checkAccessControl(lines) {
|
|
22
|
+
const vulnerabilities = [];
|
|
23
|
+
let inMultiLineComment = false;
|
|
24
|
+
lines.forEach((line, index) => {
|
|
25
|
+
const lineNumber = index + 1;
|
|
26
|
+
const trimmed = line.trim();
|
|
27
|
+
// Track multi-line comment blocks (/* ... */)
|
|
28
|
+
if (trimmed.includes('/*')) {
|
|
29
|
+
inMultiLineComment = true;
|
|
30
|
+
}
|
|
31
|
+
if (trimmed.includes('*/')) {
|
|
32
|
+
inMultiLineComment = false;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Skip comments and empty lines
|
|
36
|
+
if (!trimmed || inMultiLineComment || trimmed.startsWith('//') || trimmed.startsWith('*'))
|
|
37
|
+
return;
|
|
38
|
+
// OWASP A01:2021 - Broken Access Control
|
|
39
|
+
// Check #85: IDOR in route handlers - HIGH
|
|
40
|
+
// Pattern: app.get("/users/:id", ...) or app.post("/accounts/:accountId", ...)
|
|
41
|
+
// with :id, :userId, :accountId, :profileId, :orderId, :documentId parameters
|
|
42
|
+
const routeWithIdPattern = /(app|router)\.(get|post|put|delete|patch)\s*\(\s*["'][^"']*:(id|userId|accountId|profileId|orderId|documentId|fileId|recordId)[^"']*["']/i;
|
|
43
|
+
if (trimmed.match(routeWithIdPattern)) {
|
|
44
|
+
// Check next 15 lines for authorization checks
|
|
45
|
+
const nextLines = lines.slice(index, Math.min(index + 15, lines.length));
|
|
46
|
+
// Look for authorization patterns:
|
|
47
|
+
// - req.session.userId, req.user.id, req.session, req.user
|
|
48
|
+
// - Authorization header checks
|
|
49
|
+
// - Permission/role checks
|
|
50
|
+
// - Ownership validation (comparing req.session.userId with req.params.id)
|
|
51
|
+
const hasAuthCheck = nextLines.some(l => {
|
|
52
|
+
const lowerLine = l.toLowerCase();
|
|
53
|
+
return (
|
|
54
|
+
// Session checks
|
|
55
|
+
lowerLine.includes('req.session') ||
|
|
56
|
+
lowerLine.includes('req.user') ||
|
|
57
|
+
// Authorization header
|
|
58
|
+
lowerLine.includes('authorization') ||
|
|
59
|
+
lowerLine.includes('req.headers.authorization') ||
|
|
60
|
+
// Permission/role checks
|
|
61
|
+
lowerLine.includes('permission') ||
|
|
62
|
+
lowerLine.includes('isauthorized') ||
|
|
63
|
+
lowerLine.includes('hasaccess') ||
|
|
64
|
+
lowerLine.includes('checkaccess') ||
|
|
65
|
+
lowerLine.includes('role') ||
|
|
66
|
+
// Status code 403 (Forbidden) indicates auth check
|
|
67
|
+
lowerLine.includes('403') ||
|
|
68
|
+
lowerLine.includes('forbidden'));
|
|
69
|
+
});
|
|
70
|
+
if (!hasAuthCheck) {
|
|
71
|
+
vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('idor-no-authorization', 'Route accesses user-specific data without authorization check (Insecure Direct Object Reference)', 'Add authorization check: if (req.session.userId !== req.params.id) return res.status(403).json({error: "Forbidden"});', lineNumber, 'Attacker can access other users\' data by changing the ID in the URL. No ownership validation is performed, allowing any authenticated user to access any resource by guessing or iterating through IDs.', 'GET /users/123 returns user data for ID 123. Attacker changes to /users/456 and accesses another user\'s data without authorization.', [
|
|
72
|
+
'Unauthorized access to sensitive user data (emails, addresses, financial info)',
|
|
73
|
+
'Privacy violations and data leakage',
|
|
74
|
+
'Account takeover via profile manipulation',
|
|
75
|
+
'Horizontal privilege escalation (user accessing other users\' data)',
|
|
76
|
+
'Compliance violations (GDPR, HIPAA, PCI-DSS)'
|
|
77
|
+
], 'app.get("/users/:id", async (req, res) => {\n const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);\n res.json(user); // No auth check\n});', 'app.get("/users/:id", async (req, res) => {\n if (req.session.userId !== req.params.id) {\n return res.status(403).json({ error: "Forbidden" });\n }\n const user = await db.query("SELECT * FROM users WHERE id = ?", [req.params.id]);\n res.json(user);\n});', 'Add ownership validation by comparing the authenticated user\'s ID (from session/JWT) with the requested resource ID. Return 403 Forbidden if they don\'t match.'));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// OWASP A01:2021 - Broken Access Control / A10:2025 - Mishandling Exceptional Conditions
|
|
81
|
+
// Check #91: Fail-Open Authentication - CRITICAL
|
|
82
|
+
// Pattern: if (authorized) res.send(X); else res.send(X);
|
|
83
|
+
// Pattern: if (isAdmin) return data; else return data;
|
|
84
|
+
// Detects identical responses for authorized and unauthorized paths (fail-open design)
|
|
85
|
+
// Look for if/else statements with authorization-related conditions
|
|
86
|
+
const ifStatementPattern = /if\s*\(\s*([a-zA-Z_$][a-zA-Z0-9_$]*)\s*\)/;
|
|
87
|
+
const ifMatch = trimmed.match(ifStatementPattern);
|
|
88
|
+
if (ifMatch) {
|
|
89
|
+
const conditionVar = ifMatch[1];
|
|
90
|
+
// Check if variable name suggests authorization
|
|
91
|
+
const authVariablePattern = /(auth|authorized|isAdmin|hasPermission|canAccess|allowed|granted|authenticated)/i;
|
|
92
|
+
if (conditionVar.match(authVariablePattern)) {
|
|
93
|
+
let ifBranch = '';
|
|
94
|
+
let elseBranch = '';
|
|
95
|
+
// Try to extract if/else branches - handle both single-line and multi-line
|
|
96
|
+
// Pattern 1: Single line if/else: if (x) statement; else statement;
|
|
97
|
+
const singleLinePattern = /if\s*\([^)]+\)\s*(.+?);\s*else\s*(.+?);/;
|
|
98
|
+
const singleLineMatch = trimmed.match(singleLinePattern);
|
|
99
|
+
if (singleLineMatch) {
|
|
100
|
+
ifBranch = singleLineMatch[1].trim();
|
|
101
|
+
elseBranch = singleLineMatch[2].trim();
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Pattern 2: Multi-line if/else across separate lines
|
|
105
|
+
// Check if the if statement has its body on the same line
|
|
106
|
+
const ifBodyPattern = /if\s*\([^)]+\)\s*(.+)/;
|
|
107
|
+
const ifBodyMatch = trimmed.match(ifBodyPattern);
|
|
108
|
+
if (ifBodyMatch) {
|
|
109
|
+
ifBranch = ifBodyMatch[1].trim().replace(/;$/, '');
|
|
110
|
+
}
|
|
111
|
+
// Look for else in next few lines
|
|
112
|
+
const nextLines = lines.slice(index + 1, Math.min(index + 5, lines.length));
|
|
113
|
+
for (const nextLine of nextLines) {
|
|
114
|
+
const nextTrimmed = nextLine.trim();
|
|
115
|
+
if (nextTrimmed.startsWith('else')) {
|
|
116
|
+
const elseBodyPattern = /else\s+(.+)/;
|
|
117
|
+
const elseBodyMatch = nextTrimmed.match(elseBodyPattern);
|
|
118
|
+
if (elseBodyMatch) {
|
|
119
|
+
elseBranch = elseBodyMatch[1].trim().replace(/;$/, '');
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Check if both branches are identical (fail-open)
|
|
126
|
+
if (ifBranch && elseBranch && ifBranch === elseBranch) {
|
|
127
|
+
vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('fail-open-authentication', 'Fail-open authentication - identical response for authorized and unauthorized users (complete access control bypass)', 'Fix access control logic: authorized users should get different response than unauthorized. Use early return for unauthorized: if (!authorized) return res.status(403).send("Forbidden");', lineNumber, 'Authorization check has identical code in both if and else branches, making the check completely ineffective. This is a fail-open design where authentication/authorization failures do not change behavior, allowing unauthorized access.', 'if (authorized) res.send("Dashboard"); else res.send("Dashboard"); → Any user (authorized or not) gets Dashboard → complete access control bypass', [
|
|
128
|
+
'Complete access control bypass',
|
|
129
|
+
'Unauthorized access to protected resources',
|
|
130
|
+
'Admin panel accessible without authentication',
|
|
131
|
+
'Privilege escalation',
|
|
132
|
+
'Data breach (unauthorized data access)',
|
|
133
|
+
'Compliance violations (SOC 2, ISO 27001, GDPR Article 32)',
|
|
134
|
+
'Authorization logic rendered completely ineffective'
|
|
135
|
+
], 'let authorized = false;\ntry {\n authorized = JSON.parse(req.headers.auth).role === "admin";\n} catch { }\n\nif (authorized) res.send("Dashboard");\nelse res.send("Dashboard");', 'let authorized = false;\ntry {\n authorized = JSON.parse(req.headers.auth).role === "admin";\n} catch { }\n\nif (!authorized) {\n return res.status(403).send("Forbidden");\n}\n\nres.send("Dashboard");', 'Ensure authorized and unauthorized paths have different behavior. Use early returns for unauthorized access. Fail securely: if authorization fails, deny access by default.'));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// OWASP A01:2025 - Broken Access Control - Phase 7B Day 11
|
|
140
|
+
// Check #92: Missing authentication middleware - HIGH
|
|
141
|
+
// Pattern: app.get/post/put/delete/patch routes without authentication
|
|
142
|
+
const routePattern = /(app|router)\.(get|post|put|delete|patch)\s*\(\s*['"`]\/api\//i;
|
|
143
|
+
const nextApiPattern = /export\s+default\s+(?:async\s+)?function\s+handler\s*\(/i;
|
|
144
|
+
if (trimmed.match(routePattern) || trimmed.match(nextApiPattern)) {
|
|
145
|
+
// Check if route has authentication middleware
|
|
146
|
+
const hasMiddleware = trimmed.includes('authenticate') ||
|
|
147
|
+
trimmed.includes('authMiddleware') ||
|
|
148
|
+
trimmed.includes('requireAuth') ||
|
|
149
|
+
trimmed.includes('isAuthenticated') ||
|
|
150
|
+
trimmed.includes('verifyToken') ||
|
|
151
|
+
trimmed.includes('checkAuth');
|
|
152
|
+
// Check next 15 lines for inline authentication check
|
|
153
|
+
const nextLines = lines.slice(index, Math.min(index + 15, lines.length));
|
|
154
|
+
const hasInlineAuthCheck = nextLines.some(l => {
|
|
155
|
+
const lowerLine = l.toLowerCase();
|
|
156
|
+
return (
|
|
157
|
+
// Check for !req.user or !req.session with 401/unauthorized
|
|
158
|
+
((lowerLine.includes('!req.user') || lowerLine.includes('!req.session')) &&
|
|
159
|
+
(lowerLine.includes('401') || lowerLine.includes('unauthorized'))) ||
|
|
160
|
+
// Check for req.headers.authorization
|
|
161
|
+
lowerLine.includes('req.headers.authorization') ||
|
|
162
|
+
// Check for JWT verification
|
|
163
|
+
lowerLine.includes('verifytoken') ||
|
|
164
|
+
lowerLine.includes('jwt.verify') ||
|
|
165
|
+
// Check for req.user or req.session existence checks
|
|
166
|
+
(lowerLine.includes('if') && (lowerLine.includes('req.user') || lowerLine.includes('req.session'))));
|
|
167
|
+
});
|
|
168
|
+
if (!hasMiddleware && !hasInlineAuthCheck) {
|
|
169
|
+
vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('missing-authentication-middleware', 'API route missing authentication - allows unauthenticated access to protected resources', 'Add authentication middleware: app.get("/api/users", authenticate, handler) or check req.user in handler', lineNumber, 'API endpoints without authentication allow any user (including attackers) to access protected resources. This is a critical access control failure.', 'app.get("/api/users", (req, res) => res.json(users)); → Anyone can access /api/users without logging in', [
|
|
170
|
+
'Unauthorized access to sensitive data',
|
|
171
|
+
'Data breach from unauthenticated API access',
|
|
172
|
+
'Account enumeration and information disclosure',
|
|
173
|
+
'Business logic bypass',
|
|
174
|
+
'Compliance violations (SOC 2, ISO 27001, GDPR)'
|
|
175
|
+
], 'app.get("/api/users", (req, res) => {\n res.json(users); // No auth\n});', 'app.get("/api/users", authenticate, (req, res) => {\n res.json(users); // Protected\n});', 'All API routes accessing sensitive data must require authentication via middleware or inline checks'));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// OWASP A01:2025 - Broken Access Control - Phase 7B Day 11
|
|
179
|
+
// Check #93: Client-side only authorization - HIGH
|
|
180
|
+
// Pattern: Authorization checks in client-side TypeScript (browser code)
|
|
181
|
+
const clientSideAuthPattern = /(if|&&|\|\|)\s*\(\s*(userRole|user\.role|user\.isAdmin|isAdmin|currentUser\.role)/i;
|
|
182
|
+
const uiTogglePattern = /\.style\.display\s*=|\.hidden\s*=|\.classList\.(add|remove|toggle)/i;
|
|
183
|
+
if (trimmed.match(clientSideAuthPattern)) {
|
|
184
|
+
// Check if this is followed by API call or UI toggle (client-side behavior)
|
|
185
|
+
const nextLines = lines.slice(index, Math.min(index + 5, lines.length));
|
|
186
|
+
const hasClientSideBehavior = nextLines.some(l => l.includes('fetch(') ||
|
|
187
|
+
l.includes('axios.') ||
|
|
188
|
+
l.match(uiTogglePattern) ||
|
|
189
|
+
l.includes('getElementById') ||
|
|
190
|
+
l.includes('querySelector'));
|
|
191
|
+
// Make sure this is NOT a server-side check (no req.user or res.status)
|
|
192
|
+
const isServerSide = nextLines.some(l => l.includes('req.user') ||
|
|
193
|
+
l.includes('res.status(403)') ||
|
|
194
|
+
l.includes('res.status(401)') ||
|
|
195
|
+
l.includes('return res.'));
|
|
196
|
+
if (hasClientSideBehavior && !isServerSide) {
|
|
197
|
+
vulnerabilities.push((0, createVulnerability_1.createTypeScriptSecurityVulnerability)('client-side-authorization', 'Authorization enforced only on client-side - can be bypassed by manipulating JavaScript', 'Move authorization logic to server-side: Validate user role in API endpoint, not in browser code', lineNumber, 'Client-side authorization can be easily bypassed by modifying JavaScript in browser DevTools or using direct API calls. Attackers can access admin features by changing local variables.', 'if (userRole === "admin") fetch("/api/admin/delete") → Attacker opens DevTools, sets userRole="admin", bypasses check', [
|
|
198
|
+
'Complete authorization bypass via DevTools manipulation',
|
|
199
|
+
'Privilege escalation (user → admin)',
|
|
200
|
+
'Unauthorized access to admin features',
|
|
201
|
+
'Data manipulation and deletion',
|
|
202
|
+
'Business logic bypass',
|
|
203
|
+
'False sense of security (UI hiding is not access control)'
|
|
204
|
+
], 'if (userRole === "admin") {\n fetch("/api/admin/delete", { method: "POST" });\n}', 'fetch("/api/admin/delete", { method: "POST" }); // Server validates role\n\n// Server-side:\napp.post("/api/admin/delete", (req, res) => {\n if (req.user.role !== "admin") return res.status(403).send("Forbidden");\n // Perform delete\n});', 'Never rely on client-side checks for authorization. Always validate user permissions on the server before performing sensitive operations.'));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
return vulnerabilities;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=access-control.js.map
|