slack.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package rules
  2. import (
  3. "fmt"
  4. "github.com/zricethezav/gitleaks/v8/cmd/generate/config/utils"
  5. "github.com/zricethezav/gitleaks/v8/cmd/generate/secrets"
  6. "github.com/zricethezav/gitleaks/v8/config"
  7. "github.com/zricethezav/gitleaks/v8/regexp"
  8. )
  9. // https://api.slack.com/authentication/token-types#bot
  10. func SlackBotToken() *config.Rule {
  11. // define rule
  12. r := config.Rule{
  13. RuleID: "slack-bot-token",
  14. Description: "Identified a Slack Bot token, which may compromise bot integrations and communication channel security.",
  15. Regex: regexp.MustCompile(`xoxb-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*`),
  16. Entropy: 3,
  17. Keywords: []string{
  18. "xoxb",
  19. },
  20. }
  21. // validate
  22. tps := utils.GenerateSampleSecrets("bot", "xoxb-781236542736-2364535789652-GkwFDQoHqzXDVsC6GzqYUypD")
  23. tps = append(tps,
  24. // https://github.com/metabase/metabase/blob/74cfb332140680425c7d37d347854160cc997ea8/frontend/src/metabase/admin/settings/slack/components/SlackForm/SlackForm.tsx#L47
  25. `"bot_token1": "xoxb-781236542736-2364535789652-GkwFDQoHqzXDVsC6GzqYUypD"`, // gitleaks:allow
  26. // https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#LL44C27-L44C86
  27. `"bot_token2": "xoxb-263594206564-2343594206574-FGqddMF8t08v8N7Oq4i57vs1MBS"`, // gitleaks:allow
  28. `"bot_token3": "xoxb-4614724432022-5152386766518-O5WzjWGLG0wcCm2WPrjEmnys"`, // gitleaks:allow
  29. `"bot_token4": `+fmt.Sprintf(`"xoxb-%s-%s-%s"`, secrets.NewSecret(utils.Numeric("13")), secrets.NewSecret(utils.Numeric("12")), secrets.NewSecret(utils.AlphaNumeric("24"))),
  30. )
  31. fps := []string{
  32. "xoxb-xxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxx",
  33. "xoxb-xxx",
  34. "xoxb-12345-abcd234",
  35. "xoxb-xoxb-my-bot-token",
  36. }
  37. return utils.Validate(r, tps, fps)
  38. }
  39. // https://api.slack.com/authentication/token-types#user
  40. func SlackUserToken() *config.Rule {
  41. // define rule
  42. r := config.Rule{
  43. RuleID: "slack-user-token",
  44. Description: "Found a Slack User token, posing a risk of unauthorized user impersonation and data access within Slack workspaces.",
  45. // The last segment seems to be consistently 32 characters. I've made it 28-34 just in case.
  46. Regex: regexp.MustCompile(`xox[pe](?:-[0-9]{10,13}){3}-[a-zA-Z0-9-]{28,34}`),
  47. Entropy: 2,
  48. Keywords: []string{"xoxp-", "xoxe-"},
  49. }
  50. // validate
  51. tps := utils.GenerateSampleSecrets("user", "xoxp-41684372915-1320496754-45609968301-e708ba56e1517a99f6b5fb07349476ef")
  52. tps = append(tps,
  53. // https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#L25
  54. `"user_token1": "xoxp-41684372915-1320496754-45609968301-e708ba56e1517a99f6b5fb07349476ef"`, // gitleaks:allow
  55. // https://github.com/praetorian-inc/noseyparker/blob/16e0e5768fd14ea54f6c9a058566184d88343bb4/crates/noseyparker/data/default/rules/slack.yml#L29
  56. `"user_token2": "xoxp-283316862324-298911817009-298923149681-44f585044dace54f5701618e97cd1c0b"`, // gitleaks:allow
  57. // https://github.com/CloudBoost/cloudboost/blob/7ba2ed17099fa85e6fc652302822601283c6fa13/user-service/services/mailService.js#LL248C17-L248C92
  58. `"user_token3": "xoxp-11873098179-111402824422-234336993777-b96c9fb3b69f82ebb79d12f280779de1"`, // gitleaks:allow
  59. // https://github.com/evanyeung/terminal-slack/blob/b068f77808de72424d08b525d6cbf814849acd08/readme.md?plain=1#L66
  60. `"user_token4": "xoxp-254112160503-252950188691-252375361712-6cbf56aada30951a9d310a5f23d032a0"`, // gitleaks:allow
  61. `"user_token5": "xoxp-4614724432022-4621207627011-5182682871568-1ddad9823e8528ad0f4944dfa3c6fc6c"`, // gitleaks:allow
  62. `"user_token6": `+fmt.Sprintf(`"xoxp-%s-%s-%s-%s"`, secrets.NewSecret(utils.Numeric("12")), secrets.NewSecret(utils.Numeric("13")), secrets.NewSecret(utils.Numeric("13")), secrets.NewSecret(utils.AlphaNumeric("32"))),
  63. // It's unclear what the `xoxe-` token means in this context, however, the format is similar to a user token.
  64. `"url_private": "https:\/\/files.slack.com\/files-pri\/T04MCQMEXQ9-F04MAA1PKE3\/image.png?t=xoxe-4726837507825-4848681849303-4856614048758-e0b1f3d4cb371f92260edb0d9444d206"`,
  65. )
  66. fps := []string{
  67. `https://docs.google.com/document/d/1W7KCxOxP-1Fy5EyF2lbJGE2WuKmu5v0suYqoHas1jRM`,
  68. `"token1": "xoxp-1234567890"`, // gitleaks:allow
  69. `"token2": "xoxp-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"`, // gitleaks:allow
  70. `"token3": "xoxp-1234-1234-1234-4ddbc191d40ee098cbaae6f3523ada2d"`, // gitleaks:allow
  71. `"token4": "xoxp-572370529330-573807301142-572331691188-####################"`, // gitleaks:allow
  72. // This technically matches the pattern but is an obvious false positive.
  73. // `"token5": "xoxp-000000000000-000000000000-000000000000-00000000000000000000000000000000"`, // gitleaks:allow
  74. }
  75. return utils.Validate(r, tps, fps)
  76. }
  77. // Reference: https://api.slack.com/authentication/token-types#app
  78. func SlackAppLevelToken() *config.Rule {
  79. // define rule
  80. r := config.Rule{
  81. RuleID: "slack-app-token",
  82. Description: "Detected a Slack App-level token, risking unauthorized access to Slack applications and workspace data.",
  83. // This regex is based on a limited number of examples and may not be 100% accurate.
  84. Regex: regexp.MustCompile(`(?i)xapp-\d-[A-Z0-9]+-\d+-[a-z0-9]+`),
  85. Entropy: 2,
  86. Keywords: []string{"xapp"},
  87. }
  88. tps := utils.GenerateSampleSecrets("slack", "xapp-1-A052FGTS2DL-5171572773297-610b6a11f4b7eb819e87b767d80e6575a3634791acb9a9ead051da879eb5b55e")
  89. tps = append(tps,
  90. // https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#L17
  91. `"token1": "xapp-1-A052FGTS2DL-5171572773297-610b6a11f4b7eb819e87b767d80e6575a3634791acb9a9ead051da879eb5b55e"`, // gitleaks:allow
  92. `"token2": "xapp-1-IEMF8IMY1OQ-4037076220459-85c370b433e366de369c4ef5abdf41253519266982439a75af74a3d68d543fb6"`, // gitleaks:allow
  93. `"token3": "xapp-1-BM3V7LC51DA-1441525068281-86641a2582cd0903402ab523e5bcc53b8253098c31591e529b55b41974d2e82f"`, // gitleaks:allow
  94. `"token4": `+fmt.Sprintf(`"xapp-1-A%s-%s-%s"`, secrets.NewSecret(utils.Numeric("10")), secrets.NewSecret(utils.Numeric("13")), secrets.NewSecret(utils.AlphaNumeric("64"))),
  95. )
  96. return utils.Validate(r, tps, nil)
  97. }
  98. // Reference: https://api.slack.com/authentication/config-tokens
  99. func SlackConfigurationToken() *config.Rule {
  100. // define rule
  101. r := config.Rule{
  102. RuleID: "slack-config-access-token",
  103. Description: "Found a Slack Configuration access token, posing a risk to workspace configuration and sensitive data access.",
  104. Regex: regexp.MustCompile(`(?i)xoxe.xox[bp]-\d-[A-Z0-9]{163,166}`),
  105. Entropy: 2,
  106. Keywords: []string{"xoxe.xoxb-", "xoxe.xoxp-"},
  107. }
  108. tps := utils.GenerateSampleSecrets("access", "xoxe.xoxp-1-Mi0yLTM0MTQwNDE0MDE3Ni0zNjU5NDY0Njg4MTctNTE4MjA3NTQ5NjA4MC01NDEyOTYyODY5NzUxLThhMTBjZmI1ZWIzMGIwNTg0ZDdmMDI5Y2UxNzVlZWVhYzU2ZWQyZTZiODNjNDZiMGUxMzRlNmNjNDEwYmQxMjQ")
  109. tps = append(tps,
  110. `"access_token1": "xoxe.xoxp-1-Mi0yLTM0MTQwNDE0MDE3Ni0zNjU5NDY0Njg4MTctNTE4MjA3NTQ5NjA4MC01NDEyOTYyODY5NzUxLThhMTBjZmI1ZWIzMGIwNTg0ZDdmMDI5Y2UxNzVlZWVhYzU2ZWQyZTZiODNjNDZiMGUxMzRlNmNjNDEwYmQxMjQ"`, // gitleaks:allow
  111. `"access_token2": "xoxe.xoxp-1-Mi0yLTMxNzcwMjQ0MTcxMy0zNjU5NDY0Njg4MTctNTE1ODE1MjY5MTcxNC01MTU4MDI0MTgyOTc5LWRmY2YwY2U4ODhhNzY5ZGU5MTAyNDU4MDJjMGQ0ZDliMTZhMjNkMmEyYzliNjkzMDRlN2VjZTI4MWNiMzRkNGQ"`, // gitleaks:allow
  112. `"access_token3": "xoxe.xoxp-1-`+secrets.NewSecret(utils.AlphaNumeric("163"))+`"`,
  113. `"access_token4": "xoxe.xoxb-1-Mi0yLTMxNzcwMjQ0MTcxMy0zNjU5NDY0Njg4MTctNTE1ODE1MjY5MTcxNC01MTU4MDI0MTgyOTc5LWRmY2YwY2U4ODhhNzY5ZGU5MTAyNDU4MDJjMGQ0ZDliMTZhMjNkMmEyYzliNjkzMDRlN2VjZTI4MWNiMzRkNGQ"`,
  114. `"access_token5": "xoxe.xoxb-1-`+secrets.NewSecret(utils.AlphaNumeric("165"))+`"`,
  115. )
  116. fps := []string{
  117. "xoxe.xoxp-1-SlackAppConfigurationAccessTokenHere",
  118. "xoxe.xoxp-1-RANDOMSTRINGHERE",
  119. "xoxe.xoxp-1-initial",
  120. }
  121. return utils.Validate(r, tps, fps)
  122. }
  123. // Reference: https://api.slack.com/authentication/config-tokens
  124. func SlackConfigurationRefreshToken() *config.Rule {
  125. // define rule
  126. r := config.Rule{
  127. RuleID: "slack-config-refresh-token",
  128. Description: "Discovered a Slack Configuration refresh token, potentially allowing prolonged unauthorized access to configuration settings.",
  129. Regex: regexp.MustCompile(`(?i)xoxe-\d-[A-Z0-9]{146}`),
  130. Entropy: 2,
  131. Keywords: []string{"xoxe-"},
  132. }
  133. tps := utils.GenerateSampleSecrets("refresh", "xoxe-1-My0xLTMxNzcwMjQ0MTcxMy01MTU4MTUyNjkxNzE0LTUxODE4NDI0MDY3MzYtMjA5MGFkOTFlZThkZWE2OGFlZDYwYWJjODNhYzAxYjA5ZjVmODBhYjgzN2QyNDdjOTNlOGY5NTg2YWM1OGM4Mg")
  134. tps = append(tps,
  135. `"refresh_token1": "xoxe-1-My0xLTMxNzcwMjQ0MTcxMy01MTU4MTUyNjkxNzE0LTUxODE4NDI0MDY3MzYtMjA5MGFkOTFlZThkZWE2OGFlZDYwYWJjODNhYzAxYjA5ZjVmODBhYjgzN2QyNDdjOTNlOGY5NTg2YWM1OGM4Mg"`, // gitleaks:allow
  136. `"refresh_token2": "xoxe-1-My0xLTM0MTQwNDE0MDE3Ni01MTgyMDc1NDk2MDgwLTU0MjQ1NjIwNzgxODEtNGJkYTZhYTUxY2M1ODk3ZTNkN2YzMTgxMDI1ZDQzNzgwNWY4NWQ0ODdhZGIzM2ViOGI0MTM0MjdlNGVmYzQ4Ng"`, // gitleaks:allow
  137. `"refresh_token3": "xoxe-1-`+secrets.NewSecret(utils.AlphaNumeric("146"))+`"`,
  138. )
  139. fps := []string{"xoxe-1-xxx", "XOxE-RROAmw, Home and Garden, 5:24, 20120323"}
  140. return utils.Validate(r, tps, fps)
  141. }
  142. // Reference: https://api.slack.com/authentication/token-types#legacy_bot
  143. func SlackLegacyBotToken() *config.Rule {
  144. r := config.Rule{
  145. RuleID: "slack-legacy-bot-token",
  146. Description: "Uncovered a Slack Legacy bot token, which could lead to compromised legacy bot operations and data exposure.",
  147. // This rule is based off the limited information I could find and may not be 100% accurate.
  148. Regex: regexp.MustCompile(`xoxb-[0-9]{8,14}-[a-zA-Z0-9]{18,26}`),
  149. Entropy: 2,
  150. Keywords: []string{
  151. "xoxb",
  152. },
  153. }
  154. tps := utils.GenerateSampleSecrets("slack", "xoxb-263594206564-FGqddMF8t08v8N7Oq4i57vs1")
  155. tps = append(tps,
  156. // https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#LL42C38-L42C80
  157. `"bot_token1": "xoxb-263594206564-FGqddMF8t08v8N7Oq4i57vs1"`, // gitleaks:allow
  158. // https://heejune.me/2018/08/01/crashdump-analysis-automation-using-slackbot-python-cdb-from-windows/
  159. `"bot_token2": "xoxb-282029623751-BVtmnS3BQitmjZvjpQL7PSGP"`, // gitleaks:allow
  160. // https://github.com/praetorian-inc/noseyparker/blob/16e0e5768fd14ea54f6c9a058566184d88343bb4/crates/noseyparker/data/default/rules/slack.yml#L15
  161. `"bot_token3": "xoxb-47834520726-N3otsrwj8Cf99cs8GhiRZsX1"`, // gitleaks:allow
  162. // https://github.com/pulumi/examples/blob/32d9047c19c2a9380c04e57a764321c25eef45b0/aws-js-sqs-slack/README.md?plain=1#L39
  163. `"bot_token4": "xoxb-123456789012-Xw937qtWSXJss1lFaKe"`, // gitleaks:allow
  164. // https://github.com/ilyasProgrammer/Odoo-eBay-Amazon/blob/a9c4a8a7548b19027bc0fd904f8ae9249248a293/custom_logging/models.py#LL9C24-L9C66
  165. `"bot_token5": "xoxb-312554961652-uSmliU84rFhnUSBq9YdKh6lS"`, // gitleaks:allow
  166. // https://github.com/jay-johnson/sci-pype/blob/6bff42ea4eb32d35b9f223db312e4cd0d3911100/src/pycore.py#L37
  167. `"bot_token6": "xoxb-51351043345-Lzwmto5IMVb8UK36MghZYMEi"`, // gitleaks:allow
  168. // https://github.com/logicmoo/logicmoo_workspace/blob/2e1794f596121c9949deb3bfbd30d5b027a51d3d/packs_sys/slack_prolog/prolog/slack_client_old.pl#L28
  169. `"bot_token7": "xoxb-130154379991-ogFL0OFP3w6AwdJuK7wLojpK"`, // gitleaks:allow
  170. // https://github.com/sbarski/serverless-chatbot/blob/7d556897486f3fd53795907b7e33252e5cc6b3a3/Lesson%203/serverless.yml#L38
  171. `"bot_token8": "xoxb-159279836768-FOst5DLfEzmQgkz7cte5qiI"`, // gitleaks:allow
  172. `"bot_token9": "xoxb-50014434-slacktokenx29U9X1bQ"`, // gitleaks:allow
  173. `"bot_token10": `+fmt.Sprintf(`"xoxb-%s-%s`, secrets.NewSecret(utils.Numeric("10")), secrets.NewSecret(utils.AlphaNumeric("24"))), // gitleaks:allow
  174. `"bot_token11": `+fmt.Sprintf(`"xoxb-%s-%s`, secrets.NewSecret(utils.Numeric("12")), secrets.NewSecret(utils.AlphaNumeric("23"))), // gitleaks:allow
  175. )
  176. fps := []string{
  177. "xoxb-xxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx", // gitleaks:allow
  178. "xoxb-Slack_BOT_TOKEN",
  179. "xoxb-abcdef-abcdef",
  180. // "xoxb-0000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // gitleaks:allow
  181. }
  182. return utils.Validate(r, tps, fps)
  183. }
  184. // Reference: https://api.slack.com/authentication/token-types#workspace
  185. func SlackLegacyWorkspaceToken() *config.Rule {
  186. r := config.Rule{
  187. RuleID: "slack-legacy-workspace-token",
  188. Description: "Identified a Slack Legacy Workspace token, potentially compromising access to workspace data and legacy features.",
  189. // This is by far the least confident pattern.
  190. Regex: regexp.MustCompile(`xox[ar]-(?:\d-)?[0-9a-zA-Z]{8,48}`),
  191. Entropy: 2,
  192. Keywords: []string{
  193. "xoxa",
  194. "xoxr",
  195. },
  196. }
  197. tps := utils.GenerateSampleSecrets("slack", "xoxa-2-511111111-31111111111-3111111111111-e039d02840a0b9379c")
  198. tps = append(tps,
  199. `"access_token": "xoxa-2-511111111-31111111111-3111111111111-e039d02840a0b9379c"`, // gitleaks:allow
  200. `"access_token1": `+fmt.Sprintf(`"xoxa-%s-%s`, secrets.NewSecret(utils.Numeric("1")), secrets.NewSecret(utils.AlphaNumeric("12"))),
  201. `"access_token2": `+fmt.Sprintf(`"xoxa-%s`, secrets.NewSecret(utils.AlphaNumeric("12"))),
  202. `"refresh_token1": `+fmt.Sprintf(`"xoxr-%s-%s`, secrets.NewSecret(utils.Numeric("1")), secrets.NewSecret(utils.AlphaNumeric("12"))),
  203. `"refresh_token2": `+fmt.Sprintf(`"xoxr-%s`, secrets.NewSecret(utils.AlphaNumeric("12"))),
  204. )
  205. fps := []string{
  206. // "xoxa-faketoken",
  207. // "xoxa-access-token-string",
  208. // "XOXa-nx991k",
  209. "https://github.com/xoxa-nyc/xoxa-nyc.github.io/blob/master/README.md",
  210. }
  211. return utils.Validate(r, tps, fps)
  212. }
  213. // References:
  214. // - https://api.slack.com/authentication/token-types#legacy
  215. // - https://api.slack.com/changelog/2016-05-19-authorship-changing-for-older-tokens
  216. // - https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#L29
  217. // - https://gist.github.com/thesubtlety/a1c460d53df0837c5817c478b9f10588#file-local-slack-jack-py-L32
  218. func SlackLegacyToken() *config.Rule {
  219. // define rule
  220. r := config.Rule{
  221. RuleID: "slack-legacy-token",
  222. Description: "Detected a Slack Legacy token, risking unauthorized access to older Slack integrations and user data.",
  223. Regex: regexp.MustCompile(`xox[os]-\d+-\d+-\d+-[a-fA-F\d]+`),
  224. Entropy: 2,
  225. Keywords: []string{"xoxo", "xoxs"},
  226. }
  227. // validate
  228. tps := utils.GenerateSampleSecrets("slack", "xoxs-416843729158-132049654-5609968301-e708ba56e1")
  229. tps = append(tps,
  230. // https://github.com/GGStudy-DDUp/https-github.com-aldaor-HackerOneReports/blob/637e9261b63a7292a3a7ddf4bf13729c224d84df/PrivilegeEscalation/47940.txt#L23
  231. `"access_token1": "xoxs-3206092076-3204538285-3743137121-836b042620"`, // gitleaks:allow
  232. // https://github.com/jonz-secops/TokenTester/blob/978e9f3eabc7e9978769cfbba10735afa3bf627e/slack#L28
  233. `"access_token2": "xoxs-416843729158-132049654-5609968301-e708ba56e1"`, // gitleaks:allow
  234. // https://github.com/clr2of8/SlackExtract/blob/18d151152ff5a45b293d4b7193aa6d08f9ab1bfd/README.md?plain=1#L32
  235. `"access_token3": "xoxs-420083410720-421837374423-440811613314-977844f625b707d5b0b268206dbc92cbc85feef3e71b08e44815a8e6e7657190"`, // gitleaks:allow
  236. // https://github.com/zeroc00I/AllVideoPocsFromHackerOne/blob/95ae92f65ccef11c2c6acdaabfb7cc9b2b0eb4c6/jsonReports/61312.json#LL1C17-L1C17
  237. `"access_token4": "xoxs-4829527689-4829527691-4814341714-d0346ec616"`, // gitleaks:allow
  238. // https://github.com/ericvanderwal/general-playmaker/blob/34bd8e82e2d7b16ca9cc825d0c9d383b8378b550/Logic/setrandomseedtype.cs#LL783C15-L783C69
  239. `"access_token5": "xoxs-155191149137-155868813314-338998331396-9f6d235915"`, // gitleaks:allow
  240. `"access_token6": "xoxs-`+fmt.Sprintf("%s-%s-%s-%s", secrets.NewSecret(utils.Numeric("10")), secrets.NewSecret(utils.Numeric("10")), secrets.NewSecret(utils.Numeric("10")), secrets.NewSecret(utils.Hex("10")))+`"`,
  241. `"access_token7": "xoxo-523423-234243-234233-e039d02840a0b9379c"`, // gitleaks:allow
  242. )
  243. fps := []string{
  244. "https://indieweb.org/images/3/35/2018-250-xoxo-indieweb-1.jpg",
  245. "https://lh3.googleusercontent.com/-tWXjX3LUD6w/Ua4La_N5E2I/AAAAAAAAACg/qcm19xbEYa4/s640/EXO-XOXO-teaser-exo-k-34521098-720-516.jpg",
  246. }
  247. return utils.Validate(r, tps, fps)
  248. }
  249. func SlackWebHookUrl() *config.Rule {
  250. // define rule
  251. r := config.Rule{
  252. RuleID: "slack-webhook-url",
  253. Description: "Discovered a Slack Webhook, which could lead to unauthorized message posting and data leakage in Slack channels.",
  254. // If this generates too many false-positives we should define an allowlist (e.g., "xxxx", "00000").
  255. Regex: regexp.MustCompile(
  256. `(?:https?://)?hooks.slack.com/(?:services|workflows|triggers)/[A-Za-z0-9+/]{43,56}`),
  257. Keywords: []string{
  258. "hooks.slack.com",
  259. },
  260. }
  261. // validate
  262. tps := []string{
  263. "hooks.slack.com/services/" + secrets.NewSecret(utils.AlphaNumeric("44")),
  264. "http://hooks.slack.com/services/" + secrets.NewSecret(utils.AlphaNumeric("45")),
  265. "https://hooks.slack.com/services/" + secrets.NewSecret(utils.AlphaNumeric("46")),
  266. "http://hooks.slack.com/services/T024TTTTT/BBB72BBL/AZAAA9u0pA4ad666eMgbi555", // gitleaks:allow
  267. "https://hooks.slack.com/services/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", // gitleaks:allow
  268. "hooks.slack.com/workflows/" + secrets.NewSecret(utils.AlphaNumeric("44")),
  269. "http://hooks.slack.com/workflows/" + secrets.NewSecret(utils.AlphaNumeric("45")),
  270. "https://hooks.slack.com/workflows/" + secrets.NewSecret(utils.AlphaNumeric("46")),
  271. "https://hooks.slack.com/workflows/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", // gitleaks:allow
  272. "http://hooks.slack.com/workflows/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", // gitleaks:allow
  273. "https://hooks.slack.com/triggers/" + secrets.NewSecret(utils.AlphaNumeric("56")),
  274. }
  275. return utils.Validate(r, tps, nil)
  276. }