dd-trace 3.38.1 → 3.40.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.
Files changed (82) hide show
  1. package/LICENSE-3rdparty.csv +2 -2
  2. package/README.md +3 -3
  3. package/ext/kinds.d.ts +1 -0
  4. package/ext/kinds.js +2 -1
  5. package/ext/tags.d.ts +2 -1
  6. package/ext/tags.js +6 -1
  7. package/index.d.ts +9 -1
  8. package/package.json +8 -8
  9. package/packages/datadog-core/src/storage/async_resource.js +1 -1
  10. package/packages/datadog-esbuild/index.js +1 -20
  11. package/packages/datadog-instrumentations/src/cucumber.js +5 -0
  12. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -2
  13. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -1
  14. package/packages/datadog-instrumentations/src/helpers/register.js +1 -1
  15. package/packages/datadog-instrumentations/src/jest.js +39 -10
  16. package/packages/datadog-instrumentations/src/knex.js +24 -17
  17. package/packages/datadog-instrumentations/src/mocha.js +16 -1
  18. package/packages/datadog-instrumentations/src/next.js +58 -23
  19. package/packages/datadog-instrumentations/src/playwright.js +11 -6
  20. package/packages/datadog-instrumentations/src/restify.js +14 -1
  21. package/packages/datadog-plugin-http/src/client.js +2 -0
  22. package/packages/datadog-plugin-jest/src/index.js +11 -3
  23. package/packages/datadog-plugin-kafkajs/src/consumer.js +8 -6
  24. package/packages/datadog-plugin-kafkajs/src/producer.js +9 -6
  25. package/packages/datadog-plugin-mocha/src/index.js +7 -1
  26. package/packages/datadog-plugin-next/src/index.js +4 -3
  27. package/packages/datadog-plugin-playwright/src/index.js +4 -1
  28. package/packages/dd-trace/src/appsec/channels.js +1 -1
  29. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +1 -0
  30. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-analyzer.js +60 -0
  31. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +269 -0
  32. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +5 -2
  33. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +22 -4
  34. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +9 -2
  35. package/packages/dd-trace/src/appsec/iast/analyzers/xcontenttype-header-missing-analyzer.js +2 -2
  36. package/packages/dd-trace/src/appsec/iast/iast-log.js +9 -4
  37. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +1 -1
  38. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  39. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -2
  40. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +13 -2
  41. package/packages/dd-trace/src/appsec/iast/telemetry/index.js +1 -14
  42. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +19 -0
  43. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +2 -1
  44. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +1 -0
  45. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +5 -1
  46. package/packages/dd-trace/src/appsec/recommended.json +272 -48
  47. package/packages/dd-trace/src/appsec/reporter.js +31 -34
  48. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-itr-configuration.js +16 -4
  49. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -0
  50. package/packages/dd-trace/src/config.js +35 -17
  51. package/packages/dd-trace/src/datastreams/processor.js +60 -15
  52. package/packages/dd-trace/src/format.js +6 -1
  53. package/packages/dd-trace/src/git_properties.js +16 -15
  54. package/packages/dd-trace/src/iitm.js +1 -1
  55. package/packages/dd-trace/src/log/channels.js +1 -1
  56. package/packages/dd-trace/src/opentelemetry/span.js +95 -2
  57. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -10
  58. package/packages/dd-trace/src/opentracing/span.js +4 -0
  59. package/packages/dd-trace/src/opentracing/span_context.js +5 -2
  60. package/packages/dd-trace/src/plugin_manager.js +1 -1
  61. package/packages/dd-trace/src/plugins/database.js +1 -1
  62. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  63. package/packages/dd-trace/src/plugins/util/ci.js +6 -19
  64. package/packages/dd-trace/src/plugins/util/git.js +2 -1
  65. package/packages/dd-trace/src/plugins/util/ip_extractor.js +7 -6
  66. package/packages/dd-trace/src/plugins/util/test.js +29 -1
  67. package/packages/dd-trace/src/plugins/util/url.js +26 -0
  68. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -14
  69. package/packages/dd-trace/src/profiling/config.js +23 -20
  70. package/packages/dd-trace/src/profiling/profilers/events.js +161 -0
  71. package/packages/dd-trace/src/profiling/profilers/shared.js +9 -0
  72. package/packages/dd-trace/src/profiling/profilers/wall.js +84 -47
  73. package/packages/dd-trace/src/ritm.js +1 -1
  74. package/packages/dd-trace/src/span_processor.js +4 -0
  75. package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
  76. package/packages/dd-trace/src/telemetry/index.js +5 -1
  77. package/packages/dd-trace/src/telemetry/logs/index.js +65 -0
  78. package/packages/dd-trace/src/{appsec/iast/telemetry/log → telemetry/logs}/log-collector.js +9 -22
  79. package/packages/dd-trace/src/tracer.js +4 -2
  80. package/packages/dd-trace/src/appsec/iast/telemetry/log/index.js +0 -87
  81. package/packages/diagnostics_channel/index.js +0 -3
  82. package/packages/diagnostics_channel/src/index.js +0 -121
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "2.2",
3
3
  "metadata": {
4
- "rules_version": "1.8.0"
4
+ "rules_version": "1.9.0"
5
5
  },
6
6
  "rules": [
7
7
  {
@@ -3004,6 +3004,7 @@
3004
3004
  ],
3005
3005
  "regex": "<script[^>]*>[\\s\\S]*?",
3006
3006
  "options": {
3007
+ "case_sensitive": false,
3007
3008
  "min_length": 8
3008
3009
  }
3009
3010
  },
@@ -4207,7 +4208,6 @@
4207
4208
  "name": "Remote Command Execution: Java process spawn (CVE-2017-9805)",
4208
4209
  "tags": {
4209
4210
  "type": "java_code_injection",
4210
- "crs_id": "944110",
4211
4211
  "category": "attack_attempt",
4212
4212
  "cwe": "94",
4213
4213
  "capec": "1000/152/242"
@@ -4235,48 +4235,16 @@
4235
4235
  "address": "graphql.server.all_resolvers"
4236
4236
  }
4237
4237
  ],
4238
- "regex": "(?:runtime|processbuilder)",
4238
+ "regex": "(?:unmarshaller|base64data|java\\.).*(?:runtime|processbuilder)",
4239
4239
  "options": {
4240
- "case_sensitive": true,
4241
- "min_length": 7
4242
- }
4243
- },
4244
- "operator": "match_regex"
4245
- },
4246
- {
4247
- "parameters": {
4248
- "inputs": [
4249
- {
4250
- "address": "server.request.query"
4251
- },
4252
- {
4253
- "address": "server.request.body"
4254
- },
4255
- {
4256
- "address": "server.request.path_params"
4257
- },
4258
- {
4259
- "address": "server.request.headers.no_cookies"
4260
- },
4261
- {
4262
- "address": "grpc.server.request.message"
4263
- },
4264
- {
4265
- "address": "graphql.server.all_resolvers"
4266
- }
4267
- ],
4268
- "regex": "(?:unmarshaller|base64data|java\\.)",
4269
- "options": {
4270
- "case_sensitive": true,
4271
- "min_length": 5
4240
+ "case_sensitive": false,
4241
+ "min_length": 13
4272
4242
  }
4273
4243
  },
4274
4244
  "operator": "match_regex"
4275
4245
  }
4276
4246
  ],
4277
- "transformers": [
4278
- "lowercase"
4279
- ]
4247
+ "transformers": []
4280
4248
  },
4281
4249
  {
4282
4250
  "id": "crs-944-130",
@@ -4479,6 +4447,9 @@
4479
4447
  },
4480
4448
  {
4481
4449
  "address": "graphql.server.all_resolvers"
4450
+ },
4451
+ {
4452
+ "address": "server.request.headers.no_cookies"
4482
4453
  }
4483
4454
  ],
4484
4455
  "regex": "[#%$]{(?:[^}]+[^\\w\\s}\\-_][^}]+|\\d+-\\d+)}",
@@ -4752,7 +4723,7 @@
4752
4723
  "address": "graphql.server.all_resolvers"
4753
4724
  }
4754
4725
  ],
4755
- "regex": "\\bqualysperiscope\\.com\\b"
4726
+ "regex": "\\bqualysperiscope\\.com\\b|\\.oscomm\\."
4756
4727
  },
4757
4728
  "operator": "match_regex"
4758
4729
  }
@@ -4833,7 +4804,7 @@
4833
4804
  "address": "graphql.server.all_resolvers"
4834
4805
  }
4835
4806
  ],
4836
- "regex": "\\b(?:webhook\\.site|\\.canarytokens\\.com|vii\\.one|act1on3\\.ru|gdsburp\\.com)\\b"
4807
+ "regex": "\\b(?:webhook\\.site|\\.canarytokens\\.com|vii\\.one|act1on3\\.ru|gdsburp\\.com|arcticwolf\\.net|oob\\.li|htbiw\\.com|h4\\.vc|mochan\\.cloud|imshopping\\.com|bootstrapnodejs\\.com|mooo-ng\\.com|securitytrails\\.com|canyouhackit\\.io|7bae\\.xyz)\\b"
4837
4808
  },
4838
4809
  "operator": "match_regex"
4839
4810
  }
@@ -4955,7 +4926,7 @@
4955
4926
  "address": "graphql.server.all_resolvers"
4956
4927
  }
4957
4928
  ],
4958
- "regex": "\\b(?:interact\\.sh|oast\\.(?:pro|live|site|online|fun|me))\\b"
4929
+ "regex": "\\b(?:interact\\.sh|oast\\.(?:pro|live|site|online|fun|me)|indusfacefinder\\.in|where\\.land|syhunt\\.net|tssrt\\.de|boardofcyber\\.io|assetnote-callback\\.com|praetorianlabs\\.dev|netspi\\.sh)\\b"
4959
4930
  },
4960
4931
  "operator": "match_regex"
4961
4932
  }
@@ -4996,7 +4967,187 @@
4996
4967
  "address": "graphql.server.all_resolvers"
4997
4968
  }
4998
4969
  ],
4999
- "regex": "\\b(?:\\.|(?:\\\\|&#)(?:0*46|x0*2e);)r87(?:\\.|(?:\\\\|&#)(?:0*46|x0*2e);)(?:me|com)\\b",
4970
+ "regex": "\\b(?:\\.|(?:\\\\|&#)(?:0*46|x0*2e);)?r87(?:\\.|(?:\\\\|&#)(?:0*46|x0*2e);)(?:me|com)\\b",
4971
+ "options": {
4972
+ "case_sensitive": false,
4973
+ "min_length": 7
4974
+ }
4975
+ },
4976
+ "operator": "match_regex"
4977
+ }
4978
+ ],
4979
+ "transformers": []
4980
+ },
4981
+ {
4982
+ "id": "dog-913-009",
4983
+ "name": "WhiteHat Security OOB domain",
4984
+ "tags": {
4985
+ "type": "commercial_scanner",
4986
+ "category": "attack_attempt",
4987
+ "tool_name": "WhiteHatSecurity",
4988
+ "cwe": "200",
4989
+ "capec": "1000/118/169",
4990
+ "confidence": "0"
4991
+ },
4992
+ "conditions": [
4993
+ {
4994
+ "parameters": {
4995
+ "inputs": [
4996
+ {
4997
+ "address": "server.request.query"
4998
+ },
4999
+ {
5000
+ "address": "server.request.body"
5001
+ },
5002
+ {
5003
+ "address": "server.request.path_params"
5004
+ },
5005
+ {
5006
+ "address": "server.request.headers.no_cookies"
5007
+ },
5008
+ {
5009
+ "address": "grpc.server.request.message"
5010
+ },
5011
+ {
5012
+ "address": "graphql.server.all_resolvers"
5013
+ }
5014
+ ],
5015
+ "regex": "\\bwhsec(?:\\.|(?:\\\\|&#)(?:0*46|x0*2e);)us\\b",
5016
+ "options": {
5017
+ "case_sensitive": false,
5018
+ "min_length": 8
5019
+ }
5020
+ },
5021
+ "operator": "match_regex"
5022
+ }
5023
+ ],
5024
+ "transformers": []
5025
+ },
5026
+ {
5027
+ "id": "dog-913-010",
5028
+ "name": "Nessus OOB domain",
5029
+ "tags": {
5030
+ "type": "commercial_scanner",
5031
+ "category": "attack_attempt",
5032
+ "tool_name": "Nessus",
5033
+ "cwe": "200",
5034
+ "capec": "1000/118/169",
5035
+ "confidence": "0"
5036
+ },
5037
+ "conditions": [
5038
+ {
5039
+ "parameters": {
5040
+ "inputs": [
5041
+ {
5042
+ "address": "server.request.query"
5043
+ },
5044
+ {
5045
+ "address": "server.request.body"
5046
+ },
5047
+ {
5048
+ "address": "server.request.path_params"
5049
+ },
5050
+ {
5051
+ "address": "server.request.headers.no_cookies"
5052
+ },
5053
+ {
5054
+ "address": "grpc.server.request.message"
5055
+ },
5056
+ {
5057
+ "address": "graphql.server.all_resolvers"
5058
+ }
5059
+ ],
5060
+ "regex": "\\b\\.nessus\\.org\\b",
5061
+ "options": {
5062
+ "case_sensitive": false,
5063
+ "min_length": 8
5064
+ }
5065
+ },
5066
+ "operator": "match_regex"
5067
+ }
5068
+ ],
5069
+ "transformers": []
5070
+ },
5071
+ {
5072
+ "id": "dog-913-011",
5073
+ "name": "Watchtowr OOB domain",
5074
+ "tags": {
5075
+ "type": "commercial_scanner",
5076
+ "category": "attack_attempt",
5077
+ "tool_name": "Watchtowr",
5078
+ "cwe": "200",
5079
+ "capec": "1000/118/169",
5080
+ "confidence": "0"
5081
+ },
5082
+ "conditions": [
5083
+ {
5084
+ "parameters": {
5085
+ "inputs": [
5086
+ {
5087
+ "address": "server.request.query"
5088
+ },
5089
+ {
5090
+ "address": "server.request.body"
5091
+ },
5092
+ {
5093
+ "address": "server.request.path_params"
5094
+ },
5095
+ {
5096
+ "address": "server.request.headers.no_cookies"
5097
+ },
5098
+ {
5099
+ "address": "grpc.server.request.message"
5100
+ },
5101
+ {
5102
+ "address": "graphql.server.all_resolvers"
5103
+ }
5104
+ ],
5105
+ "regex": "\\bwatchtowr\\.com\\b",
5106
+ "options": {
5107
+ "case_sensitive": false,
5108
+ "min_length": 8
5109
+ }
5110
+ },
5111
+ "operator": "match_regex"
5112
+ }
5113
+ ],
5114
+ "transformers": []
5115
+ },
5116
+ {
5117
+ "id": "dog-913-012",
5118
+ "name": "AppCheck NG OOB domain",
5119
+ "tags": {
5120
+ "type": "commercial_scanner",
5121
+ "category": "attack_attempt",
5122
+ "tool_name": "AppCheckNG",
5123
+ "cwe": "200",
5124
+ "capec": "1000/118/169",
5125
+ "confidence": "0"
5126
+ },
5127
+ "conditions": [
5128
+ {
5129
+ "parameters": {
5130
+ "inputs": [
5131
+ {
5132
+ "address": "server.request.query"
5133
+ },
5134
+ {
5135
+ "address": "server.request.body"
5136
+ },
5137
+ {
5138
+ "address": "server.request.path_params"
5139
+ },
5140
+ {
5141
+ "address": "server.request.headers.no_cookies"
5142
+ },
5143
+ {
5144
+ "address": "grpc.server.request.message"
5145
+ },
5146
+ {
5147
+ "address": "graphql.server.all_resolvers"
5148
+ }
5149
+ ],
5150
+ "regex": "\\bptst\\.io\\b",
5000
5151
  "options": {
5001
5152
  "case_sensitive": false,
5002
5153
  "min_length": 7
@@ -5048,6 +5199,50 @@
5048
5199
  ],
5049
5200
  "transformers": []
5050
5201
  },
5202
+ {
5203
+ "id": "dog-932-100",
5204
+ "name": "Shell spawn executing network command",
5205
+ "tags": {
5206
+ "type": "command_injection",
5207
+ "category": "attack_attempt",
5208
+ "cwe": "77",
5209
+ "capec": "1000/152/248/88",
5210
+ "confidence": "0"
5211
+ },
5212
+ "conditions": [
5213
+ {
5214
+ "parameters": {
5215
+ "inputs": [
5216
+ {
5217
+ "address": "server.request.query"
5218
+ },
5219
+ {
5220
+ "address": "server.request.body"
5221
+ },
5222
+ {
5223
+ "address": "server.request.path_params"
5224
+ },
5225
+ {
5226
+ "address": "server.request.headers.no_cookies"
5227
+ },
5228
+ {
5229
+ "address": "grpc.server.request.message"
5230
+ },
5231
+ {
5232
+ "address": "graphql.server.all_resolvers"
5233
+ }
5234
+ ],
5235
+ "regex": "(?:(?:['\"\\x60({|;&]|(?:^|['\"\\x60({|;&])(?:cmd(?:\\.exe)?\\s+(?:/\\w(?::\\w+)?\\s+)*))(?:ping|curl|wget|telnet)|\\bnslookup)[\\s,]",
5236
+ "options": {
5237
+ "case_sensitive": true,
5238
+ "min_length": 5
5239
+ }
5240
+ },
5241
+ "operator": "match_regex"
5242
+ }
5243
+ ],
5244
+ "transformers": []
5245
+ },
5051
5246
  {
5052
5247
  "id": "dog-934-001",
5053
5248
  "name": "XXE - XML file loads external entity",
@@ -5056,7 +5251,7 @@
5056
5251
  "category": "attack_attempt",
5057
5252
  "cwe": "91",
5058
5253
  "capec": "1000/152/248/250",
5059
- "confidence": "0"
5254
+ "confidence": "1"
5060
5255
  },
5061
5256
  "conditions": [
5062
5257
  {
@@ -5091,7 +5286,7 @@
5091
5286
  "category": "attack_attempt",
5092
5287
  "cwe": "83",
5093
5288
  "capec": "1000/152/242/63/591/243",
5094
- "confidence": "0"
5289
+ "confidence": "1"
5095
5290
  },
5096
5291
  "conditions": [
5097
5292
  {
@@ -5125,7 +5320,7 @@
5125
5320
  "address": "graphql.server.all_resolvers"
5126
5321
  }
5127
5322
  ],
5128
- "regex": "<(?:iframe|esi:include)(?:(?:\\s|/)*\\w+=[\"'\\w]+)*(?:\\s|/)*src(?:doc)?=[\"']?(?:data:|javascript:|http:|//)[^\\s'\"]+['\"]?",
5323
+ "regex": "<(?:iframe|esi:include)(?:(?:\\s|/)*\\w+=[\"'\\w]+)*(?:\\s|/)*src(?:doc)?=[\"']?(?:data:|javascript:|http:|dns:|//)[^\\s'\"]+['\"]?",
5129
5324
  "options": {
5130
5325
  "min_length": 14
5131
5326
  }
@@ -5171,7 +5366,7 @@
5171
5366
  "address": "graphql.server.all_resolvers"
5172
5367
  }
5173
5368
  ],
5174
- "regex": "https?:\\/\\/(?:.*\\.)?(?:bxss\\.in|xss\\.ht|js\\.rip)",
5369
+ "regex": "https?:\\/\\/(?:.*\\.)?(?:bxss\\.(?:in|me)|xss\\.ht|js\\.rip)",
5175
5370
  "options": {
5176
5371
  "case_sensitive": false
5177
5372
  }
@@ -6110,7 +6305,7 @@
6110
6305
  "address": "graphql.server.all_resolvers"
6111
6306
  }
6112
6307
  ],
6113
- "regex": "(http|https):\\/\\/(?:.*\\.)?(?:burpcollaborator\\.net|localtest\\.me|mail\\.ebc\\.apple\\.com|bugbounty\\.dod\\.network|.*\\.[nx]ip\\.io|oastify\\.com|oast\\.(?:pro|live|site|online|fun|me)|sslip\\.io|requestbin\\.com|requestbin\\.net|hookbin\\.com|webhook\\.site|canarytokens\\.com|interact\\.sh|ngrok\\.io|bugbounty\\.click|prbly\\.win|qualysperiscope\\.com|vii.one|act1on3.ru)"
6308
+ "regex": "(http|https):\\/\\/(?:.*\\.)?(?:burpcollaborator\\.net|localtest\\.me|mail\\.ebc\\.apple\\.com|bugbounty\\.dod\\.network|.*\\.[nx]ip\\.io|oastify\\.com|oast\\.(?:pro|live|site|online|fun|me)|sslip\\.io|requestbin\\.com|requestbin\\.net|hookbin\\.com|webhook\\.site|canarytokens\\.com|interact\\.sh|ngrok\\.io|bugbounty\\.click|prbly\\.win|qualysperiscope\\.com|vii\\.one|act1on3\\.ru)"
6114
6309
  },
6115
6310
  "operator": "match_regex"
6116
6311
  }
@@ -7610,6 +7805,35 @@
7610
7805
  ],
7611
7806
  "transformers": []
7612
7807
  },
7808
+ {
7809
+ "id": "ua0-600-63x",
7810
+ "name": "FeroxBuster",
7811
+ "tags": {
7812
+ "type": "attack_tool",
7813
+ "category": "attack_attempt",
7814
+ "cwe": "200",
7815
+ "capec": "1000/118/169",
7816
+ "tool_name": "feroxbuster",
7817
+ "confidence": "1"
7818
+ },
7819
+ "conditions": [
7820
+ {
7821
+ "parameters": {
7822
+ "inputs": [
7823
+ {
7824
+ "address": "server.request.headers.no_cookies",
7825
+ "key_path": [
7826
+ "user-agent"
7827
+ ]
7828
+ }
7829
+ ],
7830
+ "regex": "^feroxbuster/"
7831
+ },
7832
+ "operator": "match_regex"
7833
+ }
7834
+ ],
7835
+ "transformers": []
7836
+ },
7613
7837
  {
7614
7838
  "id": "ua0-600-6xx",
7615
7839
  "name": "Stealthy scanner",
@@ -7631,7 +7855,7 @@
7631
7855
  ]
7632
7856
  }
7633
7857
  ],
7634
- "regex": "mozilla/4\\.0 \\(compatible(; msie (?:6\\.0; win32|4\\.0; Windows NT))?\\)",
7858
+ "regex": "mozilla/4\\.0 \\(compatible(; msie (?:6\\.0; (?:win32|Windows NT 5\\.0)|4\\.0; Windows NT))?\\)",
7635
7859
  "options": {
7636
7860
  "case_sensitive": false
7637
7861
  }
@@ -3,6 +3,7 @@
3
3
  const Limiter = require('../rate_limiter')
4
4
  const { storage } = require('../../../datadog-core')
5
5
  const web = require('../plugins/util/web')
6
+ const { ipHeaderList } = require('../plugins/util/ip_extractor')
6
7
  const {
7
8
  incrementWafInitMetric,
8
9
  updateWafRequestsMetricTags,
@@ -13,54 +14,49 @@ const {
13
14
  // default limiter, configurable with setRateLimit()
14
15
  let limiter = new Limiter(100)
15
16
 
16
- // TODO: use precomputed maps instead
17
- const REQUEST_HEADERS_PASSLIST = [
18
- 'accept',
19
- 'accept-encoding',
20
- 'accept-language',
17
+ const metricsQueue = new Map()
18
+
19
+ const contentHeaderList = [
21
20
  'content-encoding',
22
21
  'content-language',
23
22
  'content-length',
24
- 'content-type',
25
- 'forwarded',
26
- 'forwarded-for',
23
+ 'content-type'
24
+ ]
25
+
26
+ const REQUEST_HEADERS_MAP = mapHeaderAndTags([
27
+ 'accept',
28
+ 'accept-encoding',
29
+ 'accept-language',
27
30
  'host',
28
- 'true-client-ip',
29
31
  'user-agent',
32
+ 'forwarded',
30
33
  'via',
31
- 'x-client-ip',
32
- 'x-cluster-client-ip',
33
- 'x-forwarded',
34
- 'x-forwarded-for',
35
- 'x-real-ip'
36
- ]
37
34
 
38
- const RESPONSE_HEADERS_PASSLIST = [
39
- 'content-encoding',
40
- 'content-language',
41
- 'content-length',
42
- 'content-type'
43
- ]
35
+ ...ipHeaderList,
36
+ ...contentHeaderList
37
+ ], 'http.request.headers.')
44
38
 
45
- const metricsQueue = new Map()
39
+ const RESPONSE_HEADERS_MAP = mapHeaderAndTags(contentHeaderList, 'http.response.headers.')
46
40
 
47
- function filterHeaders (headers, passlist, prefix) {
41
+ function mapHeaderAndTags (headerList, tagPrefix) {
42
+ return new Map(headerList.map(headerName => [headerName, `${tagPrefix}${formatHeaderName(headerName)}`]))
43
+ }
44
+
45
+ function filterHeaders (headers, map) {
48
46
  const result = {}
49
47
 
50
48
  if (!headers) return result
51
49
 
52
- for (let i = 0; i < passlist.length; ++i) {
53
- const headerName = passlist[i]
54
-
55
- if (headers[headerName]) {
56
- result[`${prefix}${formatHeaderName(headerName)}`] = '' + headers[headerName]
50
+ for (const [headerName, tagName] of map) {
51
+ const headerValue = headers[headerName]
52
+ if (headerValue) {
53
+ result[tagName] = '' + headerValue
57
54
  }
58
55
  }
59
56
 
60
57
  return result
61
58
  }
62
59
 
63
- // TODO: this can be precomputed at start time
64
60
  function formatHeaderName (name) {
65
61
  return name
66
62
  .trim()
@@ -86,7 +82,7 @@ function reportWafInit (wafVersion, rulesVersion, diagnosticsRules = {}) {
86
82
  function reportMetrics (metrics) {
87
83
  // TODO: metrics should be incremental, there already is an RFC to report metrics
88
84
  const store = storage.getStore()
89
- const rootSpan = store && store.req && web.root(store.req)
85
+ const rootSpan = store?.req && web.root(store.req)
90
86
  if (!rootSpan) return
91
87
 
92
88
  if (metrics.duration) {
@@ -106,13 +102,13 @@ function reportMetrics (metrics) {
106
102
 
107
103
  function reportAttack (attackData) {
108
104
  const store = storage.getStore()
109
- const req = store && store.req
105
+ const req = store?.req
110
106
  const rootSpan = web.root(req)
111
107
  if (!rootSpan) return
112
108
 
113
109
  const currentTags = rootSpan.context()._tags
114
110
 
115
- const newTags = filterHeaders(req.headers, REQUEST_HEADERS_PASSLIST, 'http.request.headers.')
111
+ const newTags = filterHeaders(req.headers, REQUEST_HEADERS_MAP)
116
112
 
117
113
  newTags['appsec.event'] = 'true'
118
114
 
@@ -158,7 +154,7 @@ function finishRequest (req, res) {
158
154
 
159
155
  if (!rootSpan.context()._tags['appsec.event']) return
160
156
 
161
- const newTags = filterHeaders(res.getHeaders(), RESPONSE_HEADERS_PASSLIST, 'http.response.headers.')
157
+ const newTags = filterHeaders(res.getHeaders(), RESPONSE_HEADERS_MAP)
162
158
 
163
159
  if (req.route && typeof req.route.path === 'string') {
164
160
  newTags['http.endpoint'] = req.route.path
@@ -180,5 +176,6 @@ module.exports = {
180
176
  reportAttack,
181
177
  reportWafUpdate: incrementWafUpdatesMetric,
182
178
  finishRequest,
183
- setRateLimit
179
+ setRateLimit,
180
+ mapHeaderAndTags
184
181
  }
@@ -1,5 +1,6 @@
1
1
  const request = require('../../exporters/common/request')
2
2
  const id = require('../../id')
3
+ const log = require('../../log')
3
4
 
4
5
  function getItrConfiguration ({
5
6
  url,
@@ -66,13 +67,24 @@ function getItrConfiguration ({
66
67
  try {
67
68
  const {
68
69
  data: {
69
- attributes: {
70
- code_coverage: isCodeCoverageEnabled,
71
- tests_skipping: isSuitesSkippingEnabled
72
- }
70
+ attributes
73
71
  }
74
72
  } = JSON.parse(res)
75
73
 
74
+ let isCodeCoverageEnabled = attributes.code_coverage
75
+ let isSuitesSkippingEnabled = attributes.tests_skipping
76
+
77
+ log.debug(() => `Remote settings: ${{ isCodeCoverageEnabled, isSuitesSkippingEnabled }}`)
78
+
79
+ if (process.env.DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE) {
80
+ isCodeCoverageEnabled = true
81
+ log.debug(() => 'Dangerously set code coverage to true')
82
+ }
83
+ if (process.env.DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING) {
84
+ isSuitesSkippingEnabled = true
85
+ log.debug(() => 'Dangerously set test skipping to true')
86
+ }
87
+
76
88
  done(null, { isCodeCoverageEnabled, isSuitesSkippingEnabled })
77
89
  } catch (err) {
78
90
  done(err)
@@ -1,4 +1,5 @@
1
1
  const request = require('../../exporters/common/request')
2
+ const log = require('../../log')
2
3
 
3
4
  function getSkippableSuites ({
4
5
  url,
@@ -73,6 +74,7 @@ function getSkippableSuites ({
73
74
  }
74
75
  return { suite, name }
75
76
  })
77
+ log.debug(() => `Number of received skippable ${testLevel}s: ${skippableSuites.length}`)
76
78
  done(null, skippableSuites)
77
79
  } catch (err) {
78
80
  done(err)