cy3erm/gitghost
GitHub: cy3erm/gitghost
一款扫描 GitHub 公开仓库及其 Git 历史记录中残留密钥与敏感元数据的泄露检测工具,生成量化评分和可操作的 HTML 报告。
Stars: 5 | Forks: 1
# gitghost

查找 GitHub 账号公开仓库中的机密信息——包括那些已经提交,随后被“删除”,但依然存在于 git 历史记录中且任何人都可以读取的内容。
在注意到真正的泄露往往不在于某人当前的代码中,而是在于八个月前他们以为自己已经清理掉的某次提交之后,我开发了这个工具。你粘贴了一个 API key,意识到了问题,删除了那一行,然后继续工作。最新版本看起来没问题。但旧的提交依然包含着那个 key,而且 `git log` 会把它暴露给任何克隆该仓库的人。大多数扫描器只检查你当前的文件,从而完全忽略了这一点。gitghost 专门深入挖掘这些历史记录,然后将所有问题汇总为一个单独的曝光评分,让你能够一眼看出情况到底有多糟。
```
$ gitghost cy3erm
EXPOSURE SCORE: 96/100 [CRITICAL] grade F
· 7 live secrets in current code
· 3 "deleted" secrets still recoverable from history
· author email exposed in commit metadata
· timezone inferable from commit times (UTC+0530)
dossier written to gitghost-dossier.html
```
你会得到一份可以在浏览器中打开的 HTML 报告,而不仅仅是一满屏的终端文本。每一项发现都直接链接到具体位置——对于现存的机密信息会指向确切的文件和行号,对于从历史记录中恢复的机密信息则指向对应的提交——这样你就不用费力去寻找 key 的真正位置。报告末尾还附带了一份简短的修复指南,因为看到泄露的 key 时人的本能反应(删除文件、销毁仓库)实际上并不能解决任何问题:该 key 很可能已经被别人克隆了。真正的修复方法是轮换该 key,然后将其从历史记录中彻底清除,而这份报告会全程指导你完成这两项操作。
## 运行方式
你需要 Python 3.10+ 和 git。没有任何运行时依赖——全部使用标准库。
将其作为命令安装:
```
pipx install git+https://github.com/cy3erm/gitghost
gitghost
```
或者直接克隆并运行,无需安装:
```
git clone https://github.com/cy3erm/gitghost
cd gitghost
python3 -m gitghost
```
如果你不想一开始就把它指向一个真实的人,这里提供了一个演示。它会构建一个包含虚假凭证的小型仓库——其中一个凭证在几次提交后会被“删除”——这样你就可以观察到历史记录恢复功能是如何把它重新挖掘出来的:
```
bash demo/make_demo_repo.sh /tmp/demo
python3 -m gitghost --local /tmp/demo --name demo
```
其他一些标志参数:
```
python3 -m gitghost --limit 50 # cap how many repos
python3 -m gitghost --out report.html # where to write the report
python3 -m gitghost --local ./some-repo # scan a checkout you have locally
python3 -m gitghost --repo owner/name # scan just one repo (URL or owner/name)
```
需要扫描多个账号?请设置 `GITHUB_TOKEN`(任何 token 都可以,不需要任何 scope),这样你就不会触及 GitHub 对匿名调用每小时 60 次的请求限制。
## 检测内容
- 云端和服务密钥——AWS、GCP、Stripe、GitHub、OpenAI、Slack、私钥、数据库 URL
- 同样包含从历史记录中提取出的、那些已从当前代码中移除的密钥
- 你可能没有意识到自己正在共享的元数据——你提交记录中的邮箱,以及根据提交时间戳对你所在时区和工作时间的大致推测
- 已提交的 `.env` 文件、内部主机名、硬编码的私有 IP
评分被特意设计为一个单一的数字,这样你就可以观察它的变化——运行一次,清理干净,然后再运行一次。一个现存的云端密钥本身就足以让账号处于极度危险(红色)状态;而一堆较小的问题则会进一步推高分数。
## 底线原则
它只会读取公开的仓库——即该账号已经选择发布的内容——而且仅用于检测。它只会告诉你某个字符串*看起来像*是一个凭证,仅此而已。它不会拿着这个 key 去尝试登录实际的服务以验证其是否仍然有效,因为悄悄登录别人的账号并不是这个工具的职责,老实说,这也不该是你的职责。报告中的发现内容都是以指纹形式展示的,而不是原始值,因此你可以放心分享报告,而不会造成任何泄露。
先把它指向你自己吧。大多数人都会翻出至少一件他们完全忘记的事情——我自己就是这样。(第一次推送这个仓库时,GitHub 自己的机密扫描器把我给拦截了,因为演示用的虚假密钥看起来太逼真了,触发了警报。这大概是我所能期望的、对该工具初衷最好的证明了。)
## 添加自定义检测规则
匹配规则位于 `gitghost/rules.py`。每一条规则仅仅包含一个名称、一个 regex、一个严重程度级别以及一行修复建议——非常容易添加。如果你写出了不错的规则,欢迎提交 PR。
## 许可证
MIT
标签:Blue Team, ESC4, OSINT, Python, StruQ, 数据泄露, 无后门