@nahisaho/musubix-security 2.0.1 → 2.1.1
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/dist/analysis/enhanced-taint-analyzer.d.ts +120 -0
- package/dist/analysis/enhanced-taint-analyzer.d.ts.map +1 -0
- package/dist/analysis/enhanced-taint-analyzer.js +450 -0
- package/dist/analysis/enhanced-taint-analyzer.js.map +1 -0
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.d.ts.map +1 -1
- package/dist/analysis/index.js +1 -0
- package/dist/analysis/index.js.map +1 -1
- package/dist/analysis/interprocedural/call-graph-builder.d.ts +192 -0
- package/dist/analysis/interprocedural/call-graph-builder.d.ts.map +1 -0
- package/dist/analysis/interprocedural/call-graph-builder.js +510 -0
- package/dist/analysis/interprocedural/call-graph-builder.js.map +1 -0
- package/dist/analysis/interprocedural/dfg-adapter.d.ts +166 -0
- package/dist/analysis/interprocedural/dfg-adapter.d.ts.map +1 -0
- package/dist/analysis/interprocedural/dfg-adapter.js +455 -0
- package/dist/analysis/interprocedural/dfg-adapter.js.map +1 -0
- package/dist/analysis/interprocedural/index.d.ts +9 -0
- package/dist/analysis/interprocedural/index.d.ts.map +1 -0
- package/dist/analysis/interprocedural/index.js +9 -0
- package/dist/analysis/interprocedural/index.js.map +1 -0
- package/dist/analysis/interprocedural/taint-propagator.d.ts +250 -0
- package/dist/analysis/interprocedural/taint-propagator.d.ts.map +1 -0
- package/dist/analysis/interprocedural/taint-propagator.js +435 -0
- package/dist/analysis/interprocedural/taint-propagator.js.map +1 -0
- package/dist/analysis/sanitizers/command-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/command-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/command-sanitizers.js +123 -0
- package/dist/analysis/sanitizers/command-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/html-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/html-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/html-sanitizers.js +213 -0
- package/dist/analysis/sanitizers/html-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/index.d.ts +35 -0
- package/dist/analysis/sanitizers/index.d.ts.map +1 -0
- package/dist/analysis/sanitizers/index.js +59 -0
- package/dist/analysis/sanitizers/index.js.map +1 -0
- package/dist/analysis/sanitizers/path-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/path-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/path-sanitizers.js +163 -0
- package/dist/analysis/sanitizers/path-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/sql-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/sql-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/sql-sanitizers.js +216 -0
- package/dist/analysis/sanitizers/sql-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/types.d.ts +78 -0
- package/dist/analysis/sanitizers/types.d.ts.map +1 -0
- package/dist/analysis/sanitizers/types.js +7 -0
- package/dist/analysis/sanitizers/types.js.map +1 -0
- package/dist/analysis/sanitizers/validation-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/validation-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/validation-sanitizers.js +268 -0
- package/dist/analysis/sanitizers/validation-sanitizers.js.map +1 -0
- package/dist/analysis/sinks/code-eval.d.ts +12 -0
- package/dist/analysis/sinks/code-eval.d.ts.map +1 -0
- package/dist/analysis/sinks/code-eval.js +231 -0
- package/dist/analysis/sinks/code-eval.js.map +1 -0
- package/dist/analysis/sinks/command-exec.d.ts +12 -0
- package/dist/analysis/sinks/command-exec.d.ts.map +1 -0
- package/dist/analysis/sinks/command-exec.js +187 -0
- package/dist/analysis/sinks/command-exec.js.map +1 -0
- package/dist/analysis/sinks/file-operations.d.ts +12 -0
- package/dist/analysis/sinks/file-operations.d.ts.map +1 -0
- package/dist/analysis/sinks/file-operations.js +239 -0
- package/dist/analysis/sinks/file-operations.js.map +1 -0
- package/dist/analysis/sinks/html-output.d.ts +12 -0
- package/dist/analysis/sinks/html-output.d.ts.map +1 -0
- package/dist/analysis/sinks/html-output.js +256 -0
- package/dist/analysis/sinks/html-output.js.map +1 -0
- package/dist/analysis/sinks/index.d.ts +30 -0
- package/dist/analysis/sinks/index.d.ts.map +1 -0
- package/dist/analysis/sinks/index.js +46 -0
- package/dist/analysis/sinks/index.js.map +1 -0
- package/dist/analysis/sinks/sql-query.d.ts +12 -0
- package/dist/analysis/sinks/sql-query.d.ts.map +1 -0
- package/dist/analysis/sinks/sql-query.js +209 -0
- package/dist/analysis/sinks/sql-query.js.map +1 -0
- package/dist/analysis/sinks/types.d.ts +97 -0
- package/dist/analysis/sinks/types.d.ts.map +1 -0
- package/dist/analysis/sinks/types.js +7 -0
- package/dist/analysis/sinks/types.js.map +1 -0
- package/dist/analysis/sources/database.d.ts +12 -0
- package/dist/analysis/sources/database.d.ts.map +1 -0
- package/dist/analysis/sources/database.js +211 -0
- package/dist/analysis/sources/database.js.map +1 -0
- package/dist/analysis/sources/environment.d.ts +12 -0
- package/dist/analysis/sources/environment.d.ts.map +1 -0
- package/dist/analysis/sources/environment.js +158 -0
- package/dist/analysis/sources/environment.js.map +1 -0
- package/dist/analysis/sources/file-system.d.ts +12 -0
- package/dist/analysis/sources/file-system.d.ts.map +1 -0
- package/dist/analysis/sources/file-system.js +180 -0
- package/dist/analysis/sources/file-system.js.map +1 -0
- package/dist/analysis/sources/http-request.d.ts +12 -0
- package/dist/analysis/sources/http-request.d.ts.map +1 -0
- package/dist/analysis/sources/http-request.js +179 -0
- package/dist/analysis/sources/http-request.js.map +1 -0
- package/dist/analysis/sources/index.d.ts +26 -0
- package/dist/analysis/sources/index.d.ts.map +1 -0
- package/dist/analysis/sources/index.js +40 -0
- package/dist/analysis/sources/index.js.map +1 -0
- package/dist/analysis/sources/types.d.ts +93 -0
- package/dist/analysis/sources/types.d.ts.map +1 -0
- package/dist/analysis/sources/types.js +7 -0
- package/dist/analysis/sources/types.js.map +1 -0
- package/dist/analysis/sources/user-input.d.ts +12 -0
- package/dist/analysis/sources/user-input.d.ts.map +1 -0
- package/dist/analysis/sources/user-input.js +261 -0
- package/dist/analysis/sources/user-input.js.map +1 -0
- package/dist/cve/cpe-matcher.d.ts +183 -0
- package/dist/cve/cpe-matcher.d.ts.map +1 -0
- package/dist/cve/cpe-matcher.js +396 -0
- package/dist/cve/cpe-matcher.js.map +1 -0
- package/dist/cve/cve-cache.d.ts +225 -0
- package/dist/cve/cve-cache.d.ts.map +1 -0
- package/dist/cve/cve-cache.js +452 -0
- package/dist/cve/cve-cache.js.map +1 -0
- package/dist/cve/cve-cache.test.d.ts +6 -0
- package/dist/cve/cve-cache.test.d.ts.map +1 -0
- package/dist/cve/cve-cache.test.js +363 -0
- package/dist/cve/cve-cache.test.js.map +1 -0
- package/dist/cve/dependency-parser.d.ts +204 -0
- package/dist/cve/dependency-parser.d.ts.map +1 -0
- package/dist/cve/dependency-parser.js +338 -0
- package/dist/cve/dependency-parser.js.map +1 -0
- package/dist/cve/index.d.ts +20 -0
- package/dist/cve/index.d.ts.map +1 -0
- package/dist/cve/index.js +13 -0
- package/dist/cve/index.js.map +1 -0
- package/dist/cve/nvd-client.d.ts +137 -0
- package/dist/cve/nvd-client.d.ts.map +1 -0
- package/dist/cve/nvd-client.js +333 -0
- package/dist/cve/nvd-client.js.map +1 -0
- package/dist/cve/rate-limiter.d.ts +194 -0
- package/dist/cve/rate-limiter.d.ts.map +1 -0
- package/dist/cve/rate-limiter.js +276 -0
- package/dist/cve/rate-limiter.js.map +1 -0
- package/dist/cve/report-generator.d.ts +145 -0
- package/dist/cve/report-generator.d.ts.map +1 -0
- package/dist/cve/report-generator.js +377 -0
- package/dist/cve/report-generator.js.map +1 -0
- package/dist/cve/report-generator.test.d.ts +6 -0
- package/dist/cve/report-generator.test.d.ts.map +1 -0
- package/dist/cve/report-generator.test.js +275 -0
- package/dist/cve/report-generator.test.js.map +1 -0
- package/dist/cve/vulnerability-scanner.d.ts +198 -0
- package/dist/cve/vulnerability-scanner.d.ts.map +1 -0
- package/dist/cve/vulnerability-scanner.js +311 -0
- package/dist/cve/vulnerability-scanner.js.map +1 -0
- package/dist/cve/vulnerability-scanner.test.d.ts +6 -0
- package/dist/cve/vulnerability-scanner.test.d.ts.map +1 -0
- package/dist/cve/vulnerability-scanner.test.js +329 -0
- package/dist/cve/vulnerability-scanner.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/config/config-parser.d.ts +119 -0
- package/dist/rules/config/config-parser.d.ts.map +1 -0
- package/dist/rules/config/config-parser.js +376 -0
- package/dist/rules/config/config-parser.js.map +1 -0
- package/dist/rules/config/index.d.ts +8 -0
- package/dist/rules/config/index.d.ts.map +1 -0
- package/dist/rules/config/index.js +8 -0
- package/dist/rules/config/index.js.map +1 -0
- package/dist/rules/config/profiles.d.ts +85 -0
- package/dist/rules/config/profiles.d.ts.map +1 -0
- package/dist/rules/config/profiles.js +226 -0
- package/dist/rules/config/profiles.js.map +1 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts +9 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.js +54 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.js.map +1 -0
- package/dist/rules/cwe/cwe-125-oob-read.d.ts +20 -0
- package/dist/rules/cwe/cwe-125-oob-read.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-125-oob-read.js +247 -0
- package/dist/rules/cwe/cwe-125-oob-read.js.map +1 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.d.ts +9 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.js +55 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.js.map +1 -0
- package/dist/rules/cwe/cwe-20-input-validation.d.ts +21 -0
- package/dist/rules/cwe/cwe-20-input-validation.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-20-input-validation.js +342 -0
- package/dist/rules/cwe/cwe-20-input-validation.js.map +1 -0
- package/dist/rules/cwe/cwe-22-path-traversal.d.ts +20 -0
- package/dist/rules/cwe/cwe-22-path-traversal.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-22-path-traversal.js +306 -0
- package/dist/rules/cwe/cwe-22-path-traversal.js.map +1 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.d.ts +9 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.js +58 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.js.map +1 -0
- package/dist/rules/cwe/cwe-276-default-permissions.d.ts +9 -0
- package/dist/rules/cwe/cwe-276-default-permissions.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-276-default-permissions.js +54 -0
- package/dist/rules/cwe/cwe-276-default-permissions.js.map +1 -0
- package/dist/rules/cwe/cwe-287-improper-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-287-improper-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-287-improper-auth.js +57 -0
- package/dist/rules/cwe/cwe-287-improper-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts +9 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.js +53 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.js.map +1 -0
- package/dist/rules/cwe/cwe-352-csrf.d.ts +9 -0
- package/dist/rules/cwe/cwe-352-csrf.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-352-csrf.js +51 -0
- package/dist/rules/cwe/cwe-352-csrf.js.map +1 -0
- package/dist/rules/cwe/cwe-362-race-condition.d.ts +9 -0
- package/dist/rules/cwe/cwe-362-race-condition.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-362-race-condition.js +55 -0
- package/dist/rules/cwe/cwe-362-race-condition.js.map +1 -0
- package/dist/rules/cwe/cwe-416-use-after-free.d.ts +23 -0
- package/dist/rules/cwe/cwe-416-use-after-free.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-416-use-after-free.js +402 -0
- package/dist/rules/cwe/cwe-416-use-after-free.js.map +1 -0
- package/dist/rules/cwe/cwe-434-file-upload.d.ts +9 -0
- package/dist/rules/cwe/cwe-434-file-upload.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-434-file-upload.js +55 -0
- package/dist/rules/cwe/cwe-434-file-upload.js.map +1 -0
- package/dist/rules/cwe/cwe-476-null-deref.d.ts +9 -0
- package/dist/rules/cwe/cwe-476-null-deref.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-476-null-deref.js +55 -0
- package/dist/rules/cwe/cwe-476-null-deref.js.map +1 -0
- package/dist/rules/cwe/cwe-502-deserialization.d.ts +9 -0
- package/dist/rules/cwe/cwe-502-deserialization.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-502-deserialization.js +57 -0
- package/dist/rules/cwe/cwe-502-deserialization.js.map +1 -0
- package/dist/rules/cwe/cwe-77-command-injection.d.ts +9 -0
- package/dist/rules/cwe/cwe-77-command-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-77-command-injection.js +55 -0
- package/dist/rules/cwe/cwe-77-command-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-78-command-injection.d.ts +20 -0
- package/dist/rules/cwe/cwe-78-command-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-78-command-injection.js +259 -0
- package/dist/rules/cwe/cwe-78-command-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-787-oob-write.d.ts +21 -0
- package/dist/rules/cwe/cwe-787-oob-write.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-787-oob-write.js +321 -0
- package/dist/rules/cwe/cwe-787-oob-write.js.map +1 -0
- package/dist/rules/cwe/cwe-79-xss.d.ts +22 -0
- package/dist/rules/cwe/cwe-79-xss.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-79-xss.js +386 -0
- package/dist/rules/cwe/cwe-79-xss.js.map +1 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts +9 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.js +58 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.js.map +1 -0
- package/dist/rules/cwe/cwe-862-missing-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-862-missing-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-862-missing-auth.js +55 -0
- package/dist/rules/cwe/cwe-862-missing-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.js +58 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-89-sql-injection.d.ts +21 -0
- package/dist/rules/cwe/cwe-89-sql-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-89-sql-injection.js +456 -0
- package/dist/rules/cwe/cwe-89-sql-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-918-ssrf.d.ts +9 -0
- package/dist/rules/cwe/cwe-918-ssrf.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-918-ssrf.js +59 -0
- package/dist/rules/cwe/cwe-918-ssrf.js.map +1 -0
- package/dist/rules/cwe/cwe-94-code-injection.d.ts +9 -0
- package/dist/rules/cwe/cwe-94-code-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-94-code-injection.js +59 -0
- package/dist/rules/cwe/cwe-94-code-injection.js.map +1 -0
- package/dist/rules/cwe/index.d.ts +43 -0
- package/dist/rules/cwe/index.d.ts.map +1 -0
- package/dist/rules/cwe/index.js +99 -0
- package/dist/rules/cwe/index.js.map +1 -0
- package/dist/rules/engine/index.d.ts +10 -0
- package/dist/rules/engine/index.d.ts.map +1 -0
- package/dist/rules/engine/index.js +9 -0
- package/dist/rules/engine/index.js.map +1 -0
- package/dist/rules/engine/rule-context.d.ts +99 -0
- package/dist/rules/engine/rule-context.d.ts.map +1 -0
- package/dist/rules/engine/rule-context.js +175 -0
- package/dist/rules/engine/rule-context.js.map +1 -0
- package/dist/rules/engine/rule-engine.d.ts +132 -0
- package/dist/rules/engine/rule-engine.d.ts.map +1 -0
- package/dist/rules/engine/rule-engine.js +379 -0
- package/dist/rules/engine/rule-engine.js.map +1 -0
- package/dist/rules/engine/rule-registry.d.ts +133 -0
- package/dist/rules/engine/rule-registry.d.ts.map +1 -0
- package/dist/rules/engine/rule-registry.js +281 -0
- package/dist/rules/engine/rule-registry.js.map +1 -0
- package/dist/rules/index.d.ts +14 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +16 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/owasp/a01-broken-access-control.d.ts +19 -0
- package/dist/rules/owasp/a01-broken-access-control.d.ts.map +1 -0
- package/dist/rules/owasp/a01-broken-access-control.js +295 -0
- package/dist/rules/owasp/a01-broken-access-control.js.map +1 -0
- package/dist/rules/owasp/a02-cryptographic-failures.d.ts +19 -0
- package/dist/rules/owasp/a02-cryptographic-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a02-cryptographic-failures.js +327 -0
- package/dist/rules/owasp/a02-cryptographic-failures.js.map +1 -0
- package/dist/rules/owasp/a03-injection.d.ts +21 -0
- package/dist/rules/owasp/a03-injection.d.ts.map +1 -0
- package/dist/rules/owasp/a03-injection.js +342 -0
- package/dist/rules/owasp/a03-injection.js.map +1 -0
- package/dist/rules/owasp/a04-insecure-design.d.ts +19 -0
- package/dist/rules/owasp/a04-insecure-design.d.ts.map +1 -0
- package/dist/rules/owasp/a04-insecure-design.js +403 -0
- package/dist/rules/owasp/a04-insecure-design.js.map +1 -0
- package/dist/rules/owasp/a05-security-misconfiguration.d.ts +19 -0
- package/dist/rules/owasp/a05-security-misconfiguration.d.ts.map +1 -0
- package/dist/rules/owasp/a05-security-misconfiguration.js +371 -0
- package/dist/rules/owasp/a05-security-misconfiguration.js.map +1 -0
- package/dist/rules/owasp/a06-vulnerable-components.d.ts +18 -0
- package/dist/rules/owasp/a06-vulnerable-components.d.ts.map +1 -0
- package/dist/rules/owasp/a06-vulnerable-components.js +243 -0
- package/dist/rules/owasp/a06-vulnerable-components.js.map +1 -0
- package/dist/rules/owasp/a07-auth-failures.d.ts +19 -0
- package/dist/rules/owasp/a07-auth-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a07-auth-failures.js +300 -0
- package/dist/rules/owasp/a07-auth-failures.js.map +1 -0
- package/dist/rules/owasp/a08-integrity-failures.d.ts +18 -0
- package/dist/rules/owasp/a08-integrity-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a08-integrity-failures.js +306 -0
- package/dist/rules/owasp/a08-integrity-failures.js.map +1 -0
- package/dist/rules/owasp/a09-logging-failures.d.ts +18 -0
- package/dist/rules/owasp/a09-logging-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a09-logging-failures.js +339 -0
- package/dist/rules/owasp/a09-logging-failures.js.map +1 -0
- package/dist/rules/owasp/a10-ssrf.d.ts +18 -0
- package/dist/rules/owasp/a10-ssrf.d.ts.map +1 -0
- package/dist/rules/owasp/a10-ssrf.js +349 -0
- package/dist/rules/owasp/a10-ssrf.js.map +1 -0
- package/dist/rules/owasp/index.d.ts +20 -0
- package/dist/rules/owasp/index.d.ts.map +1 -0
- package/dist/rules/owasp/index.js +53 -0
- package/dist/rules/owasp/index.js.map +1 -0
- package/dist/rules/types.d.ts +277 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +34 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/tests/integration/epic-integration.test.d.ts +7 -0
- package/dist/tests/integration/epic-integration.test.d.ts.map +1 -0
- package/dist/tests/integration/epic-integration.test.js +390 -0
- package/dist/tests/integration/epic-integration.test.js.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts +2 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.js +154 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.js.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts +2 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.js +121 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.js.map +1 -0
- package/dist/types/cve.d.ts +278 -0
- package/dist/types/cve.d.ts.map +1 -0
- package/dist/types/cve.js +7 -0
- package/dist/types/cve.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rule.d.ts +245 -0
- package/dist/types/rule.d.ts.map +1 -0
- package/dist/types/rule.js +7 -0
- package/dist/types/rule.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-89-sql-injection.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-89-sql-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAiC/B,CAAC;AAocF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-89: Improper Neutralization of Special Elements used in an SQL Command (SQL Injection)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-89-sql-injection
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - String concatenation in SQL queries
|
|
8
|
+
* - Template literals with user input in SQL
|
|
9
|
+
* - Raw/unsafe query methods
|
|
10
|
+
* - ORM bypass patterns
|
|
11
|
+
* - Stored procedure injection
|
|
12
|
+
*
|
|
13
|
+
* CWE-89 is #3 in CWE Top 25 2023.
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* CWE-89 - SQL Injection
|
|
17
|
+
*/
|
|
18
|
+
export const cwe89SQLInjection = {
|
|
19
|
+
id: 'cwe-89-sql-injection',
|
|
20
|
+
name: 'CWE-89: SQL Injection',
|
|
21
|
+
description: 'Detects SQL injection vulnerabilities from unsafe query construction',
|
|
22
|
+
defaultSeverity: 'critical',
|
|
23
|
+
category: 'injection',
|
|
24
|
+
tags: ['cwe', 'sql', 'injection', 'database', 'security'],
|
|
25
|
+
owasp: ['A03:2021'],
|
|
26
|
+
cwe: ['89'],
|
|
27
|
+
references: [
|
|
28
|
+
{
|
|
29
|
+
title: 'CWE-89: SQL Injection',
|
|
30
|
+
url: 'https://cwe.mitre.org/data/definitions/89.html',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: 'OWASP SQL Injection Prevention',
|
|
34
|
+
url: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html',
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
async analyze(context) {
|
|
38
|
+
const findings = [];
|
|
39
|
+
const sourceCode = context.sourceCode;
|
|
40
|
+
checkStringConcatenation(context, sourceCode, findings);
|
|
41
|
+
checkTemplateLiterals(context, sourceCode, findings);
|
|
42
|
+
checkRawQueryMethods(context, sourceCode, findings);
|
|
43
|
+
checkORMBypass(context, sourceCode, findings);
|
|
44
|
+
checkDynamicTableColumn(context, sourceCode, findings);
|
|
45
|
+
return findings;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Check for string concatenation in SQL queries
|
|
50
|
+
*/
|
|
51
|
+
function checkStringConcatenation(context, sourceCode, findings) {
|
|
52
|
+
const lines = sourceCode.split('\n');
|
|
53
|
+
const concatPatterns = [
|
|
54
|
+
{
|
|
55
|
+
pattern: /['"`]SELECT\s+.*\+\s*\w+/gi,
|
|
56
|
+
type: 'SELECT with concatenation',
|
|
57
|
+
message: 'SQL SELECT query built with string concatenation',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
pattern: /['"`]INSERT\s+INTO\s+.*\+\s*\w+/gi,
|
|
61
|
+
type: 'INSERT with concatenation',
|
|
62
|
+
message: 'SQL INSERT query built with string concatenation',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
pattern: /['"`]UPDATE\s+.*SET\s+.*\+\s*\w+/gi,
|
|
66
|
+
type: 'UPDATE with concatenation',
|
|
67
|
+
message: 'SQL UPDATE query built with string concatenation',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
pattern: /['"`]DELETE\s+FROM\s+.*\+\s*\w+/gi,
|
|
71
|
+
type: 'DELETE with concatenation',
|
|
72
|
+
message: 'SQL DELETE query built with string concatenation',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
pattern: /['"`]WHERE\s+.*\+\s*(?:req\.|params\.|query\.|body\.|user)/gi,
|
|
76
|
+
type: 'WHERE clause with user input',
|
|
77
|
+
message: 'SQL WHERE clause concatenated with user-controlled input',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
pattern: /['"`].*(?:AND|OR)\s+.*\+\s*(?:req\.|params\.|query\.|body\.)/gi,
|
|
81
|
+
type: 'Condition with user input',
|
|
82
|
+
message: 'SQL condition concatenated with user-controlled input',
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
pattern: /['"`]ORDER\s+BY\s+.*\+\s*\w+/gi,
|
|
86
|
+
type: 'ORDER BY with concatenation',
|
|
87
|
+
message: 'SQL ORDER BY clause built with string concatenation',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
pattern: /['"`]GROUP\s+BY\s+.*\+\s*\w+/gi,
|
|
91
|
+
type: 'GROUP BY with concatenation',
|
|
92
|
+
message: 'SQL GROUP BY clause built with string concatenation',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
pattern: /['"`]LIMIT\s+.*\+\s*\w+|['"`]OFFSET\s+.*\+\s*\w+/gi,
|
|
96
|
+
type: 'LIMIT/OFFSET with concatenation',
|
|
97
|
+
message: 'SQL LIMIT/OFFSET built with string concatenation',
|
|
98
|
+
},
|
|
99
|
+
];
|
|
100
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
101
|
+
const line = lines[lineNum];
|
|
102
|
+
for (const { pattern, type, message } of concatPatterns) {
|
|
103
|
+
pattern.lastIndex = 0;
|
|
104
|
+
if (pattern.test(line)) {
|
|
105
|
+
findings.push({
|
|
106
|
+
id: `cwe-89-concat-${findings.length + 1}`,
|
|
107
|
+
ruleId: 'cwe-89-sql-injection',
|
|
108
|
+
severity: 'critical',
|
|
109
|
+
message: `SQL Injection - ${type}: ${message}`,
|
|
110
|
+
location: {
|
|
111
|
+
file: context.filePath,
|
|
112
|
+
startLine: lineNum + 1,
|
|
113
|
+
endLine: lineNum + 1,
|
|
114
|
+
startColumn: 0,
|
|
115
|
+
endColumn: line.length,
|
|
116
|
+
},
|
|
117
|
+
cwe: ['89'],
|
|
118
|
+
owasp: ['A03:2021'],
|
|
119
|
+
suggestion: {
|
|
120
|
+
description: 'Use parameterized queries',
|
|
121
|
+
example: `// PostgreSQL with node-pg:
|
|
122
|
+
const result = await client.query(
|
|
123
|
+
'SELECT * FROM users WHERE id = $1',
|
|
124
|
+
[userId]
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// MySQL with mysql2:
|
|
128
|
+
const [rows] = await connection.execute(
|
|
129
|
+
'SELECT * FROM users WHERE id = ?',
|
|
130
|
+
[userId]
|
|
131
|
+
);`,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check for template literals in SQL queries
|
|
140
|
+
*/
|
|
141
|
+
function checkTemplateLiterals(context, sourceCode, findings) {
|
|
142
|
+
const lines = sourceCode.split('\n');
|
|
143
|
+
const templatePatterns = [
|
|
144
|
+
{
|
|
145
|
+
pattern: /`SELECT\s+[^`]*\$\{[^}]+\}/gi,
|
|
146
|
+
type: 'SELECT with template literal',
|
|
147
|
+
message: 'SQL SELECT query uses template literal interpolation',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
pattern: /`INSERT\s+INTO\s+[^`]*\$\{[^}]+\}/gi,
|
|
151
|
+
type: 'INSERT with template literal',
|
|
152
|
+
message: 'SQL INSERT query uses template literal interpolation',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
pattern: /`UPDATE\s+[^`]*SET[^`]*\$\{[^}]+\}/gi,
|
|
156
|
+
type: 'UPDATE with template literal',
|
|
157
|
+
message: 'SQL UPDATE query uses template literal interpolation',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
pattern: /`DELETE\s+FROM\s+[^`]*\$\{[^}]+\}/gi,
|
|
161
|
+
type: 'DELETE with template literal',
|
|
162
|
+
message: 'SQL DELETE query uses template literal interpolation',
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
pattern: /`[^`]*WHERE[^`]*\$\{(?:req\.|params\.|query\.|body\.)[^}]+\}/gi,
|
|
166
|
+
type: 'WHERE with user input interpolation',
|
|
167
|
+
message: 'SQL WHERE clause interpolates user-controlled input',
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
171
|
+
const line = lines[lineNum];
|
|
172
|
+
for (const { pattern, type, message } of templatePatterns) {
|
|
173
|
+
pattern.lastIndex = 0;
|
|
174
|
+
if (pattern.test(line)) {
|
|
175
|
+
findings.push({
|
|
176
|
+
id: `cwe-89-template-${findings.length + 1}`,
|
|
177
|
+
ruleId: 'cwe-89-sql-injection',
|
|
178
|
+
severity: 'critical',
|
|
179
|
+
message: `SQL Injection - ${type}: ${message}`,
|
|
180
|
+
location: {
|
|
181
|
+
file: context.filePath,
|
|
182
|
+
startLine: lineNum + 1,
|
|
183
|
+
endLine: lineNum + 1,
|
|
184
|
+
startColumn: 0,
|
|
185
|
+
endColumn: line.length,
|
|
186
|
+
},
|
|
187
|
+
cwe: ['89'],
|
|
188
|
+
owasp: ['A03:2021'],
|
|
189
|
+
suggestion: {
|
|
190
|
+
description: 'Use tagged template literals or parameterized queries',
|
|
191
|
+
example: `// Use sql-template-strings or similar:
|
|
192
|
+
import sql from 'sql-template-strings';
|
|
193
|
+
const query = sql\`SELECT * FROM users WHERE id = \${userId}\`;
|
|
194
|
+
// This creates a parameterized query automatically
|
|
195
|
+
|
|
196
|
+
// Or use ORM:
|
|
197
|
+
const user = await User.findOne({ where: { id: userId } });`,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Check for raw query methods that bypass parameterization
|
|
206
|
+
*/
|
|
207
|
+
function checkRawQueryMethods(context, sourceCode, findings) {
|
|
208
|
+
const lines = sourceCode.split('\n');
|
|
209
|
+
const rawPatterns = [
|
|
210
|
+
{
|
|
211
|
+
pattern: /\.raw\s*\(\s*['"`].*\+/gi,
|
|
212
|
+
type: 'Raw query with concatenation',
|
|
213
|
+
message: 'ORM raw query method with string concatenation',
|
|
214
|
+
severity: 'critical',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
pattern: /\.raw\s*\(\s*`[^`]*\$\{/gi,
|
|
218
|
+
type: 'Raw query with interpolation',
|
|
219
|
+
message: 'ORM raw query method with template literal interpolation',
|
|
220
|
+
severity: 'critical',
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
pattern: /sequelize\.query\s*\(\s*['"`].*\+/gi,
|
|
224
|
+
type: 'Sequelize query with concatenation',
|
|
225
|
+
message: 'Sequelize raw query with string concatenation',
|
|
226
|
+
severity: 'critical',
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
pattern: /knex\.raw\s*\(\s*['"`].*\+/gi,
|
|
230
|
+
type: 'Knex raw with concatenation',
|
|
231
|
+
message: 'Knex raw query with string concatenation',
|
|
232
|
+
severity: 'critical',
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
pattern: /prisma\.\$executeRaw\s*`[^`]*\$\{/gi,
|
|
236
|
+
type: 'Prisma executeRaw with interpolation',
|
|
237
|
+
message: 'Prisma $executeRaw with interpolation - use $executeRaw with Prisma.sql',
|
|
238
|
+
severity: 'high',
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
pattern: /prisma\.\$queryRaw\s*`[^`]*\$\{/gi,
|
|
242
|
+
type: 'Prisma queryRaw with interpolation',
|
|
243
|
+
message: 'Prisma $queryRaw with interpolation - ensure using tagged template',
|
|
244
|
+
severity: 'medium',
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
pattern: /typeorm.*query\s*\(\s*['"`].*\+/gi,
|
|
248
|
+
type: 'TypeORM query with concatenation',
|
|
249
|
+
message: 'TypeORM query with string concatenation',
|
|
250
|
+
severity: 'critical',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
pattern: /\.exec\s*\(\s*['"`](?:SELECT|INSERT|UPDATE|DELETE).*\+/gi,
|
|
254
|
+
type: 'Database exec with concatenation',
|
|
255
|
+
message: 'Database exec method with string concatenation',
|
|
256
|
+
severity: 'critical',
|
|
257
|
+
},
|
|
258
|
+
];
|
|
259
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
260
|
+
const line = lines[lineNum];
|
|
261
|
+
for (const { pattern, type, message, severity } of rawPatterns) {
|
|
262
|
+
pattern.lastIndex = 0;
|
|
263
|
+
if (pattern.test(line)) {
|
|
264
|
+
findings.push({
|
|
265
|
+
id: `cwe-89-raw-${findings.length + 1}`,
|
|
266
|
+
ruleId: 'cwe-89-sql-injection',
|
|
267
|
+
severity,
|
|
268
|
+
message: `SQL Injection - ${type}: ${message}`,
|
|
269
|
+
location: {
|
|
270
|
+
file: context.filePath,
|
|
271
|
+
startLine: lineNum + 1,
|
|
272
|
+
endLine: lineNum + 1,
|
|
273
|
+
startColumn: 0,
|
|
274
|
+
endColumn: line.length,
|
|
275
|
+
},
|
|
276
|
+
cwe: ['89'],
|
|
277
|
+
owasp: ['A03:2021'],
|
|
278
|
+
suggestion: {
|
|
279
|
+
description: 'Use parameterized raw queries',
|
|
280
|
+
example: `// Sequelize with replacements:
|
|
281
|
+
await sequelize.query(
|
|
282
|
+
'SELECT * FROM users WHERE id = :userId',
|
|
283
|
+
{ replacements: { userId }, type: QueryTypes.SELECT }
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
// Knex with bindings:
|
|
287
|
+
await knex.raw('SELECT * FROM users WHERE id = ?', [userId]);
|
|
288
|
+
|
|
289
|
+
// Prisma with Prisma.sql:
|
|
290
|
+
await prisma.$queryRaw(Prisma.sql\`SELECT * FROM users WHERE id = \${userId}\`);`,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Check for ORM query builder bypass patterns
|
|
299
|
+
*/
|
|
300
|
+
function checkORMBypass(context, sourceCode, findings) {
|
|
301
|
+
const lines = sourceCode.split('\n');
|
|
302
|
+
const bypassPatterns = [
|
|
303
|
+
{
|
|
304
|
+
pattern: /\.where\s*\(\s*`[^`]*\$\{/gi,
|
|
305
|
+
type: 'ORM where with interpolation',
|
|
306
|
+
message: 'ORM where clause with template literal interpolation',
|
|
307
|
+
severity: 'high',
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
pattern: /\.where\s*\(\s*['"`].*\+/gi,
|
|
311
|
+
type: 'ORM where with concatenation',
|
|
312
|
+
message: 'ORM where clause with string concatenation',
|
|
313
|
+
severity: 'high',
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
pattern: /\.orderBy\s*\(\s*(?:req\.|params\.|query\.|body\.)/gi,
|
|
317
|
+
type: 'ORM orderBy with user input',
|
|
318
|
+
message: 'ORM orderBy with user-controlled input may allow injection',
|
|
319
|
+
severity: 'medium',
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
pattern: /\.having\s*\(\s*['"`].*\+/gi,
|
|
323
|
+
type: 'ORM having with concatenation',
|
|
324
|
+
message: 'ORM having clause with string concatenation',
|
|
325
|
+
severity: 'high',
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
pattern: /\.whereRaw\s*\(\s*['"`].*\+/gi,
|
|
329
|
+
type: 'whereRaw with concatenation',
|
|
330
|
+
message: 'whereRaw with string concatenation bypasses parameterization',
|
|
331
|
+
severity: 'critical',
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
pattern: /Sequelize\.literal\s*\(\s*['"`].*\+/gi,
|
|
335
|
+
type: 'Sequelize.literal with concatenation',
|
|
336
|
+
message: 'Sequelize.literal with concatenation allows raw SQL',
|
|
337
|
+
severity: 'critical',
|
|
338
|
+
},
|
|
339
|
+
];
|
|
340
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
341
|
+
const line = lines[lineNum];
|
|
342
|
+
for (const { pattern, type, message, severity } of bypassPatterns) {
|
|
343
|
+
pattern.lastIndex = 0;
|
|
344
|
+
if (pattern.test(line)) {
|
|
345
|
+
findings.push({
|
|
346
|
+
id: `cwe-89-orm-${findings.length + 1}`,
|
|
347
|
+
ruleId: 'cwe-89-sql-injection',
|
|
348
|
+
severity,
|
|
349
|
+
message: `SQL Injection - ${type}: ${message}`,
|
|
350
|
+
location: {
|
|
351
|
+
file: context.filePath,
|
|
352
|
+
startLine: lineNum + 1,
|
|
353
|
+
endLine: lineNum + 1,
|
|
354
|
+
startColumn: 0,
|
|
355
|
+
endColumn: line.length,
|
|
356
|
+
},
|
|
357
|
+
cwe: ['89'],
|
|
358
|
+
owasp: ['A03:2021'],
|
|
359
|
+
suggestion: {
|
|
360
|
+
description: 'Use ORM query builder methods safely',
|
|
361
|
+
example: `// Knex where with object:
|
|
362
|
+
await knex('users').where({ id: userId });
|
|
363
|
+
|
|
364
|
+
// Sequelize findOne:
|
|
365
|
+
await User.findOne({ where: { id: userId } });
|
|
366
|
+
|
|
367
|
+
// For dynamic columns, whitelist allowed values:
|
|
368
|
+
const allowedColumns = ['name', 'date', 'id'];
|
|
369
|
+
const column = allowedColumns.includes(sortBy) ? sortBy : 'id';
|
|
370
|
+
await knex('users').orderBy(column);`,
|
|
371
|
+
},
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Check for dynamic table/column name injection
|
|
379
|
+
*/
|
|
380
|
+
function checkDynamicTableColumn(context, sourceCode, findings) {
|
|
381
|
+
const lines = sourceCode.split('\n');
|
|
382
|
+
const dynamicPatterns = [
|
|
383
|
+
{
|
|
384
|
+
pattern: /['"`]SELECT\s+\*\s+FROM\s+['"`]\s*\+\s*\w+/gi,
|
|
385
|
+
type: 'Dynamic table name',
|
|
386
|
+
message: 'Table name built from variable may allow injection',
|
|
387
|
+
severity: 'high',
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
pattern: /`SELECT\s+\*\s+FROM\s+\$\{/gi,
|
|
391
|
+
type: 'Interpolated table name',
|
|
392
|
+
message: 'Table name from template interpolation may allow injection',
|
|
393
|
+
severity: 'high',
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
pattern: /['"`]SELECT\s+['"`]\s*\+\s*\w+\s*\+\s*['"`]\s+FROM/gi,
|
|
397
|
+
type: 'Dynamic column selection',
|
|
398
|
+
message: 'Column name built from variable may allow injection',
|
|
399
|
+
severity: 'medium',
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
pattern: /\.from\s*\(\s*(?:req\.|params\.|query\.|body\.)/gi,
|
|
403
|
+
type: 'ORM from with user input',
|
|
404
|
+
message: 'Table name from user input in ORM query',
|
|
405
|
+
severity: 'critical',
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
pattern: /\.into\s*\(\s*(?:req\.|params\.|query\.|body\.)/gi,
|
|
409
|
+
type: 'ORM into with user input',
|
|
410
|
+
message: 'Table name from user input in ORM insert',
|
|
411
|
+
severity: 'critical',
|
|
412
|
+
},
|
|
413
|
+
];
|
|
414
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
415
|
+
const line = lines[lineNum];
|
|
416
|
+
for (const { pattern, type, message, severity } of dynamicPatterns) {
|
|
417
|
+
pattern.lastIndex = 0;
|
|
418
|
+
if (pattern.test(line)) {
|
|
419
|
+
findings.push({
|
|
420
|
+
id: `cwe-89-dynamic-${findings.length + 1}`,
|
|
421
|
+
ruleId: 'cwe-89-sql-injection',
|
|
422
|
+
severity,
|
|
423
|
+
message: `SQL Injection - ${type}: ${message}`,
|
|
424
|
+
location: {
|
|
425
|
+
file: context.filePath,
|
|
426
|
+
startLine: lineNum + 1,
|
|
427
|
+
endLine: lineNum + 1,
|
|
428
|
+
startColumn: 0,
|
|
429
|
+
endColumn: line.length,
|
|
430
|
+
},
|
|
431
|
+
cwe: ['89'],
|
|
432
|
+
owasp: ['A03:2021'],
|
|
433
|
+
suggestion: {
|
|
434
|
+
description: 'Whitelist allowed table and column names',
|
|
435
|
+
example: `// Whitelist allowed tables:
|
|
436
|
+
const allowedTables = ['users', 'products', 'orders'];
|
|
437
|
+
if (!allowedTables.includes(tableName)) {
|
|
438
|
+
throw new Error('Invalid table name');
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Use identifier escaping:
|
|
442
|
+
const escapedTable = connection.escapeId(tableName);
|
|
443
|
+
|
|
444
|
+
// Or use ORM model mapping:
|
|
445
|
+
const models = { users: User, products: Product };
|
|
446
|
+
const Model = models[tableName];
|
|
447
|
+
if (!Model) throw new Error('Invalid model');
|
|
448
|
+
await Model.findAll();`,
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
export default cwe89SQLInjection;
|
|
456
|
+
//# sourceMappingURL=cwe-89-sql-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-89-sql-injection.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-89-sql-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAiB;IAC7C,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,sEAAsE;IACxE,eAAe,EAAE,UAAU;IAC3B,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC;IACzD,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,GAAG,EAAE,CAAC,IAAI,CAAC;IACX,UAAU,EAAE;QACV;YACE,KAAK,EAAE,uBAAuB;YAC9B,GAAG,EAAE,gDAAgD;SACtD;QACD;YACE,KAAK,EAAE,gCAAgC;YACvC,GAAG,EAAE,0FAA0F;SAChG;KACF;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAEtC,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACxD,qBAAqB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACrD,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpD,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC9C,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEvD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,wBAAwB,CAC/B,OAAoB,EACpB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG;QACrB;YACE,OAAO,EAAE,4BAA4B;YACrC,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,kDAAkD;SAC5D;QACD;YACE,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,kDAAkD;SAC5D;QACD;YACE,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,kDAAkD;SAC5D;QACD;YACE,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,kDAAkD;SAC5D;QACD;YACE,OAAO,EAAE,8DAA8D;YACvE,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,0DAA0D;SACpE;QACD;YACE,OAAO,EAAE,gEAAgE;YACzE,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,uDAAuD;SACjE;QACD;YACE,OAAO,EAAE,gCAAgC;YACzC,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,qDAAqD;SAC/D;QACD;YACE,OAAO,EAAE,gCAAgC;YACzC,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,qDAAqD;SAC/D;QACD;YACE,OAAO,EAAE,oDAAoD;YAC7D,IAAI,EAAE,iCAAiC;YACvC,OAAO,EAAE,kDAAkD;SAC5D;KACF,CAAC;IAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,cAAc,EAAE,CAAC;YACxD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,iBAAiB,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC1C,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE;oBAC9C,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,SAAS,EAAE,OAAO,GAAG,CAAC;wBACtB,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,SAAS,EAAE,IAAI,CAAC,MAAM;qBACvB;oBACD,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,UAAU,EAAE;wBACV,WAAW,EAAE,2BAA2B;wBACxC,OAAO,EAAE;;;;;;;;;;GAUlB;qBACQ;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,OAAoB,EACpB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,gBAAgB,GAAG;QACvB;YACE,OAAO,EAAE,8BAA8B;YACvC,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sDAAsD;SAChE;QACD;YACE,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sDAAsD;SAChE;QACD;YACE,OAAO,EAAE,sCAAsC;YAC/C,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sDAAsD;SAChE;QACD;YACE,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sDAAsD;SAChE;QACD;YACE,OAAO,EAAE,gEAAgE;YACzE,IAAI,EAAE,qCAAqC;YAC3C,OAAO,EAAE,qDAAqD;SAC/D;KACF,CAAC;IAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAC1D,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,mBAAmB,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5C,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE;oBAC9C,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,SAAS,EAAE,OAAO,GAAG,CAAC;wBACtB,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,SAAS,EAAE,IAAI,CAAC,MAAM;qBACvB;oBACD,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,UAAU,EAAE;wBACV,WAAW,EAAE,uDAAuD;wBACpE,OAAO,EAAE;;;;;;4DAMuC;qBACjD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,OAAoB,EACpB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,WAAW,GAAG;QAClB;YACE,OAAO,EAAE,0BAA0B;YACnC,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,gDAAgD;YACzD,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,2BAA2B;YACpC,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,0DAA0D;YACnE,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EAAE,+CAA+C;YACxD,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,8BAA8B;YACvC,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,0CAA0C;YACnD,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EACL,yEAAyE;YAC3E,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,oCAAoC;YAC1C,OAAO,EACL,oEAAoE;YACtE,QAAQ,EAAE,QAAiB;SAC5B;QACD;YACE,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,kCAAkC;YACxC,OAAO,EAAE,yCAAyC;YAClD,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,0DAA0D;YACnE,IAAI,EAAE,kCAAkC;YACxC,OAAO,EAAE,gDAAgD;YACzD,QAAQ,EAAE,UAAmB;SAC9B;KACF,CAAC;IAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC;YAC/D,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvC,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ;oBACR,OAAO,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE;oBAC9C,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,SAAS,EAAE,OAAO,GAAG,CAAC;wBACtB,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,SAAS,EAAE,IAAI,CAAC,MAAM;qBACvB;oBACD,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,UAAU,EAAE;wBACV,WAAW,EAAE,+BAA+B;wBAC5C,OAAO,EAAE;;;;;;;;;;iFAU4D;qBACtE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,OAAoB,EACpB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG;QACrB;YACE,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,sDAAsD;YAC/D,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,4BAA4B;YACrC,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,4CAA4C;YACrD,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,sDAAsD;YAC/D,IAAI,EAAE,6BAA6B;YACnC,OAAO,EACL,4DAA4D;YAC9D,QAAQ,EAAE,QAAiB;SAC5B;QACD;YACE,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,+BAA+B;YACrC,OAAO,EAAE,6CAA6C;YACtD,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,6BAA6B;YACnC,OAAO,EAAE,8DAA8D;YACvE,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,uCAAuC;YAChD,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE,qDAAqD;YAC9D,QAAQ,EAAE,UAAmB;SAC9B;KACF,CAAC;IAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,cAAc,EAAE,CAAC;YAClE,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBACvC,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ;oBACR,OAAO,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE;oBAC9C,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,SAAS,EAAE,OAAO,GAAG,CAAC;wBACtB,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,SAAS,EAAE,IAAI,CAAC,MAAM;qBACvB;oBACD,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,UAAU,EAAE;wBACV,WAAW,EAAE,sCAAsC;wBACnD,OAAO,EAAE;;;;;;;;;qCASgB;qBAC1B;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,OAAoB,EACpB,UAAkB,EAClB,QAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,eAAe,GAAG;QACtB;YACE,OAAO,EAAE,8CAA8C;YACvD,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,oDAAoD;YAC7D,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,8BAA8B;YACvC,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,4DAA4D;YACrE,QAAQ,EAAE,MAAe;SAC1B;QACD;YACE,OAAO,EAAE,sDAAsD;YAC/D,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,qDAAqD;YAC9D,QAAQ,EAAE,QAAiB;SAC5B;QACD;YACE,OAAO,EAAE,mDAAmD;YAC5D,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,yCAAyC;YAClD,QAAQ,EAAE,UAAmB;SAC9B;QACD;YACE,OAAO,EAAE,mDAAmD;YAC5D,IAAI,EAAE,0BAA0B;YAChC,OAAO,EAAE,0CAA0C;YACnD,QAAQ,EAAE,UAAmB;SAC9B;KACF,CAAC;IAEF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,CAAC;YACnE,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC;oBACZ,EAAE,EAAE,kBAAkB,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3C,MAAM,EAAE,sBAAsB;oBAC9B,QAAQ;oBACR,OAAO,EAAE,mBAAmB,IAAI,KAAK,OAAO,EAAE;oBAC9C,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO,CAAC,QAAQ;wBACtB,SAAS,EAAE,OAAO,GAAG,CAAC;wBACtB,OAAO,EAAE,OAAO,GAAG,CAAC;wBACpB,WAAW,EAAE,CAAC;wBACd,SAAS,EAAE,IAAI,CAAC,MAAM;qBACvB;oBACD,GAAG,EAAE,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,CAAC,UAAU,CAAC;oBACnB,UAAU,EAAE;wBACV,WAAW,EAAE,0CAA0C;wBACvD,OAAO,EAAE;;;;;;;;;;;;;uBAaE;qBACZ;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-918: Server-Side Request Forgery (SSRF)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-918-ssrf
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
export declare const cwe918SSRF: SecurityRule;
|
|
8
|
+
export default cwe918SSRF;
|
|
9
|
+
//# sourceMappingURL=cwe-918-ssrf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-918-ssrf.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-918-ssrf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,UAAU,EAAE,YAsDxB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-918: Server-Side Request Forgery (SSRF)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-918-ssrf
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
export const cwe918SSRF = {
|
|
7
|
+
id: 'cwe-918-ssrf',
|
|
8
|
+
name: 'CWE-918: Server-Side Request Forgery',
|
|
9
|
+
description: 'Detects SSRF vulnerabilities where user input controls URLs',
|
|
10
|
+
defaultSeverity: 'high',
|
|
11
|
+
category: 'injection',
|
|
12
|
+
tags: ['cwe', 'ssrf', 'network', 'security'],
|
|
13
|
+
cwe: ['918'],
|
|
14
|
+
owasp: ['A10:2021'],
|
|
15
|
+
references: [
|
|
16
|
+
{ title: 'CWE-918', url: 'https://cwe.mitre.org/data/definitions/918.html' },
|
|
17
|
+
],
|
|
18
|
+
async analyze(context) {
|
|
19
|
+
const findings = [];
|
|
20
|
+
const lines = context.sourceCode.split('\n');
|
|
21
|
+
const patterns = [
|
|
22
|
+
{ pattern: /fetch\s*\(\s*req\./gi, type: 'fetch with request URL', severity: 'high' },
|
|
23
|
+
{ pattern: /axios\s*\.\s*get\s*\(\s*\w+\)/gi, type: 'axios with variable URL', severity: 'high' },
|
|
24
|
+
{ pattern: /http\.request\s*\(\s*\{[^}]*url\s*:\s*\w+/gi, type: 'http.request with variable', severity: 'high' },
|
|
25
|
+
{ pattern: /new\s+URL\s*\(\s*req\./gi, type: 'URL from request', severity: 'high' },
|
|
26
|
+
{ pattern: /redirect\s*\(\s*req\./gi, type: 'Redirect from request', severity: 'medium' },
|
|
27
|
+
{ pattern: /got\s*\(\s*\w+\)/gi, type: 'got with variable URL', severity: 'high' },
|
|
28
|
+
{ pattern: /request\s*\(\s*\{[^}]*uri\s*:\s*\w+/gi, type: 'request with variable URI', severity: 'high' },
|
|
29
|
+
];
|
|
30
|
+
for (let i = 0; i < lines.length; i++) {
|
|
31
|
+
for (const { pattern, type, severity } of patterns) {
|
|
32
|
+
pattern.lastIndex = 0;
|
|
33
|
+
if (pattern.test(lines[i])) {
|
|
34
|
+
findings.push({
|
|
35
|
+
id: `cwe-918-${findings.length + 1}`,
|
|
36
|
+
ruleId: 'cwe-918-ssrf',
|
|
37
|
+
severity,
|
|
38
|
+
message: `SSRF - ${type}: Validate and allowlist URLs`,
|
|
39
|
+
location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
|
|
40
|
+
cwe: ['918'],
|
|
41
|
+
owasp: ['A10:2021'],
|
|
42
|
+
suggestion: {
|
|
43
|
+
description: 'Validate URLs against an allowlist',
|
|
44
|
+
example: `// Use URL allowlist
|
|
45
|
+
const allowedHosts = ['api.example.com'];
|
|
46
|
+
const url = new URL(userUrl);
|
|
47
|
+
if (!allowedHosts.includes(url.hostname)) {
|
|
48
|
+
throw new Error('URL not allowed');
|
|
49
|
+
}`,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return findings;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export default cwe918SSRF;
|
|
59
|
+
//# sourceMappingURL=cwe-918-ssrf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-918-ssrf.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-918-ssrf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,sCAAsC;IAC5C,WAAW,EAAE,6DAA6D;IAC1E,eAAe,EAAE,MAAM;IACvB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;IAC5C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,iDAAiD,EAAE;KAC7E;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG;YACf,EAAE,OAAO,EAAE,sBAAsB,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC9F,EAAE,OAAO,EAAE,iCAAiC,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC1G,EAAE,OAAO,EAAE,6CAA6C,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,MAAe,EAAE;YACzH,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC5F,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAClG,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC3F,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAe,EAAE;SACnH,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,MAAM,EAAE,cAAc;wBACtB,QAAQ;wBACR,OAAO,EAAE,UAAU,IAAI,+BAA+B;wBACtD,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtE,GAAG,EAAE,CAAC,KAAK,CAAC;wBACZ,KAAK,EAAE,CAAC,UAAU,CAAC;wBACnB,UAAU,EAAE;4BACV,WAAW,EAAE,oCAAoC;4BACjD,OAAO,EAAE;;;;;EAKrB;yBACW;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-94: Improper Control of Generation of Code (Code Injection)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-94-code-injection
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
export declare const cwe94CodeInjection: SecurityRule;
|
|
8
|
+
export default cwe94CodeInjection;
|
|
9
|
+
//# sourceMappingURL=cwe-94-code-injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-94-code-injection.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-94-code-injection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,kBAAkB,EAAE,YAsDhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-94: Improper Control of Generation of Code (Code Injection)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-94-code-injection
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
export const cwe94CodeInjection = {
|
|
7
|
+
id: 'cwe-94-code-injection',
|
|
8
|
+
name: 'CWE-94: Code Injection',
|
|
9
|
+
description: 'Detects code injection through dynamic code generation',
|
|
10
|
+
defaultSeverity: 'critical',
|
|
11
|
+
category: 'injection',
|
|
12
|
+
tags: ['cwe', 'code-injection', 'rce', 'security'],
|
|
13
|
+
cwe: ['94'],
|
|
14
|
+
owasp: ['A03:2021'],
|
|
15
|
+
references: [
|
|
16
|
+
{ title: 'CWE-94', url: 'https://cwe.mitre.org/data/definitions/94.html' },
|
|
17
|
+
],
|
|
18
|
+
async analyze(context) {
|
|
19
|
+
const findings = [];
|
|
20
|
+
const lines = context.sourceCode.split('\n');
|
|
21
|
+
const patterns = [
|
|
22
|
+
{ pattern: /eval\s*\(/gi, type: 'eval() usage', severity: 'critical' },
|
|
23
|
+
{ pattern: /new\s+Function\s*\(/gi, type: 'new Function() usage', severity: 'critical' },
|
|
24
|
+
{ pattern: /setTimeout\s*\(\s*['"`]/gi, type: 'setTimeout with string', severity: 'high' },
|
|
25
|
+
{ pattern: /setInterval\s*\(\s*['"`]/gi, type: 'setInterval with string', severity: 'high' },
|
|
26
|
+
{ pattern: /vm\.runInContext\s*\(/gi, type: 'vm.runInContext', severity: 'high' },
|
|
27
|
+
{ pattern: /vm\.runInNewContext\s*\(/gi, type: 'vm.runInNewContext', severity: 'high' },
|
|
28
|
+
{ pattern: /require\s*\(\s*\w+\s*\)/gi, type: 'Dynamic require', severity: 'high' },
|
|
29
|
+
{ pattern: /import\s*\(\s*\w+\s*\)/gi, type: 'Dynamic import', severity: 'medium' },
|
|
30
|
+
];
|
|
31
|
+
for (let i = 0; i < lines.length; i++) {
|
|
32
|
+
for (const { pattern, type, severity } of patterns) {
|
|
33
|
+
pattern.lastIndex = 0;
|
|
34
|
+
if (pattern.test(lines[i])) {
|
|
35
|
+
findings.push({
|
|
36
|
+
id: `cwe-94-${findings.length + 1}`,
|
|
37
|
+
ruleId: 'cwe-94-code-injection',
|
|
38
|
+
severity,
|
|
39
|
+
message: `Code Injection - ${type}: Avoid dynamic code execution`,
|
|
40
|
+
location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
|
|
41
|
+
cwe: ['94'],
|
|
42
|
+
owasp: ['A03:2021'],
|
|
43
|
+
suggestion: {
|
|
44
|
+
description: 'Use safe alternatives to dynamic code execution',
|
|
45
|
+
example: `// Instead of eval, use safe alternatives
|
|
46
|
+
// Bad: eval(userCode)
|
|
47
|
+
// Good: Use a sandboxed environment or predefined functions
|
|
48
|
+
const allowedOps = { add: (a, b) => a + b };
|
|
49
|
+
const result = allowedOps[operation]?.(a, b);`,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return findings;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
export default cwe94CodeInjection;
|
|
59
|
+
//# sourceMappingURL=cwe-94-code-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-94-code-injection.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-94-code-injection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,kBAAkB,GAAiB;IAC9C,EAAE,EAAE,uBAAuB;IAC3B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,wDAAwD;IACrE,eAAe,EAAE,UAAU;IAC3B,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,CAAC;IAClD,GAAG,EAAE,CAAC,IAAI,CAAC;IACX,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,gDAAgD,EAAE;KAC3E;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG;YACf,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAmB,EAAE;YAC/E,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAmB,EAAE;YACjG,EAAE,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAe,EAAE;YACnG,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAe,EAAE;YACrG,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC1F,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAChG,EAAE,OAAO,EAAE,2BAA2B,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC5F,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAiB,EAAE;SAC7F,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,UAAU,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACnC,MAAM,EAAE,uBAAuB;wBAC/B,QAAQ;wBACR,OAAO,EAAE,oBAAoB,IAAI,gCAAgC;wBACjE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtE,GAAG,EAAE,CAAC,IAAI,CAAC;wBACX,KAAK,EAAE,CAAC,UAAU,CAAC;wBACnB,UAAU,EAAE;4BACV,WAAW,EAAE,iDAAiD;4BAC9D,OAAO,EAAE;;;;8CAIuB;yBACjC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|