cy3erm/gitghost

GitHub: cy3erm/gitghost

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

Stars: 5 | Forks: 1

# gitghost ![gitghost 曝光档案](https://raw.githubusercontent.com/cy3erm/gitghost/main/preview.png) 查找 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, 数据泄露, 无后门