shield360 1.1.0 → 1.2.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/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__/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 +264 -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/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 +193 -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 +21 -12
- 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/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 +5 -1
- 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 +75 -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,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installHttpHooks = installHttpHooks;
|
|
4
|
+
exports.uninstallHttpHooks = uninstallHttpHooks;
|
|
5
|
+
/**
|
|
6
|
+
* Outbound HTTP sink hook (README "SSRF"): `http`/`https` `request` and
|
|
7
|
+
* `get`, and the global `fetch`, are checked for SSRF and for hosts outside
|
|
8
|
+
* `allow.outboundHosts` before anything is sent, and `http`/`https` again
|
|
9
|
+
* at the connection's own DNS lookup (DNS rebinding). The Shield360 and OTLP
|
|
10
|
+
* hosts are always allowed. Drafted with ChatGPT, reviewed and adapted by
|
|
11
|
+
* the repository owner.
|
|
12
|
+
*/
|
|
13
|
+
const http = require("http");
|
|
14
|
+
const https = require("https");
|
|
15
|
+
const dns = require("dns");
|
|
16
|
+
const net_1 = require("net");
|
|
17
|
+
const module_1 = require("module");
|
|
18
|
+
const url_1 = require("url");
|
|
19
|
+
const context_1 = require("../context");
|
|
20
|
+
const engine_1 = require("../engine");
|
|
21
|
+
const detect_1 = require("../detect");
|
|
22
|
+
const types_1 = require("../types");
|
|
23
|
+
let installed;
|
|
24
|
+
/** Bumped by every install and uninstall: a wrapper checks only while its generation is current. */
|
|
25
|
+
let generation = 0;
|
|
26
|
+
let checking = false;
|
|
27
|
+
let depth = 0;
|
|
28
|
+
function target(values, protocol) {
|
|
29
|
+
const first = values[0];
|
|
30
|
+
const hasUrl = typeof first === 'string' || first instanceof URL;
|
|
31
|
+
if (!hasUrl && (!first || typeof first !== 'object'))
|
|
32
|
+
return;
|
|
33
|
+
const base = hasUrl ? (0, url_1.urlToHttpOptions)(new URL(String(first))) : {};
|
|
34
|
+
const extra = hasUrl ? values[1] : first;
|
|
35
|
+
const options = {
|
|
36
|
+
...base,
|
|
37
|
+
...(extra && typeof extra === 'object' ? extra : {}),
|
|
38
|
+
};
|
|
39
|
+
const host = options.hostname || options.host || 'localhost';
|
|
40
|
+
const scheme = options.protocol || protocol;
|
|
41
|
+
const authority = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;
|
|
42
|
+
const url = new URL(`${scheme}//${authority}${options.port ? `:${options.port}` : ''}`);
|
|
43
|
+
// Assign path components separately: a path beginning // must not replace host.
|
|
44
|
+
const path = options.path || '/';
|
|
45
|
+
const split = path.indexOf('?');
|
|
46
|
+
url.pathname = split < 0 ? path : path.slice(0, split);
|
|
47
|
+
url.search = split < 0 ? '' : path.slice(split);
|
|
48
|
+
return {
|
|
49
|
+
url: url.href, host: url.hostname.replace(/^\[|\]$/g, ''), options,
|
|
50
|
+
callback: hasUrl ? typeof values[1] === 'function' ? values[1] : values[2] : values[1],
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function guarded(run) {
|
|
54
|
+
const previous = checking;
|
|
55
|
+
checking = true;
|
|
56
|
+
try {
|
|
57
|
+
run();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
if (error instanceof types_1.RaspBlockedError)
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
checking = previous;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function resolvedCheck(sink, url, inputs, addresses) {
|
|
68
|
+
guarded(() => { if ((0, engine_1.isActive)())
|
|
69
|
+
(0, engine_1.check)(sink, () => (0, detect_1.detectSsrf)(url, inputs, addresses)); });
|
|
70
|
+
}
|
|
71
|
+
function prepare(values, protocol, sink, always) {
|
|
72
|
+
let result = values;
|
|
73
|
+
guarded(() => {
|
|
74
|
+
if (!(0, engine_1.isActive)())
|
|
75
|
+
return;
|
|
76
|
+
const parsed = target(values, protocol);
|
|
77
|
+
if (!parsed)
|
|
78
|
+
return;
|
|
79
|
+
const ctx = (0, context_1.currentContext)();
|
|
80
|
+
const inputs = ctx ? (0, context_1.inputsOf)(ctx).map((input) => ({ ...input })) : [];
|
|
81
|
+
(0, engine_1.check)(sink, () => (0, engine_1.strongest)((0, detect_1.detectOutbound)(parsed.url, (0, engine_1.allowLists)().outboundHosts, always), (0, detect_1.detectSsrf)(parsed.url, inputs, [])));
|
|
82
|
+
if (inputs.length && !(0, net_1.isIP)(parsed.host)) {
|
|
83
|
+
const lookup = parsed.options.lookup || dns.lookup;
|
|
84
|
+
parsed.options.lookup = function (hostname, options, callback) {
|
|
85
|
+
// Keep the original lookup's arguments and callback shape, including all:true.
|
|
86
|
+
const wrapped = (...args) => {
|
|
87
|
+
if (!args[0]) {
|
|
88
|
+
try {
|
|
89
|
+
const answer = args[1];
|
|
90
|
+
const addresses = typeof answer === 'string' ? [answer]
|
|
91
|
+
: Array.isArray(answer) ? answer.map((entry) => entry.address) : [];
|
|
92
|
+
resolvedCheck(sink, parsed.url, inputs, addresses);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error instanceof types_1.RaspBlockedError) {
|
|
96
|
+
Reflect.apply(callback, undefined, [error]);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
Reflect.apply(callback, undefined, args);
|
|
102
|
+
};
|
|
103
|
+
Reflect.apply(lookup, this, [hostname, options, wrapped]);
|
|
104
|
+
};
|
|
105
|
+
result = typeof parsed.callback === 'function' ? [parsed.options, parsed.callback] : [parsed.options];
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
function copyProperties(original, wrapper) {
|
|
111
|
+
for (const key of Reflect.ownKeys(original)) {
|
|
112
|
+
if (key !== 'prototype')
|
|
113
|
+
Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(original, key));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Ends this generation (every wrapper stops checking) and puts back the
|
|
118
|
+
* originals where RASP's wrapper is still the current value. A wrapper put
|
|
119
|
+
* on top later (tracing) stays, calling RASP's, which now only passes through.
|
|
120
|
+
*/
|
|
121
|
+
function restore(saved) {
|
|
122
|
+
generation++;
|
|
123
|
+
for (let i = saved.length - 1; i >= 0; i--) {
|
|
124
|
+
const { owner, key, descriptor, wrapper } = saved[i];
|
|
125
|
+
if (Object.getOwnPropertyDescriptor(owner, key)?.value === wrapper)
|
|
126
|
+
Object.defineProperty(owner, key, descriptor);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function installHttpHooks(opts) {
|
|
130
|
+
if (installed)
|
|
131
|
+
return true;
|
|
132
|
+
const saved = [];
|
|
133
|
+
const gen = ++generation;
|
|
134
|
+
try {
|
|
135
|
+
const always = opts.alwaysAllowedHosts.slice();
|
|
136
|
+
const replace = (owner, key, build) => {
|
|
137
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, key);
|
|
138
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
139
|
+
throw new TypeError(key);
|
|
140
|
+
const wrapper = build(descriptor.value);
|
|
141
|
+
copyProperties(descriptor.value, wrapper);
|
|
142
|
+
Object.defineProperty(owner, key, { ...descriptor, value: wrapper });
|
|
143
|
+
saved.push({ owner, key, descriptor, wrapper });
|
|
144
|
+
};
|
|
145
|
+
for (const [owner, protocol, name] of [[http, 'http:', 'http'], [https, 'https:', 'https']]) {
|
|
146
|
+
for (const api of ['request', 'get'])
|
|
147
|
+
replace(owner, api, original => function (...values) {
|
|
148
|
+
const args = checking || depth || gen !== generation ? values : prepare(values, protocol, `${name}.${api}`, always);
|
|
149
|
+
depth++;
|
|
150
|
+
try {
|
|
151
|
+
return Reflect.apply(original, this, args);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
depth--;
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// fetch is optional: a runtime without it, or with fetch as an accessor
|
|
159
|
+
// (a polyfill), keeps the http/https hooks.
|
|
160
|
+
const fetchDescriptor = Object.getOwnPropertyDescriptor(globalThis, 'fetch');
|
|
161
|
+
if (typeof fetchDescriptor?.value === 'function' && fetchDescriptor.configurable)
|
|
162
|
+
replace(globalThis, 'fetch', original => async function (...values) {
|
|
163
|
+
if (checking || gen !== generation)
|
|
164
|
+
return Reflect.apply(original, this, values);
|
|
165
|
+
let url;
|
|
166
|
+
let inputs = [];
|
|
167
|
+
guarded(() => {
|
|
168
|
+
if (!(0, engine_1.isActive)())
|
|
169
|
+
return;
|
|
170
|
+
const first = values[0];
|
|
171
|
+
url = new URL(typeof first === 'string' || first instanceof URL ? String(first) : first.url);
|
|
172
|
+
const ctx = (0, context_1.currentContext)();
|
|
173
|
+
inputs = ctx ? (0, context_1.inputsOf)(ctx).map((input) => ({ ...input })) : [];
|
|
174
|
+
(0, engine_1.check)('fetch', () => (0, engine_1.strongest)((0, detect_1.detectOutbound)(url.href, (0, engine_1.allowLists)().outboundHosts, always), (0, detect_1.detectSsrf)(url.href, inputs, [])));
|
|
175
|
+
});
|
|
176
|
+
if (url && inputs.length && !(0, net_1.isIP)(url.hostname.replace(/^\[|\]$/g, ''))) {
|
|
177
|
+
try {
|
|
178
|
+
const addresses = await dns.promises.lookup(url.hostname, { all: true });
|
|
179
|
+
resolvedCheck('fetch', url.href, inputs, addresses.map(address => address.address));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error instanceof types_1.RaspBlockedError)
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Rebinding gap: fetch may resolve again for its connection. Node exposes
|
|
187
|
+
// no undici connector here without depending on the undici package.
|
|
188
|
+
return Reflect.apply(original, this, values);
|
|
189
|
+
});
|
|
190
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
191
|
+
installed = saved;
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
try {
|
|
196
|
+
restore(saved);
|
|
197
|
+
}
|
|
198
|
+
catch { /* Best effort if an external owner froze a property. */ }
|
|
199
|
+
try {
|
|
200
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
201
|
+
}
|
|
202
|
+
catch { /* Never throw on installation. */ }
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function uninstallHttpHooks() {
|
|
207
|
+
if (!installed)
|
|
208
|
+
return;
|
|
209
|
+
restore(installed);
|
|
210
|
+
installed = undefined;
|
|
211
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/rasp/hooks/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Require = (this: unknown, id: string) => unknown;
|
|
2
|
+
type Target = {
|
|
3
|
+
require: Require;
|
|
4
|
+
};
|
|
5
|
+
/** Wraps `Module.prototype.require`. Idempotent; never throws. */
|
|
6
|
+
export declare function installIncludeHooks(target?: Target): boolean;
|
|
7
|
+
/** Ends this generation; puts the original back where RASP's wrapper is still on top. Idempotent. */
|
|
8
|
+
export declare function uninstallIncludeHooks(): void;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installIncludeHooks = installIncludeHooks;
|
|
4
|
+
exports.uninstallIncludeHooks = uninstallIncludeHooks;
|
|
5
|
+
/**
|
|
6
|
+
* Module loading sink hook (README "Code", `code.include`): a module
|
|
7
|
+
* specifier passed to `require` (and the functions `module.createRequire`
|
|
8
|
+
* returns, which go through the same method) is checked during a request for
|
|
9
|
+
* a name or path that came from input. Dynamic `import()` is resolved by the
|
|
10
|
+
* ESM loader and is not covered here.
|
|
11
|
+
*
|
|
12
|
+
* `Module.prototype.require` is also wrapped by require-in-the-middle (the
|
|
13
|
+
* SDK's own instrumentations and OpenTelemetry's), so this hook follows the
|
|
14
|
+
* same rules as the others: one generation per install, a wrapper checks only
|
|
15
|
+
* while its generation is current, and uninstall restores the original only
|
|
16
|
+
* where RASP's wrapper is still on top.
|
|
17
|
+
*/
|
|
18
|
+
const Module = require("module");
|
|
19
|
+
const context_1 = require("../context");
|
|
20
|
+
const detect_1 = require("../detect");
|
|
21
|
+
const engine_1 = require("../engine");
|
|
22
|
+
/** Node's own `Module.prototype` (tests pass a stand-in: under Jest it is Jest's). */
|
|
23
|
+
const proto = Module.prototype;
|
|
24
|
+
let installed;
|
|
25
|
+
let generation = 0;
|
|
26
|
+
let checking = false;
|
|
27
|
+
function inspect(id) {
|
|
28
|
+
if (checking || typeof id !== 'string' || !(0, engine_1.isActive)())
|
|
29
|
+
return;
|
|
30
|
+
const ctx = (0, context_1.currentContext)();
|
|
31
|
+
if (!ctx?.inRequest)
|
|
32
|
+
return;
|
|
33
|
+
checking = true;
|
|
34
|
+
try {
|
|
35
|
+
(0, engine_1.check)('module.require', () => (0, detect_1.detectInclude)(id, (0, context_1.inputsOf)(ctx)));
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
checking = false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Wraps `Module.prototype.require`. Idempotent; never throws. */
|
|
42
|
+
function installIncludeHooks(target = proto) {
|
|
43
|
+
if (installed)
|
|
44
|
+
return true;
|
|
45
|
+
try {
|
|
46
|
+
const descriptor = Object.getOwnPropertyDescriptor(target, 'require');
|
|
47
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
48
|
+
return false;
|
|
49
|
+
const original = descriptor.value;
|
|
50
|
+
const gen = ++generation;
|
|
51
|
+
const wrapper = function (id) {
|
|
52
|
+
if (gen === generation)
|
|
53
|
+
inspect(id);
|
|
54
|
+
return Reflect.apply(original, this, [id]);
|
|
55
|
+
};
|
|
56
|
+
for (const key of Reflect.ownKeys(original)) {
|
|
57
|
+
if (key === 'prototype')
|
|
58
|
+
continue;
|
|
59
|
+
Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(original, key));
|
|
60
|
+
}
|
|
61
|
+
Object.defineProperty(target, 'require', { ...descriptor, value: wrapper });
|
|
62
|
+
installed = { target, descriptor, wrapper };
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Ends this generation; puts the original back where RASP's wrapper is still on top. Idempotent. */
|
|
70
|
+
function uninstallIncludeHooks() {
|
|
71
|
+
if (!installed)
|
|
72
|
+
return;
|
|
73
|
+
generation++;
|
|
74
|
+
const { target, descriptor, wrapper } = installed;
|
|
75
|
+
if (Object.getOwnPropertyDescriptor(target, 'require')?.value === wrapper)
|
|
76
|
+
Object.defineProperty(target, 'require', descriptor);
|
|
77
|
+
installed = undefined;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=include.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"include.js","sourceRoot":"","sources":["../../../src/rasp/hooks/include.ts"],"names":[],"mappings":";;AAyCA,kDAqBC;AAGD,sDAMC;AAvED;;;;;;;;;;;;GAYG;AACH,iCAAkC;AAClC,wCAAsD;AACtD,sCAA0C;AAC1C,sCAA4C;AAM5C,sFAAsF;AACtF,MAAM,KAAK,GAAI,MAA2C,CAAC,SAAS,CAAC;AACrE,IAAI,SAA4B,CAAC;AACjC,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,SAAS,OAAO,CAAC,EAAW;IAC1B,IAAI,QAAQ,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAA,iBAAQ,GAAE;QAAE,OAAO;IAC9D,MAAM,GAAG,GAAG,IAAA,wBAAc,GAAE,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,SAAS;QAAE,OAAO;IAC5B,QAAQ,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC;QACH,IAAA,cAAK,EAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAA,sBAAa,EAAC,EAAE,EAAE,IAAA,kBAAQ,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,SAAgB,mBAAmB,CAAC,SAAiB,KAAK;IACxD,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QACxE,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAgB,CAAC;QAC7C,MAAM,GAAG,GAAG,EAAE,UAAU,CAAC;QACzB,MAAM,OAAO,GAAG,UAAyB,EAAU;YACjD,IAAI,GAAG,KAAK,UAAU;gBAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACpC,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAY,CAAC;QACb,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,GAAG,KAAK,WAAW;gBAAE,SAAS;YAClC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAE,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,SAAS,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,qGAAqG;AACrG,SAAgB,qBAAqB;IACnC,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,UAAU,EAAE,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;IAClD,IAAI,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,KAAK,OAAO;QAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChI,SAAS,GAAG,SAAS,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markRaspWrapper = markRaspWrapper;
|
|
4
|
+
exports.isRaspWrapper = isRaspWrapper;
|
|
5
|
+
/**
|
|
6
|
+
* Marks RASP's own library wrappers, so a sink rule never wraps a function a
|
|
7
|
+
* built-in hook already checks (one check per call).
|
|
8
|
+
*/
|
|
9
|
+
const wrappers = new WeakSet();
|
|
10
|
+
function markRaspWrapper(fn) {
|
|
11
|
+
wrappers.add(fn);
|
|
12
|
+
}
|
|
13
|
+
function isRaspWrapper(fn) {
|
|
14
|
+
return typeof fn === 'function' && wrappers.has(fn);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=marks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marks.js","sourceRoot":"","sources":["../../../src/rasp/hooks/marks.ts"],"names":[],"mappings":";;AAMA,0CAEC;AAED,sCAEC;AAZD;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAU,CAAC;AAEvC,SAAgB,eAAe,CAAC,EAAU;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC;AAED,SAAgB,aAAa,CAAC,EAAW;IACvC,OAAO,OAAO,EAAE,KAAK,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Finding, RaspInput } from '../types';
|
|
2
|
+
export type ProcessApi = 'exec' | 'execSync' | 'spawn' | 'spawnSync' | 'execFile' | 'execFileSync' | 'fork';
|
|
3
|
+
export declare const PROCESS_APIS: readonly ProcessApi[];
|
|
4
|
+
/** What a call is about to run: a shell command line, or an argv. */
|
|
5
|
+
export type ProcessTarget = {
|
|
6
|
+
command: string;
|
|
7
|
+
} | {
|
|
8
|
+
argv: string[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The call's target, or null when the arguments are not ones Node accepts
|
|
12
|
+
* (Node then raises its own error). The caller's argv is copied.
|
|
13
|
+
*/
|
|
14
|
+
export declare function processTarget(api: ProcessApi, values: unknown[]): ProcessTarget | null;
|
|
15
|
+
/** Every finding of the contract's command checks for one target, in the contract's order. */
|
|
16
|
+
export declare function processFindings(target: ProcessTarget, inputs: RaspInput[], inRequest: boolean, allow: string[]): Finding[];
|
|
17
|
+
/** The first finding of the contract's command checks for one target. */
|
|
18
|
+
export declare function detectProcess(target: ProcessTarget, inputs: RaspInput[], inRequest: boolean, allow: string[]): Finding | null;
|
|
19
|
+
/** Replaces the child_process functions with checked ones. Idempotent; never throws. */
|
|
20
|
+
export declare function installProcessHooks(): boolean;
|
|
21
|
+
/** Puts the original functions back exactly. Idempotent. */
|
|
22
|
+
export declare function uninstallProcessHooks(): void;
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROCESS_APIS = void 0;
|
|
4
|
+
exports.processTarget = processTarget;
|
|
5
|
+
exports.processFindings = processFindings;
|
|
6
|
+
exports.detectProcess = detectProcess;
|
|
7
|
+
exports.installProcessHooks = installProcessHooks;
|
|
8
|
+
exports.uninstallProcessHooks = uninstallProcessHooks;
|
|
9
|
+
/**
|
|
10
|
+
* child_process sink hook (README "Command"): every way Node starts a
|
|
11
|
+
* process is checked before the process starts. Shell-interpreted commands
|
|
12
|
+
* (`exec`, `execSync`, and `spawn`/`execFile` family calls with `shell`)
|
|
13
|
+
* go through `detectCommand` and `shell_spawn`; argv spawns go through
|
|
14
|
+
* `detectArgv`, the script of `sh -c <script>`, and `shell_spawn`.
|
|
15
|
+
*
|
|
16
|
+
* The module's functions are replaced in place by wrappers with the same
|
|
17
|
+
* `name`, `length` and properties, and `syncBuiltinESMExports` carries the
|
|
18
|
+
* change to ESM named imports. Not a Proxy: `exec` and `execFile` carry a
|
|
19
|
+
* read-only `util.promisify.custom` that a Proxy may not replace, and the
|
|
20
|
+
* original's would skip the check. A function an app took out of the module before
|
|
21
|
+
* install (`const { exec } = require('child_process')` at load) is not
|
|
22
|
+
* covered; initialise Shield360 before loading the app's modules.
|
|
23
|
+
*
|
|
24
|
+
* Fail open: anything that goes wrong in the hook lets the call through,
|
|
25
|
+
* and Node validates its own arguments as before. Drafted with ChatGPT,
|
|
26
|
+
* reviewed and adapted by the repository owner.
|
|
27
|
+
*/
|
|
28
|
+
const cp = require("child_process");
|
|
29
|
+
const module_1 = require("module");
|
|
30
|
+
const util_1 = require("util");
|
|
31
|
+
const context_1 = require("../context");
|
|
32
|
+
const detect_1 = require("../detect");
|
|
33
|
+
const engine_1 = require("../engine");
|
|
34
|
+
exports.PROCESS_APIS = ['exec', 'execSync', 'spawn', 'spawnSync', 'execFile', 'execFileSync', 'fork'];
|
|
35
|
+
let installed;
|
|
36
|
+
/** Bumped by every install and uninstall: a wrapper checks only while its generation is current. */
|
|
37
|
+
let generation = 0;
|
|
38
|
+
let checking = false;
|
|
39
|
+
/**
|
|
40
|
+
* The call's target, or null when the arguments are not ones Node accepts
|
|
41
|
+
* (Node then raises its own error). The caller's argv is copied.
|
|
42
|
+
*/
|
|
43
|
+
function processTarget(api, values) {
|
|
44
|
+
const first = values[0];
|
|
45
|
+
if (api === 'exec' || api === 'execSync')
|
|
46
|
+
return typeof first === 'string' ? { command: first } : null;
|
|
47
|
+
const file = typeof first === 'string' ? first : api === 'fork' && first instanceof URL ? first.href : undefined;
|
|
48
|
+
if (file === undefined)
|
|
49
|
+
return null;
|
|
50
|
+
const args = Array.isArray(values[1]) ? values[1] : undefined;
|
|
51
|
+
if (args?.some((a) => typeof a !== 'string'))
|
|
52
|
+
return null;
|
|
53
|
+
const rest = args?.slice() ?? [];
|
|
54
|
+
const candidate = values[args ? 2 : 1];
|
|
55
|
+
const options = candidate !== null && typeof candidate === 'object' ? candidate : undefined;
|
|
56
|
+
if (api === 'fork') {
|
|
57
|
+
// fork runs a module under Node, or under options.execPath when given.
|
|
58
|
+
const exe = typeof options?.execPath === 'string' && options.execPath ? options.execPath : process.execPath;
|
|
59
|
+
return { argv: [exe, file, ...rest] };
|
|
60
|
+
}
|
|
61
|
+
const shell = options?.shell;
|
|
62
|
+
if (shell === true || (typeof shell === 'string' && shell !== '')) {
|
|
63
|
+
// Node joins the file and arguments with spaces and hands the line to the shell.
|
|
64
|
+
return { command: [file, ...rest].join(' ') };
|
|
65
|
+
}
|
|
66
|
+
return { argv: [file, ...rest] };
|
|
67
|
+
}
|
|
68
|
+
/** Every finding of the contract's command checks for one target, in the contract's order. */
|
|
69
|
+
function processFindings(target, inputs, inRequest, allow) {
|
|
70
|
+
let found;
|
|
71
|
+
if ('command' in target) {
|
|
72
|
+
found = [(0, detect_1.detectCommand)(target.command, inputs), (0, detect_1.detectShellSpawn)({ command: target.command, inRequest, allow })];
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const { argv } = target;
|
|
76
|
+
const script = (0, detect_1.shellScriptOf)(argv);
|
|
77
|
+
found = [(0, detect_1.detectArgv)(argv, inputs)];
|
|
78
|
+
if (script)
|
|
79
|
+
found.push((0, detect_1.detectCommand)(script, inputs), (0, detect_1.detectShellSpawn)({ command: script, inRequest: false, allow }));
|
|
80
|
+
found.push((0, detect_1.detectShellSpawn)({ argv0: argv[0], inRequest, allow }));
|
|
81
|
+
}
|
|
82
|
+
return found.filter((f) => f !== null);
|
|
83
|
+
}
|
|
84
|
+
/** The first finding of the contract's command checks for one target. */
|
|
85
|
+
function detectProcess(target, inputs, inRequest, allow) {
|
|
86
|
+
return processFindings(target, inputs, inRequest, allow)[0] ?? null;
|
|
87
|
+
}
|
|
88
|
+
function inspect(api, values) {
|
|
89
|
+
if (checking || !(0, engine_1.isActive)())
|
|
90
|
+
return;
|
|
91
|
+
checking = true;
|
|
92
|
+
try {
|
|
93
|
+
// check() reports what it finds and throws only the block error.
|
|
94
|
+
(0, engine_1.check)(`child_process.${api}`, () => {
|
|
95
|
+
const target = processTarget(api, values);
|
|
96
|
+
if (!target)
|
|
97
|
+
return null;
|
|
98
|
+
const ctx = (0, context_1.currentContext)();
|
|
99
|
+
// The strongest decision wins: a finding in monitor or off mode never hides one that blocks.
|
|
100
|
+
return (0, engine_1.strongest)(...processFindings(target, ctx ? (0, context_1.inputsOf)(ctx) : [], Boolean(ctx?.inRequest), (0, engine_1.allowLists)().commands));
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
checking = false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Replaces the child_process functions with checked ones. Idempotent; never throws. */
|
|
108
|
+
function installProcessHooks() {
|
|
109
|
+
if (installed)
|
|
110
|
+
return true;
|
|
111
|
+
const saved = new Map();
|
|
112
|
+
const gen = ++generation;
|
|
113
|
+
try {
|
|
114
|
+
for (const api of exports.PROCESS_APIS) {
|
|
115
|
+
const descriptor = Object.getOwnPropertyDescriptor(cp, api);
|
|
116
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
117
|
+
throw new TypeError(api);
|
|
118
|
+
const original = descriptor.value;
|
|
119
|
+
const wrapper = function (...values) {
|
|
120
|
+
if (gen === generation)
|
|
121
|
+
inspect(api, values);
|
|
122
|
+
return Reflect.apply(original, this, values);
|
|
123
|
+
};
|
|
124
|
+
saved.set(api, { descriptor, wrapper });
|
|
125
|
+
for (const key of Reflect.ownKeys(original)) {
|
|
126
|
+
if (key === 'prototype' || key === util_1.promisify.custom)
|
|
127
|
+
continue;
|
|
128
|
+
Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(original, key));
|
|
129
|
+
}
|
|
130
|
+
// Node's own promisified exec/execFile closes over the original function;
|
|
131
|
+
// rebuild it around the wrapper so promisify() cannot skip the check.
|
|
132
|
+
const promisified = (...values) => {
|
|
133
|
+
let child;
|
|
134
|
+
const promise = new Promise((resolve, reject) => {
|
|
135
|
+
child = Reflect.apply(wrapper, undefined, [
|
|
136
|
+
...values,
|
|
137
|
+
(error, stdout, stderr) => {
|
|
138
|
+
if (error)
|
|
139
|
+
reject(Object.assign(error, { stdout, stderr }));
|
|
140
|
+
else
|
|
141
|
+
resolve({ stdout, stderr });
|
|
142
|
+
},
|
|
143
|
+
]);
|
|
144
|
+
});
|
|
145
|
+
return Object.assign(promise, { child });
|
|
146
|
+
};
|
|
147
|
+
if (api === 'exec' || api === 'execFile')
|
|
148
|
+
Object.defineProperty(wrapper, util_1.promisify.custom, { value: promisified });
|
|
149
|
+
Object.defineProperty(cp, api, { ...descriptor, value: wrapper });
|
|
150
|
+
}
|
|
151
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
152
|
+
installed = saved;
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
restore(saved);
|
|
157
|
+
try {
|
|
158
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// never
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Ends this generation (every wrapper stops checking) and puts back the
|
|
168
|
+
* originals where RASP's wrapper is still the current value. A wrapper put
|
|
169
|
+
* on top later (tracing) stays, calling RASP's, which now only passes through.
|
|
170
|
+
*/
|
|
171
|
+
function restore(saved) {
|
|
172
|
+
generation++;
|
|
173
|
+
for (const [api, { descriptor, wrapper }] of saved) {
|
|
174
|
+
if (Object.getOwnPropertyDescriptor(cp, api)?.value === wrapper)
|
|
175
|
+
Object.defineProperty(cp, api, descriptor);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Puts the original functions back exactly. Idempotent. */
|
|
179
|
+
function uninstallProcessHooks() {
|
|
180
|
+
if (!installed)
|
|
181
|
+
return;
|
|
182
|
+
restore(installed);
|
|
183
|
+
installed = undefined;
|
|
184
|
+
try {
|
|
185
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// never
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/rasp/hooks/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sink rules (README "Sink rules"): data from the built-in list or the
|
|
3
|
+
* verified signed config that points an existing detector at a library
|
|
4
|
+
* function the SDK does not hook itself. No rule carries code: a rule names
|
|
5
|
+
* a module, a dotted path to a function, an argument and one of the checks,
|
|
6
|
+
* and the generic wrapper here runs that check.
|
|
7
|
+
*
|
|
8
|
+
* Rules are applied to modules already loaded and, through one
|
|
9
|
+
* require-in-the-middle registration per rule set, to modules loaded later.
|
|
10
|
+
* Wrappers are RASP's own (not shimmer's), as in the database hook, so
|
|
11
|
+
* tracing that wraps the same function stacks in either order.
|
|
12
|
+
*/
|
|
13
|
+
import { InstrumentationBase, InstrumentationNodeModuleDefinition } from '@opentelemetry/instrumentation';
|
|
14
|
+
import { type DeserFormat, type FileOp } from '../detect';
|
|
15
|
+
import { type SqlDialect } from '../lexers';
|
|
16
|
+
import { type RaspMode } from '../types';
|
|
17
|
+
export type SinkCheck = 'sql' | 'nosql' | 'command' | 'path' | 'ssrf' | 'code' | 'deser' | 'xml';
|
|
18
|
+
export type SinkRule = {
|
|
19
|
+
id: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
runtimes?: string[];
|
|
22
|
+
module: string;
|
|
23
|
+
target: string;
|
|
24
|
+
check: SinkCheck;
|
|
25
|
+
arg: number;
|
|
26
|
+
field?: string;
|
|
27
|
+
dialect?: SqlDialect;
|
|
28
|
+
op?: FileOp;
|
|
29
|
+
format?: DeserFormat;
|
|
30
|
+
resolvesExternal?: boolean;
|
|
31
|
+
action: Exclude<RaspMode, 'off'>;
|
|
32
|
+
};
|
|
33
|
+
/** One rule, checked field by field; null drops it (never the whole list). */
|
|
34
|
+
export declare function parseSinkRule(raw: unknown): SinkRule | null;
|
|
35
|
+
/** A list: at most 64 rules, invalid ones dropped, duplicate ids keep the first. */
|
|
36
|
+
export declare function parseSinkRules(raw: unknown): SinkRule[];
|
|
37
|
+
export declare const BUILT_IN_SINKS: SinkRule[];
|
|
38
|
+
/** Registers the rule set's modules for when the app loads them. */
|
|
39
|
+
export declare class RaspSinkInstrumentation extends InstrumentationBase {
|
|
40
|
+
constructor();
|
|
41
|
+
protected init(): InstrumentationNodeModuleDefinition[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Makes `rules` the rule set: rules no longer listed stop checking at once,
|
|
45
|
+
* new ones apply to loaded modules now and to others when loaded. Never throws.
|
|
46
|
+
*/
|
|
47
|
+
export declare function setSinkRules(rules: SinkRule[]): void;
|
|
48
|
+
/** The rule set in force (tests, diagnostics). */
|
|
49
|
+
export declare function sinkRules(): SinkRule[];
|
|
50
|
+
/** Applies the built-in rules. Idempotent; never throws. */
|
|
51
|
+
export declare function installSinkHooks(): boolean;
|
|
52
|
+
export declare function uninstallSinkHooks(): void;
|
|
53
|
+
/** Tests: apply one rule to a module object directly. */
|
|
54
|
+
export declare function applySinkRule(rule: SinkRule, exports: unknown): void;
|