@contrast/agent 4.6.0 → 4.9.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/LICENSE +1 -1
- package/agent-loader.js +1 -1
- package/bin/VERSION +1 -1
- package/bin/linux/contrast-service +0 -0
- package/bin/mac/contrast-service +0 -0
- package/bin/windows/contrast-service.exe +0 -0
- package/bootstrap.js +13 -3
- package/cli-rewriter.js +1 -1
- package/cli.js +1 -1
- package/esm.mjs +34 -1
- package/lib/agent-emitter.js +1 -1
- package/lib/agent.js +1 -1
- package/lib/app-info.js +1 -1
- package/lib/assess/deadzones/index.js +1 -1
- package/lib/assess/deadzones/rewrite.js +1 -1
- package/lib/assess/express/index.js +1 -1
- package/lib/assess/express/route-coverage.js +1 -1
- package/lib/assess/express/sinks/index.js +1 -1
- package/lib/assess/express/sinks/xss.js +1 -1
- package/lib/assess/express/sources.js +1 -1
- package/lib/assess/fastify/index.js +1 -1
- package/lib/assess/fastify/route-coverage.js +1 -1
- package/lib/assess/fastify/sinks/index.js +1 -1
- package/lib/assess/fastify/sinks/response-scanning.js +1 -1
- package/lib/assess/fastify/sinks/unvalidated-redirect.js +1 -1
- package/lib/assess/fastify/sinks/xss.js +1 -1
- package/lib/assess/fastify/sources.js +1 -1
- package/lib/assess/hapi/index.js +1 -1
- package/lib/assess/hapi/route-coverage.js +1 -1
- package/lib/assess/hapi/sinks/index.js +1 -1
- package/lib/assess/hapi/sinks/response-scanning.js +1 -1
- package/lib/assess/hapi/sinks/session.js +1 -1
- package/lib/assess/hapi/sinks/unvalidated-redirect.js +1 -1
- package/lib/assess/hapi/sinks/xss.js +1 -1
- package/lib/assess/hapi/sources.js +1 -1
- package/lib/assess/index.js +3 -1
- package/lib/assess/koa/index.js +1 -1
- package/lib/assess/koa/route-coverage.js +1 -1
- package/lib/assess/koa/sinks/index.js +1 -1
- package/lib/assess/koa/sinks/response-scanning.js +1 -1
- package/lib/assess/koa/sinks/unvalidated-redirect.js +1 -1
- package/lib/assess/koa/sinks/xss.js +1 -1
- package/lib/assess/koa/sources.js +1 -1
- package/lib/assess/loopback4/index.js +1 -1
- package/lib/assess/loopback4/route-coverage.js +1 -1
- package/lib/assess/loopback4/sinks/index.js +1 -1
- package/lib/assess/loopback4/sinks/response-scanning.js +1 -1
- package/lib/assess/loopback4/sinks/xss.js +1 -1
- package/lib/assess/loopback4/sources.js +1 -1
- package/lib/assess/membrane/debraner.js +1 -1
- package/lib/assess/membrane/deserialization-membrane.js +5 -6
- package/lib/assess/membrane/index.js +1 -1
- package/lib/assess/membrane/source-membrane.js +17 -34
- package/lib/assess/models/base-event.js +1 -1
- package/lib/assess/models/call-context.js +2 -2
- package/lib/assess/models/index.js +1 -1
- package/lib/assess/models/propagation-event.js +1 -1
- package/lib/assess/models/signature.js +1 -1
- package/lib/assess/models/sink-event.js +1 -1
- package/lib/assess/models/source-event.js +7 -1
- package/lib/assess/models/tag-range/index.js +1 -1
- package/lib/assess/models/tag-range/relationships.js +1 -1
- package/lib/assess/models/tag-range/util.js +1 -1
- package/lib/assess/policy/index.js +1 -1
- package/lib/assess/policy/init.js +1 -1
- package/lib/assess/policy/propagators.json +13 -35
- package/lib/assess/policy/rules.json +36 -2
- package/lib/assess/policy/signatures.json +38 -6
- package/lib/assess/policy/util.js +3 -2
- package/lib/assess/propagators/JSON/parse.js +2 -2
- package/lib/assess/propagators/JSON/stringify.js +81 -11
- package/lib/assess/propagators/ajv/conditionals.js +1 -1
- package/lib/assess/propagators/ajv/evaluator-shim.js +1 -1
- package/lib/assess/propagators/ajv/index.js +1 -1
- package/lib/assess/propagators/ajv/json-schema-type-evaluators.js +1 -1
- package/lib/assess/propagators/ajv/object-walk.js +1 -1
- package/lib/assess/propagators/ajv/refs.js +1 -1
- package/lib/assess/propagators/ajv/schema-context.js +1 -1
- package/lib/assess/propagators/array-prototype-join.js +8 -9
- package/lib/assess/propagators/common.js +8 -6
- package/lib/assess/propagators/dustjs/escape-html.js +22 -0
- package/lib/assess/propagators/dustjs/escape-js.js +22 -0
- package/lib/assess/propagators/ejs-template-generate-source.js +1 -1
- package/lib/assess/propagators/encode-uri/encode-uri-component.js +22 -0
- package/lib/assess/propagators/encode-uri/encode-uri.js +22 -0
- package/lib/assess/propagators/handlebars-compile.js +1 -1
- package/lib/assess/propagators/handlebars-escape-expresssion.js +2 -2
- package/lib/assess/propagators/index.js +1 -3
- package/lib/assess/propagators/joi/boolean.js +2 -2
- package/lib/assess/propagators/joi/expression.js +2 -2
- package/lib/assess/propagators/joi/index.js +1 -1
- package/lib/assess/propagators/joi/number.js +2 -2
- package/lib/assess/propagators/joi/string-base.js +2 -2
- package/lib/assess/propagators/joi/string-schema.js +13 -14
- package/lib/assess/propagators/joi/values.js +38 -23
- package/lib/assess/propagators/manager.js +13 -11
- package/lib/assess/propagators/mongoose/helpers.js +20 -0
- package/lib/assess/propagators/mongoose/index.js +18 -0
- package/lib/assess/propagators/mongoose/map.js +74 -0
- package/lib/assess/propagators/mongoose/string.js +104 -0
- package/lib/assess/propagators/mustache/escape.js +22 -0
- package/lib/assess/propagators/number.js +54 -0
- package/lib/assess/propagators/object.js +7 -8
- package/lib/assess/propagators/path/basename.js +15 -14
- package/lib/assess/propagators/path/common.js +2 -2
- package/lib/assess/propagators/path/dirname.js +15 -14
- package/lib/assess/propagators/path/extname.js +15 -14
- package/lib/assess/propagators/path/format.js +1 -1
- package/lib/assess/propagators/path/join.js +1 -1
- package/lib/assess/propagators/path/normalize.js +1 -1
- package/lib/assess/propagators/path/parse.js +2 -2
- package/lib/assess/propagators/path/relative.js +8 -6
- package/lib/assess/propagators/path/resolve.js +1 -1
- package/lib/assess/propagators/path/to-namespaced-path.js +1 -1
- package/lib/assess/propagators/pug-compile.js +1 -1
- package/lib/assess/propagators/querystring/escape.js +21 -19
- package/lib/assess/propagators/querystring/parse.js +8 -6
- package/lib/assess/propagators/querystring/stringify.js +26 -25
- package/lib/assess/propagators/querystring/unescape.js +21 -19
- package/lib/assess/propagators/querystring/utils.js +1 -1
- package/lib/assess/propagators/sequelize/sql-string-escape.js +2 -2
- package/lib/assess/propagators/sequelize/sql-string-format-named-parameters.js +2 -2
- package/lib/assess/propagators/sequelize/sql-string-format.js +4 -4
- package/lib/assess/propagators/sequelize/utils.js +3 -3
- package/lib/assess/propagators/string-prototype-replace.js +31 -29
- package/lib/assess/propagators/string-prototype-split.js +37 -37
- package/lib/assess/propagators/string-prototype-trim.js +16 -18
- package/lib/assess/propagators/string.js +13 -17
- package/lib/assess/propagators/template-escape.js +87 -0
- package/lib/assess/propagators/templates.js +11 -12
- package/lib/assess/propagators/url/url-prototype-parse.js +6 -7
- package/lib/assess/propagators/url/url-url.js +52 -44
- package/lib/assess/propagators/url/utils.js +1 -1
- package/lib/assess/propagators/util/format.js +2 -2
- package/lib/assess/propagators/utils.js +1 -1
- package/lib/assess/propagators/v8/init-hooks.js +4 -4
- package/lib/assess/propagators/validator/init-hooks.js +23 -23
- package/lib/assess/propagators/validator/validator-methods.js +1 -2
- package/lib/assess/response-scanning/app-activity.js +1 -1
- package/lib/assess/response-scanning/autocomplete-missing.js +1 -1
- package/lib/assess/response-scanning/cache-controls-missing.js +1 -1
- package/lib/assess/response-scanning/clickjacking-control-missing.js +1 -1
- package/lib/assess/response-scanning/common.js +1 -1
- package/lib/assess/response-scanning/cookies/common.js +1 -1
- package/lib/assess/response-scanning/cookies/events.js +1 -1
- package/lib/assess/response-scanning/cookies/httponly.js +1 -1
- package/lib/assess/response-scanning/cookies/secure-flag-missing.js +1 -1
- package/lib/assess/response-scanning/headers/csp-header-insecure.js +1 -1
- package/lib/assess/response-scanning/headers/csp-header-missing.js +1 -1
- package/lib/assess/response-scanning/headers/csp-utils.js +1 -1
- package/lib/assess/response-scanning/headers/hsts-header-missing.js +1 -1
- package/lib/assess/response-scanning/headers/powered-by.js +1 -1
- package/lib/assess/response-scanning/headers/xcontenttype-header-missing.js +1 -1
- package/lib/assess/response-scanning/headers/xxssprotection-header-disabled.js +1 -1
- package/lib/assess/response-scanning/parameter-pollution.js +1 -1
- package/lib/assess/response-scanning/parseable-response-emitter.js +1 -1
- package/lib/assess/restify/index.js +1 -1
- package/lib/assess/restify/route-coverage.js +1 -1
- package/lib/assess/restify/session.js +1 -1
- package/lib/assess/restify/sinks/index.js +1 -1
- package/lib/assess/restify/sinks/response-scanning.js +1 -1
- package/lib/assess/restify/sinks/unvalidated-redirect.js +1 -1
- package/lib/assess/restify/sinks/xss.js +1 -1
- package/lib/assess/restify/sources.js +1 -1
- package/lib/assess/sinks/common.js +11 -6
- package/lib/assess/sinks/dustjs-linkedin-xss.js +131 -0
- package/lib/assess/sinks/dynamo.js +1 -1
- package/lib/assess/sinks/hapi-16-xss.js +1 -1
- package/lib/assess/sinks/index.js +1 -1
- package/lib/assess/sinks/libxmljs-xxe.js +2 -2
- package/lib/assess/sinks/mongodb.js +3 -2
- package/lib/assess/sinks/rethinkdb-nosql-injection.js +142 -0
- package/lib/assess/sinks/ssrf-url.js +2 -2
- package/lib/assess/sources/event-handler.js +307 -0
- package/lib/assess/sources/formidable.js +1 -1
- package/lib/assess/sources/index.js +94 -6
- package/lib/assess/spdy/index.js +23 -0
- package/lib/assess/spdy/sinks/index.js +23 -0
- package/lib/assess/spdy/sinks/xss.js +84 -0
- package/lib/assess/static/hardcoded.js +1 -1
- package/lib/assess/technologies/index.js +3 -2
- package/lib/assess/utils.js +1 -1
- package/lib/cli-rewriter/index.js +1 -1
- package/lib/constants.js +7 -3
- package/lib/contrast.js +7 -7
- package/lib/core/arch-components/dynamodb.js +1 -1
- package/lib/core/arch-components/dynamodbv3.js +1 -1
- package/lib/core/arch-components/index.js +2 -1
- package/lib/core/arch-components/mongodb.js +23 -19
- package/lib/core/arch-components/mysql.js +1 -1
- package/lib/core/arch-components/postgres.js +22 -4
- package/lib/core/arch-components/rethinkdb.js +53 -0
- package/lib/core/arch-components/sqlite3.js +4 -6
- package/lib/core/async-storage/context.js +1 -1
- package/lib/core/async-storage/hooks/bluebird.js +1 -1
- package/lib/core/async-storage/hooks/mongodb-core.js +1 -1
- package/lib/core/async-storage/hooks/mysql.js +1 -1
- package/lib/core/async-storage/hooks/redis.js +1 -1
- package/lib/core/async-storage/hooks/utils.js +1 -1
- package/lib/core/async-storage/index.js +1 -1
- package/lib/core/async-storage/scopes/index.js +1 -1
- package/lib/core/common/formidable.js +1 -1
- package/lib/core/common/index.js +1 -1
- package/lib/core/config/options.js +38 -4
- package/lib/core/config/util.js +1 -1
- package/lib/core/exclusions/exclusion-factory.js +1 -1
- package/lib/core/exclusions/exclusion.js +3 -6
- package/lib/core/exclusions/input.js +1 -1
- package/lib/core/exclusions/url.js +1 -1
- package/lib/core/express/index.js +26 -3
- package/lib/core/express/utils.js +9 -4
- package/lib/core/fastify/index.js +1 -1
- package/lib/core/fastify/utils.js +1 -1
- package/lib/core/hapi/index.js +1 -1
- package/lib/core/hapi/utils.js +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/koa/index.js +1 -1
- package/lib/core/koa/utils.js +1 -1
- package/lib/core/logger/daily-rotate-file.js +1 -1
- package/lib/core/logger/dataflow-monitor.js +1 -1
- package/lib/core/logger/debug-logger.js +1 -1
- package/lib/core/logger/index.js +1 -1
- package/lib/core/logger/perf-logger.js +1 -1
- package/lib/core/logger/umbrella-logger.js +1 -1
- package/lib/core/loopback4/index.js +1 -1
- package/lib/core/metrics/index.js +1 -1
- package/lib/core/restify/index.js +1 -1
- package/lib/core/restify/utils.js +1 -1
- package/lib/core/rewrite/assignment-expression.js +1 -1
- package/lib/core/rewrite/binary-expression.js +1 -1
- package/lib/core/rewrite/call-expression.js +1 -1
- package/lib/core/rewrite/callees.js +1 -1
- package/lib/core/rewrite/catch-clause.js +1 -1
- package/lib/core/rewrite/function-wrap.js +1 -1
- package/lib/core/rewrite/index.js +1 -1
- package/lib/core/rewrite/injections.js +9 -1
- package/lib/core/rewrite/is-contrast-method.js +1 -1
- package/lib/core/rewrite/log.js +1 -1
- package/lib/core/rewrite/member-expression.js +1 -1
- package/lib/core/rewrite/object-property.js +1 -1
- package/lib/core/rewrite/prepend-globals.js +1 -1
- package/lib/core/rewrite/rewrite-log.js +1 -1
- package/lib/core/rewrite/switch-statement.js +1 -1
- package/lib/core/rewrite/template-literal.js +1 -1
- package/lib/core/stacktrace.js +1 -1
- package/lib/coverage.js +1 -1
- package/lib/feature-set.js +2 -2
- package/lib/generator-function.js +1 -1
- package/lib/hooks/array.js +1 -1
- package/lib/hooks/cluster.js +1 -1
- package/lib/hooks/dataflow-monitor.js +1 -1
- package/lib/hooks/encoding.js +1 -1
- package/lib/hooks/express-fileupload.js +1 -1
- package/lib/hooks/express-session.js +1 -1
- package/lib/hooks/fn-to-string.js +1 -1
- package/lib/hooks/frameworks/base.js +1 -1
- package/lib/hooks/frameworks/common.js +1 -1
- package/lib/hooks/frameworks/hapi16.js +1 -1
- package/lib/hooks/frameworks/http.js +1 -1
- package/lib/hooks/frameworks/http2.js +1 -1
- package/lib/hooks/frameworks/index.js +3 -1
- package/lib/hooks/frameworks/spdy.js +87 -0
- package/lib/hooks/hapi-16-reply.js +1 -1
- package/lib/hooks/hapi-16-session.js +1 -1
- package/lib/hooks/http.js +12 -1
- package/lib/hooks/module/extensions.js +1 -1
- package/lib/hooks/module/helpers.js +1 -1
- package/lib/hooks/module/index.js +1 -1
- package/lib/hooks/newrelic.js +1 -1
- package/lib/hooks/object-is.js +1 -1
- package/lib/hooks/object-to-primitive.js +7 -8
- package/lib/hooks/patcher.js +62 -39
- package/lib/hooks/require.js +1 -1
- package/lib/hooks/stealthy-require.js +1 -1
- package/lib/instrumentation.js +1 -1
- package/lib/libraries.js +1 -1
- package/lib/library-usage.js +1 -1
- package/lib/list-installed.js +1 -1
- package/lib/protect/analysis/aho-corasick.js +1 -1
- package/lib/protect/analysis/dfsa-analyzer.js +1 -1
- package/lib/protect/errors/handler.js +1 -1
- package/lib/protect/errors/security-exception.js +1 -1
- package/lib/protect/express/index.js +1 -1
- package/lib/protect/express/sinks.js +1 -1
- package/lib/protect/express/sources.js +1 -1
- package/lib/protect/fastify/index.js +1 -1
- package/lib/protect/fastify/sinks.js +1 -1
- package/lib/protect/fastify/sources.js +1 -1
- package/lib/protect/hapi/error-handler.js +1 -1
- package/lib/protect/hapi/index.js +1 -1
- package/lib/protect/hapi/sinks.js +1 -1
- package/lib/protect/hapi/sources.js +1 -1
- package/lib/protect/index.js +1 -1
- package/lib/protect/input-analysis.js +1 -1
- package/lib/protect/koa/index.js +1 -1
- package/lib/protect/koa/sinks.js +1 -1
- package/lib/protect/koa/sources.js +1 -1
- package/lib/protect/listeners.js +1 -1
- package/lib/protect/loopback4/index.js +1 -1
- package/lib/protect/loopback4/sources.js +1 -1
- package/lib/protect/models/application-context.js +1 -1
- package/lib/protect/models/sink-event.js +1 -1
- package/lib/protect/models/source-event.js +1 -1
- package/lib/protect/restify/index.js +1 -1
- package/lib/protect/restify/sinks.js +1 -1
- package/lib/protect/restify/sources.js +1 -1
- package/lib/protect/rules/assessment.js +1 -1
- package/lib/protect/rules/attack-patterns.js +1 -1
- package/lib/protect/rules/base-scanner/index.js +1 -1
- package/lib/protect/rules/base-scanner/java-script-scanner.js +1 -1
- package/lib/protect/rules/base-scanner/postgresqlscanner.js +1 -1
- package/lib/protect/rules/base-scanner/scan-state.js +1 -1
- package/lib/protect/rules/base-scanner/substring-finder.js +1 -1
- package/lib/protect/rules/base-scanner/token-sequence.js +1 -1
- package/lib/protect/rules/bot-blocker/bot-blocker-rule.js +1 -1
- package/lib/protect/rules/bot-blocker/index.js +1 -1
- package/lib/protect/rules/cmd-injection/cmdinjection-rule.js +1 -1
- package/lib/protect/rules/cmd-injection-command-backdoors/backdoor-detector.js +1 -1
- package/lib/protect/rules/cmd-injection-command-backdoors/cmd-injection-command-backdoors-rule.js +1 -1
- package/lib/protect/rules/cmd-injection-semantic-chained-commands/chained-command-scanner.js +1 -1
- package/lib/protect/rules/cmd-injection-semantic-chained-commands/cmd-injection-semantic-chained-commands-rule.js +1 -1
- package/lib/protect/rules/cmd-injection-semantic-dangerous-paths/cmd-injection-semantic-dangerous-paths-rule.js +1 -1
- package/lib/protect/rules/cmd-injection-semantic-dangerous-paths/dangerous-paths-scanner.js +1 -1
- package/lib/protect/rules/common.js +1 -1
- package/lib/protect/rules/index.js +1 -1
- package/lib/protect/rules/ip-denylist/ip-denylist-rule.js +1 -1
- package/lib/protect/rules/method-tampering/evaluator.js +1 -1
- package/lib/protect/rules/method-tampering/method-tampering-rule.js +1 -1
- package/lib/protect/rules/nosqli/nosql-injection-rule.js +228 -0
- package/lib/protect/rules/nosqli/nosql-scanner/index.js +1 -1
- package/lib/protect/rules/nosqli/nosql-scanner/mongodbscanner.js +1 -1
- package/lib/protect/rules/path-traversal/path-traversal-rule.js +1 -1
- package/lib/protect/rules/rule-factory.js +3 -3
- package/lib/protect/rules/signatures/cmd-injection/custom-searchers/chained-command-searcher.js +1 -1
- package/lib/protect/rules/signatures/cmd-injection/custom-searchers/index.js +1 -1
- package/lib/protect/rules/signatures/cmd-injection/index.js +1 -1
- package/lib/protect/rules/signatures/evaluator.js +1 -1
- package/lib/protect/rules/signatures/index.js +1 -1
- package/lib/protect/rules/signatures/nosql-injection/custom-searchers/index.js +1 -1
- package/lib/protect/rules/signatures/nosql-injection/custom-searchers/nosql-comment-searcher.js +1 -1
- package/lib/protect/rules/signatures/nosql-injection/custom-searchers/simple-or-searcher.js +1 -1
- package/lib/protect/rules/signatures/nosql-injection/index.js +1 -1
- package/lib/protect/rules/signatures/path-traversal/index.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/behavior-url-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/function-definition-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/immediate-function-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/index.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/link-and-src-target-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/location-set-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/map-access-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/native-function-execution-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/no-alnum-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/redefined-function-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/style-url-injection-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/custom-searchers/variable-assignment-searcher.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/helpers/function-call.js +1 -1
- package/lib/protect/rules/signatures/reflected-xss/index.js +1 -1
- package/lib/protect/rules/signatures/signature.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/if-else-drop-searcher.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/index.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/simple-or-searcher.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/sql-comment-searcher.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/time-function-searcher.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/custom-searchers/tsql-exec-searcher.js +1 -1
- package/lib/protect/rules/signatures/sql-injection/index.js +1 -1
- package/lib/protect/rules/signatures/ssjs-injection/index.js +1 -1
- package/lib/protect/rules/signatures/unsafe-file-upload/index.js +1 -1
- package/lib/protect/rules/signatures/untrusted-deserialization/index.js +1 -1
- package/lib/protect/rules/sqli/generic-complicated.js +1 -1
- package/lib/protect/rules/sqli/sql-injection-rule.js +1 -1
- package/lib/protect/rules/sqli/sql-scanner/index.js +1 -1
- package/lib/protect/rules/sqli/sql-scanner/mysql-scanner.js +1 -1
- package/lib/protect/rules/ssjs-injection/evaluator.js +1 -1
- package/lib/protect/rules/ssjs-injection/ssjsinjection-rule.js +1 -1
- package/lib/protect/rules/unsafe-file-upload/unsafe-file-upload-rule.js +1 -1
- package/lib/protect/rules/untrusted-deserialization/untrusted-deserialization-rule.js +1 -1
- package/lib/protect/rules/virtual-patch/index.js +1 -1
- package/lib/protect/rules/virtual-patch/utils.js +1 -1
- package/lib/protect/rules/virtual-patch/virtual-patch-rule.js +1 -1
- package/lib/protect/rules/xss/helpers/function-call.js +1 -1
- package/lib/protect/rules/xss/reflected-xss-rule.js +1 -1
- package/lib/protect/rules/xxe/xxerule.js +1 -1
- package/lib/protect/sample-aggregator.js +1 -1
- package/lib/protect/samples.js +1 -1
- package/lib/protect/service.js +24 -12
- package/lib/protect/sinks/child-process.js +1 -1
- package/lib/protect/sinks/eval.js +1 -1
- package/lib/protect/sinks/fs.js +1 -1
- package/lib/protect/sinks/function.js +1 -1
- package/lib/protect/sinks/index.js +1 -1
- package/lib/protect/sinks/libxmljs.js +1 -1
- package/lib/protect/sinks/mongodb.js +57 -56
- package/lib/protect/sinks/mysql.js +1 -1
- package/lib/protect/sinks/node-serialize.js +1 -1
- package/lib/protect/sinks/postgres.js +1 -1
- package/lib/protect/sinks/sequelize.js +1 -1
- package/lib/protect/sinks/sqlite3.js +1 -1
- package/lib/protect/sinks/vm.js +1 -1
- package/lib/protect/sources/busboy.js +1 -1
- package/lib/protect/sources/formidable.js +1 -1
- package/lib/protect/sources/index.js +1 -1
- package/lib/protect/validators/authorization.js +1 -1
- package/lib/protect/validators/common.js +1 -1
- package/lib/protect/validators/connection.js +1 -1
- package/lib/protect/validators/content-length.js +1 -1
- package/lib/protect/validators/host.js +1 -1
- package/lib/protect/validators/if-none-match.js +1 -1
- package/lib/protect/validators/index.js +1 -1
- package/lib/protect/validators/origin.js +1 -1
- package/lib/reporter/app-activity-queue.js +1 -1
- package/lib/reporter/grpc-client.js +1 -1
- package/lib/reporter/messages/speedracer/activity.js +1 -1
- package/lib/reporter/messages/speedracer/application-create.js +1 -1
- package/lib/reporter/messages/speedracer/application-update.js +1 -1
- package/lib/reporter/messages/speedracer/base.js +1 -1
- package/lib/reporter/messages/speedracer/index.js +1 -1
- package/lib/reporter/messages/speedracer/observed-route.js +1 -1
- package/lib/reporter/messages/speedracer/poll.js +1 -1
- package/lib/reporter/messages/speedracer/request.js +1 -1
- package/lib/reporter/messages/speedracer/startup.js +1 -1
- package/lib/reporter/messaging-router.js +1 -1
- package/lib/reporter/models/app-activity/app-activity.js +1 -1
- package/lib/reporter/models/app-activity/attacker-activity.js +1 -1
- package/lib/reporter/models/app-activity/defend.js +1 -1
- package/lib/reporter/models/app-activity/inventory.js +1 -1
- package/lib/reporter/models/app-activity/protection-rule-activity.js +1 -1
- package/lib/reporter/models/app-activity/rule-events.js +1 -1
- package/lib/reporter/models/app-activity/sample.js +1 -1
- package/lib/reporter/models/app-activity/source.js +1 -1
- package/lib/reporter/models/app-activity/user-input.js +1 -1
- package/lib/reporter/models/app-create.js +1 -1
- package/lib/reporter/models/app-update/index.js +1 -1
- package/lib/reporter/models/app-update/library-manifest.js +1 -1
- package/lib/reporter/models/app-update/library-usage.js +1 -1
- package/lib/reporter/models/app-update/library.js +1 -1
- package/lib/reporter/models/event-tag.js +1 -1
- package/lib/reporter/models/finding/event.js +1 -1
- package/lib/reporter/models/finding/finding.js +1 -1
- package/lib/reporter/models/frameworks/express-request.js +1 -1
- package/lib/reporter/models/frameworks/fastify-request.js +1 -1
- package/lib/reporter/models/frameworks/hapi-request.js +1 -1
- package/lib/reporter/models/frameworks/index.js +1 -1
- package/lib/reporter/models/frameworks/koa-request.js +1 -1
- package/lib/reporter/models/frameworks/restify-request.js +1 -1
- package/lib/reporter/models/observed-route.js +1 -1
- package/lib/reporter/models/request.js +1 -1
- package/lib/reporter/models/route-coverage.js +1 -1
- package/lib/reporter/models/startup.js +1 -1
- package/lib/reporter/models/trace-event-source.js +1 -1
- package/lib/reporter/models/utils/request-factory.js +1 -1
- package/lib/reporter/models/utils/user-input-factory.js +1 -1
- package/lib/reporter/models/utils/user-input-kit.js +1 -1
- package/lib/reporter/mq-client.js +1 -1
- package/lib/reporter/server-activity-queue.js +1 -1
- package/lib/reporter/socket-client.js +1 -1
- package/lib/reporter/speedracer/base-connection-state.js +1 -1
- package/lib/reporter/speedracer/constants.js +1 -1
- package/lib/reporter/speedracer/failure-connection-state.js +1 -1
- package/lib/reporter/speedracer/index.js +1 -1
- package/lib/reporter/speedracer/success-connection-state.js +1 -1
- package/lib/reporter/speedracer/unknown-connection-state.js +1 -1
- package/lib/reporter/translations/enums.js +1 -1
- package/lib/reporter/translations/helpers.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/activity.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/address.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/agent-startup.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/application-create.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/application-update.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/architecture-component.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/attack-result.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/bot-blocker-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/cmd-injection-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/cmd-injection-semantic-analysis-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/finding.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/http-method-tampering-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/http-request.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/index.js +2 -2
- package/lib/reporter/translations/to-protobuf/dtm/ip-denylist-details.js +2 -2
- package/lib/reporter/translations/to-protobuf/dtm/library-usage-update.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/no-sql-injection-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/observed-route.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/pair.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/path-traversal-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/poll.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/rasp-rule-sample.js +2 -2
- package/lib/reporter/translations/to-protobuf/dtm/raw-request.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/route-coverage.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/simple-pair.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/sql-injection-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/ssjs-injection-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/stack-trace-element.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/action.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/index.js +5 -5
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/parent-object-id.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-object.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-signature.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-source.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-stack.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-taint-range.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/trace-event/type.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/untrusted-deserialization-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/user-input.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/virtual-patch-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/xss-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/dtm/xxe-details.js +1 -1
- package/lib/reporter/translations/to-protobuf/index.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/application-settings.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/assess-features.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/auth.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/bot-blocker.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/custom-rule-feature.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/defend-features.js +9 -7
- package/lib/reporter/translations/to-protobuf/settings/exclusions.js +6 -5
- package/lib/reporter/translations/to-protobuf/settings/index.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/input-analysis-result.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/inventory-features.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/ip-filter.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/log-enhancer.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/protection-rule.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/reaction.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/rule-definition.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/sampling.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/server-features.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/syslog.js +1 -1
- package/lib/reporter/translations/to-protobuf/settings/virtual-patch.js +1 -1
- package/lib/reporter/ts-reporter.js +1 -1
- package/lib/tracker.js +14 -66
- package/lib/util/base64.js +1 -1
- package/lib/util/bitset.js +1 -1
- package/lib/util/block-request.js +1 -1
- package/lib/util/callback-resolver.js +1 -1
- package/lib/util/clean-stack.js +1 -1
- package/lib/util/clean-string/brackets.js +1 -1
- package/lib/util/clean-string/clean-string-base.js +1 -1
- package/lib/util/clean-string/comments.js +1 -1
- package/lib/util/clean-string/concatenations.js +1 -1
- package/lib/util/clean-string/jsclean-string.js +1 -1
- package/lib/util/clean-string/placeholders.js +1 -1
- package/lib/util/clean-string/util.js +1 -1
- package/lib/util/colors.js +1 -1
- package/lib/util/file-finder.js +1 -1
- package/lib/util/heap-dump.js +1 -1
- package/lib/util/html-util.js +1 -1
- package/lib/util/ip-analyzer.js +1 -1
- package/lib/util/is-agent-path.js +1 -1
- package/lib/util/is-contrast-error.js +1 -1
- package/lib/util/is-piped-to-dev.js +1 -1
- package/lib/util/is-string.js +1 -1
- package/lib/util/partial.js +1 -1
- package/lib/util/pkg-name.js +1 -1
- package/lib/util/request-util.js +1 -1
- package/lib/util/resolve-obj.js +1 -1
- package/lib/util/route-info.js +1 -1
- package/lib/util/some.js +1 -1
- package/lib/util/source-map.js +2 -2
- package/lib/util/static-rules.js +1 -1
- package/lib/util/trace-util.js +1 -1
- package/lib/util/traverse.js +1 -1
- package/lib/util/user-input-evaluator.js +1 -1
- package/lib/util/xml-analyzer/external-entity-finder.js +1 -1
- package/package.json +14 -8
- package/perf-logs.js +1 -1
- package/lib/protect/rules/nosqli/no-sql-injection-rule.js +0 -109
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -62,7 +62,7 @@ const escapeRegExp = (str) => {
|
|
|
62
62
|
*/
|
|
63
63
|
const addTagRangesWithOffset = (metadata, arg) => {
|
|
64
64
|
const argData = tracker.getData(arg);
|
|
65
|
-
if (argData
|
|
65
|
+
if (argData) {
|
|
66
66
|
tagRangeUtil.addAllWithOffsetInPlace(
|
|
67
67
|
metadata.tagRanges,
|
|
68
68
|
argData.tagRanges,
|
|
@@ -115,10 +115,12 @@ const createEvent = ({ tagRanges, method, parents }, data) => {
|
|
|
115
115
|
*/
|
|
116
116
|
const trackResult = (metadata, data) => {
|
|
117
117
|
if (metadata.tagRanges.length) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
const tracked = tracker.track(data.result);
|
|
119
|
+
if (tracked) {
|
|
120
|
+
tracked.props.tagRanges = metadata.tagRanges;
|
|
121
|
+
tracked.props.event = createEvent(metadata, data);
|
|
122
|
+
data.result = tracked.str;
|
|
123
|
+
}
|
|
122
124
|
}
|
|
123
125
|
};
|
|
124
126
|
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
const { propagate } = require('../template-escape');
|
|
17
|
+
|
|
18
|
+
function handler(data) {
|
|
19
|
+
propagate(data, 'html-encoded', 'dustjs-linkedin.escapeHtml');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports.handle = handler;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
const { propagate } = require('../template-escape');
|
|
17
|
+
|
|
18
|
+
function handler(data) {
|
|
19
|
+
propagate(data, 'javascript-encoded', 'dustjs-linkedin.escapeJs');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports.handle = handler;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
const { propagate } = require('../template-escape');
|
|
17
|
+
|
|
18
|
+
function handler(data) {
|
|
19
|
+
propagate(data, 'url-encoded', 'global.encodeURIComponent');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports.handle = handler;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
const { propagate } = require('../template-escape');
|
|
17
|
+
|
|
18
|
+
function handler(data) {
|
|
19
|
+
propagate(data, 'weak-url-encoded', 'global.encodeURI');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports.handle = handler;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -48,7 +48,7 @@ function patchUtilsExport(utilsExport) {
|
|
|
48
48
|
alwaysRun: true,
|
|
49
49
|
post(data) {
|
|
50
50
|
const trackData = tracker.getData(data.result);
|
|
51
|
-
if (trackData
|
|
51
|
+
if (trackData) {
|
|
52
52
|
trackData.tagRanges = tagRangeUtil.add(
|
|
53
53
|
trackData.tagRanges,
|
|
54
54
|
new TagRange(0, data.result.length - 1, 'html-encoded')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -128,8 +128,6 @@ const generateHookWrappers = (agent, policyNode, key) => {
|
|
|
128
128
|
} else {
|
|
129
129
|
({ pre, post } = provider.handle);
|
|
130
130
|
}
|
|
131
|
-
|
|
132
|
-
propagatorDescriptor.provider = provider.handle;
|
|
133
131
|
} else {
|
|
134
132
|
// generic propagator
|
|
135
133
|
post = new Propagator(agent, propagatorDescriptor);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -42,7 +42,7 @@ function instrumentJoiBoolean(boolean) {
|
|
|
42
42
|
if (
|
|
43
43
|
data.result &&
|
|
44
44
|
typeof data.result.value === 'boolean' &&
|
|
45
|
-
trackingData
|
|
45
|
+
trackingData
|
|
46
46
|
) {
|
|
47
47
|
const { event } = trackingData;
|
|
48
48
|
trackingData.tagRanges = tagRangeUtil.add(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -32,7 +32,7 @@ function instrumentJoiExpression(expression) {
|
|
|
32
32
|
patchType: ASSESS_PROPAGATOR,
|
|
33
33
|
post(data) {
|
|
34
34
|
const trackingData = tracker.getData(data.args[0]);
|
|
35
|
-
if (trackingData
|
|
35
|
+
if (trackingData && data.result._template) {
|
|
36
36
|
trackingData.tagRanges = tagRangeUtil.add(
|
|
37
37
|
trackingData.tagRanges,
|
|
38
38
|
new TagRange(0, data.args[0].length - 1, 'html-encoded')
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -41,7 +41,7 @@ function instrumentJoiNumber(number) {
|
|
|
41
41
|
data.result &&
|
|
42
42
|
data.result.value &&
|
|
43
43
|
!data.result.errors &&
|
|
44
|
-
trackingData
|
|
44
|
+
trackingData
|
|
45
45
|
) {
|
|
46
46
|
const { event } = trackingData;
|
|
47
47
|
trackingData.tagRanges = tagRangeUtil.add(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -37,7 +37,7 @@ function instrumentJoiString(string) {
|
|
|
37
37
|
patchType: ASSESS_PROPAGATOR,
|
|
38
38
|
post(data) {
|
|
39
39
|
const trackingData = tracker.getData(data.args[0]);
|
|
40
|
-
if (data.result === undefined && trackingData
|
|
40
|
+
if (data.result === undefined && trackingData) {
|
|
41
41
|
const { event } = trackingData;
|
|
42
42
|
trackingData.tagRanges = tagRangeUtil.add(
|
|
43
43
|
trackingData.tagRanges,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -79,29 +79,28 @@ function reTrackCoercedValue(coerce, rule) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
const argContrastProperties = tracker.getData(args[0]);
|
|
82
|
-
if (!argContrastProperties
|
|
82
|
+
if (!argContrastProperties) {
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
const
|
|
87
|
-
const strContrastProperties = tracker.getData(str);
|
|
86
|
+
const tracked = tracker.track(result.value);
|
|
88
87
|
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
new TagRange(0, str.length - 1, 'untrusted')
|
|
88
|
+
if (tracked) {
|
|
89
|
+
tracked.props.tagRanges = tagRangeUtil.add(
|
|
90
|
+
tracked.props.tagRanges,
|
|
91
|
+
new TagRange(0, tracked.str.length - 1, 'untrusted')
|
|
93
92
|
);
|
|
94
93
|
|
|
95
|
-
|
|
94
|
+
tracked.props.event = createPropagationEvent({
|
|
96
95
|
data,
|
|
97
96
|
trackedArgsData: argContrastProperties,
|
|
98
|
-
tagRanges:
|
|
97
|
+
tagRanges: tracked.props.tagRanges,
|
|
99
98
|
target: 'R',
|
|
100
99
|
joiMethod: rule
|
|
101
100
|
});
|
|
102
|
-
}
|
|
103
101
|
|
|
104
|
-
|
|
102
|
+
data.result = { value: tracked.str };
|
|
103
|
+
}
|
|
105
104
|
}
|
|
106
105
|
});
|
|
107
106
|
}
|
|
@@ -120,13 +119,13 @@ function wrapRuleAsValidator(rules, rule, tagName) {
|
|
|
120
119
|
}
|
|
121
120
|
|
|
122
121
|
const argContrastProperties = tracker.getData(args[0]);
|
|
123
|
-
if (!argContrastProperties
|
|
122
|
+
if (!argContrastProperties) {
|
|
124
123
|
return;
|
|
125
124
|
}
|
|
126
125
|
|
|
127
126
|
const strContrastProperties = tracker.getData(result);
|
|
128
127
|
|
|
129
|
-
if (strContrastProperties
|
|
128
|
+
if (strContrastProperties) {
|
|
130
129
|
strContrastProperties.tagRanges = tagRangeUtil.add(
|
|
131
130
|
strContrastProperties.tagRanges,
|
|
132
131
|
new TagRange(0, result.length - 1, tagName)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -41,7 +41,7 @@ function instrumentJoiValues(values) {
|
|
|
41
41
|
name: 'joi.values',
|
|
42
42
|
patchType: ASSESS_PROPAGATOR,
|
|
43
43
|
post(data) {
|
|
44
|
-
|
|
44
|
+
let {
|
|
45
45
|
args: [value],
|
|
46
46
|
result
|
|
47
47
|
} = data;
|
|
@@ -51,25 +51,40 @@ function instrumentJoiValues(values) {
|
|
|
51
51
|
return;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
const resultIsString = _.isString(result.value);
|
|
55
|
-
const argIsString = _.isString(value);
|
|
56
|
-
|
|
57
54
|
if (result.ref) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const resolvedTrackData = tracker.getData(result.value);
|
|
61
|
-
const refTrackData = tracker.getData(value);
|
|
62
|
-
const handler = getRefHandler(resolvedTrackData, refTrackData);
|
|
63
|
-
handler && handler(data, resolvedTrackData, refTrackData);
|
|
64
|
-
}
|
|
65
|
-
} else if (resultIsString) {
|
|
55
|
+
handler(result.value, value, data);
|
|
56
|
+
} else if (_.isString(result.value)) {
|
|
66
57
|
// use case is .valid() - safe
|
|
67
|
-
tracker.untrack(result.value);
|
|
58
|
+
result.value = tracker.untrack(result.value) || result.value;
|
|
68
59
|
}
|
|
69
60
|
}
|
|
70
61
|
});
|
|
71
62
|
}
|
|
72
63
|
|
|
64
|
+
const stringHandler = (resultValue, argValue, data) => {
|
|
65
|
+
const resultIsString = _.isString(resultValue);
|
|
66
|
+
const argIsString = _.isString(argValue);
|
|
67
|
+
|
|
68
|
+
if (resultIsString && argIsString) {
|
|
69
|
+
const resolvedTrackData = tracker.getData(resultValue);
|
|
70
|
+
const refTrackData = tracker.getData(argValue);
|
|
71
|
+
const handler = getRefHandler(resolvedTrackData, refTrackData);
|
|
72
|
+
handler && handler(data, resolvedTrackData, refTrackData);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const handler = (resultValue, argValue, data) => {
|
|
77
|
+
if (_.isString(resultValue)) {
|
|
78
|
+
return stringHandler(resultValue, argValue, data);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (_.isObject(resultValue)) {
|
|
82
|
+
for (const [key, value] of Object.entries(resultValue)) {
|
|
83
|
+
handler(value, argValue[key], data);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
73
88
|
/**
|
|
74
89
|
* Depending on which values are tracked, ref and/or target, returns the
|
|
75
90
|
* appropriate function to handle the scenario.
|
|
@@ -79,14 +94,14 @@ function instrumentJoiValues(values) {
|
|
|
79
94
|
*/
|
|
80
95
|
function getRefHandler(resolvedTrackData, refTrackData) {
|
|
81
96
|
// 4 Cases
|
|
82
|
-
if (!resolvedTrackData
|
|
83
|
-
if (!refTrackData
|
|
97
|
+
if (!resolvedTrackData) {
|
|
98
|
+
if (!refTrackData) {
|
|
84
99
|
return null;
|
|
85
100
|
} else {
|
|
86
101
|
return handleRefOnlyTracked;
|
|
87
102
|
}
|
|
88
103
|
} else {
|
|
89
|
-
if (refTrackData
|
|
104
|
+
if (refTrackData) {
|
|
90
105
|
return handleBothTracked;
|
|
91
106
|
} else {
|
|
92
107
|
return handleTargetOnlyTracked;
|
|
@@ -116,7 +131,7 @@ function handleTargetOnlyTracked(data, resolvedTrackData, refTrackData) {
|
|
|
116
131
|
* @param {object} refTrackData tracking data for reference value
|
|
117
132
|
*/
|
|
118
133
|
function handleBothTracked(data, resolvedTrackData, refTrackData) {
|
|
119
|
-
|
|
134
|
+
let {
|
|
120
135
|
args: [value, , prefs],
|
|
121
136
|
result
|
|
122
137
|
} = data;
|
|
@@ -127,8 +142,8 @@ function handleBothTracked(data, resolvedTrackData, refTrackData) {
|
|
|
127
142
|
}
|
|
128
143
|
|
|
129
144
|
if (result.ref.map) {
|
|
130
|
-
tracker.untrack(data.result.value);
|
|
131
|
-
tracker.untrack(value);
|
|
145
|
+
data.result.value = tracker.untrack(data.result.value) || data.result.value;
|
|
146
|
+
value = tracker.untrack(value) || value;
|
|
132
147
|
} else {
|
|
133
148
|
copyValidationHistory(resolvedTrackData, refTrackData);
|
|
134
149
|
if (prefs.convert) {
|
|
@@ -145,7 +160,7 @@ function handleBothTracked(data, resolvedTrackData, refTrackData) {
|
|
|
145
160
|
* @param {object} refTrackData tracking data for reference value
|
|
146
161
|
*/
|
|
147
162
|
function handleRefOnlyTracked(data, resolvedTrackData, refTrackData) {
|
|
148
|
-
|
|
163
|
+
let {
|
|
149
164
|
args: [value, , prefs],
|
|
150
165
|
result
|
|
151
166
|
} = data;
|
|
@@ -164,8 +179,8 @@ function handleRefOnlyTracked(data, resolvedTrackData, refTrackData) {
|
|
|
164
179
|
} else {
|
|
165
180
|
// if map is used we can trust - like .valid()
|
|
166
181
|
if (result.ref.map) {
|
|
167
|
-
if (!tracker.getData(result.value)
|
|
168
|
-
tracker.untrack(value);
|
|
182
|
+
if (!tracker.getData(result.value)) {
|
|
183
|
+
value = tracker.untrack(value) || value;
|
|
169
184
|
}
|
|
170
185
|
} else {
|
|
171
186
|
logger.debug(
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
Copyright:
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
3
|
Contact: support@contrastsecurity.com
|
|
4
4
|
License: Commercial
|
|
5
5
|
|
|
@@ -112,13 +112,14 @@ module.exports = function Propagator(agent, propagationDescriptor) {
|
|
|
112
112
|
|
|
113
113
|
// move the tags to the result of propagator
|
|
114
114
|
if (event.tagRanges.length > 0 && validTarget === data.result) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
const tracked = tracker.track(data.result);
|
|
116
|
+
if (tracked) {
|
|
117
|
+
tracked.props.tagRanges = event.tagRanges;
|
|
118
|
+
tracked.props.event = event;
|
|
119
|
+
data.result = tracked.str;
|
|
120
|
+
}
|
|
119
121
|
|
|
120
122
|
event.parents.push(...sourceEvents);
|
|
121
|
-
resultContrastProperties.event = event;
|
|
122
123
|
}
|
|
123
124
|
logger.trace('%s2%s %s --> %s', source, target, sources, [validTarget]);
|
|
124
125
|
};
|
|
@@ -206,7 +207,7 @@ function createAppendTagRanges(data) {
|
|
|
206
207
|
if (isString(data.obj)) {
|
|
207
208
|
offset = data.obj.length;
|
|
208
209
|
const sourceProps = tracker.getData(data.obj);
|
|
209
|
-
if (sourceProps
|
|
210
|
+
if (sourceProps) {
|
|
210
211
|
tagRangeUtil.addAllInPlace(newTags, sourceProps.tagRanges);
|
|
211
212
|
}
|
|
212
213
|
}
|
|
@@ -214,7 +215,7 @@ function createAppendTagRanges(data) {
|
|
|
214
215
|
for (const arg of data.args) {
|
|
215
216
|
if (arg) {
|
|
216
217
|
const props = tracker.getData(arg);
|
|
217
|
-
if (props
|
|
218
|
+
if (props) {
|
|
218
219
|
tagRangeUtil.addAllWithOffsetInPlace(newTags, props.tagRanges, offset);
|
|
219
220
|
}
|
|
220
221
|
|
|
@@ -339,7 +340,7 @@ function getSourcesMetadata(sources) {
|
|
|
339
340
|
function isSourceTracked(sourceName, source) {
|
|
340
341
|
if (source) {
|
|
341
342
|
const contrastProperties = tracker.getData(source);
|
|
342
|
-
return contrastProperties
|
|
343
|
+
return !!contrastProperties;
|
|
343
344
|
}
|
|
344
345
|
|
|
345
346
|
return false;
|
|
@@ -384,7 +385,7 @@ function getTrackedSources(sources, skipNested) {
|
|
|
384
385
|
function isTargetTracked(target, hasTags) {
|
|
385
386
|
if (hasTags) {
|
|
386
387
|
const contrastProperties = tracker.getData(target);
|
|
387
|
-
return contrastProperties
|
|
388
|
+
return !!contrastProperties;
|
|
388
389
|
}
|
|
389
390
|
|
|
390
391
|
return false;
|
|
@@ -457,7 +458,8 @@ function getValidSources(sources) {
|
|
|
457
458
|
const sourceContrastProperties = tracker.getData(source);
|
|
458
459
|
if (
|
|
459
460
|
isString(source) &&
|
|
460
|
-
!
|
|
461
|
+
(!sourceContrastProperties ||
|
|
462
|
+
(sourceContrastProperties && !sourceContrastProperties.tracked))
|
|
461
463
|
) {
|
|
462
464
|
return false;
|
|
463
465
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
const hasUserDefinedValidator = (data) =>
|
|
16
|
+
data.obj.validators.some((validator) => validator.type === 'user defined');
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
hasUserDefinedValidator
|
|
20
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
module.exports.handle = () => {
|
|
16
|
+
require('./map');
|
|
17
|
+
require('./string');
|
|
18
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Copyright: 2022 Contrast Security, Inc
|
|
3
|
+
Contact: support@contrastsecurity.com
|
|
4
|
+
License: Commercial
|
|
5
|
+
|
|
6
|
+
NOTICE: This Software and the patented inventions embodied within may only be
|
|
7
|
+
used as part of Contrast Security’s commercial offerings. Even though it is
|
|
8
|
+
made available through public repositories, use of this Software is subject to
|
|
9
|
+
the applicable End User Licensing Agreement found at
|
|
10
|
+
https://www.contrastsecurity.com/enduser-terms-0317a or as otherwise agreed
|
|
11
|
+
between Contrast Security and the End User. The Software may not be reverse
|
|
12
|
+
engineered, modified, repackaged, sold, redistributed or otherwise used in a
|
|
13
|
+
way not consistent with the End User License Agreement.
|
|
14
|
+
*/
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
const tracker = require('../../../tracker');
|
|
18
|
+
const patcher = require('../../../hooks/patcher');
|
|
19
|
+
const requireHook = require('../../../hooks/require');
|
|
20
|
+
const tagRangeUtil = require('../../models/tag-range/util');
|
|
21
|
+
const {
|
|
22
|
+
PATCH_TYPES: { ASSESS_PROPAGATOR }
|
|
23
|
+
} = require('../../../constants');
|
|
24
|
+
const TagRange = require('../../models/tag-range');
|
|
25
|
+
const { CallContext, PropagationEvent, Signature } = require('../../models');
|
|
26
|
+
const { hasUserDefinedValidator } = require('./helpers');
|
|
27
|
+
|
|
28
|
+
const doValidateSyncPatcher = (SchemaMap) => {
|
|
29
|
+
patcher.patch(SchemaMap.prototype, 'doValidateSync', {
|
|
30
|
+
alwaysRun: true,
|
|
31
|
+
name: 'mongoose.map.doValidateSync',
|
|
32
|
+
patchType: ASSESS_PROPAGATOR,
|
|
33
|
+
post(data) {
|
|
34
|
+
if (data.result || data.obj.options.of.name !== 'String') return;
|
|
35
|
+
|
|
36
|
+
if (!hasUserDefinedValidator(data)) return;
|
|
37
|
+
|
|
38
|
+
for (const value of data.args[0].values()) {
|
|
39
|
+
const trackingData = tracker.track(value);
|
|
40
|
+
|
|
41
|
+
if (!trackingData) return;
|
|
42
|
+
|
|
43
|
+
const { props } = trackingData;
|
|
44
|
+
const stringLength = value.length - 1;
|
|
45
|
+
|
|
46
|
+
props.tagRanges = tagRangeUtil.add(
|
|
47
|
+
props.tagRanges,
|
|
48
|
+
new TagRange(0, stringLength, 'custom-validated-nosql-injection')
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
props.tagRanges = tagRangeUtil.add(
|
|
52
|
+
props.tagRanges,
|
|
53
|
+
new TagRange(0, stringLength, 'string-type-checked')
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
props.event = new PropagationEvent({
|
|
57
|
+
context: new CallContext(data),
|
|
58
|
+
signature: new Signature('mongoose.map.doValidateSync'),
|
|
59
|
+
tagRanges: props.tagRanges,
|
|
60
|
+
source: 'P',
|
|
61
|
+
target: 'A',
|
|
62
|
+
parents: [props.event]
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
requireHook.resolve(
|
|
70
|
+
{ name: 'mongoose', file: 'lib/schema/map.js', version: '>=5.0.0' },
|
|
71
|
+
(SchemaMap) => {
|
|
72
|
+
doValidateSyncPatcher(SchemaMap);
|
|
73
|
+
}
|
|
74
|
+
);
|