main.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "regexp"
  6. )
  7. // ExitClean : no leaks have been found
  8. const ExitClean = 0
  9. // ExitFailure : gitleaks has encountered an error or SIGINT
  10. const ExitFailure = 1
  11. // ExitLeaks : leaks are present in scanned repos
  12. const ExitLeaks = 2
  13. // package globals
  14. var (
  15. regexes map[string]*regexp.Regexp
  16. externalRegex []*regexp.Regexp
  17. stopWords []string
  18. base64Chars string
  19. hexChars string
  20. assignRegex *regexp.Regexp
  21. fileDiffRegex *regexp.Regexp
  22. opts *Options
  23. pwd string
  24. )
  25. func init() {
  26. base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  27. hexChars = "1234567890abcdefABCDEF"
  28. stopWords = []string{"setting", "info", "env", "environment"}
  29. fileDiffRegex = regexp.MustCompile("diff --git a.+b/")
  30. assignRegex = regexp.MustCompile(`(=|:|:=|<-)`)
  31. // TODO Externalize regex... this is tricky making it yml compliant
  32. regexes = map[string]*regexp.Regexp{
  33. "PKCS8": regexp.MustCompile("-----BEGIN PRIVATE KEY-----"),
  34. "RSA": regexp.MustCompile("-----BEGIN RSA PRIVATE KEY-----"),
  35. "DSA": regexp.MustCompile("-----BEGIN DSA PRIVATE KEY-----"),
  36. "SSH": regexp.MustCompile("-----BEGIN OPENSSH PRIVATE KEY-----"),
  37. "Facebook": regexp.MustCompile("(?i)facebook.*['\"][0-9a-f]{32}['\"]"),
  38. "Twitter": regexp.MustCompile("(?i)twitter.*['\"][0-9a-zA-Z]{35,44}['\"]"),
  39. "Github": regexp.MustCompile("(?i)github.*['\"][0-9a-zA-Z]{35,40}['\"]"),
  40. "AWS": regexp.MustCompile("AKIA[0-9A-Z]{16}"),
  41. "Reddit": regexp.MustCompile("(?i)reddit.*['\"][0-9a-zA-Z]{14}['\"]"),
  42. "Heroku": regexp.MustCompile("(?i)heroku.*[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}"),
  43. }
  44. }
  45. func main() {
  46. args := os.Args[1:]
  47. opts = newOpts(args)
  48. owner := newOwner()
  49. os.Exit(owner.auditRepos())
  50. }
  51. func failF(format string, args ...interface{}) {
  52. fmt.Fprintf(os.Stderr, format, args...)
  53. os.Exit(ExitFailure)
  54. }