@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,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rule Registry - Manages rule registration and retrieval
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/engine/rule-registry
|
|
4
|
+
* @trace REQ-RULE-003
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Rule Registry
|
|
8
|
+
* Manages registration and retrieval of security rules
|
|
9
|
+
*/
|
|
10
|
+
export class RuleRegistry {
|
|
11
|
+
rules = new Map();
|
|
12
|
+
rulesByCategory = new Map([
|
|
13
|
+
['owasp', new Set()],
|
|
14
|
+
['cwe', new Set()],
|
|
15
|
+
['custom', new Set()],
|
|
16
|
+
]);
|
|
17
|
+
rulesByTag = new Map();
|
|
18
|
+
/**
|
|
19
|
+
* Register a rule
|
|
20
|
+
* @param rule The rule to register
|
|
21
|
+
* @param overwrite Whether to overwrite existing rule with same ID
|
|
22
|
+
*/
|
|
23
|
+
register(rule, overwrite = false) {
|
|
24
|
+
if (this.rules.has(rule.id) && !overwrite) {
|
|
25
|
+
throw new Error(`Rule ${rule.id} is already registered`);
|
|
26
|
+
}
|
|
27
|
+
// If overwriting, clean up old indexes first
|
|
28
|
+
if (this.rules.has(rule.id)) {
|
|
29
|
+
this.unregister(rule.id);
|
|
30
|
+
}
|
|
31
|
+
this.rules.set(rule.id, rule);
|
|
32
|
+
// Categorize by ID prefix
|
|
33
|
+
const category = this.categorizeRule(rule.id);
|
|
34
|
+
this.rulesByCategory.get(category)?.add(rule.id);
|
|
35
|
+
// Index by tags
|
|
36
|
+
if (rule.tags) {
|
|
37
|
+
for (const tag of rule.tags) {
|
|
38
|
+
if (!this.rulesByTag.has(tag)) {
|
|
39
|
+
this.rulesByTag.set(tag, new Set());
|
|
40
|
+
}
|
|
41
|
+
this.rulesByTag.get(tag).add(rule.id);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Register multiple rules
|
|
47
|
+
*/
|
|
48
|
+
registerAll(rules) {
|
|
49
|
+
for (const rule of rules) {
|
|
50
|
+
this.register(rule);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Unregister a rule
|
|
55
|
+
*/
|
|
56
|
+
unregister(ruleId) {
|
|
57
|
+
const rule = this.rules.get(ruleId);
|
|
58
|
+
if (!rule)
|
|
59
|
+
return false;
|
|
60
|
+
this.rules.delete(ruleId);
|
|
61
|
+
// Remove from category index
|
|
62
|
+
const category = this.categorizeRule(ruleId);
|
|
63
|
+
this.rulesByCategory.get(category)?.delete(ruleId);
|
|
64
|
+
// Remove from tag index
|
|
65
|
+
if (rule.tags) {
|
|
66
|
+
for (const tag of rule.tags) {
|
|
67
|
+
this.rulesByTag.get(tag)?.delete(ruleId);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a rule by ID
|
|
74
|
+
*/
|
|
75
|
+
get(ruleId) {
|
|
76
|
+
return this.rules.get(ruleId);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check if a rule exists
|
|
80
|
+
*/
|
|
81
|
+
has(ruleId) {
|
|
82
|
+
return this.rules.has(ruleId);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all registered rules
|
|
86
|
+
*/
|
|
87
|
+
getAll() {
|
|
88
|
+
return Array.from(this.rules.values());
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get rules by filter
|
|
92
|
+
*/
|
|
93
|
+
getFiltered(filter, config) {
|
|
94
|
+
let ruleIds;
|
|
95
|
+
// Start with all rules or category-filtered
|
|
96
|
+
if (filter.category && filter.category !== 'all') {
|
|
97
|
+
ruleIds = new Set(this.rulesByCategory.get(filter.category) ?? []);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
ruleIds = new Set(this.rules.keys());
|
|
101
|
+
}
|
|
102
|
+
// Filter by specific IDs
|
|
103
|
+
if (filter.ids && filter.ids.length > 0) {
|
|
104
|
+
const idSet = new Set(filter.ids);
|
|
105
|
+
ruleIds = new Set([...ruleIds].filter(id => idSet.has(id)));
|
|
106
|
+
}
|
|
107
|
+
// Filter by tags
|
|
108
|
+
if (filter.tags && filter.tags.length > 0) {
|
|
109
|
+
const tagRules = new Set();
|
|
110
|
+
for (const tag of filter.tags) {
|
|
111
|
+
const rulesWithTag = this.rulesByTag.get(tag);
|
|
112
|
+
if (rulesWithTag) {
|
|
113
|
+
for (const id of rulesWithTag) {
|
|
114
|
+
tagRules.add(id);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
ruleIds = new Set([...ruleIds].filter(id => tagRules.has(id)));
|
|
119
|
+
}
|
|
120
|
+
// Filter by detection method
|
|
121
|
+
if (filter.detectionMethod) {
|
|
122
|
+
ruleIds = new Set([...ruleIds].filter(id => {
|
|
123
|
+
const rule = this.rules.get(id);
|
|
124
|
+
return rule?.detectionMethod === filter.detectionMethod;
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
// Filter by enabled status
|
|
128
|
+
if (filter.enabledOnly && config) {
|
|
129
|
+
ruleIds = new Set([...ruleIds].filter(id => this.isRuleEnabled(id, config)));
|
|
130
|
+
}
|
|
131
|
+
return [...ruleIds]
|
|
132
|
+
.map(id => this.rules.get(id))
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get rules by category
|
|
137
|
+
*/
|
|
138
|
+
getByCategory(category) {
|
|
139
|
+
if (category === 'all') {
|
|
140
|
+
return this.getAll();
|
|
141
|
+
}
|
|
142
|
+
const ids = this.rulesByCategory.get(category) ?? new Set();
|
|
143
|
+
return [...ids].map(id => this.rules.get(id)).filter(Boolean);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get rules by tag
|
|
147
|
+
*/
|
|
148
|
+
getByTag(tag) {
|
|
149
|
+
const ids = this.rulesByTag.get(tag) ?? new Set();
|
|
150
|
+
return [...ids].map(id => this.rules.get(id)).filter(Boolean);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get enabled rules based on config
|
|
154
|
+
*/
|
|
155
|
+
getEnabled(config) {
|
|
156
|
+
return this.getFiltered({ enabledOnly: true }, config);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if a rule is enabled
|
|
160
|
+
*/
|
|
161
|
+
isRuleEnabled(ruleId, config) {
|
|
162
|
+
const ruleSettings = config.rules[ruleId];
|
|
163
|
+
// Explicit setting
|
|
164
|
+
if (ruleSettings !== undefined) {
|
|
165
|
+
return ruleSettings.enabled;
|
|
166
|
+
}
|
|
167
|
+
// Default based on profile
|
|
168
|
+
switch (config.profile) {
|
|
169
|
+
case 'strict':
|
|
170
|
+
return true; // All rules enabled
|
|
171
|
+
case 'permissive':
|
|
172
|
+
// Only critical/high by default
|
|
173
|
+
const rule = this.rules.get(ruleId);
|
|
174
|
+
return rule?.defaultSeverity === 'critical' || rule?.defaultSeverity === 'high';
|
|
175
|
+
case 'standard':
|
|
176
|
+
default:
|
|
177
|
+
return true; // All rules enabled by default
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get rule settings with defaults
|
|
182
|
+
*/
|
|
183
|
+
getRuleSettings(ruleId, config) {
|
|
184
|
+
const rule = this.rules.get(ruleId);
|
|
185
|
+
const customSettings = config.rules[ruleId];
|
|
186
|
+
return {
|
|
187
|
+
enabled: this.isRuleEnabled(ruleId, config),
|
|
188
|
+
severity: customSettings?.severity ?? rule?.defaultSeverity,
|
|
189
|
+
options: customSettings?.options ?? {},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get rule count
|
|
194
|
+
*/
|
|
195
|
+
get size() {
|
|
196
|
+
return this.rules.size;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get rule count (alias for size)
|
|
200
|
+
*/
|
|
201
|
+
count() {
|
|
202
|
+
return this.rules.size;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get all rule IDs
|
|
206
|
+
*/
|
|
207
|
+
getIds() {
|
|
208
|
+
return Array.from(this.rules.keys());
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get all tags
|
|
212
|
+
*/
|
|
213
|
+
getTags() {
|
|
214
|
+
return Array.from(this.rulesByTag.keys());
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get rules by severity
|
|
218
|
+
*/
|
|
219
|
+
getBySeverity(severity) {
|
|
220
|
+
return this.getAll().filter(rule => rule.defaultSeverity === severity);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get rules by detection method
|
|
224
|
+
*/
|
|
225
|
+
getByDetectionMethod(method) {
|
|
226
|
+
return this.getAll().filter(rule => rule.detectionMethod === method);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Filter rules by predicate
|
|
230
|
+
*/
|
|
231
|
+
filter(predicate) {
|
|
232
|
+
return this.getAll().filter(predicate);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Clear all rules
|
|
236
|
+
*/
|
|
237
|
+
clear() {
|
|
238
|
+
this.rules.clear();
|
|
239
|
+
this.rulesByCategory.forEach(set => set.clear());
|
|
240
|
+
this.rulesByTag.clear();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Categorize rule by ID prefix
|
|
244
|
+
*/
|
|
245
|
+
categorizeRule(ruleId) {
|
|
246
|
+
const upper = ruleId.toUpperCase();
|
|
247
|
+
if (upper.startsWith('OWASP') || upper.startsWith('A0')) {
|
|
248
|
+
return 'owasp';
|
|
249
|
+
}
|
|
250
|
+
if (upper.startsWith('CWE')) {
|
|
251
|
+
return 'cwe';
|
|
252
|
+
}
|
|
253
|
+
return 'custom';
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Global rule registry instance
|
|
258
|
+
*/
|
|
259
|
+
let globalRegistry = null;
|
|
260
|
+
/**
|
|
261
|
+
* Get or create global registry
|
|
262
|
+
*/
|
|
263
|
+
export function getGlobalRegistry() {
|
|
264
|
+
if (!globalRegistry) {
|
|
265
|
+
globalRegistry = new RuleRegistry();
|
|
266
|
+
}
|
|
267
|
+
return globalRegistry;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Create a new registry (for isolated use)
|
|
271
|
+
*/
|
|
272
|
+
export function createRegistry() {
|
|
273
|
+
return new RuleRegistry();
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Reset global registry (for testing)
|
|
277
|
+
*/
|
|
278
|
+
export function resetGlobalRegistry() {
|
|
279
|
+
globalRegistry = null;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=rule-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../../../src/rules/engine/rule-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rules Module Exports
|
|
3
|
+
* @module @nahisaho/musubix-security/rules
|
|
4
|
+
*/
|
|
5
|
+
export type { SecurityRule, RuleContext, RuleFinding, RuleResult, RuleConfig, RuleSettings, FixSuggestion, SourceLocation, DetectionMethod, RuleSeverity, AnalysisProgress, AnalysisReport, AnalysisSummary, RuleEngineOptions as RuleEngineOptionsBase, } from './types.js';
|
|
6
|
+
export { SEVERITY_ORDER, DEFAULT_RULE_CONFIG, meetsSeverityThreshold, } from './types.js';
|
|
7
|
+
export { RuleEngine, createRuleEngine, RuleRegistry, getGlobalRegistry, createRegistry, RuleContextBuilder, createContextBuilder, } from './engine/index.js';
|
|
8
|
+
export type { RuleEngineOptions, RuleEngineProgress, RuleEngineResult, RuleEngineError, RuleEngineSummary, RuleContextBuildOptions, } from './engine/index.js';
|
|
9
|
+
export { parseConfig, loadConfigFile, findConfigFile, loadProjectConfig, createConfigBuilder, validateConfig, writeConfigFile, ConfigBuilder, DEFAULT_CONFIG, getProfile, getProfileNames, hasProfile, getProfileRuleIds, mergeProfileConfig, PROFILES, PROFILE_MINIMAL, PROFILE_STANDARD, PROFILE_STRICT, PROFILE_OWASP, PROFILE_CWE, } from './config/index.js';
|
|
10
|
+
export type { RawRuleConfig, RawRuleSettings, ParseResult, ConfigFormat, RuleProfile, ProfileRuleConfig, } from './config/index.js';
|
|
11
|
+
export { owaspA01BrokenAccessControl, owaspA02CryptographicFailures, owaspA03Injection, owaspA04InsecureDesign, owaspA05SecurityMisconfiguration, owaspRulesA01A05, } from './owasp/index.js';
|
|
12
|
+
export { owaspA06VulnerableComponents, owaspA07AuthFailures, owaspA08IntegrityFailures, owaspA09LoggingFailures, owaspA10SSRF, owaspRulesA06A10, owaspTop10Rules, } from './owasp/index.js';
|
|
13
|
+
export { cwe787OutOfBoundsWrite, cwe79XSS, cwe89SQLInjection, cwe416UseAfterFree, cwe78CommandInjection, cwe20InputValidation, cwe125OutOfBoundsRead, cwe22PathTraversal, cwe352CSRF, cwe434FileUpload, cwe862MissingAuth, cwe476NullDeref, cwe287ImproperAuth, cweTop25Rules1to13, cweTop25Rules, } from './cwe/index.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,IAAI,qBAAqB,GAC3C,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rules Module Exports
|
|
3
|
+
* @module @nahisaho/musubix-security/rules
|
|
4
|
+
*/
|
|
5
|
+
export { SEVERITY_ORDER, DEFAULT_RULE_CONFIG, meetsSeverityThreshold, } from './types.js';
|
|
6
|
+
// Engine
|
|
7
|
+
export { RuleEngine, createRuleEngine, RuleRegistry, getGlobalRegistry, createRegistry, RuleContextBuilder, createContextBuilder, } from './engine/index.js';
|
|
8
|
+
// Config
|
|
9
|
+
export { parseConfig, loadConfigFile, findConfigFile, loadProjectConfig, createConfigBuilder, validateConfig, writeConfigFile, ConfigBuilder, DEFAULT_CONFIG, getProfile, getProfileNames, hasProfile, getProfileRuleIds, mergeProfileConfig, PROFILES, PROFILE_MINIMAL, PROFILE_STANDARD, PROFILE_STRICT, PROFILE_OWASP, PROFILE_CWE, } from './config/index.js';
|
|
10
|
+
// OWASP A01-A05 Rules (TSK-RULE-003)
|
|
11
|
+
export { owaspA01BrokenAccessControl, owaspA02CryptographicFailures, owaspA03Injection, owaspA04InsecureDesign, owaspA05SecurityMisconfiguration, owaspRulesA01A05, } from './owasp/index.js';
|
|
12
|
+
// OWASP A06-A10 Rules (TSK-RULE-004)
|
|
13
|
+
export { owaspA06VulnerableComponents, owaspA07AuthFailures, owaspA08IntegrityFailures, owaspA09LoggingFailures, owaspA10SSRF, owaspRulesA06A10, owaspTop10Rules, } from './owasp/index.js';
|
|
14
|
+
// CWE Top 25 Rules (1-13) (TSK-RULE-005)
|
|
15
|
+
export { cwe787OutOfBoundsWrite, cwe79XSS, cwe89SQLInjection, cwe416UseAfterFree, cwe78CommandInjection, cwe20InputValidation, cwe125OutOfBoundsRead, cwe22PathTraversal, cwe352CSRF, cwe434FileUpload, cwe862MissingAuth, cwe476NullDeref, cwe287ImproperAuth, cweTop25Rules1to13, cweTop25Rules, } from './cwe/index.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAW3B,SAAS;AACT,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAW3B,qCAAqC;AACrC,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,qCAAqC;AACrC,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,yCAAyC;AACzC,OAAO,EACL,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OWASP A01:2021 - Broken Access Control Rule
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/owasp/a01-broken-access-control
|
|
4
|
+
* @trace TSK-RULE-003
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - Missing authorization checks
|
|
8
|
+
* - Direct object references without validation
|
|
9
|
+
* - Path traversal vulnerabilities
|
|
10
|
+
* - CORS misconfigurations
|
|
11
|
+
* - Privilege escalation patterns
|
|
12
|
+
*/
|
|
13
|
+
import type { SecurityRule } from '../types.js';
|
|
14
|
+
/**
|
|
15
|
+
* OWASP A01 - Broken Access Control
|
|
16
|
+
*/
|
|
17
|
+
export declare const owaspA01BrokenAccessControl: SecurityRule;
|
|
18
|
+
export default owaspA01BrokenAccessControl;
|
|
19
|
+
//# sourceMappingURL=a01-broken-access-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a01-broken-access-control.d.ts","sourceRoot":"","sources":["../../../src/rules/owasp/a01-broken-access-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,YAoCzC,CAAC;AAmRF,eAAe,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OWASP A01:2021 - Broken Access Control Rule
|
|
3
|
+
* @module @nahisaho/musubix-security/rules/owasp/a01-broken-access-control
|
|
4
|
+
* @trace TSK-RULE-003
|
|
5
|
+
*
|
|
6
|
+
* Detects:
|
|
7
|
+
* - Missing authorization checks
|
|
8
|
+
* - Direct object references without validation
|
|
9
|
+
* - Path traversal vulnerabilities
|
|
10
|
+
* - CORS misconfigurations
|
|
11
|
+
* - Privilege escalation patterns
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* OWASP A01 - Broken Access Control
|
|
15
|
+
*/
|
|
16
|
+
export const owaspA01BrokenAccessControl = {
|
|
17
|
+
id: 'owasp-a01-broken-access-control',
|
|
18
|
+
name: 'OWASP A01:2021 - Broken Access Control',
|
|
19
|
+
description: 'Detects missing or improper access control implementations that could allow unauthorized access to resources',
|
|
20
|
+
defaultSeverity: 'critical',
|
|
21
|
+
detectionMethod: 'combined',
|
|
22
|
+
tags: ['owasp', 'access-control', 'authorization', 'security'],
|
|
23
|
+
owasp: ['A01:2021'],
|
|
24
|
+
cwe: ['284', '285', '639', '862', '863'],
|
|
25
|
+
references: [
|
|
26
|
+
{ title: 'OWASP A01:2021 - Broken Access Control', url: 'https://owasp.org/Top10/A01_2021-Broken_Access_Control/' },
|
|
27
|
+
{ title: 'CWE-284: Improper Access Control', url: 'https://cwe.mitre.org/data/definitions/284.html' },
|
|
28
|
+
],
|
|
29
|
+
async analyze(context) {
|
|
30
|
+
const findings = [];
|
|
31
|
+
const sourceFile = context.sourceFile;
|
|
32
|
+
if (!sourceFile)
|
|
33
|
+
return findings;
|
|
34
|
+
// Check for route handlers without auth middleware
|
|
35
|
+
checkMissingAuthMiddleware(context, findings);
|
|
36
|
+
// Check for direct object references
|
|
37
|
+
checkDirectObjectReferences(context, findings);
|
|
38
|
+
// Check for CORS misconfigurations
|
|
39
|
+
checkCorsMisconfigurations(context, findings);
|
|
40
|
+
// Check for path traversal patterns
|
|
41
|
+
checkPathTraversal(context, findings);
|
|
42
|
+
// Check for admin/privileged operations without checks
|
|
43
|
+
checkPrivilegedOperations(context, findings);
|
|
44
|
+
return findings;
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Check for route handlers that lack authentication middleware
|
|
49
|
+
*/
|
|
50
|
+
function checkMissingAuthMiddleware(context, findings) {
|
|
51
|
+
const sourceCode = context.sourceCode;
|
|
52
|
+
// Pattern: Express-style routes without auth middleware
|
|
53
|
+
const routePatterns = [
|
|
54
|
+
/app\.(get|post|put|delete|patch)\s*\(\s*(['"`][^'"`]*['"`])\s*,\s*(?!.*auth)/gi,
|
|
55
|
+
/router\.(get|post|put|delete|patch)\s*\(\s*(['"`][^'"`]*['"`])\s*,\s*(?!.*auth)/gi,
|
|
56
|
+
];
|
|
57
|
+
// Sensitive endpoint patterns
|
|
58
|
+
const sensitiveEndpoints = [
|
|
59
|
+
/\/admin/i,
|
|
60
|
+
/\/api\/users/i,
|
|
61
|
+
/\/api\/settings/i,
|
|
62
|
+
/\/api\/config/i,
|
|
63
|
+
/\/api\/private/i,
|
|
64
|
+
/\/delete/i,
|
|
65
|
+
/\/edit/i,
|
|
66
|
+
/\/update/i,
|
|
67
|
+
];
|
|
68
|
+
for (const pattern of routePatterns) {
|
|
69
|
+
let match;
|
|
70
|
+
while ((match = pattern.exec(sourceCode)) !== null) {
|
|
71
|
+
const endpoint = match[2];
|
|
72
|
+
// Check if it's a sensitive endpoint
|
|
73
|
+
if (sensitiveEndpoints.some(p => p.test(endpoint))) {
|
|
74
|
+
const lines = sourceCode.substring(0, match.index).split('\n');
|
|
75
|
+
const line = lines.length;
|
|
76
|
+
findings.push({
|
|
77
|
+
id: `owasp-a01-${findings.length + 1}`,
|
|
78
|
+
ruleId: 'owasp-a01-broken-access-control',
|
|
79
|
+
severity: 'high',
|
|
80
|
+
message: `Sensitive endpoint ${endpoint} may lack authentication middleware`,
|
|
81
|
+
location: {
|
|
82
|
+
file: context.filePath,
|
|
83
|
+
startLine: line,
|
|
84
|
+
endLine: line,
|
|
85
|
+
startColumn: 0,
|
|
86
|
+
endColumn: match[0].length,
|
|
87
|
+
},
|
|
88
|
+
suggestion: {
|
|
89
|
+
description: 'Add authentication middleware before the route handler',
|
|
90
|
+
example: `// Add auth middleware: app.${match[1]}(${endpoint}, authMiddleware, handler)`,
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check for insecure direct object references (IDOR)
|
|
99
|
+
*/
|
|
100
|
+
function checkDirectObjectReferences(context, findings) {
|
|
101
|
+
const sourceCode = context.sourceCode;
|
|
102
|
+
const lines = sourceCode.split('\n');
|
|
103
|
+
// Patterns indicating IDOR vulnerabilities
|
|
104
|
+
const idorPatterns = [
|
|
105
|
+
// Direct use of user-provided ID without ownership check
|
|
106
|
+
/(?:req\.params|req\.query|req\.body)\s*\.\s*(?:id|userId|user_id)/gi,
|
|
107
|
+
// Direct database queries with user input
|
|
108
|
+
/findById\s*\(\s*(?:req\.params|req\.query|req\.body)/gi,
|
|
109
|
+
/where\s*:\s*\{\s*id\s*:\s*(?:req\.params|req\.query)/gi,
|
|
110
|
+
];
|
|
111
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
112
|
+
const line = lines[lineNum];
|
|
113
|
+
for (const pattern of idorPatterns) {
|
|
114
|
+
pattern.lastIndex = 0;
|
|
115
|
+
if (pattern.test(line)) {
|
|
116
|
+
// Check if there's no ownership/authorization check nearby
|
|
117
|
+
const surroundingCode = lines.slice(Math.max(0, lineNum - 5), lineNum + 5).join('\n');
|
|
118
|
+
if (!hasAuthorizationCheck(surroundingCode)) {
|
|
119
|
+
findings.push({
|
|
120
|
+
id: `owasp-a01-idor-${findings.length + 1}`,
|
|
121
|
+
ruleId: 'owasp-a01-broken-access-control',
|
|
122
|
+
severity: 'high',
|
|
123
|
+
message: 'Potential Insecure Direct Object Reference (IDOR) - user-provided ID used without ownership verification',
|
|
124
|
+
location: {
|
|
125
|
+
file: context.filePath,
|
|
126
|
+
startLine: lineNum + 1,
|
|
127
|
+
endLine: lineNum + 1,
|
|
128
|
+
startColumn: 0,
|
|
129
|
+
endColumn: line.length,
|
|
130
|
+
},
|
|
131
|
+
suggestion: {
|
|
132
|
+
description: 'Verify resource ownership before allowing access',
|
|
133
|
+
example: '// Add ownership check: if (resource.userId !== req.user.id) return res.status(403).json({ error: "Forbidden" })',
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check for CORS misconfigurations
|
|
144
|
+
*/
|
|
145
|
+
function checkCorsMisconfigurations(context, findings) {
|
|
146
|
+
const sourceCode = context.sourceCode;
|
|
147
|
+
const lines = sourceCode.split('\n');
|
|
148
|
+
const corsPatterns = [
|
|
149
|
+
// Wildcard origin
|
|
150
|
+
{ pattern: /['"`]\*['"`]/g, message: 'CORS allows all origins (*)' },
|
|
151
|
+
// Reflecting origin without validation
|
|
152
|
+
{ pattern: /origin\s*:\s*(?:req\.headers\.origin|true)/gi, message: 'CORS reflects any origin' },
|
|
153
|
+
// credentials with wildcard
|
|
154
|
+
{ pattern: /credentials\s*:\s*true.*origin\s*:\s*['"`]\*['"`]/gi, message: 'CORS allows credentials with wildcard origin' },
|
|
155
|
+
];
|
|
156
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
157
|
+
const line = lines[lineNum];
|
|
158
|
+
for (const { pattern, message } of corsPatterns) {
|
|
159
|
+
pattern.lastIndex = 0;
|
|
160
|
+
if (pattern.test(line)) {
|
|
161
|
+
findings.push({
|
|
162
|
+
id: `owasp-a01-cors-${findings.length + 1}`,
|
|
163
|
+
ruleId: 'owasp-a01-broken-access-control',
|
|
164
|
+
severity: 'medium',
|
|
165
|
+
message: `CORS misconfiguration: ${message}`,
|
|
166
|
+
location: {
|
|
167
|
+
file: context.filePath,
|
|
168
|
+
startLine: lineNum + 1,
|
|
169
|
+
endLine: lineNum + 1,
|
|
170
|
+
startColumn: 0,
|
|
171
|
+
endColumn: line.length,
|
|
172
|
+
},
|
|
173
|
+
suggestion: {
|
|
174
|
+
description: 'Restrict CORS to specific trusted origins',
|
|
175
|
+
example: "// Use specific origins: origin: ['https://trusted-domain.com']",
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Check for path traversal vulnerabilities
|
|
185
|
+
*/
|
|
186
|
+
function checkPathTraversal(context, findings) {
|
|
187
|
+
const sourceCode = context.sourceCode;
|
|
188
|
+
const lines = sourceCode.split('\n');
|
|
189
|
+
// Patterns for potential path traversal
|
|
190
|
+
const pathPatterns = [
|
|
191
|
+
/path\.join\s*\([^)]*(?:req\.params|req\.query|req\.body)/gi,
|
|
192
|
+
/fs\.(?:readFile|readdir|writeFile|unlink|stat)\s*\([^)]*(?:req\.params|req\.query)/gi,
|
|
193
|
+
/res\.sendFile\s*\([^)]*(?:req\.params|req\.query)/gi,
|
|
194
|
+
];
|
|
195
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
196
|
+
const line = lines[lineNum];
|
|
197
|
+
for (const pattern of pathPatterns) {
|
|
198
|
+
pattern.lastIndex = 0;
|
|
199
|
+
if (pattern.test(line)) {
|
|
200
|
+
// Check if there's path normalization
|
|
201
|
+
if (!line.includes('normalize') && !line.includes('realpath') && !line.includes('sanitize')) {
|
|
202
|
+
findings.push({
|
|
203
|
+
id: `owasp-a01-path-${findings.length + 1}`,
|
|
204
|
+
ruleId: 'owasp-a01-broken-access-control',
|
|
205
|
+
severity: 'high',
|
|
206
|
+
message: 'Potential path traversal vulnerability - user input used in file path without sanitization',
|
|
207
|
+
location: {
|
|
208
|
+
file: context.filePath,
|
|
209
|
+
startLine: lineNum + 1,
|
|
210
|
+
endLine: lineNum + 1,
|
|
211
|
+
startColumn: 0,
|
|
212
|
+
endColumn: line.length,
|
|
213
|
+
},
|
|
214
|
+
suggestion: {
|
|
215
|
+
description: 'Sanitize and validate file paths to prevent directory traversal',
|
|
216
|
+
example: `// Use path.normalize() and verify path doesn't escape base directory
|
|
217
|
+
const safePath = path.normalize(userInput).replace(/^(\\.\\.\\/)+/, '');
|
|
218
|
+
if (!safePath.startsWith(baseDir)) throw new Error('Invalid path');`,
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Check for privileged operations without authorization checks
|
|
229
|
+
*/
|
|
230
|
+
function checkPrivilegedOperations(context, findings) {
|
|
231
|
+
const sourceCode = context.sourceCode;
|
|
232
|
+
const lines = sourceCode.split('\n');
|
|
233
|
+
// Privileged operation patterns
|
|
234
|
+
const privilegedPatterns = [
|
|
235
|
+
{ pattern: /\.destroy\s*\(/gi, operation: 'delete' },
|
|
236
|
+
{ pattern: /\.delete\s*\(/gi, operation: 'delete' },
|
|
237
|
+
{ pattern: /\.remove\s*\(/gi, operation: 'delete' },
|
|
238
|
+
{ pattern: /role\s*[:=]\s*['"`]admin['"`]/gi, operation: 'role assignment' },
|
|
239
|
+
{ pattern: /isAdmin\s*[:=]\s*true/gi, operation: 'admin flag' },
|
|
240
|
+
{ pattern: /\.executeRaw\s*\(/gi, operation: 'raw SQL execution' },
|
|
241
|
+
{ pattern: /eval\s*\(/gi, operation: 'code evaluation' },
|
|
242
|
+
];
|
|
243
|
+
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
244
|
+
const line = lines[lineNum];
|
|
245
|
+
for (const { pattern, operation } of privilegedPatterns) {
|
|
246
|
+
pattern.lastIndex = 0;
|
|
247
|
+
if (pattern.test(line)) {
|
|
248
|
+
// Check surrounding context for authorization
|
|
249
|
+
const surroundingCode = lines.slice(Math.max(0, lineNum - 10), lineNum + 1).join('\n');
|
|
250
|
+
if (!hasAuthorizationCheck(surroundingCode)) {
|
|
251
|
+
findings.push({
|
|
252
|
+
id: `owasp-a01-priv-${findings.length + 1}`,
|
|
253
|
+
ruleId: 'owasp-a01-broken-access-control',
|
|
254
|
+
severity: 'high',
|
|
255
|
+
message: `Privileged operation (${operation}) without visible authorization check`,
|
|
256
|
+
location: {
|
|
257
|
+
file: context.filePath,
|
|
258
|
+
startLine: lineNum + 1,
|
|
259
|
+
endLine: lineNum + 1,
|
|
260
|
+
startColumn: 0,
|
|
261
|
+
endColumn: line.length,
|
|
262
|
+
},
|
|
263
|
+
suggestion: {
|
|
264
|
+
description: 'Add authorization check before privileged operations',
|
|
265
|
+
example: '// Add: if (!user.hasPermission("admin")) throw new ForbiddenError();',
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Check if code contains authorization checks
|
|
276
|
+
*/
|
|
277
|
+
function hasAuthorizationCheck(code) {
|
|
278
|
+
const authPatterns = [
|
|
279
|
+
/isAuth/i,
|
|
280
|
+
/isAdmin/i,
|
|
281
|
+
/authorize/i,
|
|
282
|
+
/hasPermission/i,
|
|
283
|
+
/hasRole/i,
|
|
284
|
+
/checkAuth/i,
|
|
285
|
+
/requireAuth/i,
|
|
286
|
+
/guard/i,
|
|
287
|
+
/canAccess/i,
|
|
288
|
+
/userId\s*===\s*req\.user/i,
|
|
289
|
+
/req\.user\.id\s*===\s*/i,
|
|
290
|
+
/\.where\s*\([^)]*userId/i,
|
|
291
|
+
];
|
|
292
|
+
return authPatterns.some(p => p.test(code));
|
|
293
|
+
}
|
|
294
|
+
export default owaspA01BrokenAccessControl;
|
|
295
|
+
//# sourceMappingURL=a01-broken-access-control.js.map
|