aharwelik/credsweep

GitHub: aharwelik/credsweep

一款零依赖的跨平台密钥与云凭证扫描器,通过逐字节等价的 Bash 和 PowerShell 双引擎,在代码提交前拦截敏感凭证泄露。

Stars: 0 | Forks: 0

![credsweep](https://static.pigsec.cn/wp-content/uploads/repos/cas/ed/edde23837c7e945c7eb6c65a3da7526ccc24df4a949471c87df471aa8ea75972.svg) # credsweep **零依赖的密钥与云密钥扫描器 —— 一个工具,两种原生运行时。** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/e0/e0aa1b784d423cd6f09b5191b4c125883d647bdec1b61fc4ce6791fcfcc38d44.svg)](https://github.com/aharwelik/credsweep/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-FF7A18.svg)](LICENSE) [![Bash](https://img.shields.io/badge/bash-3.2%2B-1A73E8.svg)]() [![PowerShell](https://img.shields.io/badge/PowerShell-7%2B-1A73E8.svg)]() [![SARIF](https://img.shields.io/badge/output-SARIF%202.1.0-444.svg)]()
`credsweep` 会在凭证、云密钥和私钥泄露到提交、CI 日志或公开仓库之前将其找出。它以**两套逐字节等价的实现**发布 —— 一个是兼容 POSIX 的 `bash` 脚本,另一个是跨平台的 `PowerShell` 脚本 —— 因此,在开发者的 Mac、Linux CI runner 和 Windows 构建代理上都能运行*相同*的扫描,且**无需安装任何东西**。无需 Python,无需 Go 二进制文件,无需 `npm install`,也不进行任何网络调用。 大多数密钥扫描器都很笨重(Docker 镜像、语言运行时、云账户)。 `credsweep` 则只有两个文件,你可以直接把它们扔进任何仓库里,花五分钟就能从头到尾读完。 ## 为什么会有这个项目 - **两种运行时,一套规则。** 安全团队使用 PowerShell;应用团队使用 bash。 `credsweep` 为双方提供了完全相同的 15 条规则检测引擎和完全相同的 JSON/SARIF 输出,因此无论谁运行扫描,扫描结果都是可比较的。 - **为 CI 而生。** 输出 **SARIF 2.1.0** 格式,因此结果会直接内嵌显示在 GitHub 的 *Security → Code scanning* 选项卡中,无需任何额外的配置。 - **天生的 pre-commit 属性。** 发现任何结果都会以非零状态码退出;内置了一个可直接符号链接的 git hook。 - **离线且可审计。** 无遥测,无需 API 密钥。可选的 AI 分类步骤完全是自主选择的。 ## 检测规则(15 条) | 提供商 / 类型 | 严重程度 | 提供商 / 类型 | 严重程度 | |---|---|---|---| | AWS Access Key ID (`AKIA…`) | HIGH | AWS Secret Access Key | CRITICAL | | GCP API key (`AIza…`) | HIGH | Google OAuth secret (`GOCSPX-`) | HIGH | | GitHub token (`ghp_/gho_/…`) | HIGH | GitHub fine-grained PAT | HIGH | | Slack token (`xox…`) | HIGH | Slack webhook URL | MEDIUM | | Stripe secret key (`sk_live_`) | CRITICAL | OpenAI key (`sk-…`) | HIGH | | Anthropic key (`sk-ant-…`) | HIGH | npm token (`npm_…`) | HIGH | | Azure Storage connection key | CRITICAL | Azure client secret | HIGH | | PEM private key block | CRITICAL | JWT | MEDIUM | 此外还有一个**可选的熵值规则** (`--entropy` / `-Entropy`),只有当数值的香农熵值超过一定阈值时,该规则才会标记常规的 `password=`/`token=`/`secret=` 赋值操作 —— 这大大减少了导致大多数常规扫描器无法使用的误报。 ## 安装 ``` git clone https://github.com/aharwelik/credsweep.git cd credsweep chmod +x credsweep.sh ``` 这就够了。你也可以选择将其符号链接到你的 `PATH` 中: ``` ln -s "$PWD/credsweep.sh" /usr/local/bin/credsweep ``` ## 使用方法 **Bash** ``` ./credsweep.sh . # scan current tree (human table) ./credsweep.sh src --format json # machine-readable JSON ./credsweep.sh . --format sarif > r.sarif ./credsweep.sh . --entropy # add high-entropy generic detection ./credsweep.sh . --no-fail # report but never break the build ./credsweep.sh . --exclude-dir fixtures --exclude-dir testdata ``` **PowerShell** (macOS / Linux / Windows) ``` ./credsweep.ps1 . # scan current tree ./credsweep.ps1 src -Format json ./credsweep.ps1 . -Format sarif > r.sarif ./credsweep.ps1 . -Entropy ./credsweep.ps1 . -NoFail ``` ### 在演示用例上尝试 该仓库包含一个生成器,它会写入一个充满(伪造)密钥的一次性项目 —— 不会将任何真实的密钥字面量提交到 git: ``` bash examples/generate-fixtures.sh # creates examples/leaky-project/ (gitignored) ./credsweep.sh examples # → 10 findings ``` ### 输出示例 ``` credsweep 1.0.0 — 10 finding(s) in examples CRITICAL examples/leaky-project/config.example.env:3 aws-secret-access-key aws_…****…EY HIGH examples/leaky-project/config.example.env:2 aws-access-key-id AKIA…****…LE MEDIUM examples/leaky-project/config.example.env:9 slack-webhook http…****…XX ``` 匹配到的密钥**默认会被掩码处理** (`first4…****…last2`)。仅在你确实需要原始值时才使用 `--show-secrets`。 ## CI 集成 (GitHub Actions) `credsweep` 内置了一个工作流 (`.github/workflows/ci.yml`),它会对两个脚本进行 lint,并在每次推送时对生成的用例运行扫描器。如果你想在你的仓库中拦截密钥泄露并将其显示在 Security 选项卡中: ``` - name: Scan for secrets run: ./credsweep.sh . --format sarif > credsweep.sarif - uses: github/codeql-action/upload-sarif@v3 with: sarif_file: credsweep.sarif ``` ## Pre-commit hook ``` ln -s ../../hooks/pre-commit .git/hooks/pre-commit ``` 现在,任何试图引入密钥的 `git commit` 操作都会在本地被拦截。 ## 可选的 AI 分类 对于需要书面风险摘要的团队,`credsweep` 可以将其 JSON 输出传递给 LLM 进行通俗易懂的分类(哪些密钥的风险最高,建议的轮换顺序)。这是一个**可选功能,且默认离线** —— 详情请参阅 [`docs/ai-triage.md`](docs/ai-triage.md)。核心扫描器永远不需要 API 密钥。 ## 工作原理 - 单个规则表 (`name | severity | case-flag | regex`) 驱动着两套实现中的检测逻辑,因此添加一个提供商只需在每个文件中编辑一行。 - 二进制文件和高噪音目录 (`.git`, `node_modules`, `vendor`, `dist`, `target`, `.terraform`, …) 会被自动跳过。 - 熵值门槛使用了从零开始编写的香农熵计算(无需依赖库),因此通用规则只会在真正的密钥上触发,而不会在 URL 这种长但低熵的字符串上触发。 ## 局限性(诚恳的说明) - 正则表达式 + 熵值检测的信号强度很高,但并不详尽 —— 应该将一次干净的扫描视为“未发现*已知模式*”,而不是安全的绝对证明。 - 提供商的前缀会存在重叠(例如 `sk-ant-…` 也会匹配更宽泛的 `sk-…` OpenAI 规则),因此一个 Anthropic 密钥可能会被两条规则同时报告。两者说的都是同一件事:请轮换它。 - 熵值阈值(3.5 比特/字符)是为常规密钥调优的;如果需要更严格的扫描,可以适当调低该数值。 ## 作者 **Anthony Harwelik** — 创始人,**Sole Priority LLC** / **BlueTech Green**。 专注于安全与 AI 工具、自动化以及云工程。 - Email: **aharwelik@gmail.com** - Web: **https://bluetechgreen.com** - GitHub: **[@aharwelik](https://github.com/aharwelik)** 欢迎就安全自动化和 AI 辅助的 DevSecOps 进行咨询与合作。 ## 许可证 [MIT](LICENSE) © Anthony Harwelik
标签:AI合规, Bash, IPv6, PowerShell, SARIF, StruQ, 应用安全, 开发安全, 敏感信息扫描