@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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-352: Cross-Site Request Forgery (CSRF)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-352-csrf
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*/
|
|
6
|
+
export const cwe352CSRF = {
|
|
7
|
+
id: 'cwe-352-csrf',
|
|
8
|
+
name: 'CWE-352: Cross-Site Request Forgery',
|
|
9
|
+
description: 'Detects missing CSRF protection patterns',
|
|
10
|
+
defaultSeverity: 'high',
|
|
11
|
+
category: 'session',
|
|
12
|
+
tags: ['cwe', 'csrf', 'session', 'security'],
|
|
13
|
+
cwe: ['352'],
|
|
14
|
+
references: [
|
|
15
|
+
{ title: 'CWE-352: CSRF', url: 'https://cwe.mitre.org/data/definitions/352.html' },
|
|
16
|
+
],
|
|
17
|
+
async analyze(context) {
|
|
18
|
+
const findings = [];
|
|
19
|
+
const lines = context.sourceCode.split('\n');
|
|
20
|
+
const patterns = [
|
|
21
|
+
{ pattern: /app\.post\s*\(/gi, type: 'POST without CSRF', severity: 'medium' },
|
|
22
|
+
{ pattern: /app\.put\s*\(/gi, type: 'PUT without CSRF', severity: 'medium' },
|
|
23
|
+
{ pattern: /app\.delete\s*\(/gi, type: 'DELETE without CSRF', severity: 'medium' },
|
|
24
|
+
{ pattern: /SameSite\s*:\s*['"`]None['"`]/gi, type: 'SameSite=None cookie', severity: 'high' },
|
|
25
|
+
{ pattern: /credentials\s*:\s*['"`]include['"`]/gi, type: 'Fetch with credentials', severity: 'low' },
|
|
26
|
+
];
|
|
27
|
+
for (let i = 0; i < lines.length; i++) {
|
|
28
|
+
for (const { pattern, type, severity } of patterns) {
|
|
29
|
+
pattern.lastIndex = 0;
|
|
30
|
+
if (pattern.test(lines[i])) {
|
|
31
|
+
findings.push({
|
|
32
|
+
id: `cwe-352-${findings.length + 1}`,
|
|
33
|
+
ruleId: 'cwe-352-csrf',
|
|
34
|
+
severity,
|
|
35
|
+
message: `CSRF - ${type}: Ensure CSRF token validation`,
|
|
36
|
+
location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
|
|
37
|
+
cwe: ['352'],
|
|
38
|
+
suggestion: {
|
|
39
|
+
description: 'Use CSRF middleware',
|
|
40
|
+
example: `const csrf = require('csurf');
|
|
41
|
+
app.use(csrf({ cookie: true }));`,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return findings;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
export default cwe352CSRF;
|
|
51
|
+
//# sourceMappingURL=cwe-352-csrf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-352-csrf.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-352-csrf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EAAE,0CAA0C;IACvD,eAAe,EAAE,MAAM;IACvB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;IAC5C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,iDAAiD,EAAE;KACnF;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,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACvF,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACrF,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC3F,EAAE,OAAO,EAAE,iCAAiC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAe,EAAE;YACvG,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAc,EAAE;SAC/G,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,gCAAgC;wBACvD,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,UAAU,EAAE;4BACV,WAAW,EAAE,qBAAqB;4BAClC,OAAO,EAAE;iCACU;yBACpB;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-362: Concurrent Execution Using Shared Resource (Race Condition)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-362-race-condition
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
export declare const cwe362RaceCondition: SecurityRule;
|
|
8
|
+
export default cwe362RaceCondition;
|
|
9
|
+
//# sourceMappingURL=cwe-362-race-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-362-race-condition.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-362-race-condition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,mBAAmB,EAAE,YAkDjC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-362: Concurrent Execution Using Shared Resource (Race Condition)
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-362-race-condition
|
|
4
|
+
* @trace TSK-RULE-006
|
|
5
|
+
*/
|
|
6
|
+
export const cwe362RaceCondition = {
|
|
7
|
+
id: 'cwe-362-race-condition',
|
|
8
|
+
name: 'CWE-362: Race Condition',
|
|
9
|
+
description: 'Detects potential race condition vulnerabilities',
|
|
10
|
+
defaultSeverity: 'medium',
|
|
11
|
+
category: 'concurrency',
|
|
12
|
+
tags: ['cwe', 'race-condition', 'concurrency', 'security'],
|
|
13
|
+
cwe: ['362'],
|
|
14
|
+
references: [
|
|
15
|
+
{ title: 'CWE-362', url: 'https://cwe.mitre.org/data/definitions/362.html' },
|
|
16
|
+
],
|
|
17
|
+
async analyze(context) {
|
|
18
|
+
const findings = [];
|
|
19
|
+
const lines = context.sourceCode.split('\n');
|
|
20
|
+
const patterns = [
|
|
21
|
+
{ pattern: /if\s*\(.*exists.*\).*\{[^}]*(?:write|create|delete)/gis, type: 'Check-then-act pattern', severity: 'high' },
|
|
22
|
+
{ pattern: /fs\.existsSync.*fs\.(?:write|unlink|mkdir)/gi, type: 'File TOCTOU', severity: 'high' },
|
|
23
|
+
{ pattern: /\.findOne\s*\([^)]+\).*\.save\s*\(\)/gi, type: 'Read-modify-write pattern', severity: 'medium' },
|
|
24
|
+
{ pattern: /let\s+\w+\s*=.*;\s*(?:setTimeout|setInterval)/gi, type: 'Shared state with timer', severity: 'medium' },
|
|
25
|
+
{ pattern: /global\.\w+\s*=|globalThis\.\w+\s*=/gi, type: 'Global state modification', severity: 'medium' },
|
|
26
|
+
{ pattern: /Promise\.all.*(?:update|write|delete)/gi, type: 'Concurrent mutations', severity: 'medium' },
|
|
27
|
+
];
|
|
28
|
+
for (let i = 0; i < lines.length; i++) {
|
|
29
|
+
for (const { pattern, type, severity } of patterns) {
|
|
30
|
+
pattern.lastIndex = 0;
|
|
31
|
+
if (pattern.test(lines[i])) {
|
|
32
|
+
findings.push({
|
|
33
|
+
id: `cwe-362-${findings.length + 1}`,
|
|
34
|
+
ruleId: 'cwe-362-race-condition',
|
|
35
|
+
severity,
|
|
36
|
+
message: `Race Condition - ${type}: Use atomic operations or locks`,
|
|
37
|
+
location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
|
|
38
|
+
cwe: ['362'],
|
|
39
|
+
suggestion: {
|
|
40
|
+
description: 'Use atomic operations or proper locking',
|
|
41
|
+
example: `// Use atomic operation or transaction
|
|
42
|
+
await db.transaction(async (tx) => {
|
|
43
|
+
const item = await tx.findOne(query);
|
|
44
|
+
if (item) await tx.update(item.id, data);
|
|
45
|
+
});`,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return findings;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
export default cwe362RaceCondition;
|
|
55
|
+
//# sourceMappingURL=cwe-362-race-condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-362-race-condition.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-362-race-condition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,EAAE,EAAE,wBAAwB;IAC5B,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,kDAAkD;IAC/D,eAAe,EAAE,QAAQ;IACzB,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,CAAC;IAC1D,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,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,wDAAwD,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAChI,EAAE,OAAO,EAAE,8CAA8C,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC3G,EAAE,OAAO,EAAE,wCAAwC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACrH,EAAE,OAAO,EAAE,iDAAiD,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC5H,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACpH,EAAE,OAAO,EAAE,yCAAyC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAiB,EAAE;SAClH,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,wBAAwB;wBAChC,QAAQ;wBACR,OAAO,EAAE,oBAAoB,IAAI,kCAAkC;wBACnE,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,UAAU,EAAE;4BACV,WAAW,EAAE,yCAAyC;4BACtD,OAAO,EAAE;;;;IAInB;yBACS;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-416: Use After Free
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-416-use-after-free
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - Resource usage after disposal (streams, handles)
|
|
8
|
+
* - Promise race conditions
|
|
9
|
+
* - Event listener memory leaks
|
|
10
|
+
* - Timer cleanup issues
|
|
11
|
+
* - Database connection pool misuse
|
|
12
|
+
*
|
|
13
|
+
* CWE-416 is #4 in CWE Top 25 2023.
|
|
14
|
+
* Note: JavaScript has garbage collection, so traditional UAF is rare.
|
|
15
|
+
* This rule focuses on logical "use after free" patterns.
|
|
16
|
+
*/
|
|
17
|
+
import type { SecurityRule } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* CWE-416 - Use After Free
|
|
20
|
+
*/
|
|
21
|
+
export declare const cwe416UseAfterFree: SecurityRule;
|
|
22
|
+
export default cwe416UseAfterFree;
|
|
23
|
+
//# sourceMappingURL=cwe-416-use-after-free.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-416-use-after-free.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-416-use-after-free.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAgChC,CAAC;AAqZF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-416: Use After Free
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-416-use-after-free
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - Resource usage after disposal (streams, handles)
|
|
8
|
+
* - Promise race conditions
|
|
9
|
+
* - Event listener memory leaks
|
|
10
|
+
* - Timer cleanup issues
|
|
11
|
+
* - Database connection pool misuse
|
|
12
|
+
*
|
|
13
|
+
* CWE-416 is #4 in CWE Top 25 2023.
|
|
14
|
+
* Note: JavaScript has garbage collection, so traditional UAF is rare.
|
|
15
|
+
* This rule focuses on logical "use after free" patterns.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* CWE-416 - Use After Free
|
|
19
|
+
*/
|
|
20
|
+
export const cwe416UseAfterFree = {
|
|
21
|
+
id: 'cwe-416-use-after-free',
|
|
22
|
+
name: 'CWE-416: Use After Free',
|
|
23
|
+
description: 'Detects resource usage after disposal patterns including streams, connections, and event handlers',
|
|
24
|
+
defaultSeverity: 'medium',
|
|
25
|
+
category: 'memory-safety',
|
|
26
|
+
tags: ['cwe', 'memory', 'resource', 'disposal', 'security'],
|
|
27
|
+
cwe: ['416'],
|
|
28
|
+
references: [
|
|
29
|
+
{
|
|
30
|
+
title: 'CWE-416: Use After Free',
|
|
31
|
+
url: 'https://cwe.mitre.org/data/definitions/416.html',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
title: 'Node.js Stream Documentation',
|
|
35
|
+
url: 'https://nodejs.org/api/stream.html',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
async analyze(context) {
|
|
39
|
+
const findings = [];
|
|
40
|
+
const sourceCode = context.sourceCode;
|
|
41
|
+
checkStreamDisposal(context, sourceCode, findings);
|
|
42
|
+
checkConnectionPoolIssues(context, sourceCode, findings);
|
|
43
|
+
checkEventListenerLeaks(context, sourceCode, findings);
|
|
44
|
+
checkTimerCleanup(context, sourceCode, findings);
|
|
45
|
+
checkPromiseRaceConditions(context, sourceCode, findings);
|
|
46
|
+
return findings;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Check for stream usage after close/destroy
|
|
51
|
+
*/
|
|
52
|
+
function checkStreamDisposal(context, sourceCode, findings) {
|
|
53
|
+
const lines = sourceCode.split('\n');
|
|
54
|
+
const streamPatterns = [
|
|
55
|
+
{
|
|
56
|
+
pattern: /\.destroy\s*\(\s*\)[^;]*;[^}]*\.write\s*\(/gi,
|
|
57
|
+
type: 'Write after destroy',
|
|
58
|
+
message: 'Writing to stream after destroy() was called',
|
|
59
|
+
severity: 'high',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
pattern: /\.end\s*\(\s*\)[^;]*;[^}]*\.write\s*\(/gi,
|
|
63
|
+
type: 'Write after end',
|
|
64
|
+
message: 'Writing to stream after end() was called',
|
|
65
|
+
severity: 'medium',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
pattern: /\.close\s*\(\s*\)[^;]*;[^}]*(?:\.read|\.write|\.pipe)\s*\(/gi,
|
|
69
|
+
type: 'Operation after close',
|
|
70
|
+
message: 'Stream operation after close() was called',
|
|
71
|
+
severity: 'medium',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
pattern: /stream\.(?:destroy|end|close)\s*\([^)]*\)\s*;[\s\S]{0,100}stream\./gi,
|
|
75
|
+
type: 'Stream reuse after disposal',
|
|
76
|
+
message: 'Potential stream usage after disposal',
|
|
77
|
+
severity: 'medium',
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
81
|
+
const line = lines[lineNum];
|
|
82
|
+
for (const { pattern, type, message, severity } of streamPatterns) {
|
|
83
|
+
pattern.lastIndex = 0;
|
|
84
|
+
if (pattern.test(line)) {
|
|
85
|
+
findings.push({
|
|
86
|
+
id: `cwe-416-stream-${findings.length + 1}`,
|
|
87
|
+
ruleId: 'cwe-416-use-after-free',
|
|
88
|
+
severity,
|
|
89
|
+
message: `Use After Free - ${type}: ${message}`,
|
|
90
|
+
location: {
|
|
91
|
+
file: context.filePath,
|
|
92
|
+
startLine: lineNum + 1,
|
|
93
|
+
endLine: lineNum + 1,
|
|
94
|
+
startColumn: 0,
|
|
95
|
+
endColumn: line.length,
|
|
96
|
+
},
|
|
97
|
+
cwe: ['416'],
|
|
98
|
+
suggestion: {
|
|
99
|
+
description: 'Check stream state before operations',
|
|
100
|
+
example: `// Check if stream is writable before writing
|
|
101
|
+
if (!stream.destroyed && stream.writable) {
|
|
102
|
+
stream.write(data);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Use proper event handlers
|
|
106
|
+
stream.on('close', () => {
|
|
107
|
+
// Stream is now closed, don't use it
|
|
108
|
+
stream = null;
|
|
109
|
+
});`,
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check for database connection pool issues
|
|
118
|
+
*/
|
|
119
|
+
function checkConnectionPoolIssues(context, sourceCode, findings) {
|
|
120
|
+
const lines = sourceCode.split('\n');
|
|
121
|
+
const connectionPatterns = [
|
|
122
|
+
{
|
|
123
|
+
pattern: /\.release\s*\(\s*\)[^;]*;[^}]*(?:\.query|\.execute)\s*\(/gi,
|
|
124
|
+
type: 'Query after release',
|
|
125
|
+
message: 'Database operation after connection release',
|
|
126
|
+
severity: 'high',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
pattern: /connection\.end\s*\(\s*\)[^;]*;[^}]*connection\./gi,
|
|
130
|
+
type: 'Connection use after end',
|
|
131
|
+
message: 'Connection used after end() was called',
|
|
132
|
+
severity: 'high',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
pattern: /pool\.end\s*\(\s*\)[^;]*;[^}]*pool\.(?:query|getConnection)/gi,
|
|
136
|
+
type: 'Pool use after end',
|
|
137
|
+
message: 'Connection pool used after being closed',
|
|
138
|
+
severity: 'high',
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
pattern: /client\.close\s*\(\s*\)[^;]*;[^}]*client\./gi,
|
|
142
|
+
type: 'Client use after close',
|
|
143
|
+
message: 'Database client used after close()',
|
|
144
|
+
severity: 'high',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
pattern: /await\s+\w+\.release\s*\(\s*\)[\s\S]{0,50}await\s+\w+\.query/gi,
|
|
148
|
+
type: 'Query after async release',
|
|
149
|
+
message: 'Async query after connection release',
|
|
150
|
+
severity: 'medium',
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
154
|
+
const line = lines[lineNum];
|
|
155
|
+
for (const { pattern, type, message, severity } of connectionPatterns) {
|
|
156
|
+
pattern.lastIndex = 0;
|
|
157
|
+
if (pattern.test(line)) {
|
|
158
|
+
findings.push({
|
|
159
|
+
id: `cwe-416-conn-${findings.length + 1}`,
|
|
160
|
+
ruleId: 'cwe-416-use-after-free',
|
|
161
|
+
severity,
|
|
162
|
+
message: `Use After Free - ${type}: ${message}`,
|
|
163
|
+
location: {
|
|
164
|
+
file: context.filePath,
|
|
165
|
+
startLine: lineNum + 1,
|
|
166
|
+
endLine: lineNum + 1,
|
|
167
|
+
startColumn: 0,
|
|
168
|
+
endColumn: line.length,
|
|
169
|
+
},
|
|
170
|
+
cwe: ['416'],
|
|
171
|
+
suggestion: {
|
|
172
|
+
description: 'Use connection within try-finally or use pooled queries',
|
|
173
|
+
example: `// Use try-finally for proper cleanup
|
|
174
|
+
const connection = await pool.getConnection();
|
|
175
|
+
try {
|
|
176
|
+
await connection.query('SELECT ...');
|
|
177
|
+
} finally {
|
|
178
|
+
connection.release();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Or use pool.query directly (auto-release)
|
|
182
|
+
const results = await pool.query('SELECT ...');`,
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check for event listener memory leaks
|
|
191
|
+
*/
|
|
192
|
+
function checkEventListenerLeaks(context, sourceCode, findings) {
|
|
193
|
+
const lines = sourceCode.split('\n');
|
|
194
|
+
const listenerPatterns = [
|
|
195
|
+
{
|
|
196
|
+
pattern: /\.on\s*\(\s*['"`]\w+['"`]\s*,\s*(?:function|\([^)]*\)\s*=>)/gi,
|
|
197
|
+
type: 'Event listener without removal',
|
|
198
|
+
message: 'Event listener added - ensure proper cleanup',
|
|
199
|
+
severity: 'info',
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
pattern: /\.addListener\s*\(\s*['"`]\w+['"`]\s*,/gi,
|
|
203
|
+
type: 'addListener without removal',
|
|
204
|
+
message: 'addListener used - ensure corresponding removeListener',
|
|
205
|
+
severity: 'info',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
pattern: /setMaxListeners\s*\(\s*0\s*\)/gi,
|
|
209
|
+
type: 'Unlimited listeners',
|
|
210
|
+
message: 'setMaxListeners(0) disables leak warning - may mask real leaks',
|
|
211
|
+
severity: 'medium',
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
pattern: /setMaxListeners\s*\(\s*(?:Infinity|Number\.MAX_SAFE_INTEGER)\s*\)/gi,
|
|
215
|
+
type: 'Infinite listeners',
|
|
216
|
+
message: 'Infinite max listeners disables leak detection',
|
|
217
|
+
severity: 'medium',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
pattern: /\.removeAllListeners\s*\(\s*\)/gi,
|
|
221
|
+
type: 'Remove all listeners',
|
|
222
|
+
message: 'removeAllListeners() may remove listeners from other modules',
|
|
223
|
+
severity: 'low',
|
|
224
|
+
},
|
|
225
|
+
];
|
|
226
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
227
|
+
const line = lines[lineNum];
|
|
228
|
+
for (const { pattern, type, message, severity } of listenerPatterns) {
|
|
229
|
+
pattern.lastIndex = 0;
|
|
230
|
+
if (pattern.test(line)) {
|
|
231
|
+
findings.push({
|
|
232
|
+
id: `cwe-416-listener-${findings.length + 1}`,
|
|
233
|
+
ruleId: 'cwe-416-use-after-free',
|
|
234
|
+
severity,
|
|
235
|
+
message: `Resource Leak - ${type}: ${message}`,
|
|
236
|
+
location: {
|
|
237
|
+
file: context.filePath,
|
|
238
|
+
startLine: lineNum + 1,
|
|
239
|
+
endLine: lineNum + 1,
|
|
240
|
+
startColumn: 0,
|
|
241
|
+
endColumn: line.length,
|
|
242
|
+
},
|
|
243
|
+
cwe: ['416'],
|
|
244
|
+
suggestion: {
|
|
245
|
+
description: 'Use once() or cleanup listeners properly',
|
|
246
|
+
example: `// Use once() for one-time events
|
|
247
|
+
emitter.once('event', handler);
|
|
248
|
+
|
|
249
|
+
// Store reference for cleanup
|
|
250
|
+
const handler = () => { /* ... */ };
|
|
251
|
+
emitter.on('event', handler);
|
|
252
|
+
// Later:
|
|
253
|
+
emitter.off('event', handler);
|
|
254
|
+
|
|
255
|
+
// Use AbortController for cleanup
|
|
256
|
+
const controller = new AbortController();
|
|
257
|
+
element.addEventListener('click', handler, { signal: controller.signal });
|
|
258
|
+
// Cleanup:
|
|
259
|
+
controller.abort();`,
|
|
260
|
+
},
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Check for timer cleanup issues
|
|
268
|
+
*/
|
|
269
|
+
function checkTimerCleanup(context, sourceCode, findings) {
|
|
270
|
+
const lines = sourceCode.split('\n');
|
|
271
|
+
const timerPatterns = [
|
|
272
|
+
{
|
|
273
|
+
pattern: /setInterval\s*\([^)]+\)/gi,
|
|
274
|
+
type: 'setInterval without clearInterval',
|
|
275
|
+
message: 'setInterval may cause memory leaks if not cleared',
|
|
276
|
+
severity: 'low',
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
pattern: /setTimeout\s*\([^)]+\)(?!\s*;?\s*(?:const|let|var)\s+\w+)/gi,
|
|
280
|
+
type: 'setTimeout without reference',
|
|
281
|
+
message: 'setTimeout without storing reference cannot be cancelled',
|
|
282
|
+
severity: 'info',
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
pattern: /clearTimeout\s*\(\s*\w+\s*\)\s*;[^}]*setTimeout/gi,
|
|
286
|
+
type: 'Timeout cleared then reused',
|
|
287
|
+
message: 'Timer variable reused after clear - ensure proper assignment',
|
|
288
|
+
severity: 'low',
|
|
289
|
+
},
|
|
290
|
+
];
|
|
291
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
292
|
+
const line = lines[lineNum];
|
|
293
|
+
for (const { pattern, type, message, severity } of timerPatterns) {
|
|
294
|
+
pattern.lastIndex = 0;
|
|
295
|
+
if (pattern.test(line)) {
|
|
296
|
+
findings.push({
|
|
297
|
+
id: `cwe-416-timer-${findings.length + 1}`,
|
|
298
|
+
ruleId: 'cwe-416-use-after-free',
|
|
299
|
+
severity,
|
|
300
|
+
message: `Resource Leak - ${type}: ${message}`,
|
|
301
|
+
location: {
|
|
302
|
+
file: context.filePath,
|
|
303
|
+
startLine: lineNum + 1,
|
|
304
|
+
endLine: lineNum + 1,
|
|
305
|
+
startColumn: 0,
|
|
306
|
+
endColumn: line.length,
|
|
307
|
+
},
|
|
308
|
+
cwe: ['416'],
|
|
309
|
+
suggestion: {
|
|
310
|
+
description: 'Store timer references and clean up properly',
|
|
311
|
+
example: `// Store reference for cleanup
|
|
312
|
+
const timerId = setInterval(() => {
|
|
313
|
+
// periodic work
|
|
314
|
+
}, 1000);
|
|
315
|
+
|
|
316
|
+
// Clean up when done
|
|
317
|
+
clearInterval(timerId);
|
|
318
|
+
|
|
319
|
+
// For React components
|
|
320
|
+
useEffect(() => {
|
|
321
|
+
const id = setInterval(fn, 1000);
|
|
322
|
+
return () => clearInterval(id);
|
|
323
|
+
}, []);`,
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Check for promise race conditions that may cause UAF-like issues
|
|
332
|
+
*/
|
|
333
|
+
function checkPromiseRaceConditions(context, sourceCode, findings) {
|
|
334
|
+
const lines = sourceCode.split('\n');
|
|
335
|
+
const racePatterns = [
|
|
336
|
+
{
|
|
337
|
+
pattern: /Promise\.race\s*\(\s*\[/gi,
|
|
338
|
+
type: 'Promise.race usage',
|
|
339
|
+
message: 'Promise.race may leave pending promises - ensure proper cleanup',
|
|
340
|
+
severity: 'info',
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
pattern: /\.then\s*\([^)]+\)\s*;[^}]*=\s*null/gi,
|
|
344
|
+
type: 'Nullify after async',
|
|
345
|
+
message: 'Variable nullified while async operation may still be pending',
|
|
346
|
+
severity: 'medium',
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
pattern: /async\s+function[^{]*\{[^}]*this\.\w+\s*=[^}]*await/gi,
|
|
350
|
+
type: 'This assignment after await',
|
|
351
|
+
message: 'Assignment to this after await may fail if object was disposed',
|
|
352
|
+
severity: 'medium',
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
pattern: /unmount|destroy|dispose[^}]*await/gi,
|
|
356
|
+
type: 'Await in cleanup',
|
|
357
|
+
message: 'Async operation in cleanup function may complete after disposal',
|
|
358
|
+
severity: 'medium',
|
|
359
|
+
},
|
|
360
|
+
];
|
|
361
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
362
|
+
const line = lines[lineNum];
|
|
363
|
+
for (const { pattern, type, message, severity } of racePatterns) {
|
|
364
|
+
pattern.lastIndex = 0;
|
|
365
|
+
if (pattern.test(line)) {
|
|
366
|
+
findings.push({
|
|
367
|
+
id: `cwe-416-race-${findings.length + 1}`,
|
|
368
|
+
ruleId: 'cwe-416-use-after-free',
|
|
369
|
+
severity,
|
|
370
|
+
message: `Race Condition - ${type}: ${message}`,
|
|
371
|
+
location: {
|
|
372
|
+
file: context.filePath,
|
|
373
|
+
startLine: lineNum + 1,
|
|
374
|
+
endLine: lineNum + 1,
|
|
375
|
+
startColumn: 0,
|
|
376
|
+
endColumn: line.length,
|
|
377
|
+
},
|
|
378
|
+
cwe: ['416'],
|
|
379
|
+
suggestion: {
|
|
380
|
+
description: 'Use cancellation tokens or check component state',
|
|
381
|
+
example: `// Use AbortController for cancellation
|
|
382
|
+
const controller = new AbortController();
|
|
383
|
+
fetch(url, { signal: controller.signal });
|
|
384
|
+
// Cancel on cleanup:
|
|
385
|
+
controller.abort();
|
|
386
|
+
|
|
387
|
+
// Check mounted state in React
|
|
388
|
+
useEffect(() => {
|
|
389
|
+
let mounted = true;
|
|
390
|
+
fetchData().then(data => {
|
|
391
|
+
if (mounted) setData(data);
|
|
392
|
+
});
|
|
393
|
+
return () => { mounted = false; };
|
|
394
|
+
}, []);`,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
export default cwe416UseAfterFree;
|
|
402
|
+
//# sourceMappingURL=cwe-416-use-after-free.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-416-use-after-free.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-416-use-after-free.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-434: Unrestricted Upload of File with Dangerous Type
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-434-file-upload
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
export declare const cwe434FileUpload: SecurityRule;
|
|
8
|
+
export default cwe434FileUpload;
|
|
9
|
+
//# sourceMappingURL=cwe-434-file-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-434-file-upload.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-434-file-upload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,YAkD9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-434: Unrestricted Upload of File with Dangerous Type
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-434-file-upload
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*/
|
|
6
|
+
export const cwe434FileUpload = {
|
|
7
|
+
id: 'cwe-434-file-upload',
|
|
8
|
+
name: 'CWE-434: Unrestricted File Upload',
|
|
9
|
+
description: 'Detects dangerous file upload patterns',
|
|
10
|
+
defaultSeverity: 'high',
|
|
11
|
+
category: 'file-system',
|
|
12
|
+
tags: ['cwe', 'upload', 'file', 'security'],
|
|
13
|
+
cwe: ['434'],
|
|
14
|
+
references: [
|
|
15
|
+
{ title: 'CWE-434', url: 'https://cwe.mitre.org/data/definitions/434.html' },
|
|
16
|
+
],
|
|
17
|
+
async analyze(context) {
|
|
18
|
+
const findings = [];
|
|
19
|
+
const lines = context.sourceCode.split('\n');
|
|
20
|
+
const patterns = [
|
|
21
|
+
{ pattern: /multer\s*\(\s*\{[^}]*dest\s*:/gi, type: 'Multer without fileFilter', severity: 'medium' },
|
|
22
|
+
{ pattern: /\.originalname/gi, type: 'Using original filename', severity: 'high' },
|
|
23
|
+
{ pattern: /req\.files?\.\w+\.(?:path|name)/gi, type: 'Direct file path usage', severity: 'medium' },
|
|
24
|
+
{ pattern: /\.mimetype\s*===?\s*['"`]/gi, type: 'Client-side mimetype trust', severity: 'medium' },
|
|
25
|
+
{ pattern: /upload\.(?:single|array|fields)\s*\(/gi, type: 'File upload endpoint', severity: 'info' },
|
|
26
|
+
];
|
|
27
|
+
for (let i = 0; i < lines.length; i++) {
|
|
28
|
+
for (const { pattern, type, severity } of patterns) {
|
|
29
|
+
pattern.lastIndex = 0;
|
|
30
|
+
if (pattern.test(lines[i])) {
|
|
31
|
+
findings.push({
|
|
32
|
+
id: `cwe-434-${findings.length + 1}`,
|
|
33
|
+
ruleId: 'cwe-434-file-upload',
|
|
34
|
+
severity,
|
|
35
|
+
message: `File Upload - ${type}: Validate file type and sanitize filename`,
|
|
36
|
+
location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
|
|
37
|
+
cwe: ['434'],
|
|
38
|
+
suggestion: {
|
|
39
|
+
description: 'Validate file type by content, not extension',
|
|
40
|
+
example: `const upload = multer({
|
|
41
|
+
fileFilter: (req, file, cb) => {
|
|
42
|
+
const allowed = ['image/jpeg', 'image/png'];
|
|
43
|
+
cb(null, allowed.includes(file.mimetype));
|
|
44
|
+
}
|
|
45
|
+
});`,
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return findings;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
export default cwe434FileUpload;
|
|
55
|
+
//# sourceMappingURL=cwe-434-file-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cwe-434-file-upload.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-434-file-upload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,wCAAwC;IACrD,eAAe,EAAE,MAAM;IACvB,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;IAC3C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,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,iCAAiC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC9G,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC3F,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC7G,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC3G,EAAE,OAAO,EAAE,wCAAwC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAe,EAAE;SAC/G,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,qBAAqB;wBAC7B,QAAQ;wBACR,OAAO,EAAE,iBAAiB,IAAI,4CAA4C;wBAC1E,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,UAAU,EAAE;4BACV,WAAW,EAAE,8CAA8C;4BAC3D,OAAO,EAAE;;;;;IAKnB;yBACS;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CWE-476: NULL Pointer Dereference
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/cwe/cwe-476-null-deref
|
|
4
|
+
* @trace TSK-RULE-005
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
export declare const cwe476NullDeref: SecurityRule;
|
|
8
|
+
export default cwe476NullDeref;
|
|
9
|
+
//# sourceMappingURL=cwe-476-null-deref.d.ts.map
|