@contrast/agent-bundle 5.41.0 → 5.45.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -10
- package/node_modules/@contrast/agent/README.md +1 -10
- package/node_modules/@contrast/agent/package.json +13 -12
- package/node_modules/@contrast/agent-swc-plugin/package.json +3 -3
- package/node_modules/@contrast/agentify/lib/rewrite-hooks.js +3 -3
- package/node_modules/@contrast/agentify/lib/utils.js +13 -7
- package/node_modules/@contrast/agentify/package.json +17 -17
- package/node_modules/@contrast/architecture-components/package.json +6 -6
- package/node_modules/@contrast/assess/lib/dataflow/propagation/install/ejs/template.js +1 -1
- package/node_modules/@contrast/assess/lib/dataflow/propagation/install/pug/index.js +1 -1
- package/node_modules/@contrast/assess/lib/dataflow/sinks/install/http/server-response.js +1 -12
- package/node_modules/@contrast/assess/lib/dataflow/sinks/install/restify.js +1 -1
- package/node_modules/@contrast/assess/lib/dataflow/sources/install/http.js +1 -1
- package/node_modules/@contrast/assess/lib/dataflow/tracker.js +1 -1
- package/node_modules/@contrast/assess/lib/get-source-context.js +1 -1
- package/node_modules/@contrast/assess/lib/response-scanning/install/http.js +0 -12
- package/node_modules/@contrast/assess/package.json +14 -14
- package/node_modules/@contrast/code-events/binding.gyp +1 -1
- package/node_modules/@contrast/code-events/package.json +11 -9
- package/node_modules/@contrast/code-events/prebuilds/darwin-x64+arm64/@contrast+code-events.abi108.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/darwin-x64+arm64/@contrast+code-events.abi115.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/darwin-x64+arm64/@contrast+code-events.abi127.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/darwin-x64+arm64/{@contrast+code-events.abi93.node → @contrast+code-events.abi137.node} +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-arm64/@contrast+code-events.abi108.armv8.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-arm64/@contrast+code-events.abi115.armv8.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-arm64/@contrast+code-events.abi127.armv8.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-arm64/@contrast+code-events.abi137.armv8.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi108.glibc.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi108.musl.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi115.glibc.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi115.musl.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi127.glibc.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi127.musl.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi137.glibc.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi137.musl.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/win32-x64/@contrast+code-events.abi108.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/win32-x64/@contrast+code-events.abi115.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/win32-x64/@contrast+code-events.abi127.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/win32-x64/@contrast+code-events.abi137.node +0 -0
- package/node_modules/@contrast/common/lib/constants.d.ts +1 -1
- package/node_modules/@contrast/common/lib/constants.js +1 -1
- package/node_modules/@contrast/common/lib/index.js +15 -15
- package/node_modules/@contrast/common/lib/primordials.d.ts +22 -20
- package/node_modules/@contrast/common/lib/types.d.ts +18 -6
- package/node_modules/@contrast/common/package.json +2 -2
- package/node_modules/@contrast/config/lib/options.js +29 -4
- package/node_modules/@contrast/config/package.json +4 -4
- package/node_modules/@contrast/core/lib/app-info.js +53 -74
- package/node_modules/@contrast/core/lib/index.d.ts +17 -1
- package/node_modules/@contrast/core/lib/sensitive-data-masking/index.js +33 -5
- package/node_modules/@contrast/core/package.json +10 -9
- package/node_modules/@contrast/deadzones/package.json +6 -6
- package/node_modules/@contrast/dep-hooks/lib/export-handler-registry.d.ts +17 -13
- package/node_modules/@contrast/dep-hooks/lib/export-handler-registry.js +16 -4
- package/node_modules/@contrast/dep-hooks/lib/export-hook-descriptor.d.ts +2 -2
- package/node_modules/@contrast/dep-hooks/lib/export-hook-descriptor.js +2 -3
- package/node_modules/@contrast/dep-hooks/lib/handler-invoker.d.ts +6 -6
- package/node_modules/@contrast/dep-hooks/lib/handler-invoker.js +0 -1
- package/node_modules/@contrast/dep-hooks/lib/helpers.d.ts +0 -7
- package/node_modules/@contrast/dep-hooks/lib/helpers.js +2 -18
- package/node_modules/@contrast/dep-hooks/lib/index.d.ts +17 -12
- package/node_modules/@contrast/dep-hooks/lib/index.js +5 -3
- package/node_modules/@contrast/dep-hooks/lib/package-finder.d.ts +2 -1
- package/node_modules/@contrast/dep-hooks/lib/package-finder.js +6 -6
- package/node_modules/@contrast/dep-hooks/package.json +4 -3
- package/node_modules/@contrast/distringuish/package.json +7 -6
- package/node_modules/@contrast/distringuish/prebuilds/darwin-x64+arm64/@contrast+distringuish.abi108.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/darwin-x64+arm64/@contrast+distringuish.abi115.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/darwin-x64+arm64/@contrast+distringuish.abi127.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/darwin-x64+arm64/{@contrast+distringuish.abi93.node → @contrast+distringuish.abi137.node} +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-arm64/@contrast+distringuish.abi108.armv8.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-arm64/@contrast+distringuish.abi115.armv8.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-arm64/@contrast+distringuish.abi127.armv8.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-arm64/@contrast+distringuish.abi137.armv8.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi108.glibc.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi108.musl.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi115.glibc.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi115.musl.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi127.glibc.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi127.musl.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi137.glibc.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi137.musl.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/win32-x64/@contrast+distringuish.abi108.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/win32-x64/@contrast+distringuish.abi115.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/win32-x64/@contrast+distringuish.abi127.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/win32-x64/@contrast+distringuish.abi137.node +0 -0
- package/node_modules/@contrast/esm-hooks/lib/debug-methods.mjs +4 -4
- package/node_modules/@contrast/esm-hooks/lib/get-file-type.mjs +2 -9
- package/node_modules/@contrast/esm-hooks/lib/hooks.mjs +0 -2
- package/node_modules/@contrast/esm-hooks/lib/redirects/builtin/fs/promises.mjs +2 -0
- package/node_modules/@contrast/esm-hooks/lib/redirects/builtin/fs.mjs +3 -0
- package/node_modules/@contrast/esm-hooks/lib/redirects/builtin/util.mjs +1 -0
- package/node_modules/@contrast/esm-hooks/package.json +7 -7
- package/node_modules/@contrast/fn-inspect/package.json +9 -5
- package/node_modules/@contrast/fn-inspect/prebuilds/darwin-x64+arm64/@contrast+fn-inspect.abi108.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/darwin-x64+arm64/@contrast+fn-inspect.abi115.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/darwin-x64+arm64/@contrast+fn-inspect.abi127.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/darwin-x64+arm64/{@contrast+fn-inspect.abi93.node → @contrast+fn-inspect.abi137.node} +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-arm64/@contrast+fn-inspect.abi108.armv8.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-arm64/@contrast+fn-inspect.abi115.armv8.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-arm64/@contrast+fn-inspect.abi127.armv8.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-arm64/@contrast+fn-inspect.abi137.armv8.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi108.glibc.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi108.musl.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi115.glibc.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi115.musl.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi127.glibc.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi127.musl.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi137.glibc.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/{@contrast+fn-inspect.abi93.musl.node → @contrast+fn-inspect.abi137.musl.node} +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/win32-x64/@contrast+fn-inspect.abi108.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/win32-x64/@contrast+fn-inspect.abi115.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/win32-x64/@contrast+fn-inspect.abi127.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/win32-x64/@contrast+fn-inspect.abi137.node +0 -0
- package/node_modules/@contrast/instrumentation/lib/http2.js +0 -11
- package/node_modules/@contrast/instrumentation/package.json +6 -6
- package/node_modules/@contrast/library-analysis/lib/install/library-reporting/dep.json +312 -224
- package/node_modules/@contrast/library-analysis/package.json +6 -6
- package/node_modules/@contrast/logger/lib/index.js +18 -8
- package/node_modules/@contrast/logger/lib/serializers.js +5 -5
- package/node_modules/@contrast/logger/lib/utils.d.ts +0 -6
- package/node_modules/@contrast/logger/package.json +4 -4
- package/node_modules/@contrast/metrics/lib/index.d.ts +6 -6
- package/node_modules/@contrast/metrics/lib/index.js +0 -1
- package/node_modules/@contrast/metrics/package.json +7 -7
- package/node_modules/@contrast/patcher/package.json +3 -3
- package/node_modules/@contrast/perf/package.json +7 -4
- package/node_modules/@contrast/protect/lib/hardening/handlers.js +37 -21
- package/node_modules/@contrast/protect/lib/index.d.ts +3 -2
- package/node_modules/@contrast/protect/lib/index.js +9 -2
- package/node_modules/@contrast/protect/lib/input-analysis/handlers.js +275 -233
- package/node_modules/@contrast/protect/lib/input-analysis/install/http.js +3 -4
- package/node_modules/@contrast/protect/lib/input-tracing/{handlers/index.js → handlers.js} +15 -15
- package/node_modules/@contrast/protect/lib/input-tracing/index.js +0 -1
- package/node_modules/@contrast/protect/lib/make-source-context.js +5 -7
- package/node_modules/@contrast/protect/lib/policy.js +130 -95
- package/node_modules/@contrast/protect/lib/semantic-analysis/handlers.js +19 -18
- package/node_modules/@contrast/protect/package.json +12 -12
- package/node_modules/@contrast/reporter/lib/index.js +1 -1
- package/node_modules/@contrast/reporter/lib/reporters/base.d.ts +0 -1
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/application-activity/index.d.ts +4 -2
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/application-activity/index.js +14 -14
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/application-activity/translations.d.ts +43 -6
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/application-activity/translations.js +262 -429
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/server-inventory.d.ts +3 -3
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/traces/index.d.ts +11 -11
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/traces/index.js +93 -93
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/endpoints/traces/translations.js +12 -13
- package/node_modules/@contrast/reporter/lib/reporters/contrast-ui/utils.js +6 -7
- package/node_modules/@contrast/reporter/lib/reporters/file.js +1 -1
- package/node_modules/@contrast/reporter/lib/reporters/security-logger/index.d.ts +2 -3
- package/node_modules/@contrast/reporter/lib/reporters/security-logger/index.js +72 -86
- package/node_modules/@contrast/reporter/lib/reporters/security-logger/messages.js +6 -7
- package/node_modules/@contrast/reporter/lib/validators.js +0 -1
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/.husky/pre-commit +2 -2
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/.taprc +5 -0
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/README.md +2 -4
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/bench.js +5 -36
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/index.js +56 -300
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/package.json +12 -7
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test.js +1684 -0
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/types/index.d.ts +1 -2
- package/node_modules/@contrast/reporter/package.json +10 -10
- package/node_modules/@contrast/rewriter/lib/index.js +5 -43
- package/node_modules/@contrast/rewriter/package.json +8 -8
- package/node_modules/@contrast/route-coverage/lib/install/express/express5.js +0 -5
- package/node_modules/@contrast/route-coverage/lib/install/hapi.js +9 -2
- package/node_modules/@contrast/route-coverage/lib/install/restify.js +1 -1
- package/node_modules/@contrast/route-coverage/package.json +10 -10
- package/node_modules/@contrast/scopes/package.json +6 -6
- package/node_modules/@contrast/sec-obs/lib/traces/http.js +1 -1
- package/node_modules/@contrast/sec-obs/lib/traces/http.test.js +1 -1
- package/node_modules/@contrast/sec-obs/package.json +10 -10
- package/node_modules/@contrast/sources/lib/index.js +1 -1
- package/node_modules/@contrast/sources/lib/index.test.js +0 -26
- package/node_modules/@contrast/sources/package.json +3 -3
- package/node_modules/@contrast/telemetry/package.json +6 -6
- package/node_modules/@opentelemetry/semantic-conventions/README.md +3 -2
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.d.ts +4350 -2882
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.js +4350 -2882
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.d.ts +136 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.js +154 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.d.ts +713 -141
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.js +713 -141
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/experimental_metrics.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index-incubating.d.ts +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index-incubating.js +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index-incubating.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index.d.ts +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/index.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.d.ts +7 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js +7 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_events.d.ts +5 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_events.js +23 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/stable_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.d.ts +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.js +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esm/version.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.d.ts +4350 -2882
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.js +4350 -2882
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.d.ts +136 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.js +154 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.d.ts +713 -141
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.js +713 -141
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/experimental_metrics.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index-incubating.d.ts +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index-incubating.js +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index-incubating.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index.d.ts +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index.js +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/index.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.d.ts +7 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.js +7 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_events.d.ts +5 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_events.js +23 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/stable_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.d.ts +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.js +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/esnext/version.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.d.ts +4350 -2882
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.js +4354 -2883
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.d.ts +136 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.js +157 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.d.ts +713 -141
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.js +720 -147
- package/node_modules/@opentelemetry/semantic-conventions/build/src/experimental_metrics.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index-incubating.d.ts +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index-incubating.js +2 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index-incubating.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index.d.ts +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index.js +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/index.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.d.ts +7 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.js +10 -4
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_attributes.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_events.d.ts +5 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_events.js +26 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/stable_events.js.map +1 -0
- package/node_modules/@opentelemetry/semantic-conventions/build/src/version.d.ts +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/version.js +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/build/src/version.js.map +1 -1
- package/node_modules/@opentelemetry/semantic-conventions/package.json +6 -7
- package/node_modules/@swc/core/README.md +5 -0
- package/node_modules/@swc/core/binding.d.ts +2 -2
- package/node_modules/@swc/core/index.d.ts +5 -4
- package/node_modules/@swc/core/index.js +2 -2
- package/node_modules/@swc/core/package.json +12 -12
- package/node_modules/@swc/core-darwin-arm64/package.json +1 -1
- package/node_modules/@swc/core-darwin-arm64/swc.darwin-arm64.node +0 -0
- package/node_modules/@swc/core-darwin-x64/package.json +1 -1
- package/node_modules/@swc/core-darwin-x64/swc.darwin-x64.node +0 -0
- package/node_modules/@swc/core-linux-arm64-gnu/package.json +1 -1
- package/node_modules/@swc/core-linux-arm64-gnu/swc.linux-arm64-gnu.node +0 -0
- package/node_modules/@swc/core-linux-arm64-musl/package.json +1 -1
- package/node_modules/@swc/core-linux-arm64-musl/swc.linux-arm64-musl.node +0 -0
- package/node_modules/@swc/core-linux-x64-gnu/package.json +1 -1
- package/node_modules/@swc/core-linux-x64-gnu/swc.linux-x64-gnu.node +0 -0
- package/node_modules/@swc/core-linux-x64-musl/package.json +1 -1
- package/node_modules/@swc/core-linux-x64-musl/swc.linux-x64-musl.node +0 -0
- package/node_modules/@swc/core-win32-arm64-msvc/package.json +1 -1
- package/node_modules/@swc/core-win32-arm64-msvc/swc.win32-arm64-msvc.node +0 -0
- package/node_modules/@swc/core-win32-x64-msvc/package.json +1 -1
- package/node_modules/@swc/core-win32-x64-msvc/swc.win32-x64-msvc.node +0 -0
- package/node_modules/@swc/types/index.d.ts +15 -5
- package/node_modules/@swc/types/package.json +2 -2
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/buffer.d.ts +1 -1
- package/node_modules/@types/node/child_process.d.ts +26 -122
- package/node_modules/@types/node/crypto.d.ts +61 -11
- package/node_modules/@types/node/dns.d.ts +5 -0
- package/node_modules/@types/node/fs/promises.d.ts +48 -29
- package/node_modules/@types/node/fs.d.ts +52 -37
- package/node_modules/@types/node/globals.d.ts +148 -347
- package/node_modules/@types/node/http.d.ts +29 -5
- package/node_modules/@types/node/http2.d.ts +13 -11
- package/node_modules/@types/node/https.d.ts +5 -0
- package/node_modules/@types/node/index.d.ts +7 -2
- package/node_modules/@types/node/inspector.d.ts +187 -3985
- package/node_modules/@types/node/inspector.generated.d.ts +4052 -0
- package/node_modules/@types/node/module.d.ts +25 -0
- package/node_modules/@types/node/net.d.ts +21 -0
- package/node_modules/@types/node/package.json +4 -9
- package/node_modules/@types/node/perf_hooks.d.ts +14 -0
- package/node_modules/@types/node/repl.d.ts +11 -1
- package/node_modules/@types/node/sqlite.d.ts +34 -1
- package/node_modules/@types/node/stream/web.d.ts +4 -0
- package/node_modules/@types/node/stream.d.ts +17 -6
- package/node_modules/@types/node/test.d.ts +120 -1
- package/node_modules/@types/node/timers.d.ts +0 -2
- package/node_modules/@types/node/tls.d.ts +32 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +7 -2
- package/node_modules/@types/node/ts5.7/index.d.ts +7 -2
- package/node_modules/@types/node/url.d.ts +20 -6
- package/node_modules/@types/node/util.d.ts +12 -6
- package/node_modules/@types/node/vm.d.ts +73 -10
- package/node_modules/@types/node/wasi.d.ts +21 -0
- package/node_modules/@types/node/web-globals/abortcontroller.d.ts +34 -0
- package/node_modules/@types/node/web-globals/domexception.d.ts +68 -0
- package/node_modules/@types/node/{dom-events.d.ts → web-globals/events.d.ts} +47 -52
- package/node_modules/@types/node/web-globals/fetch.d.ts +50 -0
- package/node_modules/@types/node/web-globals/navigator.d.ts +25 -0
- package/node_modules/@types/node/web-globals/storage.d.ts +24 -0
- package/node_modules/@types/node/worker_threads.d.ts +63 -3
- package/node_modules/@types/node/zlib.d.ts +8 -2
- package/node_modules/axios/CHANGELOG.md +58 -0
- package/node_modules/axios/README.md +87 -10
- package/node_modules/axios/dist/axios.js +355 -289
- package/node_modules/axios/dist/axios.js.map +1 -1
- package/node_modules/axios/dist/axios.min.js +2 -2
- package/node_modules/axios/dist/axios.min.js.map +1 -1
- package/node_modules/axios/dist/browser/axios.cjs +286 -213
- package/node_modules/axios/dist/browser/axios.cjs.map +1 -1
- package/node_modules/axios/dist/esm/axios.js +286 -213
- package/node_modules/axios/dist/esm/axios.js.map +1 -1
- package/node_modules/axios/dist/esm/axios.min.js +2 -2
- package/node_modules/axios/dist/esm/axios.min.js.map +1 -1
- package/node_modules/axios/dist/node/axios.cjs +377 -213
- package/node_modules/axios/dist/node/axios.cjs.map +1 -1
- package/node_modules/axios/index.d.cts +12 -5
- package/node_modules/axios/index.d.ts +13 -4
- package/node_modules/axios/lib/adapters/adapters.js +6 -4
- package/node_modules/axios/lib/adapters/fetch.js +221 -162
- package/node_modules/axios/lib/adapters/http.js +18 -0
- package/node_modules/axios/lib/adapters/xhr.js +11 -8
- package/node_modules/axios/lib/core/Axios.js +0 -2
- package/node_modules/axios/lib/core/AxiosError.js +10 -3
- package/node_modules/axios/lib/core/dispatchRequest.js +1 -1
- package/node_modules/axios/lib/defaults/index.js +1 -1
- package/node_modules/axios/lib/env/data.js +1 -1
- package/node_modules/axios/lib/helpers/buildURL.js +1 -3
- package/node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js +73 -0
- package/node_modules/axios/lib/helpers/resolveConfig.js +13 -9
- package/node_modules/axios/lib/utils.js +5 -3
- package/node_modules/axios/package.json +18 -12
- package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
- package/node_modules/balanced-match/LICENSE.md +21 -0
- package/node_modules/balanced-match/README.md +97 -0
- package/node_modules/balanced-match/index.js +62 -0
- package/node_modules/balanced-match/package.json +48 -0
- package/node_modules/brace-expansion/.github/FUNDING.yml +2 -0
- package/node_modules/brace-expansion/LICENSE +21 -0
- package/node_modules/brace-expansion/README.md +135 -0
- package/node_modules/brace-expansion/index.js +203 -0
- package/node_modules/brace-expansion/package.json +49 -0
- package/node_modules/detect-libc/lib/detect-libc.js +59 -13
- package/node_modules/detect-libc/lib/elf.js +39 -0
- package/node_modules/detect-libc/lib/filesystem.js +18 -8
- package/node_modules/detect-libc/package.json +3 -2
- package/node_modules/minimatch/LICENSE +15 -0
- package/node_modules/minimatch/README.md +454 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
- package/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/ast.js +592 -0
- package/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
- package/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/escape.js +22 -0
- package/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts +94 -0
- package/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/index.js +1017 -0
- package/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
- package/node_modules/minimatch/dist/commonjs/package.json +3 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js +24 -0
- package/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
- package/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
- package/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/ast.js +588 -0
- package/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
- package/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts +12 -0
- package/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/escape.js +18 -0
- package/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/node_modules/minimatch/dist/esm/index.d.ts +94 -0
- package/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/index.js +1001 -0
- package/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/node_modules/minimatch/dist/esm/package.json +3 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts +17 -0
- package/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
- package/node_modules/minimatch/dist/esm/unescape.js +20 -0
- package/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/node_modules/minimatch/package.json +82 -0
- package/node_modules/node-abi/LICENSE +21 -0
- package/node_modules/node-abi/README.md +54 -0
- package/node_modules/node-abi/abi_registry.json +408 -0
- package/node_modules/node-abi/getNextTarget.js +13 -0
- package/node_modules/node-abi/index.js +161 -0
- package/node_modules/node-abi/package.json +46 -0
- package/node_modules/node-addon-api/README.md +25 -249
- package/node_modules/node-addon-api/common.gypi +1 -0
- package/node_modules/node-addon-api/index.js +2 -0
- package/node_modules/node-addon-api/napi-inl.h +592 -166
- package/node_modules/node-addon-api/napi.h +167 -59
- package/node_modules/node-addon-api/node_addon_api.gyp +10 -0
- package/node_modules/node-addon-api/noexcept.gypi +1 -1
- package/node_modules/node-addon-api/package.json +13 -13
- package/node_modules/node-addon-api/tools/conversion.js +1 -1
- package/node_modules/protobufjs/dist/light/protobuf.js +2 -2
- package/node_modules/protobufjs/dist/light/protobuf.min.js +2 -2
- package/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
- package/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
- package/node_modules/protobufjs/dist/protobuf.js +2 -2
- package/node_modules/protobufjs/dist/protobuf.min.js +2 -2
- package/node_modules/protobufjs/google/protobuf/descriptor.json +2 -2
- package/node_modules/protobufjs/google/protobuf/descriptor.proto +2 -1
- package/node_modules/protobufjs/package.json +1 -1
- package/node_modules/undici-types/agent.d.ts +4 -0
- package/node_modules/undici-types/client-stats.d.ts +15 -0
- package/node_modules/undici-types/client.d.ts +6 -3
- package/node_modules/undici-types/diagnostics-channel.d.ts +9 -0
- package/node_modules/undici-types/dispatcher.d.ts +3 -2
- package/node_modules/undici-types/env-http-proxy-agent.d.ts +2 -1
- package/node_modules/undici-types/eventsource.d.ts +3 -3
- package/node_modules/undici-types/fetch.d.ts +1 -0
- package/node_modules/undici-types/handlers.d.ts +1 -1
- package/node_modules/undici-types/mock-agent.d.ts +3 -0
- package/node_modules/undici-types/mock-client.d.ts +2 -0
- package/node_modules/undici-types/mock-interceptor.d.ts +2 -0
- package/node_modules/undici-types/mock-pool.d.ts +2 -0
- package/node_modules/undici-types/package.json +1 -1
- package/node_modules/undici-types/pool.d.ts +2 -0
- package/node_modules/undici-types/proxy-agent.d.ts +1 -0
- package/node_modules/undici-types/retry-handler.d.ts +9 -0
- package/node_modules/undici-types/webidl.d.ts +29 -15
- package/node_modules/undici-types/websocket.d.ts +3 -1
- package/node_modules/yaml/README.md +2 -20
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +1 -1
- package/node_modules/yaml/dist/stringify/stringifyString.js +1 -1
- package/node_modules/yaml/package.json +2 -1
- package/package.json +4 -3
- package/node_modules/@contrast/code-events/prebuilds/linux-arm64/@contrast+code-events.abi93.armv8.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi93.glibc.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/linux-x64/@contrast+code-events.abi93.musl.node +0 -0
- package/node_modules/@contrast/code-events/prebuilds/win32-x64/@contrast+code-events.abi93.node +0 -0
- package/node_modules/@contrast/core/lib/sensitive-data-masking/protect-listener.js +0 -111
- package/node_modules/@contrast/distringuish/prebuilds/linux-arm64/@contrast+distringuish.abi93.armv8.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi93.glibc.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/linux-x64/@contrast+distringuish.abi93.musl.node +0 -0
- package/node_modules/@contrast/distringuish/prebuilds/win32-x64/@contrast+distringuish.abi93.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-arm64/@contrast+fn-inspect.abi93.armv8.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/linux-x64/@contrast+fn-inspect.abi93.glibc.node +0 -0
- package/node_modules/@contrast/fn-inspect/prebuilds/win32-x64/@contrast+fn-inspect.abi93.node +0 -0
- package/node_modules/@contrast/perf/lib/index.test.js +0 -547
- package/node_modules/@contrast/perf/lib/tsconfig.json +0 -31
- package/node_modules/@contrast/protect/lib/input-tracing/install/spdy.js +0 -63
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/.taprc.yaml +0 -11
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/destroy.test.js +0 -49
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/end.test.js +0 -98
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/flush-sync.test.js +0 -140
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/flush.test.js +0 -419
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/fsync.test.js +0 -63
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/helper.js +0 -42
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/minlength.test.js +0 -35
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/mode.test.js +0 -116
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/reopen.test.js +0 -239
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/retry.test.js +0 -414
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/sync.test.js +0 -261
- package/node_modules/@contrast/reporter/node_modules/sonic-boom/test/write.test.js +0 -465
- package/node_modules/@types/node/ts5.1/compatibility/disposable.d.ts +0 -12
- package/node_modules/@types/node/ts5.1/index.d.ts +0 -98
- package/node_modules/node-addon-api/tools/eslint-format.js +0 -79
|
@@ -32,6 +32,7 @@ const {
|
|
|
32
32
|
}
|
|
33
33
|
} = require('@contrast/common');
|
|
34
34
|
const { Core } = require('@contrast/core/lib/ioc/core');
|
|
35
|
+
|
|
35
36
|
//
|
|
36
37
|
// these rules are not implemented by agent-lib, but are being considered for
|
|
37
38
|
// implementation:
|
|
@@ -100,6 +101,7 @@ module.exports = Core.makeComponent({
|
|
|
100
101
|
factory(core) {
|
|
101
102
|
const {
|
|
102
103
|
logger,
|
|
104
|
+
protect,
|
|
103
105
|
protect: {
|
|
104
106
|
agentLib,
|
|
105
107
|
inputAnalysis,
|
|
@@ -132,6 +134,124 @@ module.exports = Core.makeComponent({
|
|
|
132
134
|
// inputs against rules 1) is very fast and 2) dramatically pares down the number
|
|
133
135
|
// of exclusion checks that need to be made.
|
|
134
136
|
|
|
137
|
+
/**
|
|
138
|
+
* merge new findings into the existing findings
|
|
139
|
+
*
|
|
140
|
+
* @param {Object} sourceContext sourceContext.findings is the existing findings
|
|
141
|
+
* @param {Object} newFindings the findings, in {trackRequest, resultsList} format.
|
|
142
|
+
* @returns {undefined|[String]} undefined to permit else [mode, rule] to block.
|
|
143
|
+
*/
|
|
144
|
+
function mergeFindings(sourceContext, newFindings) {
|
|
145
|
+
const { policy } = sourceContext;
|
|
146
|
+
const { securityException, resultsMap } = sourceContext;
|
|
147
|
+
|
|
148
|
+
if (!newFindings.trackRequest) {
|
|
149
|
+
return securityException;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
newFindings.resultsList = newFindings.resultsList.filter(
|
|
153
|
+
(result) => !inputAnalysis.isResultExcluded(sourceContext, result)
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
normalizeFindings(policy, newFindings);
|
|
157
|
+
|
|
158
|
+
sourceContext.trackRequest = sourceContext.trackRequest || newFindings.trackRequest;
|
|
159
|
+
sourceContext.securityException = sourceContext.securityException || newFindings.securityException;
|
|
160
|
+
|
|
161
|
+
// merge them into a ruleId-indexed map (pojo)
|
|
162
|
+
for (const result of newFindings.resultsList) {
|
|
163
|
+
if (!resultsMap[result.ruleId]) {
|
|
164
|
+
resultsMap[result.ruleId] = [];
|
|
165
|
+
}
|
|
166
|
+
resultsMap[result.ruleId].push(result);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return sourceContext.securityException;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
//
|
|
173
|
+
// add common fields to findings.
|
|
174
|
+
//
|
|
175
|
+
function normalizeFindings(policy, findings) {
|
|
176
|
+
// now both augment the rules and check to see if any require blocking
|
|
177
|
+
// at perimeter.
|
|
178
|
+
for (const r of findings.resultsList) {
|
|
179
|
+
// augment
|
|
180
|
+
// what additional augmentations are needed?
|
|
181
|
+
// the name/id might need to be mapped but keep the original so it's not lost
|
|
182
|
+
r.mappedId = agentLibRuleTypeToName[r.ruleId] || r.ruleId;
|
|
183
|
+
|
|
184
|
+
// if we block this or the value is found in sink, we'll know not to check
|
|
185
|
+
// this result for probe analysis in handleRequestEnd().
|
|
186
|
+
r.blocked = false;
|
|
187
|
+
r.exploited = false;
|
|
188
|
+
|
|
189
|
+
// apply exclusions here.
|
|
190
|
+
//
|
|
191
|
+
// apply exclusions after scoring inputs as it will require less work
|
|
192
|
+
// most of the time.
|
|
193
|
+
//
|
|
194
|
+
// the following might need to be changed. BAP is legacy behavior; beyond that,
|
|
195
|
+
// the only way a score >= 90 can come back is if there is no "worth-watching"
|
|
196
|
+
// option and that implies that there is no sink, so this is the only place at
|
|
197
|
+
// which the block can occur. so at a minimum 'block' should also result in a
|
|
198
|
+
// block.
|
|
199
|
+
const mode = policy.getRuleMode(r.ruleId);
|
|
200
|
+
|
|
201
|
+
if (r.score >= 90 && BLOCKING_MODES.includes(mode)) {
|
|
202
|
+
r.blocked = true;
|
|
203
|
+
findings.securityException = [mode, r.ruleId, { result: r }];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function checkIpsMatch(listEntry, ip) {
|
|
209
|
+
const parsed = address.process(ip);
|
|
210
|
+
|
|
211
|
+
// Check if IP is in CIDR range,
|
|
212
|
+
if (listEntry.cidr) {
|
|
213
|
+
if (parsed.kind() !== listEntry.cidr.kind) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (parsed.match(listEntry.cidr.range)) {
|
|
218
|
+
return { ...listEntry, match: ip };
|
|
219
|
+
} else {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// or do a direct comparison
|
|
225
|
+
if (parsed.toNormalizedString() === listEntry.normalizedValue) {
|
|
226
|
+
return { ...listEntry, matchedIp: ip };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* getValueAtKey() is used to fetch the object (expected) associated
|
|
234
|
+
* with the path of keys in obj. i say expected because this is only used
|
|
235
|
+
* for fetching the objects associated with a nosql vulnerability and those
|
|
236
|
+
* should always be objects.
|
|
237
|
+
*
|
|
238
|
+
* @param {Object} obj an object with keys
|
|
239
|
+
* @param {Array} path list of keys to walk through the object
|
|
240
|
+
* @param {String} lastKey the last key (it's not in path)
|
|
241
|
+
*
|
|
242
|
+
* @returns the value at end of walking path in obj
|
|
243
|
+
*/
|
|
244
|
+
function getValueAtKey(obj, path, key) {
|
|
245
|
+
for (const p of path) {
|
|
246
|
+
/* c8 ignore next 6 */
|
|
247
|
+
if (!(p in obj)) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
obj = obj[p];
|
|
251
|
+
}
|
|
252
|
+
return key in obj ? obj[key] : undefined;
|
|
253
|
+
}
|
|
254
|
+
|
|
135
255
|
/**
|
|
136
256
|
* handleConnect()
|
|
137
257
|
*
|
|
@@ -169,7 +289,7 @@ module.exports = Core.makeComponent({
|
|
|
169
289
|
* @returns {undefined|[String]} undefined to permit else [mode, rule] to block.
|
|
170
290
|
*/
|
|
171
291
|
inputAnalysis.handleConnect = function handleConnect(sourceContext, connectInputs) {
|
|
172
|
-
const
|
|
292
|
+
const rulesMask = sourceContext.policy.getRulesMask();
|
|
173
293
|
|
|
174
294
|
inputAnalysis.handleVirtualPatches(
|
|
175
295
|
sourceContext,
|
|
@@ -183,6 +303,10 @@ module.exports = Core.makeComponent({
|
|
|
183
303
|
block = inputAnalysis.handleMethodTampering(sourceContext, connectInputs);
|
|
184
304
|
}
|
|
185
305
|
|
|
306
|
+
if (block) {
|
|
307
|
+
core.protect.reportFinding(block[2]);
|
|
308
|
+
}
|
|
309
|
+
|
|
186
310
|
return block;
|
|
187
311
|
};
|
|
188
312
|
|
|
@@ -205,17 +329,15 @@ module.exports = Core.makeComponent({
|
|
|
205
329
|
inputAnalysis.handleQueryParams = function handleQueryParams(sourceContext, queryParams) {
|
|
206
330
|
if (sourceContext.analyzedQuery) return;
|
|
207
331
|
sourceContext.analyzedQuery = true;
|
|
208
|
-
|
|
209
332
|
if (typeof queryParams !== 'object') {
|
|
210
333
|
logger.debug({ queryParams }, 'handleQueryParams() called with non-object');
|
|
211
334
|
return;
|
|
212
335
|
}
|
|
213
|
-
|
|
214
336
|
inputAnalysis.handleVirtualPatches(sourceContext, { PARAMETERS: queryParams });
|
|
215
337
|
|
|
216
338
|
const block = commonObjectAnalyzer(sourceContext, queryParams, parameterInputTypes);
|
|
217
|
-
|
|
218
339
|
if (block) {
|
|
340
|
+
core.protect.reportFinding(block[2]);
|
|
219
341
|
core.protect.throwSecurityException(sourceContext);
|
|
220
342
|
}
|
|
221
343
|
};
|
|
@@ -230,6 +352,9 @@ module.exports = Core.makeComponent({
|
|
|
230
352
|
* @param {Object} urlParams pojo
|
|
231
353
|
*/
|
|
232
354
|
inputAnalysis.handleUrlParams = function(sourceContext, urlParams) {
|
|
355
|
+
const rulesMask = sourceContext.policy.getRulesMask();
|
|
356
|
+
if (!rulesMask) return;
|
|
357
|
+
|
|
233
358
|
if (sourceContext.analyzedUrlParams) return;
|
|
234
359
|
sourceContext.analyzedUrlParams = true;
|
|
235
360
|
|
|
@@ -240,7 +365,6 @@ module.exports = Core.makeComponent({
|
|
|
240
365
|
|
|
241
366
|
inputAnalysis.handleVirtualPatches(sourceContext, { PARAMETERS: urlParams });
|
|
242
367
|
|
|
243
|
-
const { policy: { rulesMask } } = sourceContext;
|
|
244
368
|
const resultsList = [];
|
|
245
369
|
const { UrlParameter } = agentLib.InputType;
|
|
246
370
|
|
|
@@ -251,7 +375,6 @@ module.exports = Core.makeComponent({
|
|
|
251
375
|
}
|
|
252
376
|
|
|
253
377
|
const items = agentLib.scoreAtom(rulesMask, value, UrlParameter, preferWW);
|
|
254
|
-
|
|
255
378
|
if (!items) {
|
|
256
379
|
return;
|
|
257
380
|
}
|
|
@@ -284,6 +407,9 @@ module.exports = Core.makeComponent({
|
|
|
284
407
|
const block = mergeFindings(sourceContext, urlParamsFindings);
|
|
285
408
|
|
|
286
409
|
if (block) {
|
|
410
|
+
if (block[2]) {
|
|
411
|
+
core.protect.reportFinding(block[2]);
|
|
412
|
+
}
|
|
287
413
|
core.protect.throwSecurityException(sourceContext);
|
|
288
414
|
}
|
|
289
415
|
};
|
|
@@ -302,7 +428,8 @@ module.exports = Core.makeComponent({
|
|
|
302
428
|
|
|
303
429
|
inputAnalysis.handleVirtualPatches(sourceContext, { HEADERS: cookies });
|
|
304
430
|
|
|
305
|
-
const
|
|
431
|
+
const rulesMask = sourceContext.policy.getRulesMask();
|
|
432
|
+
if (!rulesMask) return;
|
|
306
433
|
|
|
307
434
|
const cookiesArr = Object.entries(cookies).reduce((acc, [key, value]) => {
|
|
308
435
|
// things like booleans will cause agent-lib to throw
|
|
@@ -315,6 +442,7 @@ module.exports = Core.makeComponent({
|
|
|
315
442
|
const block = mergeFindings(sourceContext, cookieFindings);
|
|
316
443
|
|
|
317
444
|
if (block) {
|
|
445
|
+
protect.reportFinding(block[2]);
|
|
318
446
|
core.protect.throwSecurityException(sourceContext);
|
|
319
447
|
}
|
|
320
448
|
};
|
|
@@ -356,6 +484,7 @@ module.exports = Core.makeComponent({
|
|
|
356
484
|
sourceContext.bodyType = bodyType;
|
|
357
485
|
|
|
358
486
|
if (block) {
|
|
487
|
+
protect.reportFinding(block[2]);
|
|
359
488
|
core.protect.throwSecurityException(sourceContext);
|
|
360
489
|
}
|
|
361
490
|
};
|
|
@@ -367,7 +496,7 @@ module.exports = Core.makeComponent({
|
|
|
367
496
|
const { policy } = sourceContext;
|
|
368
497
|
const resultsList = [];
|
|
369
498
|
|
|
370
|
-
if (policy
|
|
499
|
+
if (policy.getRuleMode(Rule.UNSAFE_FILE_UPLOAD) === 'off') return;
|
|
371
500
|
|
|
372
501
|
for (const name of names) {
|
|
373
502
|
if (!isString(name)) {
|
|
@@ -375,7 +504,7 @@ module.exports = Core.makeComponent({
|
|
|
375
504
|
return;
|
|
376
505
|
}
|
|
377
506
|
|
|
378
|
-
const items = agentLib.scoreAtom(policy.
|
|
507
|
+
const items = agentLib.scoreAtom(policy.getRulesMask(), name, type);
|
|
379
508
|
|
|
380
509
|
if (!items) {
|
|
381
510
|
return;
|
|
@@ -402,6 +531,7 @@ module.exports = Core.makeComponent({
|
|
|
402
531
|
const block = mergeFindings(sourceContext, unsafeFilenameFindings);
|
|
403
532
|
|
|
404
533
|
if (block) {
|
|
534
|
+
core.protect.reportFinding(block[2]);
|
|
405
535
|
core.protect.throwSecurityException(sourceContext);
|
|
406
536
|
}
|
|
407
537
|
};
|
|
@@ -411,6 +541,7 @@ module.exports = Core.makeComponent({
|
|
|
411
541
|
|
|
412
542
|
if (!Object.keys(requestInput).filter(Boolean).length || !sourceContext?.virtualPatchesEvaluators.length) return;
|
|
413
543
|
|
|
544
|
+
// todo: get virtualPatchesEvaluators from protect policy instead of request
|
|
414
545
|
for (const vpEvaluators of sourceContext.virtualPatchesEvaluators) {
|
|
415
546
|
for (const key in requestInput) {
|
|
416
547
|
const evaluator = vpEvaluators.get(key);
|
|
@@ -423,10 +554,17 @@ module.exports = Core.makeComponent({
|
|
|
423
554
|
if (!sourceContext.resultsMap[ruleId]) {
|
|
424
555
|
sourceContext.resultsMap[ruleId] = [];
|
|
425
556
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
557
|
+
|
|
558
|
+
const result = {
|
|
559
|
+
key: name,
|
|
560
|
+
inputType: 'UNKNOWN',
|
|
561
|
+
ruleId: Rule.VIRTUAL_PATCH,
|
|
562
|
+
value: 'Virtual Patch',
|
|
563
|
+
blocked: true,
|
|
564
|
+
};
|
|
565
|
+
const eventArg = { result, findings: { uuid } };
|
|
566
|
+
|
|
567
|
+
protect.reportFinding(eventArg);
|
|
430
568
|
sourceContext.securityException = ['block', ruleId];
|
|
431
569
|
core.protect.throwSecurityException(sourceContext);
|
|
432
570
|
}
|
|
@@ -453,7 +591,7 @@ module.exports = Core.makeComponent({
|
|
|
453
591
|
if (!sourceContext || !ipDenylist.length) return;
|
|
454
592
|
|
|
455
593
|
const { sourceInfo } = core.scopes.sources.getStore();
|
|
456
|
-
const match = ipListAnalysis(sourceInfo.
|
|
594
|
+
const match = ipListAnalysis(sourceInfo.ip, sourceInfo.rawHeaders, ipDenylist);
|
|
457
595
|
|
|
458
596
|
if (match) {
|
|
459
597
|
logger.info(match, 'Found a matching IP to an entry in ipDeny list');
|
|
@@ -461,17 +599,28 @@ module.exports = Core.makeComponent({
|
|
|
461
599
|
sourceContext.resultsMap[ruleId] = [];
|
|
462
600
|
}
|
|
463
601
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
602
|
+
const eventArg = {
|
|
603
|
+
result: {
|
|
604
|
+
key: 'IP Address',
|
|
605
|
+
inputType: 'UNKNOWN',
|
|
606
|
+
ruleId: Rule.IP_DENYLIST,
|
|
607
|
+
value: sourceInfo.ip,
|
|
608
|
+
blocked: true,
|
|
609
|
+
},
|
|
610
|
+
findings: {
|
|
611
|
+
uuid: match.uuid,
|
|
612
|
+
ip: match.matchedIp,
|
|
613
|
+
},
|
|
614
|
+
};
|
|
615
|
+
protect.reportFinding(eventArg);
|
|
616
|
+
|
|
468
617
|
return ['block', 'ip-denylist'];
|
|
469
618
|
}
|
|
470
619
|
};
|
|
471
620
|
|
|
472
621
|
inputAnalysis.handleMethodTampering = function(sourceContext, connectInputs) {
|
|
473
622
|
const ruleId = Rule.METHOD_TAMPERING;
|
|
474
|
-
const mode = sourceContext.policy
|
|
623
|
+
const mode = sourceContext.policy.getRuleMode(ruleId);
|
|
475
624
|
if (mode !== OFF) {
|
|
476
625
|
const { method } = connectInputs;
|
|
477
626
|
|
|
@@ -481,14 +630,14 @@ module.exports = Core.makeComponent({
|
|
|
481
630
|
key: 'method',
|
|
482
631
|
value: method,
|
|
483
632
|
blocked: false,
|
|
484
|
-
exploitMetadata: null,
|
|
485
633
|
};
|
|
486
634
|
|
|
487
635
|
sourceContext.resultsMap[ruleId] = [result];
|
|
488
636
|
|
|
489
637
|
if (BLOCKING_MODES.includes(mode)) {
|
|
638
|
+
result.exploited = true;
|
|
490
639
|
result.blocked = true;
|
|
491
|
-
return sourceContext.securityException = ['block', ruleId];
|
|
640
|
+
return sourceContext.securityException = ['block', ruleId, { result }];
|
|
492
641
|
}
|
|
493
642
|
}
|
|
494
643
|
}
|
|
@@ -502,24 +651,24 @@ module.exports = Core.makeComponent({
|
|
|
502
651
|
* @param {Object} sourceContext
|
|
503
652
|
*/
|
|
504
653
|
inputAnalysis.handleRequestEnd = function handleRequestEnd(sourceContext) {
|
|
505
|
-
{
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
}
|
|
654
|
+
const { policy } = sourceContext;
|
|
655
|
+
// check status code to verify method-tampering exploitation
|
|
656
|
+
const mtResult = sourceContext.resultsMap[Rule.METHOD_TAMPERING]?.[0];
|
|
657
|
+
if (mtResult && policy.getRuleMode(Rule.METHOD_TAMPERING) !== OFF) {
|
|
658
|
+
const { statusCode } = sourceContext.resData;
|
|
659
|
+
if (statusCode !== 405 || statusCode !== 501) {
|
|
660
|
+
mtResult.exploited = true;
|
|
661
|
+
protect.reportFindings({ result: mtResult, finding: { statusCode } });
|
|
513
662
|
}
|
|
514
663
|
}
|
|
515
664
|
|
|
516
|
-
if (!config.protect.probe_analysis.enable) return;
|
|
517
|
-
|
|
518
665
|
// Detecting probes
|
|
519
|
-
const
|
|
666
|
+
const rulesMask = sourceContext.policy.getRulesMask();
|
|
667
|
+
if (rulesMask == 0 || !config.protect.probe_analysis.enable) return;
|
|
668
|
+
const probeReports = [];
|
|
669
|
+
const { resultsMap } = sourceContext;
|
|
520
670
|
const probesRules = [Rule.CMD_INJECTION, Rule.PATH_TRAVERSAL, Rule.SQL_INJECTION, Rule.XXE];
|
|
521
671
|
const probes = {};
|
|
522
|
-
|
|
523
672
|
const findingsForScoreRequest = {
|
|
524
673
|
HeaderValue: {},
|
|
525
674
|
ParameterValue: {},
|
|
@@ -532,7 +681,7 @@ module.exports = Core.makeComponent({
|
|
|
532
681
|
resultsByRuleId.forEach(resultByRuleId => {
|
|
533
682
|
const {
|
|
534
683
|
ruleId,
|
|
535
|
-
|
|
684
|
+
exploited,
|
|
536
685
|
score,
|
|
537
686
|
value,
|
|
538
687
|
key,
|
|
@@ -540,10 +689,11 @@ module.exports = Core.makeComponent({
|
|
|
540
689
|
} = resultByRuleId;
|
|
541
690
|
|
|
542
691
|
if (
|
|
543
|
-
|
|
544
|
-
|
|
692
|
+
sourceContext.policy.getRuleMode(ruleId) !== MONITOR ||
|
|
693
|
+
exploited === true || // todo: remove
|
|
545
694
|
score >= 90 ||
|
|
546
|
-
!probesRules.some((rule) => rule === ruleId)
|
|
695
|
+
!probesRules.some((rule) => rule === ruleId) ||
|
|
696
|
+
inputType == InputType.UNKNOWN
|
|
547
697
|
) {
|
|
548
698
|
return;
|
|
549
699
|
}
|
|
@@ -562,9 +712,7 @@ module.exports = Core.makeComponent({
|
|
|
562
712
|
valueToResultByRuleId[value] = resultByRuleId;
|
|
563
713
|
});
|
|
564
714
|
});
|
|
565
|
-
|
|
566
715
|
const { ParameterValue, HeaderValue, CookieValue } = findingsForScoreRequest;
|
|
567
|
-
|
|
568
716
|
const results =
|
|
569
717
|
agentLib.scoreRequestConnect(
|
|
570
718
|
rulesMask,
|
|
@@ -579,20 +727,21 @@ module.exports = Core.makeComponent({
|
|
|
579
727
|
).resultsList || [];
|
|
580
728
|
|
|
581
729
|
Object.entries(findingsForScoreAtom).forEach(([value, inputTypes]) => {
|
|
582
|
-
Object.entries(inputTypes).forEach(([inputType, resultByRuleId]) =>
|
|
583
|
-
(
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
730
|
+
Object.entries(inputTypes).forEach(([inputType, resultByRuleId]) => {
|
|
731
|
+
if (agentLib.InputType[inputType] == null) return;
|
|
732
|
+
const alibResult = agentLib.scoreAtom(rulesMask, value, agentLib.InputType[inputType], {
|
|
733
|
+
preferWorthWatching: false,
|
|
734
|
+
}) || [];
|
|
735
|
+
alibResult.forEach(result => {
|
|
588
736
|
results.push({ value, ...result });
|
|
737
|
+
probeReports.push({ value, ...result });
|
|
589
738
|
valueToResultByRuleId[value] = resultByRuleId;
|
|
590
|
-
})
|
|
591
|
-
);
|
|
739
|
+
});
|
|
740
|
+
});
|
|
592
741
|
});
|
|
593
742
|
|
|
594
743
|
results
|
|
595
|
-
.filter(({ score, ruleId }) => score >= 90 &&
|
|
744
|
+
.filter(({ score, ruleId }) => score >= 90 && sourceContext.policy.getRuleMode(ruleId) == MONITOR)
|
|
596
745
|
.forEach((result) => {
|
|
597
746
|
const resultByRuleId = valueToResultByRuleId[result.value];
|
|
598
747
|
const probe = Object.assign({}, resultByRuleId, result, {
|
|
@@ -613,14 +762,88 @@ module.exports = Core.makeComponent({
|
|
|
613
762
|
}
|
|
614
763
|
|
|
615
764
|
resultsMap[probe.ruleId].push(probe);
|
|
765
|
+
probeReports.push(probe);
|
|
616
766
|
});
|
|
767
|
+
|
|
768
|
+
for (const result of probeReports) {
|
|
769
|
+
core.protect.reportFinding({ result });
|
|
770
|
+
}
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
/**
|
|
774
|
+
* Reads the source context's policy and compares to result item to check whether to ignore it.
|
|
775
|
+
* @param {ProtectMessage} sourceContext
|
|
776
|
+
* @param {Result} result
|
|
777
|
+
* @returns {boolean} whether result should be excluded
|
|
778
|
+
*/
|
|
779
|
+
inputAnalysis.isResultExcluded = function isResultExcluded(sourceContext, result) {
|
|
780
|
+
const exclusions = sourceContext.policy.getExclusionInfo();
|
|
781
|
+
if (!exclusions) return false;
|
|
782
|
+
|
|
783
|
+
const { ruleId, path, inputType, value } = result;
|
|
784
|
+
const inputName = path ? path[path.length - 1] : null;
|
|
785
|
+
|
|
786
|
+
let checkCookiesInHeader = false;
|
|
787
|
+
let inputExclusions;
|
|
788
|
+
|
|
789
|
+
switch (inputType) {
|
|
790
|
+
case 'JsonKey':
|
|
791
|
+
case 'JsonValue':
|
|
792
|
+
case 'MultipartName': {
|
|
793
|
+
if (
|
|
794
|
+
exclusions?.ignoreBody ||
|
|
795
|
+
exclusions?.bodyPolicy?.[ruleId] == OFF
|
|
796
|
+
) return true;
|
|
797
|
+
|
|
798
|
+
return false;
|
|
799
|
+
}
|
|
800
|
+
case 'ParameterKey':
|
|
801
|
+
case 'ParameterValue': {
|
|
802
|
+
const qsExcluded = exclusions.ignoreQuerystring || exclusions.querystringPolicy?.[ruleId] === OFF;
|
|
803
|
+
if (qsExcluded) return true;
|
|
804
|
+
inputExclusions = exclusions.parameter;
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
807
|
+
case 'CookieValue': {
|
|
808
|
+
inputExclusions = exclusions.cookie;
|
|
809
|
+
break;
|
|
810
|
+
}
|
|
811
|
+
case 'HeaderKey':
|
|
812
|
+
case 'HeaderValue': {
|
|
813
|
+
if (path[0] && StringPrototypeToLowerCase.call(path[0]) === 'cookie') {
|
|
814
|
+
inputExclusions = exclusions.cookie;
|
|
815
|
+
checkCookiesInHeader = true;
|
|
816
|
+
} else {
|
|
817
|
+
inputExclusions = exclusions?.header;
|
|
818
|
+
}
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
if (!inputName || !inputExclusions) return false;
|
|
824
|
+
|
|
825
|
+
for (const excl of inputExclusions) {
|
|
826
|
+
let nameCheck = false;
|
|
827
|
+
if (checkCookiesInHeader) {
|
|
828
|
+
nameCheck = excl.checkCookiesInHeader(value);
|
|
829
|
+
} else {
|
|
830
|
+
nameCheck = excl.matchesInputName(inputName);
|
|
831
|
+
}
|
|
832
|
+
if (!nameCheck) continue;
|
|
833
|
+
if (!excl.policy || excl.policy[ruleId] === OFF) {
|
|
834
|
+
return true;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
return false;
|
|
617
839
|
};
|
|
618
840
|
|
|
619
841
|
/**
|
|
620
842
|
* commonObjectAnalyzer() walks an object supplied by the end-user and checks
|
|
621
843
|
* it for vulnerabilities.
|
|
622
844
|
*
|
|
623
|
-
*
|
|
845
|
+
*
|
|
846
|
+
This can cause the request to be blocked, depending on the mode and findings.
|
|
624
847
|
*
|
|
625
848
|
* @param {Object} sourceContext the sourceContext for the request
|
|
626
849
|
* @param {Object} object the object to analyze. It could be from any input
|
|
@@ -632,14 +855,14 @@ module.exports = Core.makeComponent({
|
|
|
632
855
|
* @returns {Array | undefined} returns an array with block info if vulnerability was found.
|
|
633
856
|
*/
|
|
634
857
|
function commonObjectAnalyzer(sourceContext, object, inputTypes) {
|
|
635
|
-
const { policy: { rulesMask } } = sourceContext;
|
|
636
|
-
if (!rulesMask) return;
|
|
637
|
-
|
|
638
858
|
// use inputTypes to set params...
|
|
639
859
|
const { keyType, inputType } = inputTypes;
|
|
640
860
|
const inputTypeStr = inputTypes === jsonInputTypes ? 'Json' : 'Parameter';
|
|
641
861
|
const resultsList = [];
|
|
642
862
|
|
|
863
|
+
const rulesMask = sourceContext.policy.getRulesMask();
|
|
864
|
+
if (!rulesMask) return;
|
|
865
|
+
|
|
643
866
|
// it's possible to optimize this if qs (or a similar package) is not loaded
|
|
644
867
|
// or if none of the values of queryParams are objects. a quick '.includes()'
|
|
645
868
|
// could be used to determine that. if none are objects then traverseKeysAndValues()
|
|
@@ -768,184 +991,3 @@ module.exports = Core.makeComponent({
|
|
|
768
991
|
}
|
|
769
992
|
},
|
|
770
993
|
});
|
|
771
|
-
|
|
772
|
-
/**
|
|
773
|
-
* Reads the source context's policy and compares to result item to check whether to ignore it.
|
|
774
|
-
* @param {ProtectMessage} sourceContext
|
|
775
|
-
* @param {Result} result
|
|
776
|
-
* @returns {boolean} whether result should be excluded
|
|
777
|
-
*/
|
|
778
|
-
function isResultExcluded(sourceContext, result) {
|
|
779
|
-
const { policy: { exclusions } } = sourceContext;
|
|
780
|
-
const { ruleId, path, inputType, value } = result;
|
|
781
|
-
const inputName = path ? path[path.length - 1] : null;
|
|
782
|
-
|
|
783
|
-
let checkCookiesInHeader = false;
|
|
784
|
-
let inputExclusions;
|
|
785
|
-
switch (inputType) {
|
|
786
|
-
case 'JsonKey':
|
|
787
|
-
case 'JsonValue':
|
|
788
|
-
case 'MultipartName': {
|
|
789
|
-
return exclusions.ignoreBody || exclusions.bodyPolicy?.[ruleId] === OFF;
|
|
790
|
-
}
|
|
791
|
-
case 'ParameterKey':
|
|
792
|
-
case 'ParameterValue': {
|
|
793
|
-
const qsExcluded = exclusions.ignoreQuerystring || exclusions.querystringPolicy?.[ruleId] === OFF;
|
|
794
|
-
if (qsExcluded) return true;
|
|
795
|
-
inputExclusions = exclusions.parameter;
|
|
796
|
-
break;
|
|
797
|
-
}
|
|
798
|
-
case 'CookieValue': {
|
|
799
|
-
inputExclusions = exclusions.cookie;
|
|
800
|
-
break;
|
|
801
|
-
}
|
|
802
|
-
case 'HeaderKey':
|
|
803
|
-
case 'HeaderValue': {
|
|
804
|
-
if (path[0] && StringPrototypeToLowerCase.call(path[0]) === 'cookie') {
|
|
805
|
-
inputExclusions = exclusions.cookie;
|
|
806
|
-
checkCookiesInHeader = true;
|
|
807
|
-
} else {
|
|
808
|
-
inputExclusions = exclusions.header;
|
|
809
|
-
}
|
|
810
|
-
break;
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
if (!inputName || !inputExclusions) return false;
|
|
815
|
-
|
|
816
|
-
for (const excl of inputExclusions) {
|
|
817
|
-
let nameCheck = false;
|
|
818
|
-
if (checkCookiesInHeader) {
|
|
819
|
-
nameCheck = excl.checkCookiesInHeader(value);
|
|
820
|
-
} else {
|
|
821
|
-
nameCheck = excl.matchesInputName(inputName);
|
|
822
|
-
}
|
|
823
|
-
if (!nameCheck) continue;
|
|
824
|
-
if (!excl.policy || excl.policy[ruleId] === OFF) {
|
|
825
|
-
return true;
|
|
826
|
-
}
|
|
827
|
-
}
|
|
828
|
-
|
|
829
|
-
return false;
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
/**
|
|
833
|
-
* merge new findings into the existing findings
|
|
834
|
-
*
|
|
835
|
-
* @param {Object} sourceContext sourceContext.findings is the existing findings
|
|
836
|
-
* @param {Object} newFindings the findings, in {trackRequest, resultsList} format.
|
|
837
|
-
* @returns {undefined|[String]} undefined to permit else [mode, rule] to block.
|
|
838
|
-
*/
|
|
839
|
-
function mergeFindings(sourceContext, newFindings) {
|
|
840
|
-
const { policy, securityException, resultsMap } = sourceContext;
|
|
841
|
-
|
|
842
|
-
if (!newFindings.trackRequest) {
|
|
843
|
-
return securityException;
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
newFindings.resultsList = newFindings.resultsList.filter(
|
|
847
|
-
(result) => !isResultExcluded(sourceContext, result)
|
|
848
|
-
);
|
|
849
|
-
|
|
850
|
-
normalizeFindings(policy, newFindings);
|
|
851
|
-
|
|
852
|
-
sourceContext.trackRequest = sourceContext.trackRequest || newFindings.trackRequest;
|
|
853
|
-
sourceContext.securityException = sourceContext.securityException || newFindings.securityException;
|
|
854
|
-
|
|
855
|
-
// merge them into a ruleId-indexed map (pojo)
|
|
856
|
-
for (const result of newFindings.resultsList) {
|
|
857
|
-
if (!resultsMap[result.ruleId]) {
|
|
858
|
-
resultsMap[result.ruleId] = [];
|
|
859
|
-
}
|
|
860
|
-
resultsMap[result.ruleId].push(result);
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
return sourceContext.securityException;
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
//
|
|
867
|
-
// add common fields to findings.
|
|
868
|
-
//
|
|
869
|
-
function normalizeFindings(policy, findings) {
|
|
870
|
-
// now both augment the rules and check to see if any require blocking
|
|
871
|
-
// at perimeter.
|
|
872
|
-
for (const r of findings.resultsList) {
|
|
873
|
-
// augment
|
|
874
|
-
// what additional augmentations are needed?
|
|
875
|
-
// the name/id might need to be mapped but keep the original so it's not lost
|
|
876
|
-
r.mappedId = agentLibRuleTypeToName[r.ruleId] || r.ruleId;
|
|
877
|
-
// this finding resulted in blocking, i.e., it is not a probe.
|
|
878
|
-
r.blocked = false;
|
|
879
|
-
|
|
880
|
-
// sink analysis will add findings here
|
|
881
|
-
r.exploitMetadata = [];
|
|
882
|
-
|
|
883
|
-
// apply exclusions here.
|
|
884
|
-
//
|
|
885
|
-
// apply exclusions after scoring inputs as it will require less work
|
|
886
|
-
// most of the time.
|
|
887
|
-
//
|
|
888
|
-
// the following might need to be changed. BAP is legacy behavior; beyond that,
|
|
889
|
-
// the only way a score >= 90 can come back is if there is no "worth-watching"
|
|
890
|
-
// option and that implies that there is no sink, so this is the only place at
|
|
891
|
-
// which the block can occur. so at a minimum 'block' should also result in a
|
|
892
|
-
// block.
|
|
893
|
-
const mode = policy[r.ruleId];
|
|
894
|
-
if (r.score >= 90 && BLOCKING_MODES.includes(mode)) {
|
|
895
|
-
r.blocked = true;
|
|
896
|
-
findings.securityException = [mode, r.ruleId];
|
|
897
|
-
}
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
function checkIpsMatch(listEntry, ip) {
|
|
903
|
-
const parsed = address.process(ip);
|
|
904
|
-
|
|
905
|
-
// Check if IP is in CIDR range,
|
|
906
|
-
if (listEntry.cidr) {
|
|
907
|
-
if (parsed.kind() !== listEntry.cidr.kind) {
|
|
908
|
-
return null;
|
|
909
|
-
}
|
|
910
|
-
|
|
911
|
-
if (parsed.match(listEntry.cidr.range)) {
|
|
912
|
-
return { ...listEntry, match: ip };
|
|
913
|
-
} else {
|
|
914
|
-
return null;
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
|
|
918
|
-
// or do a direct comparison
|
|
919
|
-
if (parsed.toNormalizedString() === listEntry.normalizedValue) {
|
|
920
|
-
return { ...listEntry, matchedIp: ip };
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
return null;
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
/**
|
|
927
|
-
* getValueAtKey() is used to fetch the object (expected) associated
|
|
928
|
-
* with the path of keys in obj. i say expected because this is only used
|
|
929
|
-
* for fetching the objects associated with a nosql vulnerability and those
|
|
930
|
-
* should always be objects.
|
|
931
|
-
*
|
|
932
|
-
* @param {Object} obj an object with keys
|
|
933
|
-
* @param {Array} path list of keys to walk through the object
|
|
934
|
-
* @param {String} lastKey the last key (it's not in path)
|
|
935
|
-
*
|
|
936
|
-
* @returns the value at end of walking path in obj
|
|
937
|
-
*/
|
|
938
|
-
function getValueAtKey(obj, path, key) {
|
|
939
|
-
for (const p of path) {
|
|
940
|
-
/* c8 ignore next 6 */
|
|
941
|
-
if (!(p in obj)) {
|
|
942
|
-
return undefined;
|
|
943
|
-
}
|
|
944
|
-
obj = obj[p];
|
|
945
|
-
}
|
|
946
|
-
return key in obj ? obj[key] : undefined;
|
|
947
|
-
}
|
|
948
|
-
|
|
949
|
-
function isMonitorMode(ruleId, sourceContext) {
|
|
950
|
-
return sourceContext.policy[ruleId] === MONITOR;
|
|
951
|
-
}
|