gitlab-secret_detection 0.13.0 → 0.14.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f72d7d8262749305fdf1811df74637af4f7ba4bbf693fc41d2cdb34d1ca25238
4
- data.tar.gz: 6896b4eb32dc734640c0dc125dd75e79b765f27aa618f73fec81c83c0c20df93
3
+ metadata.gz: b0ab467aac5be2b21d736da1917982e522bb79522d108ae9edeb0ad0b80b0c09
4
+ data.tar.gz: c0bdaee4db1a8d5220333e44c6ca87645c48ba10d838ecfef5fd632eb7169f31
5
5
  SHA512:
6
- metadata.gz: 2d35dfa136b9524f851a6ed20885aa6d50b9334f12166fd9d131ff523ed38bed1264bad953fd6fa58e63fe2c5f9c62be129d3be231258eef25990803b9b67d4e
7
- data.tar.gz: 331a74ba7a779f275717c769c0f63785d7e74d25b07da5d07f44c08a1a0c7f343eec3ba7fd8285d549d298fac4d93bdc3f2bc122ea7cb30bd567e4c75e43efdb
6
+ metadata.gz: f54376fa5767253bd79e88b826e1a19f79c0222e16f1394b301c801ff61fb1fbb0f27fbbdd6b0c8899f013fdae75c5b5887327e8e7873c17257a2c16968d70f5
7
+ data.tar.gz: 7805cd5cf18f94006d4e0fb6409d79b2b48fed3108f7eb598a6cea64141d2a43065dad5d0cd58867138cd6aaf8ef71bbd17479b992d9853f46c198f468311bf0
@@ -8,7 +8,9 @@ module Gitlab
8
8
  # +status+:: One of values from Gitlab::SecretDetection::Core::Status indicating the scan operation's status
9
9
  # +results+:: Array of Gitlab::SecretDetection::Core::Finding values. Default value is nil.
10
10
  # to embed more information on error.
11
- # +applied_exclusions+:: Array of Exclusions that were applied during this scan.
11
+ # +applied_exclusions+:: Array of exclusions that were applied during this scan.
12
+ # These can be either GRPC::Exclusions when used as a service, or `Security::ProjectSecurityExclusion
13
+ # object when used as a gem.
12
14
  # +metadata+:: Hash object containing additional meta information about the response. It is currently used
13
15
  class Response
14
16
  attr_reader :status, :results, :applied_exclusions, :metadata
@@ -32,7 +32,7 @@ module Gitlab
32
32
  rules_data[:rules].freeze
33
33
  rescue StandardError => e
34
34
  logger.error "Failed to parse secret detection ruleset from '#{path}' path: #{e}"
35
- raise Core::Scanner::RulesetParseError
35
+ raise Core::Scanner::RulesetParseError, e
36
36
  end
37
37
  end
38
38
  end
@@ -59,10 +59,13 @@ module Gitlab
59
59
  # +timeout+:: No of seconds(accepts floating point for smaller time values) to limit the total scan duration
60
60
  # +payload_timeout+:: No of seconds(accepts floating point for smaller time values) to limit
61
61
  # the scan duration on each payload
62
- # +raw_value_exclusions:+:: Array of raw values to exclude from the scan.
63
- # +rule_exclusions+:: Array of rules to exclude from the ruleset used for the scan. Each rule is represented
64
- # by its ID. For example: `gitlab_personal_access_token` for representing Gitlab Personal Access
65
- # Token. By default, no rule is excluded from the ruleset.
62
+ # +exclusions+:: Hash with keys: :raw_value, :rule and values of arrays of either
63
+ # GRPC::Exclusion objects (when used as a standalone service)
64
+ # or Security::ProjectSecurityExclusion objects (when used as gem).
65
+ # :raw_value - Exclusions in the :raw array are the raw values to ignore.
66
+ # :rule - Exclusions in the :rule array are the rules to exclude from the ruleset used for the scan.
67
+ # Each rule is represented by its ID. For example: `gitlab_personal_access_token`
68
+ # for representing Gitlab Personal Access Token. By default, no rule is excluded from the ruleset.
66
69
  # +tags+:: Array of tag values to filter from the default ruleset when determining the rules used for the scan.
67
70
  # For example: Add `gitlab_blocking` to include only rules for Push Protection. Defaults to
68
71
  # [`gitlab_blocking`] (+DEFAULT_PATTERN_MATCHER_TAGS+).
@@ -84,8 +87,7 @@ module Gitlab
84
87
  payloads,
85
88
  timeout: DEFAULT_SCAN_TIMEOUT_SECS,
86
89
  payload_timeout: DEFAULT_PAYLOAD_TIMEOUT_SECS,
87
- raw_value_exclusions: [],
88
- rule_exclusions: [],
90
+ exclusions: {},
89
91
  tags: DEFAULT_PATTERN_MATCHER_TAGS,
90
92
  subprocess: RUN_IN_SUBPROCESS
91
93
  )
@@ -108,8 +110,7 @@ module Gitlab
108
110
  payloads: matched_payloads,
109
111
  payload_timeout:,
110
112
  pattern_matcher: build_pattern_matcher(tags:),
111
- raw_value_exclusions:,
112
- rule_exclusions:
113
+ exclusions:
113
114
  }
114
115
 
115
116
  secrets, applied_exclusions = subprocess ? run_scan_within_subprocess(**scan_args) : run_scan(**scan_args)
@@ -203,7 +204,7 @@ module Gitlab
203
204
  matched_payloads << payload
204
205
  end
205
206
 
206
- matched_payloads.freeze
207
+ matched_payloads
207
208
  end
208
209
 
209
210
  # Runs the secret detection scan on the given list of payloads. It accepts
@@ -213,8 +214,7 @@ module Gitlab
213
214
  payloads:,
214
215
  payload_timeout:,
215
216
  pattern_matcher:,
216
- raw_value_exclusions: [],
217
- rule_exclusions: []
217
+ exclusions: {}
218
218
  )
219
219
  all_applied_exclusions = Set.new
220
220
 
@@ -223,8 +223,7 @@ module Gitlab
223
223
  findings, applied_exclusions = find_secrets_in_payload(
224
224
  payload:,
225
225
  pattern_matcher:,
226
- raw_value_exclusions:,
227
- rule_exclusions:
226
+ exclusions:
228
227
  )
229
228
  all_applied_exclusions.merge(applied_exclusions)
230
229
  findings
@@ -235,15 +234,14 @@ module Gitlab
235
234
  Core::Finding.new(payload.id,
236
235
  Core::Status::PAYLOAD_TIMEOUT)
237
236
  end
238
- [all_findings.freeze, all_applied_exclusions.to_a.freeze]
237
+ [all_findings, all_applied_exclusions.to_a]
239
238
  end
240
239
 
241
240
  def run_scan_within_subprocess(
242
241
  payloads:,
243
242
  payload_timeout:,
244
243
  pattern_matcher:,
245
- raw_value_exclusions: [],
246
- rule_exclusions: []
244
+ exclusions: {}
247
245
  )
248
246
  all_applied_exclusions = Set.new
249
247
  payload_sizes = payloads.map(&:size)
@@ -261,7 +259,7 @@ module Gitlab
261
259
  findings, applied_exclusions = find_secrets_in_payload(
262
260
  payload:,
263
261
  pattern_matcher:,
264
- raw_value_exclusions:, rule_exclusions:
262
+ exclusions:
265
263
  )
266
264
  all_applied_exclusions.merge(applied_exclusions)
267
265
  findings
@@ -273,25 +271,28 @@ module Gitlab
273
271
  end
274
272
  end
275
273
 
276
- [found_secrets.freeze, all_applied_exclusions.to_a.freeze]
274
+ [found_secrets, all_applied_exclusions.to_a]
277
275
  end
278
276
 
279
277
  # Finds secrets in the given payload guarded with a timeout as a circuit breaker. It accepts
280
278
  # literal values to exclude from the input before the scan, also SD rules to exclude during
281
279
  # the scan.
282
- def find_secrets_in_payload(payload:, pattern_matcher:, raw_value_exclusions: [], rule_exclusions: [])
280
+ def find_secrets_in_payload(payload:, pattern_matcher:, exclusions: {})
283
281
  findings = []
284
282
  applied_exclusions = Set.new
285
283
 
286
284
  payload_offset = payload.respond_to?(:offset) ? payload.offset : 0
287
285
 
286
+ raw_value_exclusions = exclusions.fetch(:raw_value, [])
287
+ rule_exclusions = exclusions.fetch(:rule, [])
288
+
288
289
  payload.data
289
290
  .each_line($INPUT_RECORD_SEPARATOR, chomp: true)
290
291
  .each_with_index do |line, index|
291
292
  unless raw_value_exclusions.empty?
292
- raw_value_exclusions.each do |value|
293
- line.gsub!(value, '') # replace input that doesn't contain allowed value in it
294
- applied_exclusions << value # TODO we need the id of the exclusion
293
+ raw_value_exclusions.each do |exclusion|
294
+ line.gsub!(exclusion.value, '') # replace input that doesn't contain allowed value in it
295
+ applied_exclusions << exclusion
295
296
  end
296
297
  end
297
298
 
@@ -322,7 +323,7 @@ module Gitlab
322
323
  end
323
324
  end
324
325
 
325
- [findings.freeze, applied_exclusions]
326
+ [findings, applied_exclusions]
326
327
  rescue StandardError => e
327
328
  logger.error "Secret Detection scan failed on the payload(id:#{payload.id}): #{e}"
328
329
 
@@ -330,7 +331,7 @@ module Gitlab
330
331
  end
331
332
 
332
333
  def applied_rule_exclusion?(type, rule_exclusions, applied_exclusions)
333
- applied_exclusion = rule_exclusions&.find { |rule_exclusion| rule_exclusion == type }
334
+ applied_exclusion = rule_exclusions&.find { |rule_exclusion| rule_exclusion.value == type }
334
335
  applied_exclusion && (applied_exclusions << applied_exclusion)
335
336
  end
336
337
 
@@ -0,0 +1,223 @@
1
+ # rule-set version: 0.3.0
2
+ # Rules are auto-generated. See https://gitlab.com/gitlab-org/security-products/secret-detection/secret-detection-rules for instructions on updating the rules.
3
+ [[rules]]
4
+ description = "Anthropic keys"
5
+ id = "anthropic_key"
6
+ keywords = ["sk-ant-"]
7
+ regex = "\\b(sk-ant-[a-z]{3}\\d{2}-[A-Za-z0-9\\\\-_]{86}-[A-Za-z0-9\\\\-_]{8})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
8
+ tags = ["gitlab_blocking"]
9
+ [[rules]]
10
+ description = "AWS Access Token"
11
+ id = "AWS"
12
+ keywords = ["AKIA"]
13
+ regex = "\\bAKIA[0-9A-Z]{16}\\b"
14
+ tags = ["aws", "revocation_type", "gitlab_blocking"]
15
+ [[rules]]
16
+ description = "GCP API keys can be misused to gain API quota from billed projects"
17
+ id = "GCP API key"
18
+ keywords = ["AIza"]
19
+ regex = "(?i)\\b(AIza[0-9A-Za-z-_]{35})(?:['|\\\"|\\n|\\r|\\s|\\x60|;]|$)"
20
+ secretGroup = 1
21
+ tags = ["gitlab_partner_token", "revocation_type", "gitlab_blocking"]
22
+ [[rules]]
23
+ description = "GCP OAuth client secrets can be misused to spoof your application"
24
+ id = "GCP OAuth client secret"
25
+ keywords = ["GOCSPX-"]
26
+ regex = "GOCSPX-[a-zA-Z0-9_-]{28}"
27
+ tags = ["gitlab_partner_token", "revocation_type", "gitlab_blocking"]
28
+ [[rules]]
29
+ description = "Google (GCP) Service-account"
30
+ id = "Google (GCP) Service-account"
31
+ keywords = ["service_account"]
32
+ regex = "\\\"private_key\\\":\\s*\\\"-{5}BEGIN PRIVATE KEY-{5}[\\s\\S]*?\","
33
+ tags = ["gitlab_partner_token", "revocation_type", "gitlab_blocking"]
34
+ [[rules]]
35
+ description = "Github Personal Access Token"
36
+ id = "Github Personal Access Token"
37
+ keywords = ["ghp_"]
38
+ regex = "ghp_[0-9a-zA-Z]{36}"
39
+ tags = ["gitlab_blocking"]
40
+ [[rules]]
41
+ description = "Github OAuth Access Token"
42
+ id = "Github OAuth Access Token"
43
+ keywords = ["gho_"]
44
+ regex = "gho_[0-9a-zA-Z]{36}"
45
+ tags = ["gitlab_blocking"]
46
+ [[rules]]
47
+ description = "Github App Token"
48
+ id = "Github App Token"
49
+ keywords = ["ghu_", "ghs_"]
50
+ regex = "(ghu|ghs)_[0-9a-zA-Z]{36}"
51
+ tags = ["gitlab_blocking"]
52
+ [[rules]]
53
+ description = "Github Refresh Token"
54
+ id = "Github Refresh Token"
55
+ keywords = ["ghr_"]
56
+ regex = "ghr_[0-9a-zA-Z]{76}"
57
+ tags = ["gitlab_blocking"]
58
+ [[rules]]
59
+ description = "GitLab Personal Access Token"
60
+ id = "gitlab_personal_access_token"
61
+ keywords = ["glpat"]
62
+ regex = "\\b(glpat-[0-9a-zA-Z_\\-]{20})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
63
+ tags = ["gitlab", "revocation_type", "gitlab_blocking"]
64
+ [[rules]]
65
+ description = "GitLab Pipeline Trigger Token"
66
+ id = "gitlab_pipeline_trigger_token"
67
+ keywords = ["glptt"]
68
+ regex = "\\b(glptt-[0-9a-zA-Z_\\-]{40})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
69
+ tags = ["gitlab", "gitlab_blocking"]
70
+ [[rules]]
71
+ description = "GitLab Runner Registration Token"
72
+ id = "gitlab_runner_registration_token"
73
+ keywords = ["GR1348941"]
74
+ regex = "\\b(GR1348941[0-9a-zA-Z_\\-]{20})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
75
+ tags = ["gitlab", "gitlab_blocking"]
76
+ [[rules]]
77
+ description = "GitLab Runner Authentication Token"
78
+ id = "gitlab_runner_auth_token"
79
+ keywords = ["glrt"]
80
+ regex = "\\b(glrt-[0-9a-zA-Z_\\-]{20})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
81
+ tags = ["gitlab", "gitlab_blocking"]
82
+ [[rules]]
83
+ description = "GitLab OAuth Application Secrets"
84
+ id = "gitlab_oauth_app_secret"
85
+ keywords = ["gloas"]
86
+ regex = "\\b(gloas-[0-9a-zA-Z_\\-]{64})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
87
+ tags = ["gitlab", "gitlab_blocking"]
88
+ [[rules]]
89
+ description = "GitLab Feed token"
90
+ id = "gitlab_feed_token_v2"
91
+ keywords = ["glft"]
92
+ regex = "\\b(glft-[0-9a-zA-Z_\\-]{20})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
93
+ tags = ["gitlab", "gitlab_blocking"]
94
+ [[rules]]
95
+ description = "GitLab Agent for Kubernetes token"
96
+ id = "gitlab_kubernetes_agent_token"
97
+ keywords = ["glagent"]
98
+ regex = "\\b(glagent-[0-9a-zA-Z_\\-]{50})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
99
+ tags = ["gitlab", "gitlab_blocking"]
100
+ [[rules]]
101
+ description = "GitLab Incoming email token"
102
+ id = "gitlab_incoming_email_token"
103
+ keywords = ["glimt"]
104
+ regex = "\\b(glimt-[0-9a-zA-Z_\\-]{25})(?:[[:punct:]]|[[:space:]]|[[:blank:]]|$)"
105
+ tags = ["gitlab", "gitlab_blocking"]
106
+ [[rules]]
107
+ description = "Grafana API token"
108
+ id = "Grafana API token"
109
+ keywords = ["grafana"]
110
+ regex = "['\\\"]eyJrIjoi(?i)[a-z0-9-_=]{72,92}['\\\"]"
111
+ tags = ["gitlab_blocking"]
112
+ [[rules]]
113
+ description = "Hashicorp Terraform user/org API token"
114
+ id = "Hashicorp Terraform user/org API token"
115
+ keywords = ["atlasv1", "hashicorp", "terraform"]
116
+ regex = "['\\\"](?i)[a-z0-9]{14}\\.atlasv1\\.[a-z0-9-_=]{60,70}['\\\"]"
117
+ tags = ["gitlab_blocking"]
118
+ [[rules]]
119
+ description = "Hashicorp Vault batch token"
120
+ id = "Hashicorp Vault batch token"
121
+ keywords = ["hashicorp", "AAAAAQ", "vault"]
122
+ regex = "b\\.AAAAAQ[0-9a-zA-Z_-]{156}"
123
+ tags = ["gitlab_blocking"]
124
+ [[rules]]
125
+ description = "Mailchimp API key"
126
+ id = "Mailchimp API key"
127
+ keywords = ["mailchimp"]
128
+ regex = "(?i)(mailchimp[a-z0-9_ .\\-,]{0,25})(=|>|:=|\\|\\|:|<=|=>|:).{0,5}['\\\"]([a-f0-9]{32}-us20)['\\\"]"
129
+ secretGroup = 3
130
+ tags = ["gitlab_blocking"]
131
+ [[rules]]
132
+ description = "Mailgun private API token"
133
+ id = "Mailgun private API token"
134
+ keywords = ["mailgun"]
135
+ regex = "(?i)(mailgun[a-z0-9_ .\\-,]{0,25})(=|>|:=|\\|\\|:|<=|=>|:).{0,5}['\\\"](key-[a-f0-9]{32})['\\\"]"
136
+ secretGroup = 3
137
+ tags = ["gitlab_blocking"]
138
+ [[rules]]
139
+ description = "Mailgun webhook signing key"
140
+ id = "Mailgun webhook signing key"
141
+ keywords = ["mailgun"]
142
+ regex = "(?i)(mailgun[a-z0-9_ .\\-,]{0,25})(=|>|:=|\\|\\|:|<=|=>|:).{0,5}['\\\"]([a-h0-9]{32}-[a-h0-9]{8}-[a-h0-9]{8})['\\\"]"
143
+ secretGroup = 3
144
+ tags = ["gitlab_blocking"]
145
+ [[rules]]
146
+ description = "New Relic user API Key"
147
+ id = "New Relic user API Key"
148
+ keywords = ["NRAK"]
149
+ regex = "['\\\"](NRAK-[A-Z0-9]{27})['\\\"]"
150
+ tags = ["gitlab_blocking"]
151
+ [[rules]]
152
+ description = "New Relic user API ID"
153
+ id = "New Relic user API ID"
154
+ keywords = ["newrelic"]
155
+ regex = "(?i)(newrelic[a-z0-9_ .\\-,]{0,25})(=|>|:=|\\|\\|:|<=|=>|:).{0,5}['\\\"]([A-Z0-9]{64})['\\\"]"
156
+ secretGroup = 3
157
+ tags = ["gitlab_blocking"]
158
+ [[rules]]
159
+ description = "npm access token"
160
+ id = "npm access token"
161
+ keywords = ["npm_"]
162
+ regex = "['\\\"](npm_(?i)[a-z0-9]{36})['\\\"]"
163
+ tags = ["gitlab_blocking"]
164
+ [[rules]]
165
+ description = "PyPI upload token"
166
+ id = "PyPI upload token"
167
+ keywords = ["pypi-AgEIcHlwaS5vcmc"]
168
+ regex = "pypi-AgEIcHlwaS5vcmc[A-Za-z0-9-_]{50,1000}"
169
+ tags = ["pypi", "revocation_type", "gitlab_blocking"]
170
+ [[rules]]
171
+ description = "Rubygem API token"
172
+ id = "Rubygem API token"
173
+ keywords = ["rubygems_"]
174
+ regex = "rubygems_[a-f0-9]{48}"
175
+ tags = ["gitlab_blocking"]
176
+ [[rules]]
177
+ description = "Segment Public API token"
178
+ id = "Segment Public API token"
179
+ keywords = ["sgp_"]
180
+ regex = "sgp_[a-zA-Z0-9]{64}"
181
+ tags = ["gitlab_blocking"]
182
+ [[rules]]
183
+ description = "Sendgrid API token"
184
+ id = "Sendgrid API token"
185
+ keywords = ["sendgrid"]
186
+ regex = "SG\\.(?i)[a-z0-9_\\-\\.]{66}"
187
+ tags = ["gitlab_blocking"]
188
+ [[rules]]
189
+ description = "Shopify shared secret"
190
+ id = "Shopify shared secret"
191
+ keywords = ["shpss_"]
192
+ regex = "shpss_[a-fA-F0-9]{32}"
193
+ tags = ["gitlab_blocking"]
194
+ [[rules]]
195
+ description = "Shopify access token"
196
+ id = "Shopify access token"
197
+ keywords = ["shpat_"]
198
+ regex = "shpat_[a-fA-F0-9]{32}"
199
+ tags = ["gitlab_blocking"]
200
+ [[rules]]
201
+ description = "Shopify custom app access token"
202
+ id = "Shopify custom app access token"
203
+ keywords = ["shpca_"]
204
+ regex = "shpca_[a-fA-F0-9]{32}"
205
+ tags = ["gitlab_blocking"]
206
+ [[rules]]
207
+ description = "Shopify private app access token"
208
+ id = "Shopify private app access token"
209
+ keywords = ["shppa_"]
210
+ regex = "shppa_[a-fA-F0-9]{32}"
211
+ tags = ["gitlab_blocking"]
212
+ [[rules]]
213
+ description = "Slack token"
214
+ id = "Slack token"
215
+ keywords = ["xoxb", "xoxa", "xoxp", "xoxr", "xoxs"]
216
+ regex = "xox[baprs]-([0-9a-zA-Z]{10,48})"
217
+ tags = ["gitlab_blocking"]
218
+ [[rules]]
219
+ description = "Stripe"
220
+ id = "Stripe"
221
+ keywords = ["sk_test", "pk_test", "sk_live", "pk_live"]
222
+ regex = "(?i)(sk|pk)_(test|live)_[0-9a-z]{10,32}"
223
+ tags = ["gitlab_blocking"]
@@ -5,7 +5,7 @@
5
5
  require 'google/protobuf'
6
6
 
7
7
 
8
- descriptor_data = "\n\x16secret_detection.proto\x12\x17gitlab.secret_detection\"Z\n\tExclusion\x12>\n\x0e\x65xclusion_type\x18\x01 \x01(\x0e\x32&.gitlab.secret_detection.ExclusionType\x12\r\n\x05value\x18\x02 \x01(\t\"\xc0\x02\n\x0bScanRequest\x12>\n\x08payloads\x18\x01 \x03(\x0b\x32,.gitlab.secret_detection.ScanRequest.Payload\x12\x19\n\x0ctimeout_secs\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12!\n\x14payload_timeout_secs\x18\x03 \x01(\x02H\x01\x88\x01\x01\x12\x36\n\nexclusions\x18\x04 \x03(\x0b\x32\".gitlab.secret_detection.Exclusion\x12\x0c\n\x04tags\x18\x05 \x03(\t\x1a\x43\n\x07Payload\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\x12\x13\n\x06offset\x18\x03 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_offsetB\x0f\n\r_timeout_secsB\x17\n\x15_payload_timeout_secs\"\xa2\x04\n\x0cScanResponse\x12>\n\x07results\x18\x01 \x03(\x0b\x32-.gitlab.secret_detection.ScanResponse.Finding\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12>\n\x12\x61pplied_exclusions\x18\x03 \x03(\x0b\x32\".gitlab.secret_detection.Exclusion\x1a\x9d\x01\n\x07\x46inding\x12\x12\n\npayload_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12\x11\n\x04type\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bline_number\x18\x05 \x01(\x05H\x02\x88\x01\x01\x42\x07\n\x05_typeB\x0e\n\x0c_descriptionB\x0e\n\x0c_line_number\"\xe1\x01\n\x06Status\x12\x16\n\x12STATUS_UNSPECIFIED\x10\x00\x12\x10\n\x0cSTATUS_FOUND\x10\x01\x12\x1c\n\x18STATUS_FOUND_WITH_ERRORS\x10\x02\x12\x17\n\x13STATUS_SCAN_TIMEOUT\x10\x03\x12\x1a\n\x16STATUS_PAYLOAD_TIMEOUT\x10\x04\x12\x15\n\x11STATUS_SCAN_ERROR\x10\x05\x12\x16\n\x12STATUS_INPUT_ERROR\x10\x06\x12\x14\n\x10STATUS_NOT_FOUND\x10\x07\x12\x15\n\x11STATUS_AUTH_ERROR\x10\x08*f\n\rExclusionType\x12\x1e\n\x1a\x45XCLUSION_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x45XCLUSION_TYPE_RULE\x10\x01\x12\x1c\n\x18\x45XCLUSION_TYPE_RAW_VALUE\x10\x02\x32\xc1\x01\n\x07Scanner\x12U\n\x04Scan\x12$.gitlab.secret_detection.ScanRequest\x1a%.gitlab.secret_detection.ScanResponse\"\x00\x12_\n\nScanStream\x12$.gitlab.secret_detection.ScanRequest\x1a%.gitlab.secret_detection.ScanResponse\"\x00(\x01\x30\x01\x42 \xea\x02\x1dGitlab::SecretDetection::GRPCb\x06proto3"
8
+ descriptor_data = "\n\x16secret_detection.proto\x12\x17gitlab.secret_detection\"Z\n\tExclusion\x12>\n\x0e\x65xclusion_type\x18\x01 \x01(\x0e\x32&.gitlab.secret_detection.ExclusionType\x12\r\n\x05value\x18\x02 \x01(\t\"\xc0\x02\n\x0bScanRequest\x12>\n\x08payloads\x18\x01 \x03(\x0b\x32,.gitlab.secret_detection.ScanRequest.Payload\x12\x19\n\x0ctimeout_secs\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12!\n\x14payload_timeout_secs\x18\x03 \x01(\x02H\x01\x88\x01\x01\x12\x36\n\nexclusions\x18\x04 \x03(\x0b\x32\".gitlab.secret_detection.Exclusion\x12\x0c\n\x04tags\x18\x05 \x03(\t\x1a\x43\n\x07Payload\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\x12\x13\n\x06offset\x18\x03 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_offsetB\x0f\n\r_timeout_secsB\x17\n\x15_payload_timeout_secs\"\xa2\x04\n\x0cScanResponse\x12>\n\x07results\x18\x01 \x03(\x0b\x32-.gitlab.secret_detection.ScanResponse.Finding\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12>\n\x12\x61pplied_exclusions\x18\x03 \x03(\x0b\x32\".gitlab.secret_detection.Exclusion\x1a\x9d\x01\n\x07\x46inding\x12\x12\n\npayload_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\x05\x12\x11\n\x04type\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bline_number\x18\x05 \x01(\x05H\x02\x88\x01\x01\x42\x07\n\x05_typeB\x0e\n\x0c_descriptionB\x0e\n\x0c_line_number\"\xe1\x01\n\x06Status\x12\x16\n\x12STATUS_UNSPECIFIED\x10\x00\x12\x10\n\x0cSTATUS_FOUND\x10\x01\x12\x1c\n\x18STATUS_FOUND_WITH_ERRORS\x10\x02\x12\x17\n\x13STATUS_SCAN_TIMEOUT\x10\x03\x12\x1a\n\x16STATUS_PAYLOAD_TIMEOUT\x10\x04\x12\x15\n\x11STATUS_SCAN_ERROR\x10\x05\x12\x16\n\x12STATUS_INPUT_ERROR\x10\x06\x12\x14\n\x10STATUS_NOT_FOUND\x10\x07\x12\x15\n\x11STATUS_AUTH_ERROR\x10\x08*\x7f\n\rExclusionType\x12\x1e\n\x1a\x45XCLUSION_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13\x45XCLUSION_TYPE_RULE\x10\x01\x12\x1c\n\x18\x45XCLUSION_TYPE_RAW_VALUE\x10\x02\x12\x17\n\x13\x45XCLUSION_TYPE_PATH\x10\x03\x32\xc1\x01\n\x07Scanner\x12U\n\x04Scan\x12$.gitlab.secret_detection.ScanRequest\x1a%.gitlab.secret_detection.ScanResponse\"\x00\x12_\n\nScanStream\x12$.gitlab.secret_detection.ScanRequest\x1a%.gitlab.secret_detection.ScanResponse\"\x00(\x01\x30\x01\x42 \xea\x02\x1dGitlab::SecretDetection::GRPCb\x06proto3"
9
9
 
10
10
  pool = Google::Protobuf::DescriptorPool.generated_pool
11
11
  pool.add_serialized_file(descriptor_data)
@@ -61,24 +61,25 @@ module Gitlab
61
61
  validate_request(request)
62
62
 
63
63
  payloads = request.payloads.to_a
64
+ exclusions = { raw_value: [], rule: [], path: [] }
64
65
 
65
- raw_value_exclusions = []
66
- rule_exclusions = []
67
-
68
- request.exclusions&.each do |exclusion|
69
- case exclusion.type
66
+ request.exclusions.each do |exclusion|
67
+ case exclusion.exclusion_type
70
68
  when :EXCLUSION_TYPE_RAW_VALUE
71
- raw_value_exclusions << exclusion.value
69
+ exclusions[:raw] << exclusion
72
70
  when :EXCLUSION_TYPE_RULE
73
- rule_exclusions << exclusion.value
71
+ exclusions[:rule] << exclusion
72
+ when :EXCLUSION_TYPE_PATH
73
+ exclusions[:path] << exclusion
74
+ else
75
+ logger.warn("Unknown exclusion type #{exclusion.exclusion_type}")
74
76
  end
75
77
  end
76
78
 
77
79
  begin
78
80
  result = scanner.secrets_scan(
79
81
  payloads,
80
- raw_value_exclusions:,
81
- rule_exclusions:,
82
+ exclusions:,
82
83
  tags: request.tags.to_a,
83
84
  timeout: request.timeout_secs,
84
85
  payload_timeout: request.payload_timeout_secs
@@ -94,7 +95,8 @@ module Gitlab
94
95
 
95
96
  Gitlab::SecretDetection::GRPC::ScanResponse.new(
96
97
  results: findings,
97
- status: result.status
98
+ status: result.status,
99
+ applied_exclusions: result.applied_exclusions
98
100
  )
99
101
  end
100
102
 
@@ -17,6 +17,7 @@ enum ExclusionType {
17
17
  EXCLUSION_TYPE_UNSPECIFIED = 0;
18
18
  EXCLUSION_TYPE_RULE = 1; // Rule ID to exclude
19
19
  EXCLUSION_TYPE_RAW_VALUE = 2; // Raw value to exclude
20
+ EXCLUSION_TYPE_PATH = 3; // Specific file path to exclude
20
21
  }
21
22
 
22
23
  /* Request arg for triggering Scan/ScanStream method */
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-secret_detection
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - group::secret detection
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2024-12-11 00:00:00.000000000 Z
13
+ date: 2024-12-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: grpc
@@ -103,6 +103,7 @@ files:
103
103
  - lib/gitlab/secret_detection/core/response.rb
104
104
  - lib/gitlab/secret_detection/core/ruleset.rb
105
105
  - lib/gitlab/secret_detection/core/scanner.rb
106
+ - lib/gitlab/secret_detection/core/secret_push_protection_rules.toml
106
107
  - lib/gitlab/secret_detection/core/status.rb
107
108
  - lib/gitlab/secret_detection/grpc.rb
108
109
  - lib/gitlab/secret_detection/grpc/client/grpc_client.rb