@nahisaho/musubix-security 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +4 -4
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OWASP A05:2021 - Security Misconfiguration Rule
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/owasp/a05-security-misconfiguration
|
|
4
|
+
* @trace TSK-RULE-003
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - Default credentials
|
|
8
|
+
* - Verbose error messages
|
|
9
|
+
* - Unnecessary features enabled
|
|
10
|
+
* - Missing security headers
|
|
11
|
+
* - Development settings in production
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* OWASP A05 - Security Misconfiguration
|
|
15
|
+
*/
|
|
16
|
+
export const owaspA05SecurityMisconfiguration = {
|
|
17
|
+
id: 'owasp-a05-security-misconfiguration',
|
|
18
|
+
name: 'OWASP A05:2021 - Security Misconfiguration',
|
|
19
|
+
description: 'Detects security misconfigurations including default credentials, verbose errors, and insecure settings',
|
|
20
|
+
defaultSeverity: 'high',
|
|
21
|
+
detectionMethod: 'pattern-match',
|
|
22
|
+
tags: ['owasp', 'configuration', 'defaults', 'headers', 'security'],
|
|
23
|
+
owasp: ['A05:2021'],
|
|
24
|
+
cwe: ['2', '11', '13', '15', '16', '260', '315', '520', '526', '537'],
|
|
25
|
+
references: [
|
|
26
|
+
{ title: 'OWASP A05:2021 - Security Misconfiguration', url: 'https://owasp.org/Top10/A05_2021-Security_Misconfiguration/' },
|
|
27
|
+
{ title: 'CWE-16: Configuration', url: 'https://cwe.mitre.org/data/definitions/16.html' },
|
|
28
|
+
],
|
|
29
|
+
async analyze(context) {
|
|
30
|
+
const findings = [];
|
|
31
|
+
const sourceFile = context.sourceFile;
|
|
32
|
+
if (!sourceFile)
|
|
33
|
+
return findings;
|
|
34
|
+
// Check for default credentials
|
|
35
|
+
checkDefaultCredentials(context, findings);
|
|
36
|
+
// Check for verbose errors
|
|
37
|
+
checkVerboseErrors(context, findings);
|
|
38
|
+
// Check for unnecessary features
|
|
39
|
+
checkUnnecessaryFeatures(context, findings);
|
|
40
|
+
// Check for missing security headers
|
|
41
|
+
checkMissingHeaders(context, findings);
|
|
42
|
+
// Check for development settings
|
|
43
|
+
checkDevSettings(context, findings);
|
|
44
|
+
// Check for exposed environment
|
|
45
|
+
checkExposedEnvironment(context, findings);
|
|
46
|
+
return findings;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Check for default or hardcoded credentials
|
|
51
|
+
*/
|
|
52
|
+
function checkDefaultCredentials(context, findings) {
|
|
53
|
+
const sourceCode = context.sourceCode;
|
|
54
|
+
const lines = sourceCode.split('\n');
|
|
55
|
+
const defaultCredPatterns = [
|
|
56
|
+
// Default passwords
|
|
57
|
+
{ pattern: /password\s*[:=]\s*['"`](?:password|admin|123456|root|default|test|demo)['"`]/gi, type: 'default password' },
|
|
58
|
+
// Default usernames
|
|
59
|
+
{ pattern: /(?:username|user)\s*[:=]\s*['"`](?:admin|root|test|user|demo)['"`]/gi, type: 'default username' },
|
|
60
|
+
// Default API keys (placeholder patterns)
|
|
61
|
+
{ pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"`](?:xxx|test|demo|your[_-]?api[_-]?key)['"`]/gi, type: 'placeholder API key' },
|
|
62
|
+
// Default tokens
|
|
63
|
+
{ pattern: /(?:token|secret)\s*[:=]\s*['"`](?:changeme|secret|default|test)['"`]/gi, type: 'default token' },
|
|
64
|
+
];
|
|
65
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
66
|
+
const line = lines[lineNum];
|
|
67
|
+
// Skip comments
|
|
68
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('*'))
|
|
69
|
+
continue;
|
|
70
|
+
for (const { pattern, type } of defaultCredPatterns) {
|
|
71
|
+
pattern.lastIndex = 0;
|
|
72
|
+
if (pattern.test(line)) {
|
|
73
|
+
findings.push({
|
|
74
|
+
id: `owasp-a05-cred-${findings.length + 1}`,
|
|
75
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
76
|
+
severity: 'critical',
|
|
77
|
+
message: `Default or hardcoded ${type} detected`,
|
|
78
|
+
location: {
|
|
79
|
+
file: context.filePath,
|
|
80
|
+
startLine: lineNum + 1,
|
|
81
|
+
endLine: lineNum + 1,
|
|
82
|
+
startColumn: 0,
|
|
83
|
+
endColumn: line.length,
|
|
84
|
+
},
|
|
85
|
+
suggestion: {
|
|
86
|
+
description: 'Use environment variables for credentials',
|
|
87
|
+
example: `// Use environment variables:
|
|
88
|
+
const password = process.env.DB_PASSWORD;
|
|
89
|
+
const apiKey = process.env.API_KEY;`,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check for verbose error messages
|
|
99
|
+
*/
|
|
100
|
+
function checkVerboseErrors(context, findings) {
|
|
101
|
+
const sourceCode = context.sourceCode;
|
|
102
|
+
const lines = sourceCode.split('\n');
|
|
103
|
+
const verboseErrorPatterns = [
|
|
104
|
+
// Stack trace exposure
|
|
105
|
+
{ pattern: /(?:res\.send|res\.json)\s*\([^)]*(?:err\.stack|error\.stack)/gi, type: 'Stack trace in response' },
|
|
106
|
+
// Full error object
|
|
107
|
+
{ pattern: /(?:res\.send|res\.json)\s*\(\s*(?:err|error)\s*\)/gi, type: 'Full error object in response' },
|
|
108
|
+
// Internal error details
|
|
109
|
+
{ pattern: /(?:res\.send|res\.json)\s*\([^)]*(?:sql|query|database)/gi, type: 'Database details in response' },
|
|
110
|
+
// Debug info in production
|
|
111
|
+
{ pattern: /console\.(?:log|error)\s*\([^)]*(?:password|secret|key|token)/gi, type: 'Sensitive data in console' },
|
|
112
|
+
];
|
|
113
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
114
|
+
const line = lines[lineNum];
|
|
115
|
+
for (const { pattern, type } of verboseErrorPatterns) {
|
|
116
|
+
pattern.lastIndex = 0;
|
|
117
|
+
if (pattern.test(line)) {
|
|
118
|
+
// Check if there's environment check
|
|
119
|
+
const surroundingCode = lines.slice(Math.max(0, lineNum - 5), lineNum + 1).join('\n');
|
|
120
|
+
if (!hasProductionCheck(surroundingCode)) {
|
|
121
|
+
findings.push({
|
|
122
|
+
id: `owasp-a05-error-${findings.length + 1}`,
|
|
123
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
124
|
+
severity: 'medium',
|
|
125
|
+
message: `Verbose error information: ${type}`,
|
|
126
|
+
location: {
|
|
127
|
+
file: context.filePath,
|
|
128
|
+
startLine: lineNum + 1,
|
|
129
|
+
endLine: lineNum + 1,
|
|
130
|
+
startColumn: 0,
|
|
131
|
+
endColumn: line.length,
|
|
132
|
+
},
|
|
133
|
+
suggestion: {
|
|
134
|
+
description: 'Send generic errors in production',
|
|
135
|
+
example: `// Send generic errors in production:
|
|
136
|
+
app.use((err, req, res, next) => {
|
|
137
|
+
console.error(err); // Log internally
|
|
138
|
+
const message = process.env.NODE_ENV === 'production'
|
|
139
|
+
? 'Internal Server Error'
|
|
140
|
+
: err.message;
|
|
141
|
+
res.status(500).json({ error: message });
|
|
142
|
+
});`,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check for unnecessary features enabled
|
|
153
|
+
*/
|
|
154
|
+
function checkUnnecessaryFeatures(context, findings) {
|
|
155
|
+
const sourceCode = context.sourceCode;
|
|
156
|
+
const lines = sourceCode.split('\n');
|
|
157
|
+
const unnecessaryFeaturePatterns = [
|
|
158
|
+
// X-Powered-By header (should be disabled)
|
|
159
|
+
{ pattern: /x-powered-by/gi, issue: 'X-Powered-By header exposed' },
|
|
160
|
+
// Directory listing
|
|
161
|
+
{ pattern: /serveIndex|directory\s*listing|autoindex/gi, issue: 'Directory listing may be enabled' },
|
|
162
|
+
// TRACE method (rarely needed)
|
|
163
|
+
{ pattern: /app\.trace\s*\(/gi, issue: 'TRACE HTTP method enabled' },
|
|
164
|
+
// Debug endpoints
|
|
165
|
+
{ pattern: /(?:\/debug|\/trace|\/dump|\/phpinfo)/gi, issue: 'Debug endpoint detected' },
|
|
166
|
+
];
|
|
167
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
168
|
+
const line = lines[lineNum];
|
|
169
|
+
for (const { pattern, issue } of unnecessaryFeaturePatterns) {
|
|
170
|
+
pattern.lastIndex = 0;
|
|
171
|
+
if (pattern.test(line)) {
|
|
172
|
+
findings.push({
|
|
173
|
+
id: `owasp-a05-feature-${findings.length + 1}`,
|
|
174
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
175
|
+
severity: 'low',
|
|
176
|
+
message: `Unnecessary feature: ${issue}`,
|
|
177
|
+
location: {
|
|
178
|
+
file: context.filePath,
|
|
179
|
+
startLine: lineNum + 1,
|
|
180
|
+
endLine: lineNum + 1,
|
|
181
|
+
startColumn: 0,
|
|
182
|
+
endColumn: line.length,
|
|
183
|
+
},
|
|
184
|
+
suggestion: {
|
|
185
|
+
description: 'Disable unnecessary features',
|
|
186
|
+
example: `// Disable X-Powered-By:
|
|
187
|
+
app.disable('x-powered-by');
|
|
188
|
+
// Or use Helmet which does this automatically`,
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Check for missing security headers
|
|
198
|
+
*/
|
|
199
|
+
function checkMissingHeaders(context, findings) {
|
|
200
|
+
const sourceCode = context.sourceCode;
|
|
201
|
+
// List of important security headers
|
|
202
|
+
const securityHeaders = [
|
|
203
|
+
'Content-Security-Policy',
|
|
204
|
+
'X-Content-Type-Options',
|
|
205
|
+
'X-Frame-Options',
|
|
206
|
+
'Strict-Transport-Security',
|
|
207
|
+
'X-XSS-Protection',
|
|
208
|
+
];
|
|
209
|
+
// Check if helmet is used (sets all headers)
|
|
210
|
+
if (sourceCode.includes('helmet'))
|
|
211
|
+
return;
|
|
212
|
+
// Check if it's a server file
|
|
213
|
+
const isServerFile = /express|createServer|fastify|koa/i.test(sourceCode);
|
|
214
|
+
if (isServerFile) {
|
|
215
|
+
const missingHeaders = securityHeaders.filter(header => !new RegExp(header, 'i').test(sourceCode));
|
|
216
|
+
if (missingHeaders.length > 0) {
|
|
217
|
+
findings.push({
|
|
218
|
+
id: `owasp-a05-header-${findings.length + 1}`,
|
|
219
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
220
|
+
severity: 'medium',
|
|
221
|
+
message: `Missing security headers: ${missingHeaders.join(', ')}`,
|
|
222
|
+
location: {
|
|
223
|
+
file: context.filePath,
|
|
224
|
+
startLine: 1,
|
|
225
|
+
endLine: 1,
|
|
226
|
+
startColumn: 0,
|
|
227
|
+
endColumn: 0,
|
|
228
|
+
},
|
|
229
|
+
suggestion: {
|
|
230
|
+
description: 'Use Helmet for comprehensive security headers',
|
|
231
|
+
example: `// Use Helmet for comprehensive security headers:
|
|
232
|
+
const helmet = require('helmet');
|
|
233
|
+
app.use(helmet());
|
|
234
|
+
// Or set individual headers:
|
|
235
|
+
app.use((req, res, next) => {
|
|
236
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
237
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
238
|
+
next();
|
|
239
|
+
});`,
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Check for development settings in production code
|
|
247
|
+
*/
|
|
248
|
+
function checkDevSettings(context, findings) {
|
|
249
|
+
const sourceCode = context.sourceCode;
|
|
250
|
+
const lines = sourceCode.split('\n');
|
|
251
|
+
const devSettingsPatterns = [
|
|
252
|
+
// localhost in production
|
|
253
|
+
{ pattern: /['"`](?:https?:\/\/)?localhost(?::\d+)?(?:\/[^'"`]*)?['"`]/gi, issue: 'localhost URL' },
|
|
254
|
+
{ pattern: /['"`](?:https?:\/\/)?127\.0\.0\.1(?::\d+)?(?:\/[^'"`]*)?['"`]/gi, issue: '127.0.0.1 URL' },
|
|
255
|
+
// Development databases
|
|
256
|
+
{ pattern: /mongodb:\/\/localhost/gi, issue: 'localhost MongoDB' },
|
|
257
|
+
{ pattern: /redis:\/\/localhost/gi, issue: 'localhost Redis' },
|
|
258
|
+
// Debug flags
|
|
259
|
+
{ pattern: /(?:DEBUG|VERBOSE|DEV_MODE)\s*[:=]\s*(?:true|1|['"`]1['"`])/gi, issue: 'Debug flag enabled' },
|
|
260
|
+
// TODO/FIXME for security
|
|
261
|
+
{ pattern: /(?:TODO|FIXME)[^*\n]*(?:security|auth|password|token)/gi, issue: 'Security TODO/FIXME' },
|
|
262
|
+
];
|
|
263
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
264
|
+
const line = lines[lineNum];
|
|
265
|
+
for (const { pattern, issue } of devSettingsPatterns) {
|
|
266
|
+
pattern.lastIndex = 0;
|
|
267
|
+
if (pattern.test(line)) {
|
|
268
|
+
// Check if it's conditional
|
|
269
|
+
const surroundingCode = lines.slice(Math.max(0, lineNum - 2), lineNum + 2).join('\n');
|
|
270
|
+
if (!isConditionalDevCode(surroundingCode)) {
|
|
271
|
+
findings.push({
|
|
272
|
+
id: `owasp-a05-dev-${findings.length + 1}`,
|
|
273
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
274
|
+
severity: 'medium',
|
|
275
|
+
message: `Development setting in code: ${issue}`,
|
|
276
|
+
location: {
|
|
277
|
+
file: context.filePath,
|
|
278
|
+
startLine: lineNum + 1,
|
|
279
|
+
endLine: lineNum + 1,
|
|
280
|
+
startColumn: 0,
|
|
281
|
+
endColumn: line.length,
|
|
282
|
+
},
|
|
283
|
+
suggestion: {
|
|
284
|
+
description: 'Use environment variables',
|
|
285
|
+
example: `// Use environment variables:
|
|
286
|
+
const dbUrl = process.env.DATABASE_URL || 'mongodb://localhost/dev';
|
|
287
|
+
// Or use conditional logic:
|
|
288
|
+
const apiUrl = process.env.NODE_ENV === 'production'
|
|
289
|
+
? 'https://api.production.com'
|
|
290
|
+
: 'http://localhost:3000';`,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Check for exposed environment variables
|
|
301
|
+
*/
|
|
302
|
+
function checkExposedEnvironment(context, findings) {
|
|
303
|
+
const sourceCode = context.sourceCode;
|
|
304
|
+
const lines = sourceCode.split('\n');
|
|
305
|
+
const exposedEnvPatterns = [
|
|
306
|
+
// Sending all environment variables
|
|
307
|
+
{ pattern: /res\.(?:send|json)\s*\([^)]*process\.env\s*\)/gi, issue: 'Full process.env in response' },
|
|
308
|
+
// Logging all environment
|
|
309
|
+
{ pattern: /console\.log\s*\([^)]*process\.env\s*\)/gi, issue: 'Full process.env in console' },
|
|
310
|
+
// Config dump
|
|
311
|
+
{ pattern: /JSON\.stringify\s*\([^)]*process\.env/gi, issue: 'process.env stringified' },
|
|
312
|
+
];
|
|
313
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
314
|
+
const line = lines[lineNum];
|
|
315
|
+
for (const { pattern, issue } of exposedEnvPatterns) {
|
|
316
|
+
pattern.lastIndex = 0;
|
|
317
|
+
if (pattern.test(line)) {
|
|
318
|
+
findings.push({
|
|
319
|
+
id: `owasp-a05-env-${findings.length + 1}`,
|
|
320
|
+
ruleId: 'owasp-a05-security-misconfiguration',
|
|
321
|
+
severity: 'critical',
|
|
322
|
+
message: `Exposed environment: ${issue}`,
|
|
323
|
+
location: {
|
|
324
|
+
file: context.filePath,
|
|
325
|
+
startLine: lineNum + 1,
|
|
326
|
+
endLine: lineNum + 1,
|
|
327
|
+
startColumn: 0,
|
|
328
|
+
endColumn: line.length,
|
|
329
|
+
},
|
|
330
|
+
suggestion: {
|
|
331
|
+
description: 'Never expose full environment',
|
|
332
|
+
example: `// Never expose full environment:
|
|
333
|
+
// Instead, expose only safe values
|
|
334
|
+
const safeConfig = {
|
|
335
|
+
nodeEnv: process.env.NODE_ENV,
|
|
336
|
+
appVersion: process.env.APP_VERSION
|
|
337
|
+
};
|
|
338
|
+
res.json({ config: safeConfig });`,
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
break;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Check if code has production environment check
|
|
348
|
+
*/
|
|
349
|
+
function hasProductionCheck(code) {
|
|
350
|
+
const prodCheckPatterns = [
|
|
351
|
+
/process\.env\.NODE_ENV/i,
|
|
352
|
+
/production/i,
|
|
353
|
+
/development/i,
|
|
354
|
+
/isProduction/i,
|
|
355
|
+
/isProd/i,
|
|
356
|
+
];
|
|
357
|
+
return prodCheckPatterns.some(p => p.test(code));
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Check if code is conditional development code
|
|
361
|
+
*/
|
|
362
|
+
function isConditionalDevCode(code) {
|
|
363
|
+
const conditionalPatterns = [
|
|
364
|
+
/if\s*\([^)]*(?:NODE_ENV|development|production)/i,
|
|
365
|
+
/process\.env\.\w+\s*\|\|/i,
|
|
366
|
+
/\?\s*['"`]http/i,
|
|
367
|
+
];
|
|
368
|
+
return conditionalPatterns.some(p => p.test(code));
|
|
369
|
+
}
|
|
370
|
+
export default owaspA05SecurityMisconfiguration;
|
|
371
|
+
//# sourceMappingURL=a05-security-misconfiguration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a05-security-misconfiguration.js","sourceRoot":"","sources":["../../../src/rules/owasp/a05-security-misconfiguration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OWASP A06:2021 - Vulnerable and Outdated Components
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/owasp/a06
|
|
4
|
+
* @trace REQ-SEC-OWASP-006
|
|
5
|
+
*/
|
|
6
|
+
import type { SecurityRule } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* OWASP A06:2021 - Vulnerable and Outdated Components
|
|
9
|
+
*
|
|
10
|
+
* Detects:
|
|
11
|
+
* - Known vulnerable package versions
|
|
12
|
+
* - Outdated dependencies
|
|
13
|
+
* - Using unmaintained packages
|
|
14
|
+
* - Missing integrity checks
|
|
15
|
+
*/
|
|
16
|
+
export declare const owaspA06VulnerableComponents: SecurityRule;
|
|
17
|
+
export default owaspA06VulnerableComponents;
|
|
18
|
+
//# sourceMappingURL=a06-vulnerable-components.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a06-vulnerable-components.d.ts","sourceRoot":"","sources":["../../../src/rules/owasp/a06-vulnerable-components.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2C,MAAM,aAAa,CAAC;AAEzF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,YAsC1C,CAAC;AAoNF,eAAe,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OWASP A06:2021 - Vulnerable and Outdated Components
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/owasp/a06
|
|
4
|
+
* @trace REQ-SEC-OWASP-006
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* OWASP A06:2021 - Vulnerable and Outdated Components
|
|
8
|
+
*
|
|
9
|
+
* Detects:
|
|
10
|
+
* - Known vulnerable package versions
|
|
11
|
+
* - Outdated dependencies
|
|
12
|
+
* - Using unmaintained packages
|
|
13
|
+
* - Missing integrity checks
|
|
14
|
+
*/
|
|
15
|
+
export const owaspA06VulnerableComponents = {
|
|
16
|
+
id: 'owasp-a06-vulnerable-components',
|
|
17
|
+
name: 'OWASP A06:2021 - Vulnerable and Outdated Components',
|
|
18
|
+
description: 'Detects use of components with known vulnerabilities or outdated dependencies',
|
|
19
|
+
defaultSeverity: 'high',
|
|
20
|
+
category: 'dependency',
|
|
21
|
+
owasp: ['A06:2021'],
|
|
22
|
+
cwe: ['1035', '1104', '937'],
|
|
23
|
+
references: [
|
|
24
|
+
{
|
|
25
|
+
title: 'OWASP A06:2021',
|
|
26
|
+
url: 'https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
title: 'CWE-1104: Use of Unmaintained Third Party Components',
|
|
30
|
+
url: 'https://cwe.mitre.org/data/definitions/1104.html',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
async analyze(context) {
|
|
34
|
+
const findings = [];
|
|
35
|
+
// Check for vulnerable patterns
|
|
36
|
+
checkVulnerablePatterns(context, findings);
|
|
37
|
+
// Check package.json if it's the target file
|
|
38
|
+
if (context.filePath.endsWith('package.json')) {
|
|
39
|
+
checkPackageJson(context, findings);
|
|
40
|
+
}
|
|
41
|
+
// Check for missing SRI in HTML/templates
|
|
42
|
+
checkMissingSRI(context, findings);
|
|
43
|
+
// Check for outdated CDN usage
|
|
44
|
+
checkOutdatedCDN(context, findings);
|
|
45
|
+
return findings;
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Known vulnerable package patterns (simplified version)
|
|
50
|
+
*/
|
|
51
|
+
const VULNERABLE_PATTERNS = [
|
|
52
|
+
// Lodash < 4.17.21
|
|
53
|
+
{ pattern: /['"`]lodash['"`]\s*:\s*['"`](?:[0-3]\.|4\.(?:[0-9]|1[0-6])\.|4\.17\.(?:[0-9]|1[0-9]|20))['"`]/i, pkg: 'lodash', issue: 'Prototype pollution vulnerability' },
|
|
54
|
+
// jquery < 3.5.0
|
|
55
|
+
{ pattern: /['"`]jquery['"`]\s*:\s*['"`](?:[0-2]\.|3\.[0-4]\.)['"`]/i, pkg: 'jquery', issue: 'XSS vulnerability in htmlPrefilter' },
|
|
56
|
+
// axios < 0.21.1
|
|
57
|
+
{ pattern: /['"`]axios['"`]\s*:\s*['"`]0\.(?:[0-9]|1[0-9]|20)\./i, pkg: 'axios', issue: 'SSRF vulnerability' },
|
|
58
|
+
// minimist < 1.2.6
|
|
59
|
+
{ pattern: /['"`]minimist['"`]\s*:\s*['"`](?:0\.|1\.[0-2]\.[0-5])['"`]/i, pkg: 'minimist', issue: 'Prototype pollution vulnerability' },
|
|
60
|
+
// serialize-javascript < 3.1.0
|
|
61
|
+
{ pattern: /['"`]serialize-javascript['"`]\s*:\s*['"`][0-2]\.['"`]/i, pkg: 'serialize-javascript', issue: 'RCE vulnerability' },
|
|
62
|
+
// node-forge < 1.0.0
|
|
63
|
+
{ pattern: /['"`]node-forge['"`]\s*:\s*['"`]0\.['"`]/i, pkg: 'node-forge', issue: 'Improper verification of cryptographic signature' },
|
|
64
|
+
// moment (unmaintained)
|
|
65
|
+
{ pattern: /['"`]moment['"`]\s*:/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns or luxon' },
|
|
66
|
+
// request (deprecated)
|
|
67
|
+
{ pattern: /['"`]request['"`]\s*:/i, pkg: 'request', issue: 'Deprecated - use axios, got, or node-fetch' },
|
|
68
|
+
// express-jwt < 6.0.0
|
|
69
|
+
{ pattern: /['"`]express-jwt['"`]\s*:\s*['"`][0-5]\.['"`]/i, pkg: 'express-jwt', issue: 'Algorithm confusion vulnerability' },
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* Check for vulnerable patterns in source code
|
|
73
|
+
*/
|
|
74
|
+
function checkVulnerablePatterns(context, findings) {
|
|
75
|
+
const sourceCode = context.sourceCode;
|
|
76
|
+
const lines = sourceCode.split('\n');
|
|
77
|
+
// Check for importing known vulnerable packages
|
|
78
|
+
const importPatterns = [
|
|
79
|
+
// CommonJS require of vulnerable packages
|
|
80
|
+
{ pattern: /require\s*\(\s*['"`]moment['"`]\s*\)/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns' },
|
|
81
|
+
{ pattern: /require\s*\(\s*['"`]request['"`]\s*\)/i, pkg: 'request', issue: 'Deprecated package' },
|
|
82
|
+
// ES imports
|
|
83
|
+
{ pattern: /import\s+.*\s+from\s+['"`]moment['"`]/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns' },
|
|
84
|
+
{ pattern: /import\s+.*\s+from\s+['"`]request['"`]/i, pkg: 'request', issue: 'Deprecated package' },
|
|
85
|
+
// Using vulnerable crypto in Node.js
|
|
86
|
+
{ pattern: /crypto\.createCipher\s*\(/i, pkg: 'crypto.createCipher', issue: 'Deprecated - use createCipheriv' },
|
|
87
|
+
];
|
|
88
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
89
|
+
const line = lines[lineNum];
|
|
90
|
+
for (const { pattern, pkg, issue } of importPatterns) {
|
|
91
|
+
if (pattern.test(line)) {
|
|
92
|
+
findings.push({
|
|
93
|
+
id: `owasp-a06-import-${findings.length + 1}`,
|
|
94
|
+
ruleId: 'owasp-a06-vulnerable-components',
|
|
95
|
+
severity: 'medium',
|
|
96
|
+
message: `Potentially vulnerable or deprecated component: ${pkg} - ${issue}`,
|
|
97
|
+
location: {
|
|
98
|
+
file: context.filePath,
|
|
99
|
+
startLine: lineNum + 1,
|
|
100
|
+
endLine: lineNum + 1,
|
|
101
|
+
startColumn: 0,
|
|
102
|
+
endColumn: line.length,
|
|
103
|
+
},
|
|
104
|
+
suggestion: {
|
|
105
|
+
description: 'Consider using a maintained alternative',
|
|
106
|
+
example: pkg === 'moment'
|
|
107
|
+
? `// Use date-fns instead:\nimport { format, parseISO } from 'date-fns';`
|
|
108
|
+
: pkg === 'request'
|
|
109
|
+
? `// Use axios or got instead:\nimport axios from 'axios';`
|
|
110
|
+
: `// Use the recommended secure alternative`,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Check package.json for vulnerable dependencies
|
|
120
|
+
*/
|
|
121
|
+
function checkPackageJson(context, findings) {
|
|
122
|
+
const sourceCode = context.sourceCode;
|
|
123
|
+
const lines = sourceCode.split('\n');
|
|
124
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
125
|
+
const line = lines[lineNum];
|
|
126
|
+
for (const { pattern, pkg, issue } of VULNERABLE_PATTERNS) {
|
|
127
|
+
if (pattern.test(line)) {
|
|
128
|
+
findings.push({
|
|
129
|
+
id: `owasp-a06-pkg-${findings.length + 1}`,
|
|
130
|
+
ruleId: 'owasp-a06-vulnerable-components',
|
|
131
|
+
severity: 'high',
|
|
132
|
+
message: `Vulnerable package version: ${pkg} - ${issue}`,
|
|
133
|
+
location: {
|
|
134
|
+
file: context.filePath,
|
|
135
|
+
startLine: lineNum + 1,
|
|
136
|
+
endLine: lineNum + 1,
|
|
137
|
+
startColumn: 0,
|
|
138
|
+
endColumn: line.length,
|
|
139
|
+
},
|
|
140
|
+
cwe: ['1104'],
|
|
141
|
+
suggestion: {
|
|
142
|
+
description: 'Update to the latest secure version',
|
|
143
|
+
example: `Run: npm audit fix\nOr: npm update ${pkg}`,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check for missing Subresource Integrity (SRI)
|
|
153
|
+
*/
|
|
154
|
+
function checkMissingSRI(context, findings) {
|
|
155
|
+
const sourceCode = context.sourceCode;
|
|
156
|
+
const lines = sourceCode.split('\n');
|
|
157
|
+
// Only check HTML-like files or templates
|
|
158
|
+
const isRelevantFile = /\.(html?|ejs|hbs|pug|vue|svelte|tsx?|jsx?)$/i.test(context.filePath);
|
|
159
|
+
if (!isRelevantFile)
|
|
160
|
+
return;
|
|
161
|
+
const sriPatterns = [
|
|
162
|
+
// Script tags from CDN without integrity
|
|
163
|
+
{ pattern: /<script[^>]+src\s*=\s*['"`]https?:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)[^'"`]+['"`][^>]*>/i, type: 'script' },
|
|
164
|
+
// Link tags from CDN without integrity
|
|
165
|
+
{ pattern: /<link[^>]+href\s*=\s*['"`]https?:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)[^'"`]+['"`][^>]*>/i, type: 'stylesheet' },
|
|
166
|
+
];
|
|
167
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
168
|
+
const line = lines[lineNum];
|
|
169
|
+
for (const { pattern, type } of sriPatterns) {
|
|
170
|
+
if (pattern.test(line)) {
|
|
171
|
+
// Check if integrity attribute is present
|
|
172
|
+
if (!/integrity\s*=/i.test(line)) {
|
|
173
|
+
findings.push({
|
|
174
|
+
id: `owasp-a06-sri-${findings.length + 1}`,
|
|
175
|
+
ruleId: 'owasp-a06-vulnerable-components',
|
|
176
|
+
severity: 'medium',
|
|
177
|
+
message: `Missing Subresource Integrity (SRI) for external ${type}`,
|
|
178
|
+
location: {
|
|
179
|
+
file: context.filePath,
|
|
180
|
+
startLine: lineNum + 1,
|
|
181
|
+
endLine: lineNum + 1,
|
|
182
|
+
startColumn: 0,
|
|
183
|
+
endColumn: line.length,
|
|
184
|
+
},
|
|
185
|
+
cwe: ['353'],
|
|
186
|
+
suggestion: {
|
|
187
|
+
description: 'Add integrity and crossorigin attributes',
|
|
188
|
+
example: `<script src="https://cdn.example.com/lib.js"
|
|
189
|
+
integrity="sha384-..."
|
|
190
|
+
crossorigin="anonymous"></script>`,
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check for outdated CDN URLs
|
|
201
|
+
*/
|
|
202
|
+
function checkOutdatedCDN(context, findings) {
|
|
203
|
+
const sourceCode = context.sourceCode;
|
|
204
|
+
const lines = sourceCode.split('\n');
|
|
205
|
+
const outdatedCDNPatterns = [
|
|
206
|
+
// Old jQuery versions
|
|
207
|
+
{ pattern: /jquery[\/\-]([0-2]\.[0-9]+|3\.[0-4]\.[0-9]+)/i, lib: 'jQuery', issue: 'outdated version' },
|
|
208
|
+
// Old Bootstrap versions
|
|
209
|
+
{ pattern: /bootstrap[\/\-]([0-3]\.[0-9]+|4\.[0-5]\.[0-9]+)/i, lib: 'Bootstrap', issue: 'outdated version' },
|
|
210
|
+
// Old Angular versions
|
|
211
|
+
{ pattern: /angular[\/\-](1\.[0-7]\.[0-9]+)/i, lib: 'AngularJS', issue: 'legacy version' },
|
|
212
|
+
// HTTP instead of HTTPS for CDN
|
|
213
|
+
{ pattern: /['"`]http:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)/i, lib: 'CDN', issue: 'using HTTP instead of HTTPS' },
|
|
214
|
+
];
|
|
215
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
216
|
+
const line = lines[lineNum];
|
|
217
|
+
for (const { pattern, lib, issue } of outdatedCDNPatterns) {
|
|
218
|
+
if (pattern.test(line)) {
|
|
219
|
+
findings.push({
|
|
220
|
+
id: `owasp-a06-cdn-${findings.length + 1}`,
|
|
221
|
+
ruleId: 'owasp-a06-vulnerable-components',
|
|
222
|
+
severity: lib === 'CDN' ? 'high' : 'medium',
|
|
223
|
+
message: `Potentially ${issue}: ${lib}`,
|
|
224
|
+
location: {
|
|
225
|
+
file: context.filePath,
|
|
226
|
+
startLine: lineNum + 1,
|
|
227
|
+
endLine: lineNum + 1,
|
|
228
|
+
startColumn: 0,
|
|
229
|
+
endColumn: line.length,
|
|
230
|
+
},
|
|
231
|
+
suggestion: {
|
|
232
|
+
description: lib === 'CDN'
|
|
233
|
+
? 'Always use HTTPS for external resources'
|
|
234
|
+
: `Update ${lib} to the latest version`,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
export default owaspA06VulnerableComponents;
|
|
243
|
+
//# sourceMappingURL=a06-vulnerable-components.js.map
|