|
@@ -1,17 +1,32 @@
|
|
|
-<p align="center">
|
|
|
|
|
- <img alt="gitleaks" src="https://raw.githubusercontent.com/zricethezav/gifs/master/gitleakslogo.png" height="70" />
|
|
|
|
|
- <p align="center">
|
|
|
|
|
- <a href="https://travis-ci.org/zricethezav/gitleaks"><img alt="Travis" src="https://img.shields.io/travis/zricethezav/gitleaks/master.svg?style=flat-square"></a>
|
|
|
|
|
- </p>
|
|
|
|
|
-</p>
|
|
|
|
|
|
|
|
|
|
-Gitleaks is a SAST tool for detecting hardcoded secrets like passwords, api keys, and tokens in git repos. Gitleaks is an **easy-to-use, all-in-one solution** for finding secrets, past or present, in your code.
|
|
|
|
|
|
|
+```
|
|
|
|
|
+○
|
|
|
|
|
+│╲
|
|
|
|
|
+│ ○
|
|
|
|
|
+○ ░
|
|
|
|
|
+░ gitleaks
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
|
|
|
-### Introduction Video
|
|
|
|
|
<p align="left">
|
|
<p align="left">
|
|
|
- <a href="https://www.youtube.com/watch?v=VUq2eII20S4"><img alt="intro" src="https://img.youtube.com/vi/VUq2eII20S4/maxresdefault.jpg" height="200"></a>
|
|
|
|
|
|
|
+ <p align="left">
|
|
|
|
|
+ <a href="https://github.com/zricethezav/gitleaks/actions/workflows/test.yml">
|
|
|
|
|
+ <img alt="Github Test" src="https://github.com/zricethezav/gitleaks/actions/workflows/test.yml/badge.svg">
|
|
|
|
|
+ </a>
|
|
|
|
|
+ <a href="https://hub.docker.com/r/zricethezav/gitleaks">
|
|
|
|
|
+ <img src="https://img.shields.io/docker/pulls/zricethezav/gitleaks.svg" />
|
|
|
|
|
+ </a>
|
|
|
|
|
+ <a href="https://twitter.com/intent/follow?screen_name=zricethezav">
|
|
|
|
|
+ <img src="https://img.shields.io/twitter/follow/zricethezav?label=Follow%20zricethezav&style=social&color=blue" alt="Follow @zricethezav" />
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </p>
|
|
|
</p>
|
|
</p>
|
|
|
|
|
|
|
|
|
|
+Gitleaks is a SAST tool for detecting hardcoded secrets like passwords, api keys, and tokens in git repos. Gitleaks is an **easy-to-use, all-in-one solution** for finding secrets, past or present, in your code.
|
|
|
|
|
+
|
|
|
|
|
+### [Introduction Video](https://www.youtube.com/watch?v=VUq2eII20S4)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
### Features:
|
|
### Features:
|
|
|
- Scan for [commited](https://github.com/zricethezav/gitleaks#Scanning) secrets
|
|
- Scan for [commited](https://github.com/zricethezav/gitleaks#Scanning) secrets
|
|
|
- Scan for [unstaged](https://github.com/zricethezav/gitleaks#scan-unstaged-changes) secrets to shift security left
|
|
- Scan for [unstaged](https://github.com/zricethezav/gitleaks#scan-unstaged-changes) secrets to shift security left
|
|
@@ -19,7 +34,7 @@ Gitleaks is a SAST tool for detecting hardcoded secrets like passwords, api keys
|
|
|
- Run [Gitleaks Action](https://github.com/marketplace/actions/gitleaks) in your CI/CD pipeline
|
|
- Run [Gitleaks Action](https://github.com/marketplace/actions/gitleaks) in your CI/CD pipeline
|
|
|
- [Custom rules](https://github.com/zricethezav/gitleaks#configuration) via toml configuration
|
|
- [Custom rules](https://github.com/zricethezav/gitleaks#configuration) via toml configuration
|
|
|
- Increased performance using [go-git](https://github.com/go-git/go-git)
|
|
- Increased performance using [go-git](https://github.com/go-git/go-git)
|
|
|
-- JSON, SARIF, and CSV reporting
|
|
|
|
|
|
|
+- json, sarif, and csv reporting
|
|
|
- Private repo scans using key or password based authentication
|
|
- Private repo scans using key or password based authentication
|
|
|
|
|
|
|
|
|
|
|
|
@@ -28,14 +43,18 @@ Gitleaks can be installed using Homebrew, Docker, or Go. Gitleaks is also availa
|
|
|
|
|
|
|
|
##### MacOS
|
|
##### MacOS
|
|
|
|
|
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
brew install gitleaks
|
|
brew install gitleaks
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
##### Docker
|
|
##### Docker
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
-docker pull zricethezav/gitleaks
|
|
|
|
|
|
|
+# To just pull the image
|
|
|
|
|
+docker pull zricethezav/gitleaks:latest
|
|
|
|
|
+# To run it from your cloned repo
|
|
|
|
|
+cd to/your/repo/
|
|
|
|
|
+docker run -v ${PWD}:/my-repo zricethezav/gitleaks:latest --path="/my-repo" [OPTIONS]
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
##### Go
|
|
##### Go
|
|
@@ -49,8 +68,11 @@ See [pre-commit](https://github.com/pre-commit/pre-commit) for instructions.
|
|
|
Sample `.pre-commit-config.yaml`
|
|
Sample `.pre-commit-config.yaml`
|
|
|
|
|
|
|
|
```yaml
|
|
```yaml
|
|
|
|
|
+# The revision doesn't get updated manually
|
|
|
|
|
+# check this https://github.com/zricethezav/gitleaks/releases
|
|
|
|
|
+# to see if there are newer versions
|
|
|
- repo: https://github.com/zricethezav/gitleaks
|
|
- repo: https://github.com/zricethezav/gitleaks
|
|
|
- rev: v7.4.0
|
|
|
|
|
|
|
+ rev: v7.6.0
|
|
|
hooks:
|
|
hooks:
|
|
|
- id: gitleaks
|
|
- id: gitleaks
|
|
|
```
|
|
```
|
|
@@ -83,13 +105,11 @@ Application Options:
|
|
|
--append-repo-config Append the provided or default config with the repo config.
|
|
--append-repo-config Append the provided or default config with the repo config.
|
|
|
--additional-config= Path to an additional gitleaks config to append with an existing config. Can be used with --append-repo-config to append up to three configurations
|
|
--additional-config= Path to an additional gitleaks config to append with an existing config. Can be used with --append-repo-config to append up to three configurations
|
|
|
-o, --report= Report output path
|
|
-o, --report= Report output path
|
|
|
- -f, --format= JSON, CSV, SARIF (default: json)
|
|
|
|
|
|
|
+ -f, --format= json, csv, sarif (default: json)
|
|
|
--files-at-commit= Sha of commit to scan all files at commit
|
|
--files-at-commit= Sha of commit to scan all files at commit
|
|
|
--commit= Sha of commit to scan or "latest" to scan the last commit of the repository
|
|
--commit= Sha of commit to scan or "latest" to scan the last commit of the repository
|
|
|
--commits= Comma separated list of a commits to scan
|
|
--commits= Comma separated list of a commits to scan
|
|
|
--commits-file= Path to file of line separated list of commits to scan
|
|
--commits-file= Path to file of line separated list of commits to scan
|
|
|
- --commit-from= Commit to start scan from
|
|
|
|
|
- --commit-to= Commit to stop scan
|
|
|
|
|
--commit-since= Scan commits more recent than a specific date. Ex: '2006-01-02' or '2006-01-02T15:04:05-0700' format.
|
|
--commit-since= Scan commits more recent than a specific date. Ex: '2006-01-02' or '2006-01-02T15:04:05-0700' format.
|
|
|
--commit-until= Scan commits older than a specific date. Ex: '2006-01-02' or '2006-01-02T15:04:05-0700' format.
|
|
--commit-until= Scan commits older than a specific date. Ex: '2006-01-02' or '2006-01-02T15:04:05-0700' format.
|
|
|
--depth= Number of commits to scan
|
|
--depth= Number of commits to scan
|
|
@@ -103,49 +123,49 @@ Help Options:
|
|
|
|
|
|
|
|
#### Basic repo-url scan:
|
|
#### Basic repo-url scan:
|
|
|
This scans the entire history of tests/secrets and logs leaks as they are encountered `-v`/`--verbose` being set.
|
|
This scans the entire history of tests/secrets and logs leaks as they are encountered `-v`/`--verbose` being set.
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo -v
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo -v
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
#### Basic repo-url scan output to a report:
|
|
#### Basic repo-url scan output to a report:
|
|
|
If you want the report in sarif or csv you can set the `-f/--format` option
|
|
If you want the report in sarif or csv you can set the `-f/--format` option
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo -v --report=my-report.json
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo -v --report=my-report.json
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan specific commit:
|
|
#### Scan specific commit:
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo --commit=commit-sha -v
|
|
gitleaks --repo-url=https://github.com/my-insecure/repo --commit=commit-sha -v
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan local repo:
|
|
#### Scan local repo:
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --path=path/to/local/repo -v
|
|
gitleaks --path=path/to/local/repo -v
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan repos contained in a parent directory:
|
|
#### Scan repos contained in a parent directory:
|
|
|
If you have `repo1`, `repo2`, `repo3` all under `path/to/local`, gitleaks will discover and scan those repos.
|
|
If you have `repo1`, `repo2`, `repo3` all under `path/to/local`, gitleaks will discover and scan those repos.
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --path=path/to/local/ -v
|
|
gitleaks --path=path/to/local/ -v
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan local directory:
|
|
#### Scan local directory:
|
|
|
If you want to scan the current contents of a repo, ignoring git alltogether. You can use the `--no-git` option to do this.
|
|
If you want to scan the current contents of a repo, ignoring git alltogether. You can use the `--no-git` option to do this.
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --path=path/to/local/repo -v --no-git
|
|
gitleaks --path=path/to/local/repo -v --no-git
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan a file:
|
|
#### Scan a file:
|
|
|
Or if you want to scan a single file using gitleaks rules. You can do this by specifying the file in `--path` and including the `--no-git` option.
|
|
Or if you want to scan a single file using gitleaks rules. You can do this by specifying the file in `--path` and including the `--no-git` option.
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --path=path/to/local/repo/main.go -v --no-git
|
|
gitleaks --path=path/to/local/repo/main.go -v --no-git
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
#### Scan unstaged changes:
|
|
#### Scan unstaged changes:
|
|
|
-If you have unstaged changes are are currently at the root of the repo, you can run `gitleaks` with no `--path` or `--repo-url` specified which will run a scan on your uncommitted changes. Or if you want to specify a
|
|
|
|
|
|
|
+If you have unstaged changes are are currently at the root of the repo, you can run `gitleaks` with no `--path` or `--repo-url` specified which will run a scan on your uncommitted changes. Or if you want to specify a
|
|
|
path, you can run:
|
|
path, you can run:
|
|
|
-```
|
|
|
|
|
|
|
+```bash
|
|
|
gitleaks --path=path/to/local/repo -v --unstaged
|
|
gitleaks --path=path/to/local/repo -v --unstaged
|
|
|
```
|
|
```
|
|
|
|
|
|
|
@@ -158,12 +178,10 @@ The default configuration Gitleaks uses is located [here](https://github.com/zri
|
|
|
|
|
|
|
|
The rules are written in [TOML](https://github.com/toml-lang/toml) as defined in [TomlLoader struct](https://github.com/zricethezav/gitleaks/blob/master/config/config.go#L57-L87), and can be summarized as:
|
|
The rules are written in [TOML](https://github.com/toml-lang/toml) as defined in [TomlLoader struct](https://github.com/zricethezav/gitleaks/blob/master/config/config.go#L57-L87), and can be summarized as:
|
|
|
|
|
|
|
|
-```
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
|
|
+```toml
|
|
|
[[rules]]
|
|
[[rules]]
|
|
|
description = "a string describing one of many rule in this config"
|
|
description = "a string describing one of many rule in this config"
|
|
|
- regex = '''one-go-style-regex-for-this-rule'''
|
|
|
|
|
|
|
+ regex = '''one-go-style-regex-for-this-rule'''
|
|
|
file = '''a-file-name-regex'''
|
|
file = '''a-file-name-regex'''
|
|
|
path = '''a-file-path-regex'''
|
|
path = '''a-file-path-regex'''
|
|
|
tags = ["tag","another tag"]
|
|
tags = ["tag","another tag"]
|
|
@@ -193,7 +211,7 @@ Regular expressions are _NOT_ the full Perl set, so there are no look-aheads or
|
|
|
### Examples
|
|
### Examples
|
|
|
#### Example 1
|
|
#### Example 1
|
|
|
The first and most commonly edited array of tables is `[[rules]]`. This is where you can define your own custom rules for Gitleaks to use while scanning repos. Example keys/values within the `[[rules]]` table:
|
|
The first and most commonly edited array of tables is `[[rules]]`. This is where you can define your own custom rules for Gitleaks to use while scanning repos. Example keys/values within the `[[rules]]` table:
|
|
|
-```
|
|
|
|
|
|
|
+```toml
|
|
|
[[rules]]
|
|
[[rules]]
|
|
|
description = "generic secret regex"
|
|
description = "generic secret regex"
|
|
|
regex = '''secret(.{0,20})([0-9a-zA-Z-._{}$\/\+=]{20,120})'''
|
|
regex = '''secret(.{0,20})([0-9a-zA-Z-._{}$\/\+=]{20,120})'''
|
|
@@ -201,35 +219,34 @@ The first and most commonly edited array of tables is `[[rules]]`. This is where
|
|
|
```
|
|
```
|
|
|
#### Example 2
|
|
#### Example 2
|
|
|
We can also **combine** regular expressions AND entropy:
|
|
We can also **combine** regular expressions AND entropy:
|
|
|
-```
|
|
|
|
|
|
|
+```toml
|
|
|
[[rules]]
|
|
[[rules]]
|
|
|
description = "entropy and regex example"
|
|
description = "entropy and regex example"
|
|
|
regex = '''secret(.{0,20})['|"]([0-9a-zA-Z-._{}$\/\+=]{20,120})['|"]'''
|
|
regex = '''secret(.{0,20})['|"]([0-9a-zA-Z-._{}$\/\+=]{20,120})['|"]'''
|
|
|
[[rules.Entropies]]
|
|
[[rules.Entropies]]
|
|
|
- Min = "4.5"
|
|
|
|
|
- Max = "4.7"
|
|
|
|
|
|
|
+ Min = "4.5"
|
|
|
|
|
+ Max = "4.7"
|
|
|
```
|
|
```
|
|
|
Translating this rule to English, this rule states: "if we encounter a line of code that matches *regex* AND the line falls within the bounds of a [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) of 4.5 to 4.7, then the line must be a leak"
|
|
Translating this rule to English, this rule states: "if we encounter a line of code that matches *regex* AND the line falls within the bounds of a [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) of 4.5 to 4.7, then the line must be a leak"
|
|
|
|
|
|
|
|
#### Example 3
|
|
#### Example 3
|
|
|
-Let's compare two lines of code:
|
|
|
|
|
|
|
+Let's compare two lines of code:
|
|
|
```
|
|
```
|
|
|
aws_secret='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE'
|
|
aws_secret='ABCDEF+c2L7yXeGvUyrPgYsDnWRRC1AYEXAMPLE'
|
|
|
```
|
|
```
|
|
|
-and
|
|
|
|
|
|
|
+and
|
|
|
```
|
|
```
|
|
|
aws_secret=os.getenv('AWS_SECRET_ACCESS_KEY')
|
|
aws_secret=os.getenv('AWS_SECRET_ACCESS_KEY')
|
|
|
-
|
|
|
|
|
```
|
|
```
|
|
|
The first line of code is an example of a hardcoded secret being assigned to the variable `aws_secret`. The second line of code is an example of a secret being assigned via env variables to `aws_secret`. Both would be caught by the rule defined in *example 2* but only the first line is actually a leak. Let's define a new rule that will capture only the first line of code. We can do this by combining regular expression **groups** and entropy.
|
|
The first line of code is an example of a hardcoded secret being assigned to the variable `aws_secret`. The second line of code is an example of a secret being assigned via env variables to `aws_secret`. Both would be caught by the rule defined in *example 2* but only the first line is actually a leak. Let's define a new rule that will capture only the first line of code. We can do this by combining regular expression **groups** and entropy.
|
|
|
-```
|
|
|
|
|
|
|
+```toml
|
|
|
[[rules]]
|
|
[[rules]]
|
|
|
description = "entropy and regex example"
|
|
description = "entropy and regex example"
|
|
|
regex = '''secret(.{0,20})['|"]([0-9a-zA-Z-._{}$\/\+=]{20,120})['|"]'''
|
|
regex = '''secret(.{0,20})['|"]([0-9a-zA-Z-._{}$\/\+=]{20,120})['|"]'''
|
|
|
[[rules.Entropies]]
|
|
[[rules.Entropies]]
|
|
|
- Min = "4.5"
|
|
|
|
|
- Max = "4.7"
|
|
|
|
|
- Group = "2"
|
|
|
|
|
|
|
+ Min = "4.5"
|
|
|
|
|
+ Max = "4.7"
|
|
|
|
|
+ Group = "2"
|
|
|
```
|
|
```
|
|
|
Notice how we added `Group = "2"` to this rule. We can translate this rule to English: "if we encounter a line of code that matches regex AND the entropy of the *second regex group* falls within the bounds of a [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) of 4.5 to 4.7, then the line must be a leak"
|
|
Notice how we added `Group = "2"` to this rule. We can translate this rule to English: "if we encounter a line of code that matches regex AND the entropy of the *second regex group* falls within the bounds of a [Shannon entropy](https://en.wikipedia.org/wiki/Entropy_(information_theory)) of 4.5 to 4.7, then the line must be a leak"
|
|
|
|
|
|
|
@@ -239,24 +256,22 @@ The proper Perl regex for AWS secret keys is
|
|
|
`(?<![A-Za-z0-9\\+])[A-Za-z0-9\\+=]{40}(?![A-Za-z0-9\\+=])`
|
|
`(?<![A-Za-z0-9\\+])[A-Za-z0-9\\+=]{40}(?![A-Za-z0-9\\+=])`
|
|
|
but the Go library doesn't do lookahead/lookbehind, so
|
|
but the Go library doesn't do lookahead/lookbehind, so
|
|
|
we'll look for 40 base64 characters, then allowlist
|
|
we'll look for 40 base64 characters, then allowlist
|
|
|
-if they're embedded in a string of 41 base64 characters, that is,
|
|
|
|
|
|
|
+if they're embedded in a string of 41 base64 characters, that is,
|
|
|
without any delimiters. This will make a false negative for, say:
|
|
without any delimiters. This will make a false negative for, say:
|
|
|
```
|
|
```
|
|
|
foo=+awsSecretAccessKeyisBase64=40characters
|
|
foo=+awsSecretAccessKeyisBase64=40characters
|
|
|
```
|
|
```
|
|
|
So you can use the following to effectively create the proper Perl regex:
|
|
So you can use the following to effectively create the proper Perl regex:
|
|
|
-```
|
|
|
|
|
|
|
+```toml
|
|
|
[[rules]]
|
|
[[rules]]
|
|
|
- description = "AWS secret key regardless of labeling"
|
|
|
|
|
- regex = '''.?[A-Za-z0-9\\+=]{40}.?'''
|
|
|
|
|
- [rules.allowlist]
|
|
|
|
|
- description = "41 base64 characters is not an AWS secret key"
|
|
|
|
|
- regexes = ['''[A-Za-z0-9\\+=]{41}''']
|
|
|
|
|
-
|
|
|
|
|
|
|
+ description = "AWS secret key regardless of labeling"
|
|
|
|
|
+ regex = '''.?[A-Za-z0-9\\+=]{40}.?'''
|
|
|
|
|
+ [rules.allowlist]
|
|
|
|
|
+ description = "41 base64 characters is not an AWS secret key"
|
|
|
|
|
+ regexes = ['''[A-Za-z0-9\\+=]{41}''']
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
### Exit Codes
|
|
### Exit Codes
|
|
|
You can always set the exit code when leaves are encountered with the `--leaks-exit-code` flag. Default exit codes below:
|
|
You can always set the exit code when leaves are encountered with the `--leaks-exit-code` flag. Default exit codes below:
|
|
|
```
|
|
```
|
|
@@ -266,17 +281,15 @@ You can always set the exit code when leaves are encountered with the `--leaks-e
|
|
|
|
|
|
|
|
### Sponsors ❤️
|
|
### Sponsors ❤️
|
|
|
#### Organization Sponsors
|
|
#### Organization Sponsors
|
|
|
-[](https://gammanet.com/?utm_source=gitleaks&utm_medium=homepage&utm_campaign=gitleaks_promotion)
|
|
|
|
|
-
|
|
|
|
|
-Gamma proactively detects and remediates data leaks across cloud apps. Scan your public repos for secret leaks with [Gamma](https://gammanet.com/github-demo?utm_source=gitleaks&utm_medium=homepage&utm_campaign=gitleaks_promotion)
|
|
|
|
|
|
|
+Sir, ehm, this is uhh... this is empty [😭](https://www.youtube.com/watch?v=w1o4O2SfQ5g)
|
|
|
|
|
|
|
|
-#### Individual Sponsors
|
|
|
|
|
|
|
+#### Individual Sponsors
|
|
|
These users are [sponsors](https://github.com/sponsors/zricethezav) of gitleaks:
|
|
These users are [sponsors](https://github.com/sponsors/zricethezav) of gitleaks:
|
|
|
|
|
|
|
|
- [Adam Shannon](https://github.com/adamdecaf)
|
|
- [Adam Shannon](https://github.com/adamdecaf)
|
|
|
- [ProjectDiscovery](https://projectdiscovery.io/#/)
|
|
- [ProjectDiscovery](https://projectdiscovery.io/#/)
|
|
|
-
|
|
|
|
|
|
|
+- [Ben "Ihavespoons"](https://github.com/ihavespoons)
|
|
|
|
|
+- [Henry Sachs](https://github.com/henrysachs)
|
|
|
|
|
|
|
|
#### Logo Attribution
|
|
#### Logo Attribution
|
|
|
The Gitleaks logo uses the Git Logo created <a href="https://twitter.com/jasonlong">Jason Long</a> is licensed under the <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a>.
|
|
The Gitleaks logo uses the Git Logo created <a href="https://twitter.com/jasonlong">Jason Long</a> is licensed under the <a href="https://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 Unported License</a>.
|
|
|
-
|
|
|