shield360 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +330 -3
- package/dist/__tests__/build-info.test.js +8 -1
- package/dist/__tests__/build-info.test.js.map +1 -1
- package/dist/__tests__/code-location.test.js +1 -1
- package/dist/__tests__/destination.test.js +15 -0
- package/dist/__tests__/destination.test.js.map +1 -1
- package/dist/__tests__/masking.test.d.ts +1 -0
- package/dist/__tests__/masking.test.js +66 -0
- package/dist/__tests__/masking.test.js.map +1 -0
- package/dist/__tests__/register.e2e.test.d.ts +1 -0
- package/dist/__tests__/register.e2e.test.js +279 -0
- package/dist/__tests__/register.e2e.test.js.map +1 -0
- package/dist/__tests__/register.test.js +60 -0
- package/dist/__tests__/register.test.js.map +1 -1
- package/dist/agents/__tests__/agents.test.d.ts +1 -0
- package/dist/agents/__tests__/agents.test.js +529 -0
- package/dist/agents/__tests__/agents.test.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.js +25 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/passport.d.ts +92 -0
- package/dist/agents/passport.js +301 -0
- package/dist/agents/passport.js.map +1 -0
- package/dist/agents/policy.d.ts +24 -0
- package/dist/agents/policy.js +93 -0
- package/dist/agents/policy.js.map +1 -0
- package/dist/agents/replay.d.ts +20 -0
- package/dist/agents/replay.js +47 -0
- package/dist/agents/replay.js.map +1 -0
- package/dist/agents/report.d.ts +30 -0
- package/dist/agents/report.js +93 -0
- package/dist/agents/report.js.map +1 -0
- package/dist/agents/types.d.ts +148 -0
- package/dist/agents/types.js +37 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/verifier.d.ts +33 -0
- package/dist/agents/verifier.js +276 -0
- package/dist/agents/verifier.js.map +1 -0
- package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
- package/dist/ai-security/__tests__/bench.test.js +50 -0
- package/dist/ai-security/__tests__/bench.test.js.map +1 -0
- package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
- package/dist/ai-security/__tests__/checks.test.js +248 -0
- package/dist/ai-security/__tests__/checks.test.js.map +1 -0
- package/dist/ai-security/__tests__/config.test.d.ts +1 -0
- package/dist/ai-security/__tests__/config.test.js +164 -0
- package/dist/ai-security/__tests__/config.test.js.map +1 -0
- package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
- package/dist/ai-security/__tests__/detection.test.js +114 -0
- package/dist/ai-security/__tests__/detection.test.js.map +1 -0
- package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
- package/dist/ai-security/__tests__/fixtures.js +30 -0
- package/dist/ai-security/__tests__/fixtures.js.map +1 -0
- package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
- package/dist/ai-security/__tests__/hooks.test.js +174 -0
- package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
- package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
- package/dist/ai-security/__tests__/stream.test.js +85 -0
- package/dist/ai-security/__tests__/stream.test.js.map +1 -0
- package/dist/ai-security/config.d.ts +94 -0
- package/dist/ai-security/config.js +241 -0
- package/dist/ai-security/config.js.map +1 -0
- package/dist/ai-security/context.d.ts +45 -0
- package/dist/ai-security/context.js +108 -0
- package/dist/ai-security/context.js.map +1 -0
- package/dist/ai-security/custom-kinds.d.ts +23 -0
- package/dist/ai-security/custom-kinds.js +97 -0
- package/dist/ai-security/custom-kinds.js.map +1 -0
- package/dist/ai-security/events.d.ts +77 -0
- package/dist/ai-security/events.js +153 -0
- package/dist/ai-security/events.js.map +1 -0
- package/dist/ai-security/hooks.d.ts +48 -0
- package/dist/ai-security/hooks.js +461 -0
- package/dist/ai-security/hooks.js.map +1 -0
- package/dist/ai-security/index.d.ts +209 -0
- package/dist/ai-security/index.js +587 -0
- package/dist/ai-security/index.js.map +1 -0
- package/dist/ai-security/injection-rules.json +1024 -0
- package/dist/ai-security/injection.d.ts +46 -0
- package/dist/ai-security/injection.js +635 -0
- package/dist/ai-security/injection.js.map +1 -0
- package/dist/ai-security/jailbreak.d.ts +38 -0
- package/dist/ai-security/jailbreak.js +73 -0
- package/dist/ai-security/jailbreak.js.map +1 -0
- package/dist/ai-security/limits.d.ts +84 -0
- package/dist/ai-security/limits.js +195 -0
- package/dist/ai-security/limits.js.map +1 -0
- package/dist/ai-security/mcp.d.ts +82 -0
- package/dist/ai-security/mcp.js +150 -0
- package/dist/ai-security/mcp.js.map +1 -0
- package/dist/ai-security/output.d.ts +107 -0
- package/dist/ai-security/output.js +390 -0
- package/dist/ai-security/output.js.map +1 -0
- package/dist/ai-security/policy.d.ts +125 -0
- package/dist/ai-security/policy.js +196 -0
- package/dist/ai-security/policy.js.map +1 -0
- package/dist/ai-security/rag.d.ts +70 -0
- package/dist/ai-security/rag.js +174 -0
- package/dist/ai-security/rag.js.map +1 -0
- package/dist/ai-security/tool-rules.json +203 -0
- package/dist/ai-security/tools.d.ts +46 -0
- package/dist/ai-security/tools.js +62 -0
- package/dist/ai-security/tools.js.map +1 -0
- package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
- package/dist/budgets/__tests__/budgets.test.js +134 -0
- package/dist/budgets/__tests__/budgets.test.js.map +1 -0
- package/dist/budgets/auto.d.ts +25 -0
- package/dist/budgets/auto.js +63 -0
- package/dist/budgets/auto.js.map +1 -0
- package/dist/budgets/index.d.ts +110 -0
- package/dist/budgets/index.js +239 -0
- package/dist/budgets/index.js.map +1 -0
- package/dist/customer/__tests__/customer.test.d.ts +1 -0
- package/dist/customer/__tests__/customer.test.js +155 -0
- package/dist/customer/__tests__/customer.test.js.map +1 -0
- package/dist/customer/index.d.ts +48 -0
- package/dist/customer/index.js +132 -0
- package/dist/customer/index.js.map +1 -0
- package/dist/destination.d.ts +14 -0
- package/dist/destination.js +16 -0
- package/dist/destination.js.map +1 -1
- package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
- package/dist/feedback/__tests__/feedback.test.js +80 -0
- package/dist/feedback/__tests__/feedback.test.js.map +1 -0
- package/dist/feedback/index.d.ts +48 -0
- package/dist/feedback/index.js +97 -0
- package/dist/feedback/index.js.map +1 -0
- package/dist/flags/__tests__/flags.test.d.ts +1 -0
- package/dist/flags/__tests__/flags.test.js +301 -0
- package/dist/flags/__tests__/flags.test.js.map +1 -0
- package/dist/flags/client.d.ts +131 -0
- package/dist/flags/client.js +301 -0
- package/dist/flags/client.js.map +1 -0
- package/dist/flags/engine.d.ts +200 -0
- package/dist/flags/engine.js +677 -0
- package/dist/flags/engine.js.map +1 -0
- package/dist/flags/index.d.ts +4 -0
- package/dist/flags/index.js +16 -0
- package/dist/flags/index.js.map +1 -0
- package/dist/guard/__tests__/findings.test.js +1 -1
- package/dist/guard/__tests__/report.test.js +67 -0
- package/dist/guard/__tests__/report.test.js.map +1 -1
- package/dist/guard/heartbeat.d.ts +34 -0
- package/dist/guard/heartbeat.js +83 -0
- package/dist/guard/heartbeat.js.map +1 -0
- package/dist/guard/integration.d.ts +9 -0
- package/dist/guard/integration.js +4 -2
- package/dist/guard/integration.js.map +1 -1
- package/dist/guard/report.d.ts +24 -1
- package/dist/guard/report.js +67 -18
- package/dist/guard/report.js.map +1 -1
- package/dist/index.d.ts +88 -0
- package/dist/index.js +203 -2
- package/dist/index.js.map +1 -1
- package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
- package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
- package/dist/instrumentation/anthropic/wrapper.js +4 -0
- package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
- package/dist/instrumentation/openai/wrapper.js +6 -0
- package/dist/instrumentation/openai/wrapper.js.map +1 -1
- package/dist/masking.d.ts +42 -0
- package/dist/masking.js +197 -0
- package/dist/masking.js.map +1 -0
- package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
- package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
- package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
- package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
- package/dist/otel/__tests__/app-logs.test.js +269 -0
- package/dist/otel/__tests__/app-logs.test.js.map +1 -0
- package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
- package/dist/otel/__tests__/log-auto.test.js +125 -0
- package/dist/otel/__tests__/log-auto.test.js.map +1 -0
- package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
- package/dist/otel/__tests__/log-bridges.test.js +170 -0
- package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
- package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
- package/dist/otel/__tests__/system-metrics.test.js +79 -0
- package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
- package/dist/otel/app-logs.d.ts +80 -0
- package/dist/otel/app-logs.js +195 -0
- package/dist/otel/app-logs.js.map +1 -0
- package/dist/otel/build-info.d.ts +2 -1
- package/dist/otel/build-info.js +3 -2
- package/dist/otel/build-info.js.map +1 -1
- package/dist/otel/events.d.ts +1 -0
- package/dist/otel/events.js +22 -13
- package/dist/otel/events.js.map +1 -1
- package/dist/otel/log-auto.d.ts +44 -0
- package/dist/otel/log-auto.js +200 -0
- package/dist/otel/log-auto.js.map +1 -0
- package/dist/otel/log-bridges.d.ts +54 -0
- package/dist/otel/log-bridges.js +307 -0
- package/dist/otel/log-bridges.js.map +1 -0
- package/dist/otel/metrics.js +1 -1
- package/dist/otel/metrics.js.map +1 -1
- package/dist/otel/system-metrics.d.ts +39 -0
- package/dist/otel/system-metrics.js +166 -0
- package/dist/otel/system-metrics.js.map +1 -0
- package/dist/otel/tracing.js +6 -2
- package/dist/otel/tracing.js.map +1 -1
- package/dist/protect/__tests__/protect.test.js +4 -0
- package/dist/protect/__tests__/protect.test.js.map +1 -1
- package/dist/protect/index.js +9 -4
- package/dist/protect/index.js.map +1 -1
- package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
- package/dist/rasp/__tests__/auto-http.test.js +136 -0
- package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
- package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
- package/dist/rasp/__tests__/baseline.test.js +86 -0
- package/dist/rasp/__tests__/baseline.test.js.map +1 -0
- package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
- package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
- package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
- package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
- package/dist/rasp/__tests__/capture-context.test.js +135 -0
- package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
- package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/code-hook.test.js +218 -0
- package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
- package/dist/rasp/__tests__/config-client.test.js +283 -0
- package/dist/rasp/__tests__/config-client.test.js.map +1 -0
- package/dist/rasp/__tests__/corpus.d.ts +13 -0
- package/dist/rasp/__tests__/corpus.js +111 -0
- package/dist/rasp/__tests__/corpus.js.map +1 -0
- package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
- package/dist/rasp/__tests__/custom-rules.test.js +276 -0
- package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
- package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/db-hook.test.js +438 -0
- package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/deception.test.d.ts +1 -0
- package/dist/rasp/__tests__/deception.test.js +567 -0
- package/dist/rasp/__tests__/deception.test.js.map +1 -0
- package/dist/rasp/__tests__/detect.test.d.ts +1 -0
- package/dist/rasp/__tests__/detect.test.js +276 -0
- package/dist/rasp/__tests__/detect.test.js.map +1 -0
- package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
- package/dist/rasp/__tests__/esm-exports.test.js +20 -0
- package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
- package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/fs-hook.test.js +241 -0
- package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
- package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
- package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
- package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
- package/dist/rasp/__tests__/hook-kit.js +139 -0
- package/dist/rasp/__tests__/hook-kit.js.map +1 -0
- package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/http-hook.test.js +250 -0
- package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/iast.test.d.ts +1 -0
- package/dist/rasp/__tests__/iast.test.js +361 -0
- package/dist/rasp/__tests__/iast.test.js.map +1 -0
- package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/include-hook.test.js +122 -0
- package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
- package/dist/rasp/__tests__/middleware.test.js +302 -0
- package/dist/rasp/__tests__/middleware.test.js.map +1 -0
- package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/process-hook.test.js +238 -0
- package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
- package/dist/rasp/__tests__/reporter.test.js +114 -0
- package/dist/rasp/__tests__/reporter.test.js.map +1 -0
- package/dist/rasp/__tests__/route.test.d.ts +1 -0
- package/dist/rasp/__tests__/route.test.js +46 -0
- package/dist/rasp/__tests__/route.test.js.map +1 -0
- package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
- package/dist/rasp/__tests__/rule-expr.test.js +151 -0
- package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
- package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
- package/dist/rasp/__tests__/rule-phases.test.js +271 -0
- package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
- package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
- package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/targets.test.d.ts +1 -0
- package/dist/rasp/__tests__/targets.test.js +82 -0
- package/dist/rasp/__tests__/targets.test.js.map +1 -0
- package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
- package/dist/rasp/__tests__/template-hook.test.js +254 -0
- package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
- package/dist/rasp/__tests__/upload.test.d.ts +1 -0
- package/dist/rasp/__tests__/upload.test.js +81 -0
- package/dist/rasp/__tests__/upload.test.js.map +1 -0
- package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
- package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
- package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
- package/dist/rasp/auto-http.d.ts +6 -0
- package/dist/rasp/auto-http.js +194 -0
- package/dist/rasp/auto-http.js.map +1 -0
- package/dist/rasp/baseline.d.ts +35 -0
- package/dist/rasp/baseline.js +91 -0
- package/dist/rasp/baseline.js.map +1 -0
- package/dist/rasp/capture.d.ts +76 -0
- package/dist/rasp/capture.js +304 -0
- package/dist/rasp/capture.js.map +1 -0
- package/dist/rasp/config-client.d.ts +122 -0
- package/dist/rasp/config-client.js +337 -0
- package/dist/rasp/config-client.js.map +1 -0
- package/dist/rasp/context.d.ts +65 -0
- package/dist/rasp/context.js +68 -0
- package/dist/rasp/context.js.map +1 -0
- package/dist/rasp/custom-rules.d.ts +68 -0
- package/dist/rasp/custom-rules.js +222 -0
- package/dist/rasp/custom-rules.js.map +1 -0
- package/dist/rasp/data/default-rules.json +199 -0
- package/dist/rasp/data/default-sinks.json +4 -0
- package/dist/rasp/data/dnslog-domains.json +11 -0
- package/dist/rasp/deception.d.ts +70 -0
- package/dist/rasp/deception.js +220 -0
- package/dist/rasp/deception.js.map +1 -0
- package/dist/rasp/detect.d.ts +68 -0
- package/dist/rasp/detect.js +671 -0
- package/dist/rasp/detect.js.map +1 -0
- package/dist/rasp/engine.d.ts +107 -0
- package/dist/rasp/engine.js +330 -0
- package/dist/rasp/engine.js.map +1 -0
- package/dist/rasp/hooks/code.d.ts +20 -0
- package/dist/rasp/hooks/code.js +334 -0
- package/dist/rasp/hooks/code.js.map +1 -0
- package/dist/rasp/hooks/db.d.ts +48 -0
- package/dist/rasp/hooks/db.js +322 -0
- package/dist/rasp/hooks/db.js.map +1 -0
- package/dist/rasp/hooks/esm.d.ts +7 -0
- package/dist/rasp/hooks/esm.js +18 -0
- package/dist/rasp/hooks/esm.js.map +1 -0
- package/dist/rasp/hooks/fs.d.ts +3 -0
- package/dist/rasp/hooks/fs.js +206 -0
- package/dist/rasp/hooks/fs.js.map +1 -0
- package/dist/rasp/hooks/http.d.ts +4 -0
- package/dist/rasp/hooks/http.js +213 -0
- package/dist/rasp/hooks/http.js.map +1 -0
- package/dist/rasp/hooks/include.d.ts +9 -0
- package/dist/rasp/hooks/include.js +79 -0
- package/dist/rasp/hooks/include.js.map +1 -0
- package/dist/rasp/hooks/marks.d.ts +2 -0
- package/dist/rasp/hooks/marks.js +16 -0
- package/dist/rasp/hooks/marks.js.map +1 -0
- package/dist/rasp/hooks/process.d.ts +22 -0
- package/dist/rasp/hooks/process.js +191 -0
- package/dist/rasp/hooks/process.js.map +1 -0
- package/dist/rasp/hooks/sinks.d.ts +54 -0
- package/dist/rasp/hooks/sinks.js +329 -0
- package/dist/rasp/hooks/sinks.js.map +1 -0
- package/dist/rasp/hooks/template.d.ts +21 -0
- package/dist/rasp/hooks/template.js +152 -0
- package/dist/rasp/hooks/template.js.map +1 -0
- package/dist/rasp/iast-rules.d.ts +82 -0
- package/dist/rasp/iast-rules.js +240 -0
- package/dist/rasp/iast-rules.js.map +1 -0
- package/dist/rasp/iast-scope.d.ts +29 -0
- package/dist/rasp/iast-scope.js +54 -0
- package/dist/rasp/iast-scope.js.map +1 -0
- package/dist/rasp/iast.d.ts +81 -0
- package/dist/rasp/iast.js +272 -0
- package/dist/rasp/iast.js.map +1 -0
- package/dist/rasp/index.d.ts +52 -0
- package/dist/rasp/index.js +280 -0
- package/dist/rasp/index.js.map +1 -0
- package/dist/rasp/lexers.d.ts +32 -0
- package/dist/rasp/lexers.js +444 -0
- package/dist/rasp/lexers.js.map +1 -0
- package/dist/rasp/middleware.d.ts +155 -0
- package/dist/rasp/middleware.js +568 -0
- package/dist/rasp/middleware.js.map +1 -0
- package/dist/rasp/model-output.d.ts +14 -0
- package/dist/rasp/model-output.js +107 -0
- package/dist/rasp/model-output.js.map +1 -0
- package/dist/rasp/normalize.d.ts +23 -0
- package/dist/rasp/normalize.js +140 -0
- package/dist/rasp/normalize.js.map +1 -0
- package/dist/rasp/reporter.d.ts +60 -0
- package/dist/rasp/reporter.js +230 -0
- package/dist/rasp/reporter.js.map +1 -0
- package/dist/rasp/rule-expr.d.ts +236 -0
- package/dist/rasp/rule-expr.js +1253 -0
- package/dist/rasp/rule-expr.js.map +1 -0
- package/dist/rasp/template.d.ts +53 -0
- package/dist/rasp/template.js +336 -0
- package/dist/rasp/template.js.map +1 -0
- package/dist/rasp/types.d.ts +110 -0
- package/dist/rasp/types.js +51 -0
- package/dist/rasp/types.js.map +1 -0
- package/dist/rasp/vpatch.d.ts +55 -0
- package/dist/rasp/vpatch.js +120 -0
- package/dist/rasp/vpatch.js.map +1 -0
- package/dist/register.js +52 -11
- package/dist/register.js.map +1 -1
- package/dist/semantic-convention.d.ts +2 -0
- package/dist/semantic-convention.js +5 -0
- package/dist/semantic-convention.js.map +1 -1
- package/dist/types.d.ts +77 -1
- package/dist/zero-code.d.ts +8 -0
- package/dist/zero-code.js +38 -0
- package/dist/zero-code.js.map +1 -0
- package/package.json +18 -2
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* When request rules run (README "Custom rules: when rules run"), on every
|
|
5
|
+
* entry point:
|
|
6
|
+
* - at head, `input.*` sees only the inputs known before the body, even when
|
|
7
|
+
* the framework hands over an already-parsed body;
|
|
8
|
+
* - a request with no body (or an empty one) has a known, empty body, so the
|
|
9
|
+
* body phase still runs; a body the SDK cannot read yet stays unknown;
|
|
10
|
+
* - findings raised during capture are judged with the request current;
|
|
11
|
+
* - a rule matches at most once per request, also when framework middleware
|
|
12
|
+
* replaces the zero-code capture's context.
|
|
13
|
+
*/
|
|
14
|
+
const http_1 = require("http");
|
|
15
|
+
const auto_http_1 = require("../auto-http");
|
|
16
|
+
const capture_1 = require("../capture");
|
|
17
|
+
const context_1 = require("../context");
|
|
18
|
+
const custom_rules_1 = require("../custom-rules");
|
|
19
|
+
const engine_1 = require("../engine");
|
|
20
|
+
const middleware_1 = require("../middleware");
|
|
21
|
+
const types_1 = require("../types");
|
|
22
|
+
let events = [];
|
|
23
|
+
function remote(customRules, attacks = {}) {
|
|
24
|
+
return { version: 'v1', exp: Math.floor(Date.now() / 1000) + 3600, killSwitch: false, snippets: false, mode: 'monitor', attacks, rules: [], customRules };
|
|
25
|
+
}
|
|
26
|
+
const rule = (id, expression, action = 'monitor') => ({ id, name: id, expression, action, enabled: true });
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
(0, custom_rules_1.resetCustomRuleWarnings)();
|
|
29
|
+
events = [];
|
|
30
|
+
(0, engine_1.configureEngine)({ enabled: true, applicationName: 'orders-api', env: {} });
|
|
31
|
+
(0, engine_1.setEventSink)({ add: (e) => events.push(e) });
|
|
32
|
+
});
|
|
33
|
+
afterEach(() => {
|
|
34
|
+
(0, engine_1.setEventSink)(undefined);
|
|
35
|
+
(0, engine_1.setRemoteConfig)(undefined);
|
|
36
|
+
(0, engine_1.configureEngine)({ enabled: false, applicationName: 'default', env: {} });
|
|
37
|
+
});
|
|
38
|
+
const fired = () => events.filter((e) => e.attrs['shield360.rasp.attack'] === 'custom_rule').map((e) => e.attrs['shield360.rasp.rule']);
|
|
39
|
+
function res() {
|
|
40
|
+
const r = { statusCode: 0, headersSent: false, writableEnded: false, body: '', setHeader: () => undefined };
|
|
41
|
+
r.end = (b) => ((r.body = b), (r.writableEnded = true));
|
|
42
|
+
return r;
|
|
43
|
+
}
|
|
44
|
+
function fastify() {
|
|
45
|
+
const hooks = {};
|
|
46
|
+
(0, middleware_1.raspFastify)({ addHook: (name, fn) => (hooks[name] = fn) }, {}, () => undefined);
|
|
47
|
+
const reply = { status: 0, code: (n) => ((reply.status = n), reply), header: () => reply, send: (b) => (reply.sent = b) };
|
|
48
|
+
return { hooks, reply };
|
|
49
|
+
}
|
|
50
|
+
const JSON_POST = { 'content-type': 'application/json', 'content-length': '13' };
|
|
51
|
+
describe('head rules see only the inputs known before the body', () => {
|
|
52
|
+
// In list order: a body rule, then an input rule that only a body input matches.
|
|
53
|
+
// Judged at head, the input rule would match first; judged at body, it follows the body rule.
|
|
54
|
+
beforeEach(() => (0, engine_1.setRemoteConfig)(remote([rule('body-rule', 'request.body["role"] != null'), rule('input-rule', 'input.key == "body.role"')])));
|
|
55
|
+
const atBody = ['custom.body-rule', 'custom.input-rule'];
|
|
56
|
+
it('capture core: a body captured before the head is judged', () => {
|
|
57
|
+
const ctx = (0, capture_1.captureRequest)({ framework: 'test', method: 'POST', url: '/a', headers: JSON_POST });
|
|
58
|
+
(0, capture_1.captureBody)(ctx, { body: { role: 'admin' }, contentType: 'application/json' });
|
|
59
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
60
|
+
expect(fired()).toEqual(atBody);
|
|
61
|
+
});
|
|
62
|
+
it('raspExpress with an already-parsed body', () => {
|
|
63
|
+
const next = jest.fn();
|
|
64
|
+
(0, middleware_1.raspExpress)()({ method: 'POST', url: '/a', originalUrl: '/a', headers: JSON_POST, query: {}, params: {}, body: { role: 'admin' } }, res(), next);
|
|
65
|
+
expect(next).toHaveBeenCalled();
|
|
66
|
+
expect(fired()).toEqual(atBody);
|
|
67
|
+
});
|
|
68
|
+
it('raspKoa with an already-parsed body', async () => {
|
|
69
|
+
const k = { method: 'POST', url: '/a', headers: JSON_POST, query: {}, request: { body: { role: 'admin' } }, set: jest.fn() };
|
|
70
|
+
await (0, middleware_1.raspKoa)()(k, jest.fn(async () => undefined));
|
|
71
|
+
expect(fired()).toEqual(atBody);
|
|
72
|
+
});
|
|
73
|
+
it('raspHttp with a body a parser set', () => {
|
|
74
|
+
const handler = jest.fn();
|
|
75
|
+
(0, middleware_1.raspHttp)(handler)({ method: 'POST', url: '/a', headers: JSON_POST, body: { role: 'admin' }, socket: {} }, res());
|
|
76
|
+
expect(handler).toHaveBeenCalled();
|
|
77
|
+
expect(fired()).toEqual(atBody);
|
|
78
|
+
});
|
|
79
|
+
it('raspFastify (body arrives in preHandler)', () => {
|
|
80
|
+
const { hooks, reply } = fastify();
|
|
81
|
+
const request = { method: 'POST', url: '/a', headers: JSON_POST, query: {}, params: {} };
|
|
82
|
+
hooks.onRequest(request, reply, jest.fn());
|
|
83
|
+
request.body = { role: 'admin' };
|
|
84
|
+
const next = jest.fn();
|
|
85
|
+
hooks.preHandler(request, reply, next);
|
|
86
|
+
expect(next).toHaveBeenCalled();
|
|
87
|
+
expect(fired()).toEqual(atBody);
|
|
88
|
+
});
|
|
89
|
+
it('withRasp (body read from a clone)', async () => {
|
|
90
|
+
const out = await (0, middleware_1.withRasp)(async () => new Response('ran'))(new Request('http://localhost/a', { method: 'POST', headers: { 'content-type': 'application/json' }, body: '{"role":"admin"}' }), {});
|
|
91
|
+
expect(await out.text()).toBe('ran');
|
|
92
|
+
expect(fired()).toEqual(atBody);
|
|
93
|
+
});
|
|
94
|
+
it('upload file names join at body too', () => {
|
|
95
|
+
(0, engine_1.setRemoteConfig)(remote([rule('body-rule', 'request.method == "POST" && request.body["x"] == null'), rule('upload-name', 'input.key == "body.doc.filename"')]));
|
|
96
|
+
const next = jest.fn();
|
|
97
|
+
(0, middleware_1.raspExpress)()({ method: 'POST', url: '/up', originalUrl: '/up', headers: { 'content-length': '10' }, query: {}, params: {}, body: {}, files: [{ fieldname: 'doc', originalname: 'a.txt' }] }, res(), next);
|
|
98
|
+
expect(fired()).toEqual(['custom.body-rule', 'custom.upload-name']);
|
|
99
|
+
});
|
|
100
|
+
it('a head input rule still matches at head', () => {
|
|
101
|
+
(0, engine_1.setRemoteConfig)(remote([rule('body-rule', 'request.body["role"] != null'), rule('q', 'input.key == "query.a"')]));
|
|
102
|
+
const ctx = (0, capture_1.captureRequest)({ framework: 'test', method: 'POST', url: '/a?a=1', headers: JSON_POST });
|
|
103
|
+
(0, capture_1.captureBody)(ctx, { body: { role: 'admin' }, contentType: 'application/json' });
|
|
104
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
105
|
+
expect(fired()).toEqual(['custom.q', 'custom.body-rule']);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('a request with no body has a known, empty body', () => {
|
|
109
|
+
beforeEach(() => (0, engine_1.setRemoteConfig)(remote([rule('no-role', 'request.body["role"] == null')])));
|
|
110
|
+
it('raspHttp GET', () => {
|
|
111
|
+
(0, middleware_1.raspHttp)(jest.fn())({ method: 'GET', url: '/a', headers: {}, httpVersionMajor: 1, socket: {} }, res());
|
|
112
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
113
|
+
});
|
|
114
|
+
it('raspHttp empty POST (content-length 0)', () => {
|
|
115
|
+
(0, middleware_1.raspHttp)(jest.fn())({ method: 'POST', url: '/a', headers: { 'content-length': '0' }, httpVersionMajor: 1, socket: {} }, res());
|
|
116
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
117
|
+
});
|
|
118
|
+
it('raspHttp POST with a body the handler has not read stays unknown until recordRequestBody', () => {
|
|
119
|
+
const handler = jest.fn((_q, _r) => {
|
|
120
|
+
expect(fired()).toEqual([]);
|
|
121
|
+
(0, middleware_1.recordRequestBody)('{}', 'application/json');
|
|
122
|
+
});
|
|
123
|
+
(0, middleware_1.raspHttp)(handler)({ method: 'POST', url: '/a', headers: JSON_POST, httpVersionMajor: 1, socket: {} }, res());
|
|
124
|
+
expect(handler).toHaveBeenCalled();
|
|
125
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
126
|
+
});
|
|
127
|
+
it('a body that arrives anyway (no length sent) is still captured as input', () => {
|
|
128
|
+
let keys = [];
|
|
129
|
+
const handler = jest.fn((_q, _r) => {
|
|
130
|
+
(0, middleware_1.recordRequestBody)({ file: '../../etc/passwd' });
|
|
131
|
+
keys = ((0, context_1.currentContext)()?.inputs ?? []).map((i) => i.key);
|
|
132
|
+
});
|
|
133
|
+
(0, middleware_1.raspHttp)(handler)({ method: 'POST', url: '/a', headers: {}, httpVersionMajor: 1, socket: {} }, res());
|
|
134
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
135
|
+
expect(keys).toContain('body.file');
|
|
136
|
+
});
|
|
137
|
+
it('raspExpress GET without a body parser', () => {
|
|
138
|
+
(0, middleware_1.raspExpress)()({ method: 'GET', url: '/a', originalUrl: '/a', headers: {}, httpVersionMajor: 1, query: {}, params: {} }, res(), jest.fn());
|
|
139
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
140
|
+
});
|
|
141
|
+
it('raspExpress empty JSON body', () => {
|
|
142
|
+
(0, middleware_1.raspExpress)()({ method: 'POST', url: '/a', originalUrl: '/a', headers: JSON_POST, query: {}, params: {}, body: {} }, res(), jest.fn());
|
|
143
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
144
|
+
});
|
|
145
|
+
it('raspKoa GET', async () => {
|
|
146
|
+
const k = { method: 'GET', url: '/a', headers: {}, query: {}, request: {}, req: { httpVersionMajor: 1 }, set: jest.fn() };
|
|
147
|
+
await (0, middleware_1.raspKoa)()(k, jest.fn(async () => undefined));
|
|
148
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
149
|
+
});
|
|
150
|
+
it('raspFastify GET', () => {
|
|
151
|
+
const { hooks, reply } = fastify();
|
|
152
|
+
const request = { method: 'GET', url: '/a', headers: {}, query: {}, params: {} };
|
|
153
|
+
hooks.onRequest(request, reply, jest.fn());
|
|
154
|
+
const next = jest.fn();
|
|
155
|
+
hooks.preHandler(request, reply, next);
|
|
156
|
+
expect(next).toHaveBeenCalled();
|
|
157
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
158
|
+
});
|
|
159
|
+
it.each([
|
|
160
|
+
['GET with Content-Length: 0 and a content type', 'GET', { 'content-type': 'application/json', 'content-length': '0' }],
|
|
161
|
+
['GET with a content type and no length', 'GET', { 'content-type': 'application/json' }],
|
|
162
|
+
['POST with Content-Length: 0 and a content type the parser leaves unset', 'POST', { 'content-type': 'application/json', 'content-length': '0' }],
|
|
163
|
+
])('raspFastify %s', (_name, method, headers) => {
|
|
164
|
+
const { hooks, reply } = fastify();
|
|
165
|
+
const request = { method, url: '/a', headers, query: {}, params: {} };
|
|
166
|
+
hooks.onRequest(request, reply, jest.fn());
|
|
167
|
+
hooks.preHandler(request, reply, jest.fn());
|
|
168
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
169
|
+
});
|
|
170
|
+
it('raspFastify multipart left unparsed stays unknown', () => {
|
|
171
|
+
const { hooks, reply } = fastify();
|
|
172
|
+
const request = { method: 'POST', url: '/a', headers: { 'content-type': 'multipart/form-data; boundary=x', 'content-length': '99' }, query: {}, params: {} };
|
|
173
|
+
hooks.onRequest(request, reply, jest.fn());
|
|
174
|
+
hooks.preHandler(request, reply, jest.fn());
|
|
175
|
+
expect(fired()).toEqual([]);
|
|
176
|
+
});
|
|
177
|
+
it('withRasp GET', async () => {
|
|
178
|
+
const out = await (0, middleware_1.withRasp)(async () => new Response('ran'))(new Request('http://localhost/a'), {});
|
|
179
|
+
expect(await out.text()).toBe('ran');
|
|
180
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
181
|
+
});
|
|
182
|
+
it('withRasp empty POST', async () => {
|
|
183
|
+
await (0, middleware_1.withRasp)(async () => new Response('ran'))(new Request('http://localhost/a', { method: 'POST' }), {});
|
|
184
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
185
|
+
});
|
|
186
|
+
it('a body-phase rule can block a body-less request', () => {
|
|
187
|
+
(0, engine_1.setRemoteConfig)(remote([rule('no-role', 'request.method == "GET" && request.body["role"] == null', 'block')], { custom_rule: 'block' }));
|
|
188
|
+
const handler = jest.fn();
|
|
189
|
+
const r = res();
|
|
190
|
+
(0, middleware_1.raspHttp)(handler)({ method: 'GET', url: '/a', headers: {}, httpVersionMajor: 1, socket: {} }, r);
|
|
191
|
+
expect(handler).not.toHaveBeenCalled();
|
|
192
|
+
expect(r.statusCode).toBe(403);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
async function serve(listener, path, opts = {}) {
|
|
196
|
+
(0, auto_http_1.installAutoHttpCapture)();
|
|
197
|
+
const server = (0, http_1.createServer)(listener);
|
|
198
|
+
await new Promise((ok) => server.listen(0, '127.0.0.1', () => ok()));
|
|
199
|
+
try {
|
|
200
|
+
const { port } = server.address();
|
|
201
|
+
return await new Promise((ok, fail) => {
|
|
202
|
+
const rq = (0, http_1.request)(`http://127.0.0.1:${port}${path}`, { method: opts.method ?? 'GET', headers: opts.headers }, (r) => {
|
|
203
|
+
r.resume();
|
|
204
|
+
r.on('end', () => ok(r.statusCode || 0));
|
|
205
|
+
}).on('error', fail);
|
|
206
|
+
rq.end(opts.body);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
server.closeAllConnections();
|
|
211
|
+
await new Promise((ok) => server.close(ok));
|
|
212
|
+
(0, auto_http_1.uninstallAutoHttpCapture)();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
describe('the zero-code http capture', () => {
|
|
216
|
+
it('runs the body phase for a GET', async () => {
|
|
217
|
+
(0, engine_1.setRemoteConfig)(remote([rule('no-role', 'request.body["role"] == null')]));
|
|
218
|
+
expect(await serve((_q, r) => r.end('ran'), '/a')).toBe(200);
|
|
219
|
+
expect(fired()).toEqual(['custom.no-role']);
|
|
220
|
+
});
|
|
221
|
+
it('a rule matches once when framework middleware replaces its context (GET)', async () => {
|
|
222
|
+
(0, engine_1.setRemoteConfig)(remote([rule('q', 'input.key == "query.a"'), rule('no-role', 'request.body["role"] == null')]));
|
|
223
|
+
const status = await serve((req, r) => {
|
|
224
|
+
const q = req;
|
|
225
|
+
q.originalUrl = req.url;
|
|
226
|
+
q.query = { a: '1' };
|
|
227
|
+
q.params = {};
|
|
228
|
+
(0, middleware_1.raspExpress)()(q, r, () => r.end('ran'));
|
|
229
|
+
}, '/a?a=1');
|
|
230
|
+
expect(status).toBe(200);
|
|
231
|
+
expect(fired()).toEqual(['custom.q', 'custom.no-role']);
|
|
232
|
+
});
|
|
233
|
+
it('a rule matches once when framework middleware replaces its context (POST body)', async () => {
|
|
234
|
+
(0, engine_1.setRemoteConfig)(remote([rule('q', 'input.key == "query.a"')]));
|
|
235
|
+
const status = await serve((req, r) => {
|
|
236
|
+
const q = req;
|
|
237
|
+
q.originalUrl = req.url;
|
|
238
|
+
q.query = { a: '1' };
|
|
239
|
+
q.params = {};
|
|
240
|
+
q.body = { role: 'admin' };
|
|
241
|
+
(0, middleware_1.raspExpress)()(q, r, () => r.end('ran'));
|
|
242
|
+
}, '/a?a=1', { method: 'POST', body: '{"role":"admin"}', headers: { 'content-type': 'application/json' } });
|
|
243
|
+
expect(status).toBe(200);
|
|
244
|
+
expect(fired()).toEqual(['custom.q']);
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
describe('findings raised during capture are judged with the request current', () => {
|
|
248
|
+
it('an upload finding rule sees request.ip and the inputs (raspExpress)', () => {
|
|
249
|
+
(0, engine_1.setRemoteConfig)(remote([rule('upload', 'attack.type == "file_write" && request.ip == "10.0.0.9" && input.key == "body.f.filename"', 'block')], { custom_rule: 'block' }));
|
|
250
|
+
const next = jest.fn();
|
|
251
|
+
const r = res();
|
|
252
|
+
(0, middleware_1.raspExpress)()({ method: 'POST', url: '/up', originalUrl: '/up', headers: {}, ip: '10.0.0.9', query: {}, params: {}, body: {}, files: [{ fieldname: 'f', originalname: 'shell.php' }] }, r, next);
|
|
253
|
+
expect(next).not.toHaveBeenCalled();
|
|
254
|
+
expect(r.statusCode).toBe(403);
|
|
255
|
+
expect(JSON.parse(r.body)).toMatchObject({ rule: 'custom.upload' });
|
|
256
|
+
});
|
|
257
|
+
it('a late upload check blocks through recordRequestBody', () => {
|
|
258
|
+
(0, engine_1.setRemoteConfig)(remote([rule('upload', 'attack.type == "file_write" && request.path == "/up"', 'block')], { custom_rule: 'block' }));
|
|
259
|
+
let thrown;
|
|
260
|
+
(0, middleware_1.raspHttp)((_q, _r) => {
|
|
261
|
+
try {
|
|
262
|
+
(0, middleware_1.recordRequestBody)('--x\r\ncontent-disposition: form-data; name="f"; filename="shell.php"\r\n\r\n<?php\r\n--x--', 'multipart/form-data; boundary=x');
|
|
263
|
+
}
|
|
264
|
+
catch (e) {
|
|
265
|
+
thrown = e;
|
|
266
|
+
}
|
|
267
|
+
})({ method: 'POST', url: '/up', headers: { 'content-length': '80' }, httpVersionMajor: 1, socket: {} }, res());
|
|
268
|
+
expect(thrown).toBeInstanceOf(types_1.RaspBlockedError);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=rule-phases.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-phases.test.js","sourceRoot":"","sources":["../../../src/rasp/__tests__/rule-phases.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
/**
|
|
37
|
+
* Sink rules: validation, the generic wrapper running the named check, the
|
|
38
|
+
* rule's action capping the decision, rule sets replacing each other, and
|
|
39
|
+
* built-in hooks never wrapped twice. Fake modules only.
|
|
40
|
+
*/
|
|
41
|
+
const fs_1 = require("fs");
|
|
42
|
+
const path_1 = require("path");
|
|
43
|
+
const detect = __importStar(require("../detect"));
|
|
44
|
+
const context_1 = require("../context");
|
|
45
|
+
const engine_1 = require("../engine");
|
|
46
|
+
const db_1 = require("../hooks/db");
|
|
47
|
+
const sinks_1 = require("../hooks/sinks");
|
|
48
|
+
const types_1 = require("../types");
|
|
49
|
+
const hook_kit_1 = require("./hook-kit");
|
|
50
|
+
const corpus_1 = require("./corpus");
|
|
51
|
+
const input = "' OR '1'='1";
|
|
52
|
+
const query = `SELECT * FROM products WHERE name = '${input}'`;
|
|
53
|
+
const req = (value) => ({ value, key: 'query.q', source: 'request' });
|
|
54
|
+
const tainted = (fn, trees = []) => (0, context_1.runWithInputs)([req(input)], fn, { inRequest: true, trees });
|
|
55
|
+
const rule = (extra = {}) => (0, sinks_1.parseSinkRule)({ id: 'sink.fake.query', module: 'fake-driver', target: 'Connection.prototype.query', check: 'sql', dialect: 'postgres', action: 'block', ...extra });
|
|
56
|
+
function fakeDriver() {
|
|
57
|
+
const original = jest.fn((..._values) => 'rows');
|
|
58
|
+
class Connection {
|
|
59
|
+
}
|
|
60
|
+
Object.defineProperty(Connection.prototype, 'query', { value: original, configurable: true, writable: true });
|
|
61
|
+
return { original, exports: { Connection }, Connection: Connection };
|
|
62
|
+
}
|
|
63
|
+
const events = [];
|
|
64
|
+
beforeEach(() => {
|
|
65
|
+
events.length = 0;
|
|
66
|
+
(0, engine_1.configureEngine)({ enabled: true, applicationName: 'a', mode: 'block', env: {} });
|
|
67
|
+
(0, engine_1.setEventSink)({ add: (e) => events.push(e) });
|
|
68
|
+
});
|
|
69
|
+
afterEach(() => {
|
|
70
|
+
(0, sinks_1.setSinkRules)([]);
|
|
71
|
+
jest.restoreAllMocks();
|
|
72
|
+
(0, engine_1.setEventSink)(undefined);
|
|
73
|
+
(0, engine_1.configureEngine)({ enabled: false, applicationName: 'default', env: {} });
|
|
74
|
+
});
|
|
75
|
+
describe('parseSinkRule', () => {
|
|
76
|
+
it('accepts a complete rule and fills defaults', () => {
|
|
77
|
+
expect((0, sinks_1.parseSinkRule)({ id: 'sink.x', module: '@scope/pkg', target: 'default.query', check: 'sql' })).toMatchObject({ arg: 0, action: 'monitor' });
|
|
78
|
+
for (const dialect of ['oracle', 'db2'])
|
|
79
|
+
expect((0, sinks_1.parseSinkRule)({ id: 'sink.x', module: 'm', target: 'a', check: 'sql', dialect })).toMatchObject({ dialect });
|
|
80
|
+
});
|
|
81
|
+
it.each([
|
|
82
|
+
['no id', { module: 'm', target: 'a', check: 'sql' }],
|
|
83
|
+
['an id with a hyphen', { id: 'sink.my-driver.query', module: 'm', target: 'a', check: 'sql' }],
|
|
84
|
+
['an id too long for the event sink', { id: `s${'x'.repeat(59)}`, module: 'm', target: 'a', check: 'sql' }],
|
|
85
|
+
['__proto__ in the path', { id: 'x', module: 'm', target: 'a.__proto__.b', check: 'sql' }],
|
|
86
|
+
['constructor in the path', { id: 'x', module: 'm', target: 'constructor', check: 'sql' }],
|
|
87
|
+
['too deep a path', { id: 'x', module: 'm', target: 'a.b.c.d.e', check: 'sql' }],
|
|
88
|
+
['an unknown check', { id: 'x', module: 'm', target: 'a', check: 'eval-anything' }],
|
|
89
|
+
['deser without a format', { id: 'x', module: 'm', target: 'a', check: 'deser' }],
|
|
90
|
+
['an action of off', { id: 'x', module: 'm', target: 'a', check: 'sql', action: 'off' }],
|
|
91
|
+
['another runtime only', { id: 'x', module: 'm', target: 'a', check: 'sql', runtimes: ['python'] }],
|
|
92
|
+
['a module path with ..', { id: 'x', module: '../m', target: 'a', check: 'sql' }],
|
|
93
|
+
['a field that is not a name', { id: 'x', module: 'm', target: 'a', check: 'sql', field: 'a.b' }],
|
|
94
|
+
])('drops %s', (_n, raw) => {
|
|
95
|
+
expect((0, sinks_1.parseSinkRule)(raw)).toBeNull();
|
|
96
|
+
});
|
|
97
|
+
it('keeps the valid rules of a list, at most 64, first id wins', () => {
|
|
98
|
+
const many = Array.from({ length: 70 }, (_, i) => ({ id: `r${i}`, module: 'm', target: 'a', check: 'sql' }));
|
|
99
|
+
expect((0, sinks_1.parseSinkRules)([{ bad: true }, ...many])).toHaveLength(64);
|
|
100
|
+
expect((0, sinks_1.parseSinkRules)([{ id: 'a', module: 'm', target: 'x', check: 'sql' }, { id: 'a', module: 'm', target: 'y', check: 'sql' }])[0].target).toBe('x');
|
|
101
|
+
expect((0, sinks_1.parseSinkRules)('nope')).toEqual([]);
|
|
102
|
+
});
|
|
103
|
+
it('the built-in list is the contract copy and parses', () => {
|
|
104
|
+
const embedded = (0, fs_1.readFileSync)((0, path_1.join)(__dirname, '..', 'data', 'default-sinks.json'));
|
|
105
|
+
expect(embedded.equals((0, fs_1.readFileSync)((0, path_1.join)(corpus_1.RASP_DIR, 'rules', 'default-sinks.json')))).toBe(true);
|
|
106
|
+
expect(Array.isArray(sinks_1.BUILT_IN_SINKS)).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('a rule at work', () => {
|
|
110
|
+
it('blocks when the rule and the attack mode both say block, with the rule as the sink', () => {
|
|
111
|
+
const d = fakeDriver();
|
|
112
|
+
(0, sinks_1.applySinkRule)(rule(), d.exports);
|
|
113
|
+
expect(() => tainted(() => new d.Connection().query(query))).toThrow(types_1.RaspBlockedError);
|
|
114
|
+
expect(d.original).not.toHaveBeenCalled();
|
|
115
|
+
expect(events[0].attrs['shield360.rasp.sink']).toBe('rule:sink.fake.query');
|
|
116
|
+
});
|
|
117
|
+
it('a monitor rule only reports, even in block mode', () => {
|
|
118
|
+
const d = fakeDriver();
|
|
119
|
+
(0, sinks_1.applySinkRule)(rule({ action: 'monitor' }), d.exports);
|
|
120
|
+
expect(tainted(() => new d.Connection().query(query))).toBe('rows');
|
|
121
|
+
expect(events[0].attrs['shield360.rasp.decision']).toBe('monitored');
|
|
122
|
+
});
|
|
123
|
+
it('reads an object argument through field, and passes bound parameters', () => {
|
|
124
|
+
const d = fakeDriver();
|
|
125
|
+
(0, sinks_1.applySinkRule)(rule({ field: 'sql' }), d.exports);
|
|
126
|
+
expect(() => tainted(() => new d.Connection().query({ sql: query }))).toThrow(types_1.RaspBlockedError);
|
|
127
|
+
expect(tainted(() => new d.Connection().query('SELECT * FROM products WHERE name = $1', [input]))).toBe('rows');
|
|
128
|
+
});
|
|
129
|
+
it('runs the nosql check on the request trees', () => {
|
|
130
|
+
const d = fakeDriver();
|
|
131
|
+
(0, sinks_1.applySinkRule)(rule({ check: 'nosql' }), d.exports);
|
|
132
|
+
const body = { name: { $ne: null } };
|
|
133
|
+
expect(() => tainted(() => new d.Connection().query({ name: body.name }), [body])).toThrow(types_1.RaspBlockedError);
|
|
134
|
+
});
|
|
135
|
+
it('a new rule set switches the old rules off at once', () => {
|
|
136
|
+
const d = fakeDriver();
|
|
137
|
+
(0, sinks_1.applySinkRule)(rule(), d.exports);
|
|
138
|
+
(0, sinks_1.setSinkRules)([]);
|
|
139
|
+
expect(tainted(() => new d.Connection().query(query))).toBe('rows');
|
|
140
|
+
expect(d.Connection.prototype.query).toBe(d.original);
|
|
141
|
+
});
|
|
142
|
+
it('never wraps a function a built-in hook already checks', () => {
|
|
143
|
+
class Client {
|
|
144
|
+
query(...v) {
|
|
145
|
+
return v.length;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
(0, db_1.patchPg)({ Client });
|
|
149
|
+
const wrapped = Client.prototype.query;
|
|
150
|
+
const detector = jest.spyOn(detect, 'detectSql');
|
|
151
|
+
(0, sinks_1.applySinkRule)(rule({ module: 'pg', target: 'Client.prototype.query' }), { Client });
|
|
152
|
+
expect(Client.prototype.query).toBe(wrapped);
|
|
153
|
+
expect(() => tainted(() => new Client().query(query))).toThrow(types_1.RaspBlockedError);
|
|
154
|
+
expect(detector).toHaveBeenCalledTimes(1);
|
|
155
|
+
(0, db_1.unpatchPg)({ Client });
|
|
156
|
+
});
|
|
157
|
+
it('a target that does not exist leaves the module alone', () => {
|
|
158
|
+
const d = fakeDriver();
|
|
159
|
+
(0, sinks_1.applySinkRule)(rule({ target: 'Missing.prototype.query' }), d.exports);
|
|
160
|
+
expect(d.Connection.prototype.query).toBe(d.original);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
const contractDriver = fakeDriver();
|
|
164
|
+
(0, hook_kit_1.describeHookContract)({
|
|
165
|
+
name: 'sink rule (sql)',
|
|
166
|
+
install: () => {
|
|
167
|
+
(0, sinks_1.applySinkRule)(rule(), contractDriver.exports);
|
|
168
|
+
return true;
|
|
169
|
+
},
|
|
170
|
+
uninstall: () => (0, sinks_1.setSinkRules)([]),
|
|
171
|
+
replaced: [{ owner: contractDriver.Connection.prototype, key: 'query' }],
|
|
172
|
+
trigger: () => new contractDriver.Connection().query(query),
|
|
173
|
+
inputs: [req(input)],
|
|
174
|
+
detector: { module: detect, name: 'detectSql' },
|
|
175
|
+
attack: 'sql_injection',
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=sinks-hook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinks-hook.test.js","sourceRoot":"","sources":["../../../src/rasp/__tests__/sinks-hook.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,2BAAkC;AAClC,+BAA4B;AAC5B,kDAAoC;AACpC,wCAA2C;AAC3C,sCAA0D;AAC1D,oCAAiD;AACjD,0CAA2H;AAC3H,oCAA4D;AAC5D,yCAAkD;AAClD,qCAAoC;AAEpC,MAAM,KAAK,GAAG,aAAa,CAAC;AAC5B,MAAM,KAAK,GAAG,wCAAwC,KAAK,GAAG,CAAC;AAC/D,MAAM,GAAG,GAAG,CAAC,KAAa,EAAa,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACzF,MAAM,OAAO,GAAG,CAAI,EAAW,EAAE,QAAmB,EAAE,EAAK,EAAE,CAAC,IAAA,uBAAa,EAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAE1H,MAAM,IAAI,GAAG,CAAC,QAA2B,EAAE,EAAY,EAAE,CACvD,IAAA,qBAAa,EAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,4BAA4B,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAE,CAAC;AAEvK,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,OAAkB,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,UAAU;KAAG;IACnB,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,UAA4F,EAAE,CAAC;AACzJ,CAAC;AAED,MAAM,MAAM,GAAwC,EAAE,CAAC;AACvD,UAAU,CAAC,GAAG,EAAE;IACd,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,IAAA,wBAAe,EAAC,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACjF,IAAA,qBAAY,EAAC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AACH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,oBAAY,EAAC,EAAE,CAAC,CAAC;IACjB,IAAI,CAAC,eAAe,EAAE,CAAC;IACvB,IAAA,qBAAY,EAAC,SAAS,CAAC,CAAC;IACxB,IAAA,wBAAe,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,IAAA,qBAAa,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAClJ,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,IAAA,qBAAa,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/J,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACrD,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC/F,CAAC,mCAAmC,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC3G,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1F,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1F,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAChF,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACnF,CAAC,wBAAwB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QACjF,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACxF,CAAC,sBAAsB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnG,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACjF,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;KAClG,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE;QACzB,MAAM,CAAC,IAAA,qBAAa,EAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7G,MAAM,CAAC,IAAA,sBAAc,EAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,IAAA,sBAAc,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvJ,MAAM,CAAC,IAAA,sBAAc,EAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,iBAAQ,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,sBAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAgB,CAAC,CAAC;QACvF,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAgB,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAgB,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACjC,IAAA,oBAAY,EAAC,EAAE,CAAC,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM;YACV,KAAK,CAAC,GAAG,CAAY;gBACnB,OAAO,CAAC,CAAC,MAAM,CAAC;YAClB,CAAC;SACF;QACD,IAAA,YAAO,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACjD,IAAA,qBAAa,EAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAgB,CAAC,CAAC;QACjF,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,IAAA,cAAS,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;QACvB,IAAA,qBAAa,EAAC,IAAI,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACtE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;AACpC,IAAA,+BAAoB,EAAC;IACnB,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,GAAG,EAAE;QACZ,IAAA,qBAAa,EAAC,IAAI,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,SAAS,EAAE,GAAG,EAAE,CAAC,IAAA,oBAAY,EAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;IACxE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;IAC3D,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;IAC/C,MAAM,EAAE,eAAe;CACxB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Allow-list targets and the SQL dialect (README "Events", "Allow-list
|
|
5
|
+
* targets"): the shared conformance file, the detectors, and the engine's
|
|
6
|
+
* gating on the signed `reportTargets` flag.
|
|
7
|
+
*/
|
|
8
|
+
const detect_1 = require("../detect");
|
|
9
|
+
const engine_1 = require("../engine");
|
|
10
|
+
const corpus_1 = require("./corpus");
|
|
11
|
+
const targets = (0, corpus_1.loadJson)('testdata/targets.json');
|
|
12
|
+
describe('targets.json conformance', () => {
|
|
13
|
+
it('masks every raw target as the file says', () => {
|
|
14
|
+
for (const c of targets.mask)
|
|
15
|
+
expect([c.raw, (0, engine_1.maskTarget)(c.raw) ?? null]).toEqual([c.raw, c.target]);
|
|
16
|
+
});
|
|
17
|
+
it('gives every resolved path its directory', () => {
|
|
18
|
+
for (const c of targets.directory)
|
|
19
|
+
expect((0, detect_1.targetDirectory)(c.resolved)).toBe(c.directory);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
describe('detectors', () => {
|
|
23
|
+
const inp = (value) => [{ value, key: 'query.q', source: 'request' }];
|
|
24
|
+
it('shell_spawn.shell names the executable basename, never the arguments', () => {
|
|
25
|
+
const f = (0, detect_1.detectShellSpawn)({ argv0: '/usr/bin/BASH.exe', inRequest: true, allow: [] });
|
|
26
|
+
expect(f).toMatchObject({ rule: 'shell_spawn.shell', target: 'bash' });
|
|
27
|
+
});
|
|
28
|
+
it('outbound.not_allowed names the host only', () => {
|
|
29
|
+
expect((0, detect_1.detectOutbound)('https://API.Example.com:8443/p?q=1', ['ok.example.com'])).toMatchObject({ target: 'api.example.com' });
|
|
30
|
+
});
|
|
31
|
+
it('path.outside_root names the directory, never the file name; other path rules name nothing', () => {
|
|
32
|
+
const f = (0, detect_1.detectPath)('/var/data/report.txt', 'read', inp('report.txt'), ['/srv/app']);
|
|
33
|
+
expect(f).toMatchObject({ rule: 'path.outside_root', target: '/var/data' });
|
|
34
|
+
expect((0, detect_1.detectPath)('/srv/app/../../etc/passwd', 'read', inp('../../etc/passwd'), ['/srv/app'])?.target).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
it('SQL findings carry the dialect', () => {
|
|
37
|
+
expect((0, detect_1.detectSql)("SELECT * FROM t WHERE id = 1 OR 1=1", inp('1 OR 1=1'), 'postgres')).toMatchObject({ rule: 'sqli.userinput', dialect: 'postgres' });
|
|
38
|
+
expect((0, detect_1.detectSql)("SELECT * FROM t WHERE id = 1 OR 1=1", inp('1 OR 1=1'))?.dialect).toBe('generic');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('engine', () => {
|
|
42
|
+
const events = [];
|
|
43
|
+
const remote = (over = {}) => ({ version: 'v1', exp: Date.now() / 1000 + 3600, killSwitch: false, snippets: false, attacks: {}, rules: null, ...over });
|
|
44
|
+
const outbound = { attack: 'outbound', rule: 'outbound.not_allowed', target: 'api.example.com' };
|
|
45
|
+
const attrs = (f) => {
|
|
46
|
+
events.length = 0;
|
|
47
|
+
(0, engine_1.handleFinding)(f, 'http.request');
|
|
48
|
+
return events[0].attrs;
|
|
49
|
+
};
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
(0, engine_1.configureEngine)({ enabled: true, applicationName: 'orders-api', env: {} });
|
|
52
|
+
(0, engine_1.setEventSink)({ add: (e) => events.push(e) });
|
|
53
|
+
});
|
|
54
|
+
afterAll(() => {
|
|
55
|
+
(0, engine_1.setEventSink)(undefined);
|
|
56
|
+
(0, engine_1.configureEngine)({ enabled: false, applicationName: 'default', env: {} });
|
|
57
|
+
});
|
|
58
|
+
it('sends the target only with the signed reportTargets flag', () => {
|
|
59
|
+
expect(attrs(outbound)['shield360.rasp.target']).toBeUndefined();
|
|
60
|
+
(0, engine_1.setRemoteConfig)(remote({ reportTargets: false }));
|
|
61
|
+
expect(attrs(outbound)['shield360.rasp.target']).toBeUndefined();
|
|
62
|
+
(0, engine_1.setRemoteConfig)(remote({ reportTargets: true }));
|
|
63
|
+
expect(attrs(outbound)['shield360.rasp.target']).toBe('api.example.com');
|
|
64
|
+
expect(attrs({ attack: 'shell_spawn', rule: 'shell_spawn.shell', target: 'curl' })['shield360.rasp.target']).toBe('curl');
|
|
65
|
+
});
|
|
66
|
+
it('only for the three allow-list rules', () => {
|
|
67
|
+
(0, engine_1.setRemoteConfig)(remote({ reportTargets: true }));
|
|
68
|
+
expect(attrs({ attack: 'path_traversal', rule: 'path.traversal', target: '/var/data' })['shield360.rasp.target']).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
it('masked and capped', () => {
|
|
71
|
+
(0, engine_1.setRemoteConfig)(remote({ reportTargets: true }));
|
|
72
|
+
expect(attrs({ ...outbound, target: `${'abcdefghijklmnopqrstuvwxyz0123'}.example.com` })['shield360.rasp.target']).toBe('***.example.com');
|
|
73
|
+
expect(attrs({ attack: 'path_traversal', rule: 'path.outside_root', target: '/ab'.repeat(100) })['shield360.rasp.target']).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
it('SQL events carry the dialect whatever reportTargets says; unknown dialects are left out', () => {
|
|
76
|
+
const sql = { attack: 'sql_injection', rule: 'sqli.userinput', dialect: 'oracle' };
|
|
77
|
+
expect(attrs(sql)['shield360.rasp.sql.dialect']).toBe('oracle');
|
|
78
|
+
expect(attrs({ ...sql, dialect: 'cobol' })['shield360.rasp.sql.dialect']).toBeUndefined();
|
|
79
|
+
expect(attrs(outbound)['shield360.rasp.sql.dialect']).toBeUndefined();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=targets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.test.js","sourceRoot":"","sources":["../../../src/rasp/__tests__/targets.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|