telegram.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package rules
  2. import (
  3. "regexp"
  4. "github.com/zricethezav/gitleaks/v8/cmd/generate/secrets"
  5. "github.com/zricethezav/gitleaks/v8/config"
  6. )
  7. func TelegramBotToken() *config.Rule {
  8. // define rule
  9. r := config.Rule{
  10. Description: "Detected a Telegram Bot API Token, risking unauthorized bot operations and message interception on Telegram.",
  11. RuleID: "telegram-bot-api-token",
  12. Regex: regexp.MustCompile(`(?i)(?:^|\b|bot)([0-9]{5,16}:A[a-z0-9_\-]{34})(?:$|\b[^_\-])`),
  13. Keywords: []string{
  14. "telegram",
  15. "api",
  16. "bot",
  17. "token",
  18. "url",
  19. },
  20. }
  21. // validate
  22. var (
  23. validToken = secrets.NewSecret(numeric("8") + ":A" + alphaNumericExtendedShort("34"))
  24. minToken = secrets.NewSecret(numeric("5") + ":A" + alphaNumericExtendedShort("34"))
  25. maxToken = secrets.NewSecret(numeric("16") + ":A" + alphaNumericExtendedShort("34"))
  26. xsdWithToken = secrets.NewSecret(`<xsd:element name="AgencyIdentificationCode" type="` + numeric("5") + `:A` + alphaNumericExtendedShort("34") + `"/>`)
  27. )
  28. tps := []string{
  29. // variable assignment
  30. generateSampleSecret("telegram", validToken),
  31. // URL containing token
  32. generateSampleSecret("url", "https://api.telegram.org/bot"+validToken+"/sendMessage"),
  33. // object constructor
  34. `const bot = new Telegraf("` + validToken + `")`,
  35. // .env
  36. `API_TOKEN = ` + validToken,
  37. // YAML
  38. `bot: ` + validToken,
  39. // Token with min bot_id
  40. generateSampleSecret("telegram", minToken),
  41. // Token with max bot_id
  42. generateSampleSecret("telegram", maxToken),
  43. // Valid token in XSD document
  44. generateSampleSecret("telegram", xsdWithToken),
  45. }
  46. var (
  47. tooSmallToken = secrets.NewSecret(numeric("4") + ":A" + alphaNumericExtendedShort("34"))
  48. tooBigToken = secrets.NewSecret(numeric("17") + ":A" + alphaNumericExtendedShort("34"))
  49. xsdAgencyIdentificationCode1 = secrets.NewSecret(`<xsd:element name="AgencyIdentificationCode" type="clm`+numeric("5")+":AgencyIdentificationCodeContentType") + `"/>`
  50. xsdAgencyIdentificationCode2 = secrets.NewSecret(`token:"clm` + numeric("5") + `:AgencyIdentificationCodeContentType"`)
  51. xsdAgencyIdentificationCode3 = secrets.NewSecret(`<xsd:element name="AgencyIdentificationCode" type="clm` + numeric("8") + `:AgencyIdentificationCodeContentType"/>`)
  52. prefixedToken1 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:Ahello` + alphaNumericExtendedShort("34") + `\"`)
  53. prefixedToken2 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:A-some-other-thing-` + alphaNumericExtendedShort("34") + `\"`)
  54. prefixedToken3 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:A_` + alphaNumericExtendedShort("34") + `\"`)
  55. suffixedToken1 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:A` + alphaNumericExtendedShort("34") + `hello\"`)
  56. suffixedToken2 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:A` + alphaNumericExtendedShort("34") + `-some-other-thing\"`)
  57. suffixedToken3 = secrets.NewSecret(`telegram_api_token = \"` + numeric("8") + `:A_` + alphaNumericExtendedShort("34") + `_\"`)
  58. )
  59. fps := []string{
  60. // Token with too small bot_id
  61. generateSampleSecret("telegram", tooSmallToken),
  62. // Token with too big bot_id
  63. generateSampleSecret("telegram", tooBigToken),
  64. // XSD file containing the string AgencyIdentificationCodeContentType
  65. generateSampleSecret("telegram", xsdAgencyIdentificationCode1),
  66. generateSampleSecret("telegram", xsdAgencyIdentificationCode2),
  67. generateSampleSecret("telegram", xsdAgencyIdentificationCode3),
  68. // Prefix and suffix variations that shouldn't match
  69. generateSampleSecret("telegram", prefixedToken1),
  70. generateSampleSecret("telegram", prefixedToken2),
  71. generateSampleSecret("telegram", prefixedToken3),
  72. generateSampleSecret("telegram", suffixedToken1),
  73. generateSampleSecret("telegram", suffixedToken2),
  74. generateSampleSecret("telegram", suffixedToken3),
  75. }
  76. return validate(r, tps, fps)
  77. }