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,322 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unpatchMongodb = exports.patchMongodb = exports.unpatchIbmDb = exports.patchIbmDb = exports.unpatchOracledb = exports.patchOracledb = exports.unpatchTedious = exports.patchTedious = exports.unpatchMssql = exports.patchMssql = exports.unpatchBetterSqlite3 = exports.patchBetterSqlite3 = exports.unpatchSqlite3 = exports.patchSqlite3 = exports.unpatchMysql = exports.patchMysql = exports.unpatchMysql2 = exports.patchMysql2 = exports.unpatchPg = exports.patchPg = exports.RaspDbInstrumentation = void 0;
|
|
4
|
+
exports.patchLoaded = patchLoaded;
|
|
5
|
+
exports.installDbHooks = installDbHooks;
|
|
6
|
+
exports.uninstallDbHooks = uninstallDbHooks;
|
|
7
|
+
/**
|
|
8
|
+
* Database sink hook (README "SQL", "NoSQL"): SQL text sent through pg,
|
|
9
|
+
* mysql2, mysql, sqlite3, better-sqlite3, mssql, tedious (SQL Server),
|
|
10
|
+
* oracledb (Oracle) and ibm_db (Db2), and MongoDB filter,
|
|
11
|
+
* update and pipeline documents, are checked for injection before the
|
|
12
|
+
* driver sends them. Drivers are hooked by name when the app loads them; no
|
|
13
|
+
* driver is imported. Drafted with ChatGPT, reviewed and adapted by the
|
|
14
|
+
* repository owner.
|
|
15
|
+
*
|
|
16
|
+
* Wrappers are RASP's own, not shimmer's: the SDK's tracing (and other
|
|
17
|
+
* OpenTelemetry instrumentations) wrap the same methods with shimmer, which
|
|
18
|
+
* unwraps whatever shimmer-wrapped method it finds. Kept apart, the two
|
|
19
|
+
* stack in either order and neither removes the other.
|
|
20
|
+
*/
|
|
21
|
+
const instrumentation_1 = require("@opentelemetry/instrumentation");
|
|
22
|
+
const context_1 = require("../context");
|
|
23
|
+
const engine_1 = require("../engine");
|
|
24
|
+
const detect_1 = require("../detect");
|
|
25
|
+
const types_1 = require("../types");
|
|
26
|
+
const marks_1 = require("./marks");
|
|
27
|
+
const esm_1 = require("./esm");
|
|
28
|
+
const specs = {
|
|
29
|
+
pg: { version: '>=7', constructor: 'Client', methods: ['query'], dialect: 'postgres', field: 'text' },
|
|
30
|
+
mysql2: { version: '>=2', constructor: 'Connection', methods: ['query', 'execute'], dialect: 'mysql', field: 'sql' },
|
|
31
|
+
mysql: { version: '>=2', constructor: '', methods: ['query'], dialect: 'mysql', field: 'sql' },
|
|
32
|
+
sqlite3: { version: '>=5', constructor: 'Database', methods: ['run', 'get', 'all', 'each', 'exec', 'prepare'], dialect: 'sqlite' },
|
|
33
|
+
'better-sqlite3': { version: '>=7', constructor: '', methods: ['prepare', 'exec'], dialect: 'sqlite' },
|
|
34
|
+
// query and batch live on mssql's shared base Request, which the exported Request inherits.
|
|
35
|
+
mssql: { version: '>=6', constructor: 'Request', methods: ['query', 'batch', 'execute'], dialect: 'mssql',
|
|
36
|
+
handsTo: { query: 'tedious', batch: 'tedious', execute: 'tedious' },
|
|
37
|
+
// mssql prepares through sp_prepare (a tedious procedure call, not hooked), so its text is checked here.
|
|
38
|
+
also: { PreparedStatement: ['prepare'] } },
|
|
39
|
+
// tedious takes a Request built with the SQL text; mssql's default driver calls it too.
|
|
40
|
+
tedious: { version: '>=6', constructor: 'Connection', methods: ['execSql', 'execSqlBatch', 'prepare'], dialect: 'mssql', field: 'sqlTextOrProcedure' },
|
|
41
|
+
// queryStream runs this.execute on the next tick.
|
|
42
|
+
oracledb: { version: '>=4', constructor: 'Connection', methods: ['execute', 'executeMany', 'queryStream'], dialect: 'oracle',
|
|
43
|
+
handsTo: { queryStream: 'oracledb.execute' } },
|
|
44
|
+
// queryStream delegates to queryResult, so it is covered there.
|
|
45
|
+
ibm_db: { version: '>=2', constructor: 'Database', methods: [
|
|
46
|
+
'query', 'querySync', 'queryResult', 'queryResultSync', 'prepare', 'prepareSync',
|
|
47
|
+
], dialect: 'db2', field: 'sql' },
|
|
48
|
+
mongodb: { version: '>=4', constructor: 'Collection', methods: [
|
|
49
|
+
'find', 'findOne', 'countDocuments', 'updateOne', 'updateMany', 'replaceOne',
|
|
50
|
+
'deleteOne', 'deleteMany', 'findOneAndUpdate', 'findOneAndDelete', 'findOneAndReplace', 'aggregate',
|
|
51
|
+
] },
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Text a call already checked and handed on (mssql -> tedious, oracledb
|
|
55
|
+
* queryStream -> execute), as `receiver\0text`, so the receiving call made
|
|
56
|
+
* later (asynchronously, with the same text) is not checked again: one check
|
|
57
|
+
* per call. Kept per RASP context, consumed by the receiver, at most 32.
|
|
58
|
+
*/
|
|
59
|
+
const handedOn = new WeakMap();
|
|
60
|
+
let checking = false;
|
|
61
|
+
// Suppress synchronous delegation, e.g. sqlite Database.get -> prepare.
|
|
62
|
+
let depth = 0;
|
|
63
|
+
function inspect(driver, method, values) {
|
|
64
|
+
if (checking || depth)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
if (!(0, engine_1.isActive)())
|
|
68
|
+
return;
|
|
69
|
+
checking = true;
|
|
70
|
+
const ctx = (0, context_1.currentContext)();
|
|
71
|
+
if (!ctx)
|
|
72
|
+
return;
|
|
73
|
+
(0, engine_1.check)(`db.${driver}.${method}`, () => {
|
|
74
|
+
const inputs = (0, context_1.inputsOf)(ctx);
|
|
75
|
+
if (driver === 'mongodb') {
|
|
76
|
+
const docs = method === 'aggregate'
|
|
77
|
+
? Array.isArray(values[0]) ? values[0] : []
|
|
78
|
+
: ['updateOne', 'updateMany', 'replaceOne', 'findOneAndUpdate', 'findOneAndReplace'].includes(method)
|
|
79
|
+
? [values[0], values[1]] : [values[0]];
|
|
80
|
+
for (const doc of docs) {
|
|
81
|
+
const finding = (0, detect_1.detectNoSql)(doc, ctx.trees, inputs);
|
|
82
|
+
if (finding)
|
|
83
|
+
return finding;
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const first = values[0];
|
|
88
|
+
const field = specs[driver].field;
|
|
89
|
+
const text = typeof first === 'string' ? first
|
|
90
|
+
: first && typeof first === 'object' && field ? first[field] : undefined;
|
|
91
|
+
if (typeof text !== 'string')
|
|
92
|
+
return null;
|
|
93
|
+
const seen = handedOn.get(ctx);
|
|
94
|
+
if (seen) {
|
|
95
|
+
let at = seen.indexOf(`${driver}.${method}\0${text}`);
|
|
96
|
+
if (at < 0)
|
|
97
|
+
at = seen.indexOf(`${driver}\0${text}`);
|
|
98
|
+
if (at >= 0) {
|
|
99
|
+
seen.splice(at, 1);
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const finding = (0, detect_1.detectSql)(text, inputs, specs[driver].dialect);
|
|
104
|
+
const receiver = specs[driver].handsTo?.[method];
|
|
105
|
+
if (receiver) {
|
|
106
|
+
const list = seen ?? [];
|
|
107
|
+
if (list.length >= 32)
|
|
108
|
+
list.shift();
|
|
109
|
+
list.push(`${receiver}\0${text}`);
|
|
110
|
+
handedOn.set(ctx, list);
|
|
111
|
+
}
|
|
112
|
+
return finding;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof types_1.RaspBlockedError)
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
checking = false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const registry = new Map();
|
|
124
|
+
/** The prototype in the chain that defines `method` itself (mssql's Request inherits query from its base). */
|
|
125
|
+
function ownerOf(proto, method) {
|
|
126
|
+
for (let p = proto; p && p !== Object.prototype; p = Object.getPrototypeOf(p)) {
|
|
127
|
+
if (Object.prototype.hasOwnProperty.call(p, method))
|
|
128
|
+
return p;
|
|
129
|
+
}
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
function wrapMethods(driver, exported, list = specs[driver].methods) {
|
|
133
|
+
for (const method of list) {
|
|
134
|
+
const proto = ownerOf(exported, method);
|
|
135
|
+
if (!proto)
|
|
136
|
+
continue;
|
|
137
|
+
let methods = registry.get(proto);
|
|
138
|
+
if (!methods)
|
|
139
|
+
registry.set(proto, (methods = new Map()));
|
|
140
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, method);
|
|
141
|
+
const current = descriptor?.value;
|
|
142
|
+
if (typeof current !== 'function')
|
|
143
|
+
continue;
|
|
144
|
+
const known = methods.get(method);
|
|
145
|
+
if (known) {
|
|
146
|
+
// Patched again (a reload, or the app loaded the driver after patchLoaded): turn it back on.
|
|
147
|
+
known.on = true;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const entry = { original: current, wrapper: current, on: true };
|
|
151
|
+
const wrapper = function (...values) {
|
|
152
|
+
if (entry.on)
|
|
153
|
+
inspect(driver, method, values);
|
|
154
|
+
depth++;
|
|
155
|
+
try {
|
|
156
|
+
return Reflect.apply(current, this, values);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
depth--;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
for (const key of Reflect.ownKeys(current)) {
|
|
163
|
+
if (key !== 'prototype')
|
|
164
|
+
Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(current, key));
|
|
165
|
+
}
|
|
166
|
+
entry.wrapper = wrapper;
|
|
167
|
+
(0, marks_1.markRaspWrapper)(wrapper);
|
|
168
|
+
Object.defineProperty(proto, method, { ...descriptor, value: wrapper });
|
|
169
|
+
methods.set(method, entry);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function restoreMethods(proto) {
|
|
173
|
+
const methods = registry.get(proto);
|
|
174
|
+
if (!methods)
|
|
175
|
+
return;
|
|
176
|
+
for (const [method, entry] of methods) {
|
|
177
|
+
entry.on = false;
|
|
178
|
+
// Put the original back only while ours is on top; under another
|
|
179
|
+
// wrapper (tracing patched after RASP) ours stays, switched off.
|
|
180
|
+
if (proto[method] === entry.wrapper) {
|
|
181
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, method);
|
|
182
|
+
Object.defineProperty(proto, method, { ...descriptor, value: entry.original });
|
|
183
|
+
methods.delete(method);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (!methods.size)
|
|
187
|
+
registry.delete(proto);
|
|
188
|
+
}
|
|
189
|
+
class RaspDbInstrumentation extends instrumentation_1.InstrumentationBase {
|
|
190
|
+
constructor() { super('shield360/instrumentation-rasp-db', '1.0.0', { enabled: false }); }
|
|
191
|
+
init() {
|
|
192
|
+
return Object.keys(specs).map(driver => {
|
|
193
|
+
const versions = [specs[driver].version];
|
|
194
|
+
if (driver === 'mysql')
|
|
195
|
+
return new instrumentation_1.InstrumentationNodeModuleDefinition(driver, versions, undefined, undefined, [
|
|
196
|
+
new instrumentation_1.InstrumentationNodeModuleFile('mysql/lib/Connection.js', versions, exports => { this.patch(driver, exports); return exports; }, exports => this.unpatch(driver, exports)),
|
|
197
|
+
]);
|
|
198
|
+
return new instrumentation_1.InstrumentationNodeModuleDefinition(driver, versions, exports => { this.patch(driver, (0, esm_1.moduleExports)(exports)); return exports; }, exports => this.unpatch(driver, (0, esm_1.moduleExports)(exports)));
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
patch(driver, exports) {
|
|
202
|
+
try {
|
|
203
|
+
const spec = specs[driver];
|
|
204
|
+
const ctor = spec.constructor ? exports?.[spec.constructor] : exports;
|
|
205
|
+
const proto = ctor?.prototype;
|
|
206
|
+
if (proto)
|
|
207
|
+
wrapMethods(driver, proto);
|
|
208
|
+
for (const [name, methods] of Object.entries(spec.also ?? {})) {
|
|
209
|
+
const other = exports?.[name]?.prototype;
|
|
210
|
+
if (other)
|
|
211
|
+
wrapMethods(driver, other, methods);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch { /* Optional or unsupported driver shape: leave it alone. */ }
|
|
215
|
+
}
|
|
216
|
+
unpatch(driver, exports) {
|
|
217
|
+
try {
|
|
218
|
+
const spec = specs[driver];
|
|
219
|
+
const ctors = [spec.constructor ? exports?.[spec.constructor] : exports,
|
|
220
|
+
...Object.keys(spec.also ?? {}).map(name => exports?.[name])];
|
|
221
|
+
for (const ctor of ctors) {
|
|
222
|
+
const proto = ctor?.prototype;
|
|
223
|
+
for (let p = proto ?? null; p && p !== Object.prototype; p = Object.getPrototypeOf(p)) {
|
|
224
|
+
restoreMethods(p);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch { /* Fail open during driver unload. */ }
|
|
229
|
+
}
|
|
230
|
+
restoreAll() {
|
|
231
|
+
for (const proto of [...registry.keys()])
|
|
232
|
+
restoreMethods(proto);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
exports.RaspDbInstrumentation = RaspDbInstrumentation;
|
|
236
|
+
let manual;
|
|
237
|
+
let active;
|
|
238
|
+
const patcher = () => manual ?? (manual = new RaspDbInstrumentation());
|
|
239
|
+
const patchPg = (exports) => patcher().patch('pg', exports);
|
|
240
|
+
exports.patchPg = patchPg;
|
|
241
|
+
const unpatchPg = (exports) => manual?.unpatch('pg', exports);
|
|
242
|
+
exports.unpatchPg = unpatchPg;
|
|
243
|
+
const patchMysql2 = (exports) => patcher().patch('mysql2', exports);
|
|
244
|
+
exports.patchMysql2 = patchMysql2;
|
|
245
|
+
const unpatchMysql2 = (exports) => manual?.unpatch('mysql2', exports);
|
|
246
|
+
exports.unpatchMysql2 = unpatchMysql2;
|
|
247
|
+
const patchMysql = (exports) => patcher().patch('mysql', exports);
|
|
248
|
+
exports.patchMysql = patchMysql;
|
|
249
|
+
const unpatchMysql = (exports) => manual?.unpatch('mysql', exports);
|
|
250
|
+
exports.unpatchMysql = unpatchMysql;
|
|
251
|
+
const patchSqlite3 = (exports) => patcher().patch('sqlite3', exports);
|
|
252
|
+
exports.patchSqlite3 = patchSqlite3;
|
|
253
|
+
const unpatchSqlite3 = (exports) => manual?.unpatch('sqlite3', exports);
|
|
254
|
+
exports.unpatchSqlite3 = unpatchSqlite3;
|
|
255
|
+
const patchBetterSqlite3 = (exports) => patcher().patch('better-sqlite3', exports);
|
|
256
|
+
exports.patchBetterSqlite3 = patchBetterSqlite3;
|
|
257
|
+
const unpatchBetterSqlite3 = (exports) => manual?.unpatch('better-sqlite3', exports);
|
|
258
|
+
exports.unpatchBetterSqlite3 = unpatchBetterSqlite3;
|
|
259
|
+
const patchMssql = (exports) => patcher().patch('mssql', exports);
|
|
260
|
+
exports.patchMssql = patchMssql;
|
|
261
|
+
const unpatchMssql = (exports) => manual?.unpatch('mssql', exports);
|
|
262
|
+
exports.unpatchMssql = unpatchMssql;
|
|
263
|
+
const patchTedious = (exports) => patcher().patch('tedious', exports);
|
|
264
|
+
exports.patchTedious = patchTedious;
|
|
265
|
+
const unpatchTedious = (exports) => manual?.unpatch('tedious', exports);
|
|
266
|
+
exports.unpatchTedious = unpatchTedious;
|
|
267
|
+
const patchOracledb = (exports) => patcher().patch('oracledb', exports);
|
|
268
|
+
exports.patchOracledb = patchOracledb;
|
|
269
|
+
const unpatchOracledb = (exports) => manual?.unpatch('oracledb', exports);
|
|
270
|
+
exports.unpatchOracledb = unpatchOracledb;
|
|
271
|
+
const patchIbmDb = (exports) => patcher().patch('ibm_db', exports);
|
|
272
|
+
exports.patchIbmDb = patchIbmDb;
|
|
273
|
+
const unpatchIbmDb = (exports) => manual?.unpatch('ibm_db', exports);
|
|
274
|
+
exports.unpatchIbmDb = unpatchIbmDb;
|
|
275
|
+
const patchMongodb = (exports) => patcher().patch('mongodb', exports);
|
|
276
|
+
exports.patchMongodb = patchMongodb;
|
|
277
|
+
const unpatchMongodb = (exports) => manual?.unpatch('mongodb', exports);
|
|
278
|
+
exports.unpatchMongodb = unpatchMongodb;
|
|
279
|
+
/** Inspect the cache only: resolving a driver never executes its code. */
|
|
280
|
+
function patchLoaded() {
|
|
281
|
+
for (const driver of Object.keys(specs)) {
|
|
282
|
+
try {
|
|
283
|
+
const id = require.resolve(driver === 'mysql' ? 'mysql/lib/Connection.js' : driver);
|
|
284
|
+
const cached = require.cache[id];
|
|
285
|
+
if (cached)
|
|
286
|
+
(active ?? patcher()).patch(driver, cached.exports);
|
|
287
|
+
}
|
|
288
|
+
catch { /* Driver absent or not resolvable from the SDK. */ }
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function installDbHooks() {
|
|
292
|
+
if (active)
|
|
293
|
+
return true;
|
|
294
|
+
let instance;
|
|
295
|
+
try {
|
|
296
|
+
instance = new RaspDbInstrumentation();
|
|
297
|
+
instance.enable();
|
|
298
|
+
active = instance;
|
|
299
|
+
patchLoaded();
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
try {
|
|
304
|
+
instance?.disable();
|
|
305
|
+
instance?.restoreAll();
|
|
306
|
+
}
|
|
307
|
+
catch { /* Never throw. */ }
|
|
308
|
+
active = undefined;
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function uninstallDbHooks() {
|
|
313
|
+
try {
|
|
314
|
+
active?.disable();
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
active?.restoreAll();
|
|
318
|
+
manual?.restoreAll();
|
|
319
|
+
active = undefined;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../../src/rasp/hooks/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A package the app `import`s reaches an instrumentation through the ESM loader hook as its module
|
|
3
|
+
* namespace. For a CommonJS package the exports object the hooks patch is the namespace's
|
|
4
|
+
* `default` (its named exports are only what Node's static scan found: none for pg's
|
|
5
|
+
* `module.exports = new PG()`), so the hooks patch that.
|
|
6
|
+
*/
|
|
7
|
+
export declare function moduleExports(exports: unknown): unknown;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.moduleExports = moduleExports;
|
|
4
|
+
/**
|
|
5
|
+
* A package the app `import`s reaches an instrumentation through the ESM loader hook as its module
|
|
6
|
+
* namespace. For a CommonJS package the exports object the hooks patch is the namespace's
|
|
7
|
+
* `default` (its named exports are only what Node's static scan found: none for pg's
|
|
8
|
+
* `module.exports = new PG()`), so the hooks patch that.
|
|
9
|
+
*/
|
|
10
|
+
function moduleExports(exports) {
|
|
11
|
+
if (exports && typeof exports === 'object' && exports[Symbol.toStringTag] === 'Module') {
|
|
12
|
+
const def = exports.default;
|
|
13
|
+
if (def && (typeof def === 'object' || typeof def === 'function'))
|
|
14
|
+
return def;
|
|
15
|
+
}
|
|
16
|
+
return exports;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esm.js","sourceRoot":"","sources":["../../../src/rasp/hooks/esm.ts"],"names":[],"mappings":";;AAMA,sCAMC;AAZD;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,OAAgB;IAC5C,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAAmC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QACpH,MAAM,GAAG,GAAI,OAAiC,CAAC,OAAO,CAAC;QACvD,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,CAAC;YAAE,OAAO,GAAG,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installFsHooks = installFsHooks;
|
|
4
|
+
exports.uninstallFsHooks = uninstallFsHooks;
|
|
5
|
+
/**
|
|
6
|
+
* fs sink hook (README "Path"): reads, writes, deletes, renames, copies and
|
|
7
|
+
* directory listings on `fs` and `fs.promises` are checked for path
|
|
8
|
+
* traversal and script writes before the call. Install before application
|
|
9
|
+
* modules capture bindings. Drafted with ChatGPT, reviewed and adapted by
|
|
10
|
+
* the repository owner.
|
|
11
|
+
*
|
|
12
|
+
* Node calls its own public functions inside some of these (`readFileSync`
|
|
13
|
+
* opens through `fs.openSync`, streams open through `fs.open` later), so a
|
|
14
|
+
* path is checked once: calls made while a synchronous fs call runs are
|
|
15
|
+
* Node's and are skipped, and within a request a path already checked for
|
|
16
|
+
* the same kind of access is not checked again.
|
|
17
|
+
*/
|
|
18
|
+
const fs = require("fs");
|
|
19
|
+
const module_1 = require("module");
|
|
20
|
+
const url_1 = require("url");
|
|
21
|
+
const util_1 = require("util");
|
|
22
|
+
const context_1 = require("../context");
|
|
23
|
+
const engine_1 = require("../engine");
|
|
24
|
+
const detect_1 = require("../detect");
|
|
25
|
+
const types_1 = require("../types");
|
|
26
|
+
const operations = {
|
|
27
|
+
readFile: 'read', readFileSync: 'read', createReadStream: 'read',
|
|
28
|
+
open: 'open', openSync: 'open',
|
|
29
|
+
writeFile: 'write', writeFileSync: 'write', createWriteStream: 'write',
|
|
30
|
+
appendFile: 'append', appendFileSync: 'append',
|
|
31
|
+
unlink: 'delete', unlinkSync: 'delete', rm: 'delete', rmSync: 'delete',
|
|
32
|
+
rename: 'rename', renameSync: 'rename', readdir: 'list', readdirSync: 'list',
|
|
33
|
+
copyFile: 'read', copyFileSync: 'read',
|
|
34
|
+
};
|
|
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
|
+
/** Depth of synchronous fs calls in progress: anything nested is Node's own. */
|
|
40
|
+
let syncDepth = 0;
|
|
41
|
+
/** Per request: paths already checked, by kind of access (capped). */
|
|
42
|
+
const seen = new WeakMap();
|
|
43
|
+
const SEEN_MAX = 256;
|
|
44
|
+
const accessOf = (op) => (op === 'append' || op === 'open' ? 'write' : op);
|
|
45
|
+
const seenKey = (path, op) => `${accessOf(op)}\u0000${path}`;
|
|
46
|
+
/** True when this request already checked this path for this kind of access. */
|
|
47
|
+
function seenBefore(ctx, path, op) {
|
|
48
|
+
return Boolean(ctx && seen.get(ctx)?.has(seenKey(path, op)));
|
|
49
|
+
}
|
|
50
|
+
/** Records that this request checked this path for this kind of access. */
|
|
51
|
+
function markSeen(ctx, path, op) {
|
|
52
|
+
if (!ctx)
|
|
53
|
+
return;
|
|
54
|
+
let set = seen.get(ctx);
|
|
55
|
+
if (!set)
|
|
56
|
+
seen.set(ctx, (set = new Set()));
|
|
57
|
+
if (set.size < SEEN_MAX)
|
|
58
|
+
set.add(seenKey(path, op));
|
|
59
|
+
}
|
|
60
|
+
function pathString(value) {
|
|
61
|
+
if (typeof value === 'string')
|
|
62
|
+
return value;
|
|
63
|
+
if (Buffer.isBuffer(value))
|
|
64
|
+
return value.toString();
|
|
65
|
+
if (value instanceof URL && value.protocol === 'file:')
|
|
66
|
+
return (0, url_1.fileURLToPath)(value);
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
function openOp(flags) {
|
|
70
|
+
if (flags === undefined)
|
|
71
|
+
return 'read';
|
|
72
|
+
if (typeof flags === 'string')
|
|
73
|
+
return /[wa+]/.test(flags) ? 'write' : 'read';
|
|
74
|
+
if (typeof flags === 'number') {
|
|
75
|
+
const c = fs.constants;
|
|
76
|
+
return flags & (c.O_WRONLY | c.O_RDWR | c.O_CREAT | c.O_TRUNC | c.O_APPEND) ? 'write' : 'read';
|
|
77
|
+
}
|
|
78
|
+
return 'read';
|
|
79
|
+
}
|
|
80
|
+
function inspect(api, values, promises) {
|
|
81
|
+
if (checking || syncDepth > 0)
|
|
82
|
+
return;
|
|
83
|
+
try {
|
|
84
|
+
if (!(0, engine_1.isActive)())
|
|
85
|
+
return;
|
|
86
|
+
checking = true;
|
|
87
|
+
(0, engine_1.check)(`fs.${promises ? 'promises.' : ''}${api}`, () => {
|
|
88
|
+
const ctx = (0, context_1.currentContext)();
|
|
89
|
+
const inputs = ctx ? (0, context_1.inputsOf)(ctx) : [];
|
|
90
|
+
const roots = (0, engine_1.allowLists)().fileRoots;
|
|
91
|
+
const inRequest = Boolean(ctx?.inRequest);
|
|
92
|
+
const op = operations[api] === 'open' ? openOp(values[1]) : operations[api];
|
|
93
|
+
const paths = [[pathString(values[0]), op]];
|
|
94
|
+
if (api === 'rename' || api === 'renameSync' || api === 'copyFile' || api === 'copyFileSync') {
|
|
95
|
+
paths.push([pathString(values[1]), api.startsWith('copyFile') ? 'write' : 'rename']);
|
|
96
|
+
}
|
|
97
|
+
const checks = [];
|
|
98
|
+
for (const [path, pathOp] of paths) {
|
|
99
|
+
if (path !== undefined && !seenBefore(ctx, path, pathOp)) {
|
|
100
|
+
checks.push({ path, op: pathOp, finding: (0, detect_1.detectPath)(path, pathOp, inputs, roots, inRequest) });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Both paths are checked; the strongest decision wins.
|
|
104
|
+
const winner = (0, engine_1.strongest)(...checks.map((c) => c.finding));
|
|
105
|
+
// A finding that lost to the winner was never applied: its path stays
|
|
106
|
+
// unmarked, so a later call on it in this request is checked again.
|
|
107
|
+
for (const c of checks)
|
|
108
|
+
if (!(winner && c.finding && c.finding !== winner))
|
|
109
|
+
markSeen(ctx, c.path, c.op);
|
|
110
|
+
return winner;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof types_1.RaspBlockedError)
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
checking = false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Ends this generation (every wrapper stops checking) and puts back the
|
|
123
|
+
* originals where RASP's wrapper is still the current value. A wrapper put
|
|
124
|
+
* on top later (tracing) stays, calling RASP's, which now only passes through.
|
|
125
|
+
*/
|
|
126
|
+
function restore(saved) {
|
|
127
|
+
generation++;
|
|
128
|
+
for (const entry of [...saved].reverse()) {
|
|
129
|
+
if (Object.getOwnPropertyDescriptor(entry.owner, entry.api)?.value === entry.wrapper) {
|
|
130
|
+
Object.defineProperty(entry.owner, entry.api, entry.descriptor);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Idempotent; a failed installation restores every replaced descriptor. */
|
|
135
|
+
function installFsHooks() {
|
|
136
|
+
if (installed)
|
|
137
|
+
return true;
|
|
138
|
+
const saved = [];
|
|
139
|
+
const gen = ++generation;
|
|
140
|
+
try {
|
|
141
|
+
for (const [owner, promises] of [[fs, false], [fs.promises, true]]) {
|
|
142
|
+
for (const api of Object.keys(operations)) {
|
|
143
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, api);
|
|
144
|
+
if (!descriptor && promises)
|
|
145
|
+
continue; // No synchronous or stream promise APIs.
|
|
146
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
147
|
+
throw new TypeError(api);
|
|
148
|
+
const original = descriptor.value;
|
|
149
|
+
const sync = api.endsWith('Sync');
|
|
150
|
+
const wrapper = function (...values) {
|
|
151
|
+
try {
|
|
152
|
+
if (gen === generation)
|
|
153
|
+
inspect(api, values, promises);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (promises)
|
|
157
|
+
return Promise.reject(error);
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
if (!sync)
|
|
161
|
+
return Reflect.apply(original, this, values);
|
|
162
|
+
syncDepth++;
|
|
163
|
+
try {
|
|
164
|
+
return Reflect.apply(original, this, values);
|
|
165
|
+
}
|
|
166
|
+
finally {
|
|
167
|
+
syncDepth--;
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
for (const key of Reflect.ownKeys(original)) {
|
|
171
|
+
if (key === 'prototype' || key === util_1.promisify.custom)
|
|
172
|
+
continue;
|
|
173
|
+
Object.defineProperty(wrapper, key, Object.getOwnPropertyDescriptor(original, key));
|
|
174
|
+
}
|
|
175
|
+
const custom = Object.getOwnPropertyDescriptor(original, util_1.promisify.custom);
|
|
176
|
+
if (custom) {
|
|
177
|
+
// Node's custom fs promisifiers (notably read/readv/write) return
|
|
178
|
+
// named results. None of the covered APIs has that contract.
|
|
179
|
+
const generic = (0, util_1.promisify)(wrapper);
|
|
180
|
+
Object.defineProperty(wrapper, util_1.promisify.custom, { ...custom, value: generic });
|
|
181
|
+
}
|
|
182
|
+
Object.defineProperty(owner, api, { ...descriptor, value: wrapper });
|
|
183
|
+
saved.push({ owner, api, descriptor, wrapper });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
187
|
+
installed = saved;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
restore(saved);
|
|
192
|
+
try {
|
|
193
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
194
|
+
}
|
|
195
|
+
catch { /* Installation remains unsuccessful. */ }
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function uninstallFsHooks() {
|
|
200
|
+
if (!installed)
|
|
201
|
+
return;
|
|
202
|
+
restore(installed);
|
|
203
|
+
installed = undefined;
|
|
204
|
+
(0, module_1.syncBuiltinESMExports)();
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/rasp/hooks/fs.ts"],"names":[],"mappings":"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"}
|