shield360 1.0.1 → 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 +392 -37
- package/dist/__tests__/build-info.test.d.ts +1 -0
- package/dist/__tests__/build-info.test.js +196 -0
- package/dist/__tests__/build-info.test.js.map +1 -0
- package/dist/__tests__/code-location.test.d.ts +1 -0
- package/dist/__tests__/code-location.test.js +180 -0
- package/dist/__tests__/code-location.test.js.map +1 -0
- 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__/pricing-claude-5.test.js +3 -0
- package/dist/__tests__/pricing-claude-5.test.js.map +1 -1
- 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/config.js +1 -1
- package/dist/config.js.map +1 -1
- 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 +28 -9
- package/dist/guard/__tests__/findings.test.js.map +1 -1
- package/dist/guard/__tests__/report.test.js +67 -0
- package/dist/guard/__tests__/report.test.js.map +1 -1
- package/dist/guard/base.d.ts +2 -0
- package/dist/guard/base.js +4 -0
- package/dist/guard/base.js.map +1 -1
- package/dist/guard/findings.d.ts +12 -2
- package/dist/guard/findings.js +19 -49
- package/dist/guard/findings.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 +33 -3
- package/dist/guard/integration.js +106 -32
- package/dist/guard/integration.js.map +1 -1
- package/dist/guard/pipeline.d.ts +10 -1
- package/dist/guard/pipeline.js +14 -0
- package/dist/guard/pipeline.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 +90 -0
- package/dist/index.js +225 -3
- 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/mcp/wrapper.js +7 -1
- package/dist/instrumentation/mcp/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 +23 -0
- package/dist/otel/build-info.js +176 -0
- package/dist/otel/build-info.js.map +1 -0
- package/dist/otel/code-location.d.ts +49 -0
- package/dist/otel/code-location.js +233 -0
- package/dist/otel/code-location.js.map +1 -0
- 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 +12 -1
- package/dist/otel/tracing.js.map +1 -1
- package/dist/pricing.json +100 -42
- package/dist/protect/__tests__/protect.test.d.ts +1 -0
- package/dist/protect/__tests__/protect.test.js +210 -0
- package/dist/protect/__tests__/protect.test.js.map +1 -0
- package/dist/protect/index.d.ts +103 -0
- package/dist/protect/index.js +196 -0
- package/dist/protect/index.js.map +1 -0
- package/dist/protect/mcp.d.ts +13 -0
- package/dist/protect/mcp.js +49 -0
- package/dist/protect/mcp.js.map +1 -0
- package/dist/protect/mode.d.ts +89 -0
- package/dist/protect/mode.js +134 -0
- package/dist/protect/mode.js.map +1 -0
- 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 +96 -0
- 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,568 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lowerHeaders = void 0;
|
|
4
|
+
exports.isRaspBlocked = isRaspBlocked;
|
|
5
|
+
exports.sendBlocked = sendBlocked;
|
|
6
|
+
exports.blockedResponse = blockedResponse;
|
|
7
|
+
exports.sendNotFound = sendNotFound;
|
|
8
|
+
exports.frameworkServes = frameworkServes;
|
|
9
|
+
exports.sendExpressNotFound = sendExpressNotFound;
|
|
10
|
+
exports.raspExpress = raspExpress;
|
|
11
|
+
exports.raspExpressErrorHandler = raspExpressErrorHandler;
|
|
12
|
+
exports.raspFastify = raspFastify;
|
|
13
|
+
exports.raspKoa = raspKoa;
|
|
14
|
+
exports.raspHttp = raspHttp;
|
|
15
|
+
exports.recordRequestBody = recordRequestBody;
|
|
16
|
+
exports.withRasp = withRasp;
|
|
17
|
+
const capture_1 = require("./capture");
|
|
18
|
+
Object.defineProperty(exports, "lowerHeaders", { enumerable: true, get: function () { return capture_1.lowerHeaders; } });
|
|
19
|
+
const context_1 = require("./context");
|
|
20
|
+
const deception_1 = require("./deception");
|
|
21
|
+
const engine_1 = require("./engine");
|
|
22
|
+
const types_1 = require("./types");
|
|
23
|
+
function isRaspBlocked(e) {
|
|
24
|
+
return e instanceof types_1.RaspBlockedError;
|
|
25
|
+
}
|
|
26
|
+
const BLOCK_HEADERS = { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' };
|
|
27
|
+
/** Writes the 403 on a Node response (no-op once the headers are out). */
|
|
28
|
+
function sendBlocked(res, e) {
|
|
29
|
+
try {
|
|
30
|
+
if (res.headersSent || res.writableEnded) {
|
|
31
|
+
if (!res.writableEnded)
|
|
32
|
+
res.end();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
res.statusCode = 403;
|
|
36
|
+
for (const [k, v] of Object.entries(BLOCK_HEADERS))
|
|
37
|
+
res.setHeader(k, v);
|
|
38
|
+
res.end(JSON.stringify((0, types_1.blockBody)(e)));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// the response is already gone
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** The 403 as a fetch Response (Next.js and other fetch-style handlers). */
|
|
45
|
+
function blockedResponse(e) {
|
|
46
|
+
return new Response(JSON.stringify((0, types_1.blockBody)(e)), { status: 403, headers: BLOCK_HEADERS });
|
|
47
|
+
}
|
|
48
|
+
/** The client address: the framework's own (Express `req.ip` honors `trust proxy`), else the socket's peer. */
|
|
49
|
+
const ipOf = (own, req) => {
|
|
50
|
+
const v = typeof own === 'string' && own ? own : req?.socket?.remoteAddress;
|
|
51
|
+
return typeof v === 'string' && v ? v : undefined;
|
|
52
|
+
};
|
|
53
|
+
/** Deception, unless the zero-code capture already ran it for this request (it answers decoys itself). */
|
|
54
|
+
function deceive(r) {
|
|
55
|
+
return (0, context_1.currentContext)()?.deception ? {} : (0, deception_1.checkDeception)(r);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The 404 where a framework has no not-found of its own (raw `http`, the
|
|
59
|
+
* zero-code capture): `404 Not Found` as plain text.
|
|
60
|
+
*/
|
|
61
|
+
function sendNotFound(res) {
|
|
62
|
+
try {
|
|
63
|
+
if (res.headersSent || res.writableEnded) {
|
|
64
|
+
if (!res.writableEnded)
|
|
65
|
+
res.end();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
res.statusCode = 404;
|
|
69
|
+
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
70
|
+
res.setHeader('Content-Length', '9');
|
|
71
|
+
res.end('Not Found');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// the response is already gone
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const FRAMEWORK_SERVER = Symbol.for('shield360.rasp.frameworkServer');
|
|
78
|
+
/** Notes that a framework adapter serves this server, so the zero-code capture leaves deception to it. */
|
|
79
|
+
function markFrameworkServer(server) {
|
|
80
|
+
try {
|
|
81
|
+
if (server && typeof server === 'object' && !server[FRAMEWORK_SERVER]) {
|
|
82
|
+
Object.defineProperty(server, FRAMEWORK_SERVER, { value: true, configurable: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// best effort
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const socketServer = (req) => req?.socket?.server;
|
|
90
|
+
/**
|
|
91
|
+
* Whether a server's `request` listener is a framework app, which resolves the
|
|
92
|
+
* client address itself (`trust proxy`) and has its own not-found: an Express
|
|
93
|
+
* 4/5 app (the app function, with `handle`, `use`, `set` and `settings`), Koa's
|
|
94
|
+
* `callback()` (`handleRequest`) or Fastify's router entry (`preRouting`); the
|
|
95
|
+
* last two are bare closures, so only their names tell. A server an adapter
|
|
96
|
+
* already served (`raspFastify` notes its server when registered, the others
|
|
97
|
+
* on their first request) counts too, which covers a renamed or wrapped app.
|
|
98
|
+
*/
|
|
99
|
+
function frameworkServes(server) {
|
|
100
|
+
try {
|
|
101
|
+
const s = server;
|
|
102
|
+
if (!s)
|
|
103
|
+
return false;
|
|
104
|
+
if (s[FRAMEWORK_SERVER])
|
|
105
|
+
return true;
|
|
106
|
+
for (const raw of s.rawListeners?.('request') ?? []) {
|
|
107
|
+
// once() listeners are wrapped; the app is the wrapper's `listener`.
|
|
108
|
+
const l = raw.listener ?? raw;
|
|
109
|
+
if (typeof l !== 'function')
|
|
110
|
+
continue;
|
|
111
|
+
const o = l;
|
|
112
|
+
if (typeof o.handle === 'function' && typeof o.use === 'function' && typeof o.set === 'function' && o.settings && typeof o.settings === 'object')
|
|
113
|
+
return true;
|
|
114
|
+
if (l.name === 'handleRequest' || l.name === 'preRouting')
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// unknown: treat as plain
|
|
120
|
+
}
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
const contentTypeOf = (h) => {
|
|
124
|
+
const v = h?.['content-type'];
|
|
125
|
+
return typeof v === 'string' ? v : undefined;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Starts a request context. Returns the context, `blocked` with the error
|
|
129
|
+
* when a virtual patch blocks, or undefined when capture failed (fail open).
|
|
130
|
+
* `noBody` says the request has no body at all (its body is known, empty).
|
|
131
|
+
*/
|
|
132
|
+
function begin(make, body, noBody) {
|
|
133
|
+
let ctx;
|
|
134
|
+
try {
|
|
135
|
+
ctx = make();
|
|
136
|
+
const b = body();
|
|
137
|
+
if (b && b.body !== undefined && b.body !== null)
|
|
138
|
+
(0, capture_1.captureBody)(ctx, b);
|
|
139
|
+
else {
|
|
140
|
+
// A body that shows up anyway (an adapter that sent no length) is still captured late.
|
|
141
|
+
(0, capture_1.captureLater)(ctx, body);
|
|
142
|
+
if (noBody?.())
|
|
143
|
+
(0, capture_1.captureNoBody)(ctx);
|
|
144
|
+
}
|
|
145
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
146
|
+
return { ctx };
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
150
|
+
return { blocked: e };
|
|
151
|
+
return { ctx: undefined };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const URL_UNSAFE = /(?:[^\x21\x23-\x3B\x3D\x3F-\x5F\x61-\x7A\x7C\x7E]|%(?:[^0-9A-Fa-f]|[0-9A-Fa-f][^0-9A-Fa-f]|$))+/g;
|
|
155
|
+
const SURROGATE = /([\uD800-\uDBFF][\uDC00-\uDFFF])|[\uD800-\uDFFF]/g;
|
|
156
|
+
const HTML_ESCAPES = { '"': '"', '&': '&', "'": ''', '<': '<', '>': '>' };
|
|
157
|
+
/**
|
|
158
|
+
* Express's own answer to an unknown path, byte for byte: finalhandler's 404
|
|
159
|
+
* (`Cannot GET /path` in its HTML page, with its security headers), which
|
|
160
|
+
* Express 4 and 5 send when no route matches. It is written here rather than
|
|
161
|
+
* reached with `next('router')`: that only leaves the router the middleware
|
|
162
|
+
* is mounted on, so mounted on a sub-router it would go on to the parent's
|
|
163
|
+
* handlers, and at the app level it skips the app's own 404 middleware just
|
|
164
|
+
* the same. An app with its own 404 page passes `raspExpress({ notFound })`.
|
|
165
|
+
*/
|
|
166
|
+
function sendExpressNotFound(req, res) {
|
|
167
|
+
try {
|
|
168
|
+
if (res.headersSent || res.writableEnded) {
|
|
169
|
+
if (!res.writableEnded)
|
|
170
|
+
res.end();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// finalhandler: 'Cannot ' + method + ' ' + encodeUrl(pathname of the original URL), HTML-escaped.
|
|
174
|
+
const target = req.originalUrl || req.url || '/';
|
|
175
|
+
const end = target.search(/[?#]/);
|
|
176
|
+
const path = (end >= 0 ? target.slice(0, end) : target).replace(SURROGATE, (_, pair) => pair || '\uFFFD').replace(URL_UNSAFE, encodeURI);
|
|
177
|
+
const message = `Cannot ${req.method} ${path}`
|
|
178
|
+
.replace(/["&'<>]/g, (c) => HTML_ESCAPES[c])
|
|
179
|
+
.replace(/\n/g, '<br>')
|
|
180
|
+
.replace(/ {2}/g, ' ');
|
|
181
|
+
const body = `<!DOCTYPE html>\n<html lang="en">\n<head>\n<meta charset="utf-8">\n<title>Error</title>\n</head>\n<body>\n<pre>${message}</pre>\n</body>\n</html>\n`;
|
|
182
|
+
res.statusCode = 404;
|
|
183
|
+
if (req.httpVersionMajor < 2)
|
|
184
|
+
res.statusMessage = 'Not Found';
|
|
185
|
+
res.removeHeader('Content-Encoding');
|
|
186
|
+
res.removeHeader('Content-Language');
|
|
187
|
+
res.removeHeader('Content-Range');
|
|
188
|
+
res.setHeader('Content-Security-Policy', "default-src 'none'");
|
|
189
|
+
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
190
|
+
res.setHeader('Content-Type', 'text/html; charset=utf-8');
|
|
191
|
+
res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'));
|
|
192
|
+
if (req.method === 'HEAD')
|
|
193
|
+
res.end();
|
|
194
|
+
else
|
|
195
|
+
res.end(body, 'utf8');
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// the response is already gone
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Express (4 and 5). Register it after the body parsers so the body is seen
|
|
203
|
+
* before the handler; registered earlier, the body is still captured when a
|
|
204
|
+
* sink first reads the inputs.
|
|
205
|
+
*
|
|
206
|
+
* app.use(express.json());
|
|
207
|
+
* app.use(raspExpress());
|
|
208
|
+
* ...routes...
|
|
209
|
+
* app.use(raspExpressErrorHandler());
|
|
210
|
+
*/
|
|
211
|
+
function raspExpress(options = {}) {
|
|
212
|
+
return function shield360Rasp(req, res, next) {
|
|
213
|
+
if (!(0, engine_1.isActive)())
|
|
214
|
+
return next();
|
|
215
|
+
markFrameworkServer(socketServer(req));
|
|
216
|
+
// The full target the client sent (`originalUrl`: a router mount does not strip it).
|
|
217
|
+
const d = deceive({ framework: 'express', method: req.method || 'GET', url: req.originalUrl || req.url || '/', ip: ipOf(req.ip, req) });
|
|
218
|
+
if (d.notFound) {
|
|
219
|
+
try {
|
|
220
|
+
if (options.notFound)
|
|
221
|
+
return options.notFound(req, res);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// the app's page failed: Express's own 404 below
|
|
225
|
+
}
|
|
226
|
+
return sendExpressNotFound(req, res);
|
|
227
|
+
}
|
|
228
|
+
if (d.blocked)
|
|
229
|
+
return sendBlocked(res, d.blocked);
|
|
230
|
+
const r = begin(() => (0, capture_1.captureRequest)({
|
|
231
|
+
framework: 'express',
|
|
232
|
+
method: req.method || 'GET',
|
|
233
|
+
url: req.originalUrl || req.url || '/',
|
|
234
|
+
headers: req.headers,
|
|
235
|
+
query: req.query,
|
|
236
|
+
params: req.params,
|
|
237
|
+
ip: ipOf(req.ip, req),
|
|
238
|
+
}), () => {
|
|
239
|
+
const files = req.files ?? req.file;
|
|
240
|
+
return req.body === undefined && files === undefined ? undefined : { body: req.body ?? {}, contentType: contentTypeOf(req.headers), files };
|
|
241
|
+
}, () => (0, capture_1.bodyAbsent)(req.headers, req.httpVersionMajor));
|
|
242
|
+
if (r.blocked)
|
|
243
|
+
return sendBlocked(res, r.blocked);
|
|
244
|
+
if (!r.ctx)
|
|
245
|
+
return next();
|
|
246
|
+
context_1.storage.run(r.ctx, () => next());
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/** Maps the block error from a handler to the 403; passes every other error on. */
|
|
250
|
+
function raspExpressErrorHandler() {
|
|
251
|
+
return function shield360RaspErrors(err, _req, res, next) {
|
|
252
|
+
if (isRaspBlocked(err))
|
|
253
|
+
return sendBlocked(res, err);
|
|
254
|
+
next(err);
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
const FASTIFY_CTX = Symbol('shield360.rasp.context');
|
|
258
|
+
function fastifyBlocked(reply, e) {
|
|
259
|
+
try {
|
|
260
|
+
let r = reply.code(403);
|
|
261
|
+
for (const [k, v] of Object.entries(BLOCK_HEADERS))
|
|
262
|
+
r = r.header(k, v);
|
|
263
|
+
r.send(JSON.stringify((0, types_1.blockBody)(e)));
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// the reply is already gone
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* A decoy gets Fastify's not-found: `reply.callNotFound()` (the app's
|
|
271
|
+
* `setNotFoundHandler`, else Fastify's JSON 404). A decoy that matches no
|
|
272
|
+
* route is already on its way to that handler, so the request just goes on
|
|
273
|
+
* (callNotFound from there would send a bare 404 instead).
|
|
274
|
+
*/
|
|
275
|
+
function fastifyNotFound(request, reply, next) {
|
|
276
|
+
if (request.is404)
|
|
277
|
+
return next();
|
|
278
|
+
try {
|
|
279
|
+
if (typeof reply.callNotFound === 'function') {
|
|
280
|
+
reply.callNotFound();
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
reply.code(404).send({ message: `Route ${request.method}:${request.url} not found`, error: 'Not Found', statusCode: 404 });
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// the reply is already gone
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
function fastifyNoBody(method, headers) {
|
|
290
|
+
const m = method.toUpperCase();
|
|
291
|
+
if (m === 'GET' || m === 'HEAD')
|
|
292
|
+
return true;
|
|
293
|
+
if (!(0, capture_1.bodyAbsent)(headers))
|
|
294
|
+
return false;
|
|
295
|
+
const len = headers['content-length'];
|
|
296
|
+
return headers['content-type'] === undefined || (typeof len === 'string' && len.trim() === '0');
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Fastify plugin: `fastify.register(raspFastify)`. Applies to every route
|
|
300
|
+
* (it skips encapsulation, as fastify-plugin would). Inputs are captured in
|
|
301
|
+
* `onRequest`, the body in `preHandler`. A handler that lets the block error
|
|
302
|
+
* through gets a 403 from Fastify's default error handler (`statusCode`).
|
|
303
|
+
*/
|
|
304
|
+
function raspFastify(fastify, _opts, done) {
|
|
305
|
+
markFrameworkServer(fastify.server);
|
|
306
|
+
fastify.addHook('onRequest', (request, reply, next) => {
|
|
307
|
+
if (!(0, engine_1.isActive)())
|
|
308
|
+
return next();
|
|
309
|
+
const d = deceive({ framework: 'fastify', method: request.method, url: request.url, ip: ipOf(request.ip) });
|
|
310
|
+
if (d.notFound)
|
|
311
|
+
return fastifyNotFound(request, reply, next);
|
|
312
|
+
if (d.blocked)
|
|
313
|
+
return fastifyBlocked(reply, d.blocked);
|
|
314
|
+
const route = request.routeOptions?.url ?? request.routerPath;
|
|
315
|
+
const r = begin(() => (0, capture_1.captureRequest)({
|
|
316
|
+
framework: 'fastify',
|
|
317
|
+
method: request.method,
|
|
318
|
+
url: request.url,
|
|
319
|
+
headers: request.headers,
|
|
320
|
+
query: request.query,
|
|
321
|
+
params: request.params,
|
|
322
|
+
route: typeof route === 'string' ? route : undefined,
|
|
323
|
+
ip: ipOf(request.ip),
|
|
324
|
+
}), () => undefined,
|
|
325
|
+
// No body as Fastify judges it: it never parses a GET or HEAD body, an explicit
|
|
326
|
+
// Content-Length: 0 carries none whatever the content type, and without a content type
|
|
327
|
+
// it parses nothing when there is neither a length nor chunks.
|
|
328
|
+
() => fastifyNoBody(request.method, request.headers));
|
|
329
|
+
if (r.blocked)
|
|
330
|
+
return fastifyBlocked(reply, r.blocked);
|
|
331
|
+
if (!r.ctx)
|
|
332
|
+
return next();
|
|
333
|
+
r.ctx.late = undefined;
|
|
334
|
+
request[FASTIFY_CTX] = r.ctx;
|
|
335
|
+
context_1.storage.run(r.ctx, () => next());
|
|
336
|
+
});
|
|
337
|
+
fastify.addHook('preHandler', (request, reply, next) => {
|
|
338
|
+
const ctx = request[FASTIFY_CTX];
|
|
339
|
+
if (!ctx || !(0, engine_1.isActive)())
|
|
340
|
+
return next();
|
|
341
|
+
try {
|
|
342
|
+
if (request.body !== undefined && request.body !== null)
|
|
343
|
+
(0, capture_1.captureBody)(ctx, { body: request.body, contentType: contentTypeOf(request.headers) });
|
|
344
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
348
|
+
return fastifyBlocked(reply, e);
|
|
349
|
+
}
|
|
350
|
+
context_1.storage.run(ctx, () => next());
|
|
351
|
+
});
|
|
352
|
+
done();
|
|
353
|
+
}
|
|
354
|
+
raspFastify[Symbol.for('skip-override')] = true;
|
|
355
|
+
raspFastify[Symbol.for('fastify.display-name')] = 'shield360-rasp';
|
|
356
|
+
function koaBlocked(k, e) {
|
|
357
|
+
k.status = 403;
|
|
358
|
+
try {
|
|
359
|
+
for (const [h, v] of Object.entries(BLOCK_HEADERS))
|
|
360
|
+
k.set?.(h, v);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
// headers are best effort
|
|
364
|
+
}
|
|
365
|
+
k.body = (0, types_1.blockBody)(e);
|
|
366
|
+
}
|
|
367
|
+
/** Koa middleware: `app.use(raspKoa())`, ideally after the body parser. */
|
|
368
|
+
function raspKoa() {
|
|
369
|
+
return async function shield360Rasp(k, next) {
|
|
370
|
+
if (!(0, engine_1.isActive)()) {
|
|
371
|
+
await next();
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
markFrameworkServer(socketServer(k.req));
|
|
375
|
+
const d = deceive({ framework: 'koa', method: k.method, url: k.originalUrl || k.url || '/', ip: ipOf(k.ip) });
|
|
376
|
+
if (d.notFound) {
|
|
377
|
+
// What Koa does with a path nothing answers: status 404 and no body, so Koa sends "Not Found" as text/plain.
|
|
378
|
+
k.status = 404;
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (d.blocked)
|
|
382
|
+
return koaBlocked(k, d.blocked);
|
|
383
|
+
const headers = k.headers ?? k.request?.headers ?? {};
|
|
384
|
+
const r = begin(() => (0, capture_1.captureRequest)({
|
|
385
|
+
framework: 'koa',
|
|
386
|
+
method: k.method,
|
|
387
|
+
url: k.originalUrl || k.url || '/',
|
|
388
|
+
headers,
|
|
389
|
+
query: k.query,
|
|
390
|
+
params: k.params,
|
|
391
|
+
route: typeof k._matchedRoute === 'string' ? k._matchedRoute : undefined,
|
|
392
|
+
ip: ipOf(k.ip),
|
|
393
|
+
}), () => (k.request?.body === undefined ? undefined : { body: k.request.body, contentType: contentTypeOf(headers) }), () => (0, capture_1.bodyAbsent)(headers, k.req?.httpVersionMajor));
|
|
394
|
+
if (r.blocked)
|
|
395
|
+
return koaBlocked(k, r.blocked);
|
|
396
|
+
if (!r.ctx) {
|
|
397
|
+
await next();
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
try {
|
|
401
|
+
await context_1.storage.run(r.ctx, () => next());
|
|
402
|
+
}
|
|
403
|
+
catch (e) {
|
|
404
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
405
|
+
return koaBlocked(k, e);
|
|
406
|
+
throw e;
|
|
407
|
+
}
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Wraps a raw `http` request handler: `http.createServer(raspHttp(handler))`.
|
|
412
|
+
* The body is the handler's to read; once it has, `recordRequestBody(body)`
|
|
413
|
+
* adds it (and runs the virtual patches that read the body). A `req.body`
|
|
414
|
+
* set by a parser is picked up when a sink first reads the inputs.
|
|
415
|
+
*/
|
|
416
|
+
function raspHttp(handler) {
|
|
417
|
+
const wrapped = function (req, res) {
|
|
418
|
+
if (!(0, engine_1.isActive)())
|
|
419
|
+
return handler.call(this, req, res);
|
|
420
|
+
const d = deceive({ framework: 'http', method: req.method || 'GET', url: req.url || '/', ip: ipOf(undefined, req) });
|
|
421
|
+
if (d.notFound)
|
|
422
|
+
return sendNotFound(res);
|
|
423
|
+
if (d.blocked)
|
|
424
|
+
return sendBlocked(res, d.blocked);
|
|
425
|
+
const withBody = req;
|
|
426
|
+
const r = begin(() => (0, capture_1.captureRequest)({ framework: 'http', method: req.method || 'GET', url: req.url || '/', headers: req.headers, ip: ipOf(undefined, req) }), () => (withBody.body === undefined ? undefined : { body: withBody.body, contentType: contentTypeOf(req.headers) }), () => (0, capture_1.bodyAbsent)(req.headers, req.httpVersionMajor));
|
|
427
|
+
if (r.blocked)
|
|
428
|
+
return sendBlocked(res, r.blocked);
|
|
429
|
+
if (!r.ctx)
|
|
430
|
+
return handler.call(this, req, res);
|
|
431
|
+
return context_1.storage.run(r.ctx, () => {
|
|
432
|
+
try {
|
|
433
|
+
const out = handler.call(this, req, res);
|
|
434
|
+
if (out && typeof out.then === 'function') {
|
|
435
|
+
return out.then(undefined, (e) => {
|
|
436
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
437
|
+
return sendBlocked(res, e);
|
|
438
|
+
throw e;
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return out;
|
|
442
|
+
}
|
|
443
|
+
catch (e) {
|
|
444
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
445
|
+
return sendBlocked(res, e);
|
|
446
|
+
throw e;
|
|
447
|
+
}
|
|
448
|
+
});
|
|
449
|
+
};
|
|
450
|
+
return wrapped;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Adds a body the app read itself to the current request's inputs and runs
|
|
454
|
+
* the virtual patches that read the body. Throws the block error when one
|
|
455
|
+
* blocks; otherwise never throws.
|
|
456
|
+
*/
|
|
457
|
+
function recordRequestBody(body, contentType) {
|
|
458
|
+
if (!(0, engine_1.isActive)())
|
|
459
|
+
return;
|
|
460
|
+
const ctx = (0, context_1.currentContext)();
|
|
461
|
+
// Once a body was captured; a body the SDK took to be absent is still added.
|
|
462
|
+
if (!ctx?.inRequest || ctx.headInputs !== undefined)
|
|
463
|
+
return;
|
|
464
|
+
try {
|
|
465
|
+
ctx.late = undefined;
|
|
466
|
+
(0, capture_1.captureBody)(ctx, { body, contentType });
|
|
467
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
468
|
+
}
|
|
469
|
+
catch (e) {
|
|
470
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
471
|
+
throw e;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// ---- Next.js route handlers ------------------------------------------------------
|
|
475
|
+
const MAX_READ = 1024 * 1024;
|
|
476
|
+
const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
477
|
+
/** Reads at most `max` bytes of a cloned request body as text. */
|
|
478
|
+
async function readCapped(req, max) {
|
|
479
|
+
if (!req.body)
|
|
480
|
+
return undefined;
|
|
481
|
+
const reader = req.body.getReader();
|
|
482
|
+
const chunks = [];
|
|
483
|
+
let total = 0;
|
|
484
|
+
try {
|
|
485
|
+
while (total < max) {
|
|
486
|
+
const { done, value } = await reader.read();
|
|
487
|
+
if (done)
|
|
488
|
+
break;
|
|
489
|
+
chunks.push(value);
|
|
490
|
+
total += value.byteLength;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
finally {
|
|
494
|
+
reader.cancel().catch(() => undefined);
|
|
495
|
+
}
|
|
496
|
+
return Buffer.concat(chunks.map((c) => Buffer.from(c))).subarray(0, max).toString('utf8');
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Wraps a Next.js App Router route handler (Node.js runtime):
|
|
500
|
+
*
|
|
501
|
+
* export const POST = withRasp(async (request) => { ... });
|
|
502
|
+
*
|
|
503
|
+
* The body is read from a clone (up to 1 MiB), so the handler can still read it.
|
|
504
|
+
*/
|
|
505
|
+
function withRasp(handler) {
|
|
506
|
+
return async function shield360Rasp(request, context) {
|
|
507
|
+
if (!(0, engine_1.isActive)())
|
|
508
|
+
return handler(request, context);
|
|
509
|
+
let url;
|
|
510
|
+
try {
|
|
511
|
+
url = new URL(request.url);
|
|
512
|
+
}
|
|
513
|
+
catch {
|
|
514
|
+
return handler(request, context);
|
|
515
|
+
}
|
|
516
|
+
// Next.js gives only the parsed URL (dot segments already resolved) and no client address, so a hit marks nothing.
|
|
517
|
+
const d = deceive({ framework: 'nextjs', method: request.method, url: url.pathname + url.search });
|
|
518
|
+
// What `notFound()` gives in a route handler: an empty 404.
|
|
519
|
+
if (d.notFound)
|
|
520
|
+
return new Response(null, { status: 404 });
|
|
521
|
+
if (d.blocked)
|
|
522
|
+
return blockedResponse(d.blocked);
|
|
523
|
+
let ctx;
|
|
524
|
+
try {
|
|
525
|
+
const headers = {};
|
|
526
|
+
request.headers.forEach((v, k) => {
|
|
527
|
+
headers[k.toLowerCase()] = v;
|
|
528
|
+
});
|
|
529
|
+
let params;
|
|
530
|
+
try {
|
|
531
|
+
const p = context?.params;
|
|
532
|
+
params = p && typeof p.then === 'function' ? await p : p;
|
|
533
|
+
}
|
|
534
|
+
catch {
|
|
535
|
+
params = undefined;
|
|
536
|
+
}
|
|
537
|
+
ctx = (0, capture_1.captureRequest)({ framework: 'nextjs', method: request.method, url: url.pathname + url.search, headers, params });
|
|
538
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
539
|
+
if (!request.body) {
|
|
540
|
+
// No body at all (a GET, an empty POST): the body is known and empty.
|
|
541
|
+
(0, capture_1.captureNoBody)(ctx);
|
|
542
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
543
|
+
}
|
|
544
|
+
else if (BODY_METHODS.has(request.method.toUpperCase()) && !request.bodyUsed) {
|
|
545
|
+
const text = await readCapped(request.clone(), MAX_READ);
|
|
546
|
+
if (text !== undefined)
|
|
547
|
+
(0, capture_1.captureBody)(ctx, { body: text, contentType: headers['content-type'] });
|
|
548
|
+
(0, capture_1.runVirtualPatches)(ctx);
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
catch (e) {
|
|
552
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
553
|
+
return blockedResponse(e);
|
|
554
|
+
ctx = undefined;
|
|
555
|
+
}
|
|
556
|
+
if (!ctx)
|
|
557
|
+
return handler(request, context);
|
|
558
|
+
try {
|
|
559
|
+
return await context_1.storage.run(ctx, () => handler(request, context));
|
|
560
|
+
}
|
|
561
|
+
catch (e) {
|
|
562
|
+
if (e instanceof types_1.RaspBlockedError)
|
|
563
|
+
return blockedResponse(e);
|
|
564
|
+
throw e;
|
|
565
|
+
}
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/rasp/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Set by the engine: whether model output is recorded at all. */
|
|
2
|
+
export declare function setModelOutputRecording(on: boolean): void;
|
|
3
|
+
export declare function modelOutputRecording(): boolean;
|
|
4
|
+
/** Registers completion text a model returned as untrusted input. Never throws. */
|
|
5
|
+
export declare function recordModelOutput(text: unknown, key?: string): void;
|
|
6
|
+
/** Registers tool-call arguments (a JSON string or an object) as untrusted input. Never throws. */
|
|
7
|
+
export declare function recordToolArguments(args: unknown, toolName?: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Records a provider response the instrumentation already holds: OpenAI chat
|
|
10
|
+
* completions (`choices[].message`), OpenAI Responses (`output[]`), Anthropic
|
|
11
|
+
* messages (`content[]`). Text becomes completion fragments; tool-call
|
|
12
|
+
* arguments become `model.tool.<name>` inputs. Never throws.
|
|
13
|
+
*/
|
|
14
|
+
export declare function recordModelResponse(result: unknown): void;
|