@contrast/agent 4.7.0 → 4.9.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.
Files changed (563) hide show
  1. package/LICENSE +1 -1
  2. package/agent-loader.js +1 -1
  3. package/bin/VERSION +1 -1
  4. package/bin/linux/contrast-service +0 -0
  5. package/bin/mac/contrast-service +0 -0
  6. package/bin/windows/contrast-service.exe +0 -0
  7. package/bootstrap.js +13 -3
  8. package/cli-rewriter.js +1 -1
  9. package/cli.js +1 -1
  10. package/esm.mjs +34 -1
  11. package/lib/agent-emitter.js +1 -1
  12. package/lib/agent.js +1 -1
  13. package/lib/app-info.js +1 -1
  14. package/lib/assess/deadzones/index.js +1 -1
  15. package/lib/assess/deadzones/rewrite.js +1 -1
  16. package/lib/assess/express/index.js +1 -1
  17. package/lib/assess/express/route-coverage.js +1 -1
  18. package/lib/assess/express/sinks/index.js +1 -1
  19. package/lib/assess/express/sinks/xss.js +1 -1
  20. package/lib/assess/express/sources.js +1 -1
  21. package/lib/assess/fastify/index.js +1 -1
  22. package/lib/assess/fastify/route-coverage.js +1 -1
  23. package/lib/assess/fastify/sinks/index.js +1 -1
  24. package/lib/assess/fastify/sinks/response-scanning.js +1 -1
  25. package/lib/assess/fastify/sinks/unvalidated-redirect.js +1 -1
  26. package/lib/assess/fastify/sinks/xss.js +1 -1
  27. package/lib/assess/fastify/sources.js +1 -1
  28. package/lib/assess/hapi/index.js +1 -1
  29. package/lib/assess/hapi/route-coverage.js +1 -1
  30. package/lib/assess/hapi/sinks/index.js +1 -1
  31. package/lib/assess/hapi/sinks/response-scanning.js +1 -1
  32. package/lib/assess/hapi/sinks/session.js +1 -1
  33. package/lib/assess/hapi/sinks/unvalidated-redirect.js +1 -1
  34. package/lib/assess/hapi/sinks/xss.js +1 -1
  35. package/lib/assess/hapi/sources.js +1 -1
  36. package/lib/assess/index.js +3 -1
  37. package/lib/assess/koa/index.js +1 -1
  38. package/lib/assess/koa/route-coverage.js +1 -1
  39. package/lib/assess/koa/sinks/index.js +1 -1
  40. package/lib/assess/koa/sinks/response-scanning.js +1 -1
  41. package/lib/assess/koa/sinks/unvalidated-redirect.js +1 -1
  42. package/lib/assess/koa/sinks/xss.js +1 -1
  43. package/lib/assess/koa/sources.js +1 -1
  44. package/lib/assess/loopback4/index.js +1 -1
  45. package/lib/assess/loopback4/route-coverage.js +1 -1
  46. package/lib/assess/loopback4/sinks/index.js +1 -1
  47. package/lib/assess/loopback4/sinks/response-scanning.js +1 -1
  48. package/lib/assess/loopback4/sinks/xss.js +1 -1
  49. package/lib/assess/loopback4/sources.js +1 -1
  50. package/lib/assess/membrane/debraner.js +1 -1
  51. package/lib/assess/membrane/deserialization-membrane.js +5 -6
  52. package/lib/assess/membrane/index.js +1 -1
  53. package/lib/assess/membrane/source-membrane.js +16 -20
  54. package/lib/assess/models/base-event.js +1 -1
  55. package/lib/assess/models/call-context.js +2 -2
  56. package/lib/assess/models/index.js +1 -1
  57. package/lib/assess/models/propagation-event.js +1 -1
  58. package/lib/assess/models/signature.js +1 -1
  59. package/lib/assess/models/sink-event.js +1 -1
  60. package/lib/assess/models/source-event.js +7 -1
  61. package/lib/assess/models/tag-range/index.js +1 -1
  62. package/lib/assess/models/tag-range/relationships.js +1 -1
  63. package/lib/assess/models/tag-range/util.js +1 -1
  64. package/lib/assess/policy/index.js +1 -1
  65. package/lib/assess/policy/init.js +1 -1
  66. package/lib/assess/policy/propagators.json +8 -0
  67. package/lib/assess/policy/rules.json +31 -2
  68. package/lib/assess/policy/signatures.json +33 -6
  69. package/lib/assess/policy/util.js +3 -2
  70. package/lib/assess/propagators/JSON/parse.js +2 -2
  71. package/lib/assess/propagators/JSON/stringify.js +81 -11
  72. package/lib/assess/propagators/ajv/conditionals.js +1 -1
  73. package/lib/assess/propagators/ajv/evaluator-shim.js +1 -1
  74. package/lib/assess/propagators/ajv/index.js +1 -1
  75. package/lib/assess/propagators/ajv/json-schema-type-evaluators.js +1 -1
  76. package/lib/assess/propagators/ajv/object-walk.js +1 -1
  77. package/lib/assess/propagators/ajv/refs.js +1 -1
  78. package/lib/assess/propagators/ajv/schema-context.js +1 -1
  79. package/lib/assess/propagators/array-prototype-join.js +8 -9
  80. package/lib/assess/propagators/common.js +8 -6
  81. package/lib/assess/propagators/dustjs/escape-html.js +1 -1
  82. package/lib/assess/propagators/dustjs/escape-js.js +1 -1
  83. package/lib/assess/propagators/ejs-template-generate-source.js +1 -1
  84. package/lib/assess/propagators/encode-uri/encode-uri-component.js +1 -1
  85. package/lib/assess/propagators/encode-uri/encode-uri.js +1 -1
  86. package/lib/assess/propagators/handlebars-compile.js +1 -1
  87. package/lib/assess/propagators/handlebars-escape-expresssion.js +2 -2
  88. package/lib/assess/propagators/index.js +1 -1
  89. package/lib/assess/propagators/joi/boolean.js +2 -2
  90. package/lib/assess/propagators/joi/expression.js +2 -2
  91. package/lib/assess/propagators/joi/index.js +1 -1
  92. package/lib/assess/propagators/joi/number.js +2 -2
  93. package/lib/assess/propagators/joi/string-base.js +2 -2
  94. package/lib/assess/propagators/joi/string-schema.js +13 -14
  95. package/lib/assess/propagators/joi/values.js +12 -12
  96. package/lib/assess/propagators/manager.js +13 -11
  97. package/lib/assess/propagators/mongoose/helpers.js +20 -0
  98. package/lib/assess/propagators/mongoose/index.js +18 -0
  99. package/lib/assess/propagators/mongoose/map.js +74 -0
  100. package/lib/assess/propagators/mongoose/string.js +104 -0
  101. package/lib/assess/propagators/mustache/escape.js +1 -1
  102. package/lib/assess/propagators/number.js +54 -0
  103. package/lib/assess/propagators/object.js +7 -8
  104. package/lib/assess/propagators/path/basename.js +15 -14
  105. package/lib/assess/propagators/path/common.js +2 -2
  106. package/lib/assess/propagators/path/dirname.js +15 -14
  107. package/lib/assess/propagators/path/extname.js +15 -14
  108. package/lib/assess/propagators/path/format.js +1 -1
  109. package/lib/assess/propagators/path/join.js +1 -1
  110. package/lib/assess/propagators/path/normalize.js +1 -1
  111. package/lib/assess/propagators/path/parse.js +2 -2
  112. package/lib/assess/propagators/path/relative.js +8 -6
  113. package/lib/assess/propagators/path/resolve.js +1 -1
  114. package/lib/assess/propagators/path/to-namespaced-path.js +1 -1
  115. package/lib/assess/propagators/pug-compile.js +1 -1
  116. package/lib/assess/propagators/querystring/escape.js +21 -19
  117. package/lib/assess/propagators/querystring/parse.js +8 -6
  118. package/lib/assess/propagators/querystring/stringify.js +26 -25
  119. package/lib/assess/propagators/querystring/unescape.js +21 -19
  120. package/lib/assess/propagators/querystring/utils.js +1 -1
  121. package/lib/assess/propagators/sequelize/sql-string-escape.js +2 -2
  122. package/lib/assess/propagators/sequelize/sql-string-format-named-parameters.js +2 -2
  123. package/lib/assess/propagators/sequelize/sql-string-format.js +4 -4
  124. package/lib/assess/propagators/sequelize/utils.js +3 -3
  125. package/lib/assess/propagators/string-prototype-replace.js +31 -29
  126. package/lib/assess/propagators/string-prototype-split.js +37 -37
  127. package/lib/assess/propagators/string-prototype-trim.js +16 -18
  128. package/lib/assess/propagators/string.js +13 -17
  129. package/lib/assess/propagators/template-escape.js +22 -19
  130. package/lib/assess/propagators/templates.js +9 -9
  131. package/lib/assess/propagators/url/url-prototype-parse.js +6 -7
  132. package/lib/assess/propagators/url/url-url.js +52 -44
  133. package/lib/assess/propagators/url/utils.js +1 -1
  134. package/lib/assess/propagators/util/format.js +2 -2
  135. package/lib/assess/propagators/utils.js +1 -1
  136. package/lib/assess/propagators/v8/init-hooks.js +4 -4
  137. package/lib/assess/propagators/validator/init-hooks.js +23 -23
  138. package/lib/assess/propagators/validator/validator-methods.js +1 -2
  139. package/lib/assess/response-scanning/app-activity.js +1 -1
  140. package/lib/assess/response-scanning/autocomplete-missing.js +1 -1
  141. package/lib/assess/response-scanning/cache-controls-missing.js +1 -1
  142. package/lib/assess/response-scanning/clickjacking-control-missing.js +1 -1
  143. package/lib/assess/response-scanning/common.js +1 -1
  144. package/lib/assess/response-scanning/cookies/common.js +1 -1
  145. package/lib/assess/response-scanning/cookies/events.js +1 -1
  146. package/lib/assess/response-scanning/cookies/httponly.js +1 -1
  147. package/lib/assess/response-scanning/cookies/secure-flag-missing.js +1 -1
  148. package/lib/assess/response-scanning/headers/csp-header-insecure.js +1 -1
  149. package/lib/assess/response-scanning/headers/csp-header-missing.js +1 -1
  150. package/lib/assess/response-scanning/headers/csp-utils.js +1 -1
  151. package/lib/assess/response-scanning/headers/hsts-header-missing.js +1 -1
  152. package/lib/assess/response-scanning/headers/powered-by.js +1 -1
  153. package/lib/assess/response-scanning/headers/xcontenttype-header-missing.js +1 -1
  154. package/lib/assess/response-scanning/headers/xxssprotection-header-disabled.js +1 -1
  155. package/lib/assess/response-scanning/parameter-pollution.js +1 -1
  156. package/lib/assess/response-scanning/parseable-response-emitter.js +1 -1
  157. package/lib/assess/restify/index.js +1 -1
  158. package/lib/assess/restify/route-coverage.js +1 -1
  159. package/lib/assess/restify/session.js +1 -1
  160. package/lib/assess/restify/sinks/index.js +1 -1
  161. package/lib/assess/restify/sinks/response-scanning.js +1 -1
  162. package/lib/assess/restify/sinks/unvalidated-redirect.js +1 -1
  163. package/lib/assess/restify/sinks/xss.js +1 -1
  164. package/lib/assess/restify/sources.js +1 -1
  165. package/lib/assess/sinks/common.js +11 -6
  166. package/lib/assess/sinks/dustjs-linkedin-xss.js +1 -1
  167. package/lib/assess/sinks/dynamo.js +1 -1
  168. package/lib/assess/sinks/hapi-16-xss.js +1 -1
  169. package/lib/assess/sinks/index.js +1 -1
  170. package/lib/assess/sinks/libxmljs-xxe.js +2 -2
  171. package/lib/assess/sinks/mongodb.js +3 -2
  172. package/lib/assess/sinks/rethinkdb-nosql-injection.js +142 -0
  173. package/lib/assess/sinks/ssrf-url.js +2 -2
  174. package/lib/assess/sources/event-handler.js +307 -0
  175. package/lib/assess/sources/formidable.js +1 -1
  176. package/lib/assess/sources/index.js +94 -6
  177. package/lib/assess/spdy/index.js +23 -0
  178. package/lib/assess/spdy/sinks/index.js +23 -0
  179. package/lib/assess/spdy/sinks/xss.js +84 -0
  180. package/lib/assess/static/hardcoded.js +1 -1
  181. package/lib/assess/technologies/index.js +3 -2
  182. package/lib/assess/utils.js +1 -1
  183. package/lib/cli-rewriter/index.js +1 -1
  184. package/lib/constants.js +7 -3
  185. package/lib/contrast.js +7 -7
  186. package/lib/core/arch-components/dynamodb.js +1 -1
  187. package/lib/core/arch-components/dynamodbv3.js +1 -1
  188. package/lib/core/arch-components/index.js +2 -1
  189. package/lib/core/arch-components/mongodb.js +23 -19
  190. package/lib/core/arch-components/mysql.js +1 -1
  191. package/lib/core/arch-components/postgres.js +22 -4
  192. package/lib/core/arch-components/rethinkdb.js +1 -1
  193. package/lib/core/arch-components/sqlite3.js +4 -6
  194. package/lib/core/async-storage/context.js +1 -1
  195. package/lib/core/async-storage/hooks/bluebird.js +1 -1
  196. package/lib/core/async-storage/hooks/mongodb-core.js +1 -1
  197. package/lib/core/async-storage/hooks/mysql.js +1 -1
  198. package/lib/core/async-storage/hooks/redis.js +1 -1
  199. package/lib/core/async-storage/hooks/utils.js +1 -1
  200. package/lib/core/async-storage/index.js +1 -1
  201. package/lib/core/async-storage/scopes/index.js +1 -1
  202. package/lib/core/common/formidable.js +1 -1
  203. package/lib/core/common/index.js +1 -1
  204. package/lib/core/config/options.js +37 -3
  205. package/lib/core/config/util.js +1 -1
  206. package/lib/core/exclusions/exclusion-factory.js +1 -1
  207. package/lib/core/exclusions/exclusion.js +3 -6
  208. package/lib/core/exclusions/input.js +1 -1
  209. package/lib/core/exclusions/url.js +1 -1
  210. package/lib/core/express/index.js +26 -3
  211. package/lib/core/express/utils.js +9 -4
  212. package/lib/core/fastify/index.js +1 -1
  213. package/lib/core/fastify/utils.js +1 -1
  214. package/lib/core/hapi/index.js +1 -1
  215. package/lib/core/hapi/utils.js +1 -1
  216. package/lib/core/index.js +1 -1
  217. package/lib/core/koa/index.js +1 -1
  218. package/lib/core/koa/utils.js +1 -1
  219. package/lib/core/logger/daily-rotate-file.js +1 -1
  220. package/lib/core/logger/dataflow-monitor.js +1 -1
  221. package/lib/core/logger/debug-logger.js +1 -1
  222. package/lib/core/logger/index.js +1 -1
  223. package/lib/core/logger/perf-logger.js +1 -1
  224. package/lib/core/logger/umbrella-logger.js +1 -1
  225. package/lib/core/loopback4/index.js +1 -1
  226. package/lib/core/metrics/index.js +1 -1
  227. package/lib/core/restify/index.js +1 -1
  228. package/lib/core/restify/utils.js +1 -1
  229. package/lib/core/rewrite/assignment-expression.js +1 -1
  230. package/lib/core/rewrite/binary-expression.js +1 -1
  231. package/lib/core/rewrite/call-expression.js +1 -1
  232. package/lib/core/rewrite/callees.js +1 -1
  233. package/lib/core/rewrite/catch-clause.js +1 -1
  234. package/lib/core/rewrite/function-wrap.js +1 -1
  235. package/lib/core/rewrite/index.js +1 -1
  236. package/lib/core/rewrite/injections.js +9 -1
  237. package/lib/core/rewrite/is-contrast-method.js +1 -1
  238. package/lib/core/rewrite/log.js +1 -1
  239. package/lib/core/rewrite/member-expression.js +1 -1
  240. package/lib/core/rewrite/object-property.js +1 -1
  241. package/lib/core/rewrite/prepend-globals.js +1 -1
  242. package/lib/core/rewrite/rewrite-log.js +1 -1
  243. package/lib/core/rewrite/switch-statement.js +1 -1
  244. package/lib/core/rewrite/template-literal.js +1 -1
  245. package/lib/core/stacktrace.js +1 -1
  246. package/lib/coverage.js +1 -1
  247. package/lib/feature-set.js +2 -2
  248. package/lib/generator-function.js +1 -1
  249. package/lib/hooks/array.js +1 -1
  250. package/lib/hooks/cluster.js +1 -1
  251. package/lib/hooks/dataflow-monitor.js +1 -1
  252. package/lib/hooks/encoding.js +1 -1
  253. package/lib/hooks/express-fileupload.js +1 -1
  254. package/lib/hooks/express-session.js +1 -1
  255. package/lib/hooks/fn-to-string.js +1 -1
  256. package/lib/hooks/frameworks/base.js +1 -1
  257. package/lib/hooks/frameworks/common.js +1 -1
  258. package/lib/hooks/frameworks/hapi16.js +1 -1
  259. package/lib/hooks/frameworks/http.js +1 -1
  260. package/lib/hooks/frameworks/http2.js +1 -1
  261. package/lib/hooks/frameworks/index.js +3 -1
  262. package/lib/hooks/frameworks/spdy.js +87 -0
  263. package/lib/hooks/hapi-16-reply.js +1 -1
  264. package/lib/hooks/hapi-16-session.js +1 -1
  265. package/lib/hooks/http.js +12 -1
  266. package/lib/hooks/module/extensions.js +1 -1
  267. package/lib/hooks/module/helpers.js +1 -1
  268. package/lib/hooks/module/index.js +1 -1
  269. package/lib/hooks/newrelic.js +1 -1
  270. package/lib/hooks/object-is.js +1 -1
  271. package/lib/hooks/object-to-primitive.js +7 -8
  272. package/lib/hooks/patcher.js +2 -2
  273. package/lib/hooks/require.js +1 -1
  274. package/lib/hooks/stealthy-require.js +1 -1
  275. package/lib/instrumentation.js +1 -1
  276. package/lib/libraries.js +1 -1
  277. package/lib/library-usage.js +1 -1
  278. package/lib/list-installed.js +1 -1
  279. package/lib/protect/analysis/aho-corasick.js +1 -1
  280. package/lib/protect/analysis/dfsa-analyzer.js +1 -1
  281. package/lib/protect/errors/handler.js +1 -1
  282. package/lib/protect/errors/security-exception.js +1 -1
  283. package/lib/protect/express/index.js +1 -1
  284. package/lib/protect/express/sinks.js +1 -1
  285. package/lib/protect/express/sources.js +1 -1
  286. package/lib/protect/fastify/index.js +1 -1
  287. package/lib/protect/fastify/sinks.js +1 -1
  288. package/lib/protect/fastify/sources.js +1 -1
  289. package/lib/protect/hapi/error-handler.js +1 -1
  290. package/lib/protect/hapi/index.js +1 -1
  291. package/lib/protect/hapi/sinks.js +1 -1
  292. package/lib/protect/hapi/sources.js +1 -1
  293. package/lib/protect/index.js +1 -1
  294. package/lib/protect/input-analysis.js +1 -1
  295. package/lib/protect/koa/index.js +1 -1
  296. package/lib/protect/koa/sinks.js +1 -1
  297. package/lib/protect/koa/sources.js +1 -1
  298. package/lib/protect/listeners.js +1 -1
  299. package/lib/protect/loopback4/index.js +1 -1
  300. package/lib/protect/loopback4/sources.js +1 -1
  301. package/lib/protect/models/application-context.js +1 -1
  302. package/lib/protect/models/sink-event.js +1 -1
  303. package/lib/protect/models/source-event.js +1 -1
  304. package/lib/protect/restify/index.js +1 -1
  305. package/lib/protect/restify/sinks.js +1 -1
  306. package/lib/protect/restify/sources.js +1 -1
  307. package/lib/protect/rules/assessment.js +1 -1
  308. package/lib/protect/rules/attack-patterns.js +1 -1
  309. package/lib/protect/rules/base-scanner/index.js +1 -1
  310. package/lib/protect/rules/base-scanner/java-script-scanner.js +1 -1
  311. package/lib/protect/rules/base-scanner/postgresqlscanner.js +1 -1
  312. package/lib/protect/rules/base-scanner/scan-state.js +1 -1
  313. package/lib/protect/rules/base-scanner/substring-finder.js +1 -1
  314. package/lib/protect/rules/base-scanner/token-sequence.js +1 -1
  315. package/lib/protect/rules/bot-blocker/bot-blocker-rule.js +1 -1
  316. package/lib/protect/rules/bot-blocker/index.js +1 -1
  317. package/lib/protect/rules/cmd-injection/cmdinjection-rule.js +1 -1
  318. package/lib/protect/rules/cmd-injection-command-backdoors/backdoor-detector.js +1 -1
  319. package/lib/protect/rules/cmd-injection-command-backdoors/cmd-injection-command-backdoors-rule.js +1 -1
  320. package/lib/protect/rules/cmd-injection-semantic-chained-commands/chained-command-scanner.js +1 -1
  321. package/lib/protect/rules/cmd-injection-semantic-chained-commands/cmd-injection-semantic-chained-commands-rule.js +1 -1
  322. package/lib/protect/rules/cmd-injection-semantic-dangerous-paths/cmd-injection-semantic-dangerous-paths-rule.js +1 -1
  323. package/lib/protect/rules/cmd-injection-semantic-dangerous-paths/dangerous-paths-scanner.js +1 -1
  324. package/lib/protect/rules/common.js +1 -1
  325. package/lib/protect/rules/index.js +1 -1
  326. package/lib/protect/rules/ip-denylist/ip-denylist-rule.js +1 -1
  327. package/lib/protect/rules/method-tampering/evaluator.js +1 -1
  328. package/lib/protect/rules/method-tampering/method-tampering-rule.js +1 -1
  329. package/lib/protect/rules/nosqli/nosql-injection-rule.js +228 -0
  330. package/lib/protect/rules/nosqli/nosql-scanner/index.js +1 -1
  331. package/lib/protect/rules/nosqli/nosql-scanner/mongodbscanner.js +1 -1
  332. package/lib/protect/rules/path-traversal/path-traversal-rule.js +1 -1
  333. package/lib/protect/rules/rule-factory.js +3 -3
  334. package/lib/protect/rules/signatures/cmd-injection/custom-searchers/chained-command-searcher.js +1 -1
  335. package/lib/protect/rules/signatures/cmd-injection/custom-searchers/index.js +1 -1
  336. package/lib/protect/rules/signatures/cmd-injection/index.js +1 -1
  337. package/lib/protect/rules/signatures/evaluator.js +1 -1
  338. package/lib/protect/rules/signatures/index.js +1 -1
  339. package/lib/protect/rules/signatures/nosql-injection/custom-searchers/index.js +1 -1
  340. package/lib/protect/rules/signatures/nosql-injection/custom-searchers/nosql-comment-searcher.js +1 -1
  341. package/lib/protect/rules/signatures/nosql-injection/custom-searchers/simple-or-searcher.js +1 -1
  342. package/lib/protect/rules/signatures/nosql-injection/index.js +1 -1
  343. package/lib/protect/rules/signatures/path-traversal/index.js +1 -1
  344. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/behavior-url-searcher.js +1 -1
  345. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/function-definition-searcher.js +1 -1
  346. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/immediate-function-searcher.js +1 -1
  347. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/index.js +1 -1
  348. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/link-and-src-target-searcher.js +1 -1
  349. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/location-set-searcher.js +1 -1
  350. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/map-access-searcher.js +1 -1
  351. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/native-function-execution-searcher.js +1 -1
  352. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/no-alnum-searcher.js +1 -1
  353. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/redefined-function-searcher.js +1 -1
  354. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/style-url-injection-searcher.js +1 -1
  355. package/lib/protect/rules/signatures/reflected-xss/custom-searchers/variable-assignment-searcher.js +1 -1
  356. package/lib/protect/rules/signatures/reflected-xss/helpers/function-call.js +1 -1
  357. package/lib/protect/rules/signatures/reflected-xss/index.js +1 -1
  358. package/lib/protect/rules/signatures/signature.js +1 -1
  359. package/lib/protect/rules/signatures/sql-injection/custom-searchers/if-else-drop-searcher.js +1 -1
  360. package/lib/protect/rules/signatures/sql-injection/custom-searchers/index.js +1 -1
  361. package/lib/protect/rules/signatures/sql-injection/custom-searchers/simple-or-searcher.js +1 -1
  362. package/lib/protect/rules/signatures/sql-injection/custom-searchers/sql-comment-searcher.js +1 -1
  363. package/lib/protect/rules/signatures/sql-injection/custom-searchers/time-function-searcher.js +1 -1
  364. package/lib/protect/rules/signatures/sql-injection/custom-searchers/tsql-exec-searcher.js +1 -1
  365. package/lib/protect/rules/signatures/sql-injection/index.js +1 -1
  366. package/lib/protect/rules/signatures/ssjs-injection/index.js +1 -1
  367. package/lib/protect/rules/signatures/unsafe-file-upload/index.js +1 -1
  368. package/lib/protect/rules/signatures/untrusted-deserialization/index.js +1 -1
  369. package/lib/protect/rules/sqli/generic-complicated.js +1 -1
  370. package/lib/protect/rules/sqli/sql-injection-rule.js +1 -1
  371. package/lib/protect/rules/sqli/sql-scanner/index.js +1 -1
  372. package/lib/protect/rules/sqli/sql-scanner/mysql-scanner.js +1 -1
  373. package/lib/protect/rules/ssjs-injection/evaluator.js +1 -1
  374. package/lib/protect/rules/ssjs-injection/ssjsinjection-rule.js +1 -1
  375. package/lib/protect/rules/unsafe-file-upload/unsafe-file-upload-rule.js +1 -1
  376. package/lib/protect/rules/untrusted-deserialization/untrusted-deserialization-rule.js +1 -1
  377. package/lib/protect/rules/virtual-patch/index.js +1 -1
  378. package/lib/protect/rules/virtual-patch/utils.js +1 -1
  379. package/lib/protect/rules/virtual-patch/virtual-patch-rule.js +1 -1
  380. package/lib/protect/rules/xss/helpers/function-call.js +1 -1
  381. package/lib/protect/rules/xss/reflected-xss-rule.js +1 -1
  382. package/lib/protect/rules/xxe/xxerule.js +1 -1
  383. package/lib/protect/sample-aggregator.js +1 -1
  384. package/lib/protect/samples.js +1 -1
  385. package/lib/protect/service.js +24 -12
  386. package/lib/protect/sinks/child-process.js +1 -1
  387. package/lib/protect/sinks/eval.js +1 -1
  388. package/lib/protect/sinks/fs.js +1 -1
  389. package/lib/protect/sinks/function.js +1 -1
  390. package/lib/protect/sinks/index.js +1 -1
  391. package/lib/protect/sinks/libxmljs.js +1 -1
  392. package/lib/protect/sinks/mongodb.js +57 -56
  393. package/lib/protect/sinks/mysql.js +1 -1
  394. package/lib/protect/sinks/node-serialize.js +1 -1
  395. package/lib/protect/sinks/postgres.js +1 -1
  396. package/lib/protect/sinks/sequelize.js +1 -1
  397. package/lib/protect/sinks/sqlite3.js +1 -1
  398. package/lib/protect/sinks/vm.js +1 -1
  399. package/lib/protect/sources/busboy.js +1 -1
  400. package/lib/protect/sources/formidable.js +1 -1
  401. package/lib/protect/sources/index.js +1 -1
  402. package/lib/protect/validators/authorization.js +1 -1
  403. package/lib/protect/validators/common.js +1 -1
  404. package/lib/protect/validators/connection.js +1 -1
  405. package/lib/protect/validators/content-length.js +1 -1
  406. package/lib/protect/validators/host.js +1 -1
  407. package/lib/protect/validators/if-none-match.js +1 -1
  408. package/lib/protect/validators/index.js +1 -1
  409. package/lib/protect/validators/origin.js +1 -1
  410. package/lib/reporter/app-activity-queue.js +1 -1
  411. package/lib/reporter/grpc-client.js +1 -1
  412. package/lib/reporter/messages/speedracer/activity.js +1 -1
  413. package/lib/reporter/messages/speedracer/application-create.js +1 -1
  414. package/lib/reporter/messages/speedracer/application-update.js +1 -1
  415. package/lib/reporter/messages/speedracer/base.js +1 -1
  416. package/lib/reporter/messages/speedracer/index.js +1 -1
  417. package/lib/reporter/messages/speedracer/observed-route.js +1 -1
  418. package/lib/reporter/messages/speedracer/poll.js +1 -1
  419. package/lib/reporter/messages/speedracer/request.js +1 -1
  420. package/lib/reporter/messages/speedracer/startup.js +1 -1
  421. package/lib/reporter/messaging-router.js +1 -1
  422. package/lib/reporter/models/app-activity/app-activity.js +1 -1
  423. package/lib/reporter/models/app-activity/attacker-activity.js +1 -1
  424. package/lib/reporter/models/app-activity/defend.js +1 -1
  425. package/lib/reporter/models/app-activity/inventory.js +1 -1
  426. package/lib/reporter/models/app-activity/protection-rule-activity.js +1 -1
  427. package/lib/reporter/models/app-activity/rule-events.js +1 -1
  428. package/lib/reporter/models/app-activity/sample.js +1 -1
  429. package/lib/reporter/models/app-activity/source.js +1 -1
  430. package/lib/reporter/models/app-activity/user-input.js +1 -1
  431. package/lib/reporter/models/app-create.js +1 -1
  432. package/lib/reporter/models/app-update/index.js +1 -1
  433. package/lib/reporter/models/app-update/library-manifest.js +1 -1
  434. package/lib/reporter/models/app-update/library-usage.js +1 -1
  435. package/lib/reporter/models/app-update/library.js +1 -1
  436. package/lib/reporter/models/event-tag.js +1 -1
  437. package/lib/reporter/models/finding/event.js +1 -1
  438. package/lib/reporter/models/finding/finding.js +1 -1
  439. package/lib/reporter/models/frameworks/express-request.js +1 -1
  440. package/lib/reporter/models/frameworks/fastify-request.js +1 -1
  441. package/lib/reporter/models/frameworks/hapi-request.js +1 -1
  442. package/lib/reporter/models/frameworks/index.js +1 -1
  443. package/lib/reporter/models/frameworks/koa-request.js +1 -1
  444. package/lib/reporter/models/frameworks/restify-request.js +1 -1
  445. package/lib/reporter/models/observed-route.js +1 -1
  446. package/lib/reporter/models/request.js +1 -1
  447. package/lib/reporter/models/route-coverage.js +1 -1
  448. package/lib/reporter/models/startup.js +1 -1
  449. package/lib/reporter/models/trace-event-source.js +1 -1
  450. package/lib/reporter/models/utils/request-factory.js +1 -1
  451. package/lib/reporter/models/utils/user-input-factory.js +1 -1
  452. package/lib/reporter/models/utils/user-input-kit.js +1 -1
  453. package/lib/reporter/mq-client.js +1 -1
  454. package/lib/reporter/server-activity-queue.js +1 -1
  455. package/lib/reporter/socket-client.js +1 -1
  456. package/lib/reporter/speedracer/base-connection-state.js +1 -1
  457. package/lib/reporter/speedracer/constants.js +1 -1
  458. package/lib/reporter/speedracer/failure-connection-state.js +1 -1
  459. package/lib/reporter/speedracer/index.js +1 -1
  460. package/lib/reporter/speedracer/success-connection-state.js +1 -1
  461. package/lib/reporter/speedracer/unknown-connection-state.js +1 -1
  462. package/lib/reporter/translations/enums.js +1 -1
  463. package/lib/reporter/translations/helpers.js +1 -1
  464. package/lib/reporter/translations/to-protobuf/dtm/activity.js +1 -1
  465. package/lib/reporter/translations/to-protobuf/dtm/address.js +1 -1
  466. package/lib/reporter/translations/to-protobuf/dtm/agent-startup.js +1 -1
  467. package/lib/reporter/translations/to-protobuf/dtm/application-create.js +1 -1
  468. package/lib/reporter/translations/to-protobuf/dtm/application-update.js +1 -1
  469. package/lib/reporter/translations/to-protobuf/dtm/architecture-component.js +1 -1
  470. package/lib/reporter/translations/to-protobuf/dtm/attack-result.js +1 -1
  471. package/lib/reporter/translations/to-protobuf/dtm/bot-blocker-details.js +1 -1
  472. package/lib/reporter/translations/to-protobuf/dtm/cmd-injection-details.js +1 -1
  473. package/lib/reporter/translations/to-protobuf/dtm/cmd-injection-semantic-analysis-details.js +1 -1
  474. package/lib/reporter/translations/to-protobuf/dtm/finding.js +1 -1
  475. package/lib/reporter/translations/to-protobuf/dtm/http-method-tampering-details.js +1 -1
  476. package/lib/reporter/translations/to-protobuf/dtm/http-request.js +1 -1
  477. package/lib/reporter/translations/to-protobuf/dtm/index.js +2 -2
  478. package/lib/reporter/translations/to-protobuf/dtm/ip-denylist-details.js +2 -2
  479. package/lib/reporter/translations/to-protobuf/dtm/library-usage-update.js +1 -1
  480. package/lib/reporter/translations/to-protobuf/dtm/no-sql-injection-details.js +1 -1
  481. package/lib/reporter/translations/to-protobuf/dtm/observed-route.js +1 -1
  482. package/lib/reporter/translations/to-protobuf/dtm/pair.js +1 -1
  483. package/lib/reporter/translations/to-protobuf/dtm/path-traversal-details.js +1 -1
  484. package/lib/reporter/translations/to-protobuf/dtm/poll.js +1 -1
  485. package/lib/reporter/translations/to-protobuf/dtm/rasp-rule-sample.js +2 -2
  486. package/lib/reporter/translations/to-protobuf/dtm/raw-request.js +1 -1
  487. package/lib/reporter/translations/to-protobuf/dtm/route-coverage.js +1 -1
  488. package/lib/reporter/translations/to-protobuf/dtm/simple-pair.js +1 -1
  489. package/lib/reporter/translations/to-protobuf/dtm/sql-injection-details.js +1 -1
  490. package/lib/reporter/translations/to-protobuf/dtm/ssjs-injection-details.js +1 -1
  491. package/lib/reporter/translations/to-protobuf/dtm/stack-trace-element.js +1 -1
  492. package/lib/reporter/translations/to-protobuf/dtm/trace-event/action.js +1 -1
  493. package/lib/reporter/translations/to-protobuf/dtm/trace-event/index.js +5 -5
  494. package/lib/reporter/translations/to-protobuf/dtm/trace-event/parent-object-id.js +1 -1
  495. package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-object.js +1 -1
  496. package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-signature.js +1 -1
  497. package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-event-source.js +1 -1
  498. package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-stack.js +1 -1
  499. package/lib/reporter/translations/to-protobuf/dtm/trace-event/trace-taint-range.js +1 -1
  500. package/lib/reporter/translations/to-protobuf/dtm/trace-event/type.js +1 -1
  501. package/lib/reporter/translations/to-protobuf/dtm/untrusted-deserialization-details.js +1 -1
  502. package/lib/reporter/translations/to-protobuf/dtm/user-input.js +1 -1
  503. package/lib/reporter/translations/to-protobuf/dtm/virtual-patch-details.js +1 -1
  504. package/lib/reporter/translations/to-protobuf/dtm/xss-details.js +1 -1
  505. package/lib/reporter/translations/to-protobuf/dtm/xxe-details.js +1 -1
  506. package/lib/reporter/translations/to-protobuf/index.js +1 -1
  507. package/lib/reporter/translations/to-protobuf/settings/application-settings.js +1 -1
  508. package/lib/reporter/translations/to-protobuf/settings/assess-features.js +1 -1
  509. package/lib/reporter/translations/to-protobuf/settings/auth.js +1 -1
  510. package/lib/reporter/translations/to-protobuf/settings/bot-blocker.js +1 -1
  511. package/lib/reporter/translations/to-protobuf/settings/custom-rule-feature.js +1 -1
  512. package/lib/reporter/translations/to-protobuf/settings/defend-features.js +9 -7
  513. package/lib/reporter/translations/to-protobuf/settings/exclusions.js +6 -5
  514. package/lib/reporter/translations/to-protobuf/settings/index.js +1 -1
  515. package/lib/reporter/translations/to-protobuf/settings/input-analysis-result.js +1 -1
  516. package/lib/reporter/translations/to-protobuf/settings/inventory-features.js +1 -1
  517. package/lib/reporter/translations/to-protobuf/settings/ip-filter.js +1 -1
  518. package/lib/reporter/translations/to-protobuf/settings/log-enhancer.js +1 -1
  519. package/lib/reporter/translations/to-protobuf/settings/protection-rule.js +1 -1
  520. package/lib/reporter/translations/to-protobuf/settings/reaction.js +1 -1
  521. package/lib/reporter/translations/to-protobuf/settings/rule-definition.js +1 -1
  522. package/lib/reporter/translations/to-protobuf/settings/sampling.js +1 -1
  523. package/lib/reporter/translations/to-protobuf/settings/server-features.js +1 -1
  524. package/lib/reporter/translations/to-protobuf/settings/syslog.js +1 -1
  525. package/lib/reporter/translations/to-protobuf/settings/virtual-patch.js +1 -1
  526. package/lib/reporter/ts-reporter.js +1 -1
  527. package/lib/tracker.js +14 -66
  528. package/lib/util/base64.js +1 -1
  529. package/lib/util/bitset.js +1 -1
  530. package/lib/util/block-request.js +1 -1
  531. package/lib/util/callback-resolver.js +1 -1
  532. package/lib/util/clean-stack.js +1 -1
  533. package/lib/util/clean-string/brackets.js +1 -1
  534. package/lib/util/clean-string/clean-string-base.js +1 -1
  535. package/lib/util/clean-string/comments.js +1 -1
  536. package/lib/util/clean-string/concatenations.js +1 -1
  537. package/lib/util/clean-string/jsclean-string.js +1 -1
  538. package/lib/util/clean-string/placeholders.js +1 -1
  539. package/lib/util/clean-string/util.js +1 -1
  540. package/lib/util/colors.js +1 -1
  541. package/lib/util/file-finder.js +1 -1
  542. package/lib/util/heap-dump.js +1 -1
  543. package/lib/util/html-util.js +1 -1
  544. package/lib/util/ip-analyzer.js +1 -1
  545. package/lib/util/is-agent-path.js +1 -1
  546. package/lib/util/is-contrast-error.js +1 -1
  547. package/lib/util/is-piped-to-dev.js +1 -1
  548. package/lib/util/is-string.js +1 -1
  549. package/lib/util/partial.js +1 -1
  550. package/lib/util/pkg-name.js +1 -1
  551. package/lib/util/request-util.js +1 -1
  552. package/lib/util/resolve-obj.js +1 -1
  553. package/lib/util/route-info.js +1 -1
  554. package/lib/util/some.js +1 -1
  555. package/lib/util/source-map.js +4 -4
  556. package/lib/util/static-rules.js +1 -1
  557. package/lib/util/trace-util.js +1 -1
  558. package/lib/util/traverse.js +1 -1
  559. package/lib/util/user-input-evaluator.js +1 -1
  560. package/lib/util/xml-analyzer/external-entity-finder.js +1 -1
  561. package/package.json +7 -6
  562. package/perf-logs.js +1 -1
  563. package/lib/protect/rules/nosqli/no-sql-injection-rule.js +0 -109
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
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.tracked
45
+ trackingData
46
46
  ) {
47
47
  const { event } = trackingData;
48
48
  trackingData.tagRanges = tagRangeUtil.add(
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
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.tracked && data.result._template) {
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: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
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.tracked
44
+ trackingData
45
45
  ) {
46
46
  const { event } = trackingData;
47
47
  trackingData.tagRanges = tagRangeUtil.add(
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
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.tracked) {
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: 2021 Contrast Security, Inc
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.tracked) {
82
+ if (!argContrastProperties) {
83
83
  return;
84
84
  }
85
85
 
86
- const str = tracker.track(result.value);
87
- const strContrastProperties = tracker.getData(str);
86
+ const tracked = tracker.track(result.value);
88
87
 
89
- if (strContrastProperties.tracked) {
90
- strContrastProperties.tagRanges = tagRangeUtil.add(
91
- strContrastProperties.tagRanges,
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
- strContrastProperties.event = createPropagationEvent({
94
+ tracked.props.event = createPropagationEvent({
96
95
  data,
97
96
  trackedArgsData: argContrastProperties,
98
- tagRanges: strContrastProperties.tagRanges,
97
+ tagRanges: tracked.props.tagRanges,
99
98
  target: 'R',
100
99
  joiMethod: rule
101
100
  });
102
- }
103
101
 
104
- data.result = { value: str };
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.tracked) {
122
+ if (!argContrastProperties) {
124
123
  return;
125
124
  }
126
125
 
127
126
  const strContrastProperties = tracker.getData(result);
128
127
 
129
- if (strContrastProperties.tracked) {
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: 2021 Contrast Security, Inc
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
- const {
44
+ let {
45
45
  args: [value],
46
46
  result
47
47
  } = data;
@@ -55,7 +55,7 @@ function instrumentJoiValues(values) {
55
55
  handler(result.value, value, data);
56
56
  } else if (_.isString(result.value)) {
57
57
  // use case is .valid() - safe
58
- tracker.untrack(result.value);
58
+ result.value = tracker.untrack(result.value) || result.value;
59
59
  }
60
60
  }
61
61
  });
@@ -94,14 +94,14 @@ const handler = (resultValue, argValue, data) => {
94
94
  */
95
95
  function getRefHandler(resolvedTrackData, refTrackData) {
96
96
  // 4 Cases
97
- if (!resolvedTrackData.tracked) {
98
- if (!refTrackData.tracked) {
97
+ if (!resolvedTrackData) {
98
+ if (!refTrackData) {
99
99
  return null;
100
100
  } else {
101
101
  return handleRefOnlyTracked;
102
102
  }
103
103
  } else {
104
- if (refTrackData.tracked) {
104
+ if (refTrackData) {
105
105
  return handleBothTracked;
106
106
  } else {
107
107
  return handleTargetOnlyTracked;
@@ -131,7 +131,7 @@ function handleTargetOnlyTracked(data, resolvedTrackData, refTrackData) {
131
131
  * @param {object} refTrackData tracking data for reference value
132
132
  */
133
133
  function handleBothTracked(data, resolvedTrackData, refTrackData) {
134
- const {
134
+ let {
135
135
  args: [value, , prefs],
136
136
  result
137
137
  } = data;
@@ -142,8 +142,8 @@ function handleBothTracked(data, resolvedTrackData, refTrackData) {
142
142
  }
143
143
 
144
144
  if (result.ref.map) {
145
- tracker.untrack(data.result.value);
146
- tracker.untrack(value);
145
+ data.result.value = tracker.untrack(data.result.value) || data.result.value;
146
+ value = tracker.untrack(value) || value;
147
147
  } else {
148
148
  copyValidationHistory(resolvedTrackData, refTrackData);
149
149
  if (prefs.convert) {
@@ -160,7 +160,7 @@ function handleBothTracked(data, resolvedTrackData, refTrackData) {
160
160
  * @param {object} refTrackData tracking data for reference value
161
161
  */
162
162
  function handleRefOnlyTracked(data, resolvedTrackData, refTrackData) {
163
- const {
163
+ let {
164
164
  args: [value, , prefs],
165
165
  result
166
166
  } = data;
@@ -179,8 +179,8 @@ function handleRefOnlyTracked(data, resolvedTrackData, refTrackData) {
179
179
  } else {
180
180
  // if map is used we can trust - like .valid()
181
181
  if (result.ref.map) {
182
- if (!tracker.getData(result.value).tracked) {
183
- tracker.untrack(value);
182
+ if (!tracker.getData(result.value)) {
183
+ value = tracker.untrack(value) || value;
184
184
  }
185
185
  } else {
186
186
  logger.debug(
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
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
- data.result = tracker.track(data.result);
116
- const resultContrastProperties = tracker.getData(data.result);
117
- resultContrastProperties.tracked = true;
118
- resultContrastProperties.tagRanges = event.tagRanges;
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.tracked) {
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.tracked) {
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.tracked;
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.tracked;
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
- !(sourceContrastProperties && sourceContrastProperties.tracked)
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
+ );
@@ -0,0 +1,104 @@
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 enumPatcher = (SchemaString) => {
29
+ patcher.patch(SchemaString.prototype, 'enum', {
30
+ alwaysRun: true,
31
+ name: 'mongoose.string.enum',
32
+ patchType: ASSESS_PROPAGATOR,
33
+ post(data) {
34
+ if (!data.result) return;
35
+
36
+ const enumValidator = data.result.validators.find(
37
+ (validator) => validator.type === 'enum'
38
+ );
39
+
40
+ if (!enumValidator) return;
41
+
42
+ patcher.patch(enumValidator, 'validator', {
43
+ alwaysRun: true,
44
+ name: 'mongoose.string.enumValidator',
45
+ patchType: ASSESS_PROPAGATOR,
46
+ post(data) {
47
+ if (!data.result) return;
48
+
49
+ tracker.untrack(data.args[0]);
50
+ }
51
+ });
52
+ }
53
+ });
54
+ };
55
+
56
+ const doValidateSyncPatcher = (SchemaString) => {
57
+ patcher.patch(SchemaString.prototype, 'doValidateSync', {
58
+ alwaysRun: true,
59
+ name: 'mongoose.string.doValidateSync',
60
+ patchType: ASSESS_PROPAGATOR,
61
+ post(data) {
62
+ if (data.result) return;
63
+
64
+ if (!hasUserDefinedValidator(data)) return;
65
+
66
+ const trackingData = tracker.track(data.args[0]);
67
+ if (!trackingData) return;
68
+
69
+ const { props } = trackingData;
70
+ const incomingStringLength = data.args[0].length - 1;
71
+
72
+ props.tagRanges = tagRangeUtil.add(
73
+ props.tagRanges,
74
+ new TagRange(
75
+ 0,
76
+ incomingStringLength,
77
+ 'custom-validated-nosql-injection'
78
+ )
79
+ );
80
+
81
+ props.tagRanges = tagRangeUtil.add(
82
+ props.tagRanges,
83
+ new TagRange(0, incomingStringLength, 'string-type-checked')
84
+ );
85
+
86
+ props.event = new PropagationEvent({
87
+ context: new CallContext(data),
88
+ signature: new Signature('mongoose.string.doValidateSync'),
89
+ tagRanges: props.tagRanges,
90
+ source: 'P',
91
+ target: 'A',
92
+ parents: [props.event]
93
+ });
94
+ }
95
+ });
96
+ };
97
+
98
+ requireHook.resolve(
99
+ { name: 'mongoose', file: 'lib/schema/string.js', version: '>=5.0.0' },
100
+ (SchemaString) => {
101
+ enumPatcher(SchemaString);
102
+ doValidateSyncPatcher(SchemaString);
103
+ }
104
+ );
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -0,0 +1,54 @@
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.js');
18
+ const patcher = require('../../hooks/patcher.js');
19
+ const { PATCH_TYPES } = require('../../constants');
20
+ const tagRangeUtil = require('../models/tag-range/util');
21
+ const TagRange = require('../models/tag-range');
22
+ const ContrastNumber = require('../../core/rewrite/injections').get('Number');
23
+ const { CallContext, PropagationEvent, Signature } = require('../models');
24
+
25
+ function handle() {
26
+ ContrastNumber.enable();
27
+
28
+ patcher.patch(ContrastNumber.value, {
29
+ name: 'Number',
30
+ patchType: PATCH_TYPES.ASSESS_PROPAGATOR,
31
+ post(data) {
32
+ const trackingData = tracker.getData(data.args[0]);
33
+
34
+ if (!Number.isNaN(data.result) && trackingData) {
35
+ const { event } = trackingData;
36
+ trackingData.tagRanges = tagRangeUtil.add(
37
+ trackingData.tagRanges,
38
+ new TagRange(0, data.args[0].length - 1, 'limited-chars')
39
+ );
40
+
41
+ trackingData.event = new PropagationEvent({
42
+ context: new CallContext(data),
43
+ signature: new Signature('Number'),
44
+ tagRanges: trackingData.tagRanges,
45
+ source: 'P',
46
+ target: 'P',
47
+ parents: [event]
48
+ });
49
+ }
50
+ }
51
+ });
52
+ }
53
+
54
+ module.exports = { handle };
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -41,18 +41,17 @@ function handle() {
41
41
  }
42
42
 
43
43
  const argContrastProperties = tracker.getData(arg);
44
- if (!argContrastProperties.tracked) {
44
+ if (!argContrastProperties) {
45
45
  return;
46
46
  }
47
47
 
48
- const str = tracker.track(data.result);
49
- const strContrastProperties = tracker.getData(str);
50
- if (strContrastProperties.tracked) {
51
- strContrastProperties.event = argContrastProperties.event;
52
- strContrastProperties.tagRanges = strContrastProperties.tagRanges.concat(
48
+ const tracked = tracker.track(data.result);
49
+ if (tracked) {
50
+ tracked.props.event = argContrastProperties.event;
51
+ tracked.props.tagRanges = tracked.props.tagRanges.concat(
53
52
  argContrastProperties.tagRanges
54
53
  );
55
- data.result = str;
54
+ data.result = tracked.str;
56
55
  }
57
56
  }
58
57
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -45,7 +45,7 @@ module.exports.handle = function handle() {
45
45
  if (!path || !data.result) return;
46
46
 
47
47
  const trackingData = tracker.getData(path);
48
- if (!trackingData.tracked) return;
48
+ if (!trackingData) return;
49
49
 
50
50
  if (extension) {
51
51
  const extIndex = _path.lastIndexOf(extension);
@@ -68,19 +68,20 @@ module.exports.handle = function handle() {
68
68
  // no tags propagated to the result
69
69
  if (!tagRanges.length) return;
70
70
 
71
- const result = tracker.track(data.result);
72
- const resultData = tracker.getData(result);
73
71
  const parentEvent = trackingData.event;
74
- resultData.tagRanges = tagRanges;
75
- resultData.event = new PropagationEvent({
76
- context: new CallContext(data),
77
- parents: [parentEvent],
78
- signature,
79
- source: 'P',
80
- tagRanges,
81
- target: 'R'
82
- });
83
- data.result = result;
72
+ const tracked = tracker.track(data.result);
73
+ if (tracked) {
74
+ tracked.props.tagRanges = tagRanges;
75
+ tracked.props.event = new PropagationEvent({
76
+ context: new CallContext(data),
77
+ parents: [parentEvent],
78
+ signature,
79
+ source: 'P',
80
+ tagRanges,
81
+ target: 'R'
82
+ });
83
+ data.result = tracked.str;
84
+ }
84
85
  }
85
86
  });
86
87
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- Copyright: 2021 Contrast Security, Inc
2
+ Copyright: 2022 Contrast Security, Inc
3
3
  Contact: support@contrastsecurity.com
4
4
  License: Commercial
5
5
 
@@ -333,7 +333,7 @@ function propagate({ resultMeta, data, win32 }) {
333
333
  evaluator: (segmentOffset) => segmentOffset > -1,
334
334
  offset: 0,
335
335
  str: arg,
336
- tagRanges: argData.tracked ? argData.tagRanges : []
336
+ tagRanges: argData ? argData.tagRanges : []
337
337
  };
338
338
 
339
339
  const targetTagRanges = adjustTagsToPart(