telegram.go 4.2 KB

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