santhsecurity/keyhog
GitHub: santhsecurity/keyhog
一款轻量、高性能的Rust秘密扫描器,可快速发现代码、Git历史、容器和云存储中的敏感凭证。
Stars: 73 | Forks: 9
属于 Santh · 博客 · @SanthProject
**keyhog** 扫描源代码树、Git 历史、Docker 镜像、S3 存储桶以及运行中的系统,以查找泄露的凭证。**894 个服务特定检测器**、解码穿透(base64/hex/url/protobuf)、置信度评分、SARIF 输出、零运行时配置。默认的 `keyhog scan .` 开箱即用。 ### 将其添加到你的 CI(一个工作流文件) ``` # .github/workflows/keyhog.yml name: keyhog on: [push, pull_request] permissions: { contents: read, security-events: write } jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: santhsecurity/keyhog/.github/actions/keyhog@v0.5.37 with: { path: ., severity: high, format: sarif } ``` 对你的 CI 的成本:约 20 MB 二进制下载(可缓存)、托管运行器上约 400 ms 冷启动(GPU 自动禁用、SIMD 路径)、5,000 文件仓库约 10 s 挂钟时间。单一 `libhyperscan5` apt 包,无需 Python、无需 JVM、无需 Docker 守护进程。扫描结果以 SARIF 格式自动上传到 GitHub 代码扫描;通过提交基线(`keyhog scan --create-baseline .keyhog-baseline.json`)可在不破坏现有树的情况下采用,这样操作仅在发现新秘密时失败。 对于超精简 CI 安装,现在可以使用 `cargo install keyhog --no-default-features --features ci`:13 MB 二进制(相比于完整版的 22 MB)、约 140 ms 冷启动、无 Hyperscan 依赖、无 wgpu/Vulkan 探测、无 libstdc++ 链接。同样 894 个检测器,同样 ML/熵/解码/多行数据路径。在自构建的 CI 镜像此配置,适用于二进制大小或容器冷启动重要的场景;上述预构建安装程序仍然是开箱即用的单二进制下载默认选择。 GitLab CI、CircleCI、Drone、BuildKite、Jenkins、Bazel、pre-commit、Husky、lefthook 配置: [`docs/DROP_IN_USAGE.md`](docs/DROP_IN_USAGE.md)。 ### 工作原理 keyhog 将其 894 个检测器编译为单个 Hyperscan NFA 数据库,在匹配前先解码嵌套编码,通过贝叶斯 Beta(α,β) 反馈为每个检测器校准置信度,并将每次扫描路由到当前最快的硬件后端: | 层 / 后端 | 何时 | 如何 | |---|---|---| | `simdsieve` 预过滤器 | AVX-512 / AVX2 / NEON | 第 1 层:在正则表达式后端运行之前,以最高 **50 GB/s** 的速度扫描每个文件,寻找 8 个最高价值秘密前缀(AWS `AKIA`/`ASIA`、GitHub `ghp_`、OpenAI `sk-proj-`、Slack `xoxb-`/`xoxp-`、SendGrid `SG.`、Square `sq0csp-`) | | `gpu-zero-copy` | 独立 GPU + 扫描大小 ≥256 MiB | 通过 WGPU(跨平台)或可选的 CUDA 后端在 GPU 上运行 vyre AC 自动机 | | `simd-regex` | AVX-512 / AVX2 / NEON + Hyperscan | 并行多模式 NFA,约 500 MB/s | | `cpu-fallback` | 无 SIMD、无 GPU | Aho-Corasick 前缀 + Rust `regex` 提取 | `simdsieve` 预过滤器是一个性能层,而非独立的检测器:命中结果会在其**规范检测器 ID**(`aws-access-key`、`github-classic-pat`、`slack-bot-token`……)下呈现——在所有平台和构建上相同,无论是由快速路径还是完整正则引擎发现的。 后端选择是自动的。启动时: ``` keyhog v0.5.37 | 16 cores | SIMD: AVX-512 | Hyperscan | 894 detectors ``` **完整文档:** [santhsecurity.github.io/keyhog](https://santhsecurity.github.io/keyhog/) – 安装、首次扫描、输出格式、检测内部机制、抑制、验证、pre-commit + CI 集成、CLI 参考、退出码、环境变量、贡献。源码位于 `docs/`。 ## 安装 ``` # Linux / macOS curl -fsSL https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.sh | sh # Windows (PowerShell) iwr https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.ps1 -useb | iex # 从源代码 (任意平台) git clone https://github.com/santhsecurity/keyhog.git cd keyhog && cargo build --release -p keyhog # 从 crates.io cargo install keyhog --no-default-features --features portable ``` 适用于 **Linux**、**macOS**(Intel + Apple Silicon)、**Windows**。零配置。`keyhog scan .` 开箱即用。 安装程序会自动检测主机状态并选择合适的默认值: **所有地方都使用 WGPU + SIMD**,包括 Linux NVIDIA 主机——WGPU 通过 vulkan 后端在 GPU 上运行相同的 vyre AC / RulePipeline 调度,二进制更小且无 `libcuda.so` 运行时依赖。专用的 `keyhog-linux-x86_64-cuda` 变体仅在完整的 CUDA 工具包存在时(nvcc 在 PATH 上、`$CUDA_HOME` 已设置或 `/usr/local/cuda` 存在)才会自动选择——这表明您正在积极使用 CUDA 开发环境,而不仅仅是安装了 NVIDIA 驱动。Apple Silicon 主机将收到明确的“Metal GPU 加速即将推出”提示。每次下载都会在安装前根据发布端的校验和文件进行 SHA256 验证。 使用 `KEYHOG_VARIANT=cuda`(强制原生 CUDA 构建,运行时需要 `libcuda.so`)或 `KEYHOG_VARIANT=cpu`(强制默认的 WGPU + SIMD 构建,跳过 GPU 检测)覆盖变体。使用 `KEYHOG_VERSION=v0.5.37` 固定版本。使用 `KEYHOG_INSTALL=/usr/local/bin` 更改安装目录。 同一脚本包含三种诊断模式: ``` sh install.sh --diagnose # print host + binary state, change nothing sh install.sh --repair # re-download the right variant for this host sh install.sh --uninstall # remove the binary (leaves PATH entries alone) ``` 对于交互式安装(变体提示 + 安装后向导,用于 PATH、shell 补全、Claude Code / Cursor 钩子、git pre-commit 钩子),请先下载脚本而不是直接通过 sh 管道执行: ``` curl -fsSL https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.sh \ -o keyhog-install.sh sh keyhog-install.sh ``` 守护进程模式(亚 100 ms 的 pre-commit 扫描)仅适用于 Unix。其他所有功能在 Windows 上相同。 ## 保持 keyhog 健康并更新 安装后,keyhog 会自我维护——安装脚本仅用于首次安装: ``` keyhog doctor # health check: host probe + end-to-end scan self-test keyhog backend --self-test --json # CI-readable GPU path health proof keyhog update # self-update to the latest release (verified download + atomic swap) keyhog update --check # is a newer release available? (exits 10 if yes, 0 if current) keyhog update --variant cuda # update to the CUDA build instead of the portable one keyhog repair # reinstall a known-good binary if the self-test fails (--force to force) keyhog uninstall # remove the binary (dry run; pass --yes to actually delete) ``` `keyhog doctor` 重用扫描器自身的硬件探测并运行真正的端到端自检——它会植入一个合成秘密并确认二进制能够检测到它——因此这是权威的“keyhog 能否在此工作?”检查(安装程序会在安装后自动运行它)。`update` 和 `repair` 通过 HTTPS 下载发布二进制,使用 keyhog 的内嵌公钥验证其 minisign 签名,并以原子方式替换运行中的二进制;拒绝被篡改或签名不匹配的二进制。在健康的主机上,`keyhog update` 是一键升级路径。 `keyhog backend --self-test --json` 是供自托管运行器使用的机器可读 GPU 健康检查。当生产 GPU 扫描路径在运行时降级时,它以退出码 `4` 退出,并输出稳定的 `ok`、`status`、`exit_code`、`recommended_backend` 及每个探测的字段,用于 CI 路由。 ## 快速入门 ``` keyhog scan . # scan a directory keyhog scan --git-staged # pre-commit: only staged blobs keyhog scan --git-diff main # files changed since base ref keyhog scan --git-history . # every commit, every branch keyhog scan --docker-image registry/app:v1 # Docker image layers keyhog scan --s3-bucket logs-prod --s3-prefix / # S3 objects (--s3-endpoint for non-AWS) keyhog scan --github-org acme --github-token "$GH_PAT" # every repo in a GitHub org (PAT required) keyhog scan-system --space 50G # walk every drive, every git history ``` 交互式仪表板: ``` keyhog tui demo # live finding feed + GPU panel + stats keyhog tui . --throttle-ms 200 # paced scan, useful for recordings/demos ``` 过滤、格式化、门控: ``` keyhog scan . --severity high # info | low | medium | high | critical keyhog scan . --min-confidence 0.5 # raise the ML floor keyhog scan . --format sarif -o keyhog.sarif # GitHub code scanning keyhog scan . --verify # live-verify against vendor APIs keyhog scan . --baseline .keyhog-baseline.json # only NEW findings vs snapshot keyhog scan . --fast # pre-commit speed (skip ML + decode) keyhog scan . --deep # max detection depth keyhog scan . --incremental # BLAKE3 Merkle skip → 10–100× CI loop ``` 退出码:`0` 干净、`1` 发现结果高于严重性阈值、`2` 用户错误(错误路径、错误配置、不支持的标志)、`3` 系统错误或检测器语料审计失败、`4` `backend --self-test` 失败、`10` 发现实时凭证(需要 `--verify`)、`11` 扫描线程在扫描过程中崩溃(状态不可靠,信任前请重新运行)。与 `keyhog --help` 一致。 ## 它能捕获什么 894 个服务特定检测器,带有校验和 / 配套验证: - **云提供商**:AWS(访问密钥 + 密钥 + STS 验证)、Azure(订阅密钥、存储账户密钥、SAS)、GCP(服务账户、API 密钥)、Cloudflare、Heroku、Vercel、Supabase。 - **支付处理器**:Stripe、Braintree、Razorpay、Paddle、Plaid、Square、PayPal——所有都要求配套验证(没有对应的公钥时,Braintree 私钥永远不会触发)。 - **源码托管平台**:GitHub PAT(带 CRC32 校验和)、GitLab 令牌、Bitbucket 应用密码、npm 令牌(带校验和)、Gitea / Forgejo / Codeberg。 - **身份验证 / SSO**:Okta、Auth0、Clerk、JumpCloud、Kinde。 - **通讯**:Slack、Discord、Twilio、SendGrid、Postmark、Mailgun、Resend、Loops。 - **AI / ML**:OpenAI(sk-/sk-proj-)、Anthropic、Google AI Studio、Cohere、Mistral、HuggingFace、Replicate。 - **数据库**:Postgres 连接字符串、MongoDB Atlas、Supabase service-role、PlanetScale、Neon、Turso、MySQL、Redis URL。 - **通用 + 熵回退**:`API_KEY=<高熵数据块>` 捕获没有命名检测器的凭证,通过上下文熵阈值 + ML 评门控。 - **加密材料**:RSA / EC / SSH 私钥、PGP 私钥块、JWT 签名秘密。 每个检测器作为一个 [TOML 文件](./detectors/)(数据,而不是代码)提供:服务元数据、正则模式、关键词、配套字段、验证处理器。添加一个新检测器只需要 5–10 行 TOML;[贡献者指南](./CONTRIBUTING.md) 会引导您完成。 浏览完整目录:[`/site/detectors.html`](./site/detectors.html)——加载所有 894 个检测器,支持严重性 + 服务 + 关键词过滤。 ## 为什么召回率更高、误报更少 - **解码穿透扫描**:Kubernetes `Secret` 清单、JWT 负载、base64 包装的环境变量、Helm values、docker-config `auth:` 数据块——结构化预处理器会就地解码它们,并将明文馈送给每个下游检测器,因此检测器无需各自重新实现解码。 - **多行重组**:JavaScript 中的 `"sk-proj-" + \` 续行、YAML 多行字符串、Makefile 反斜杠续行、Helm / Jinja 模板化输出——全部在正则匹配前重新组装。 - **配套验证**:没有 40 字符密钥的 AWS 访问密钥?跳过。没有身份验证令牌的 Twilio API 密钥?跳过。对于高噪声检测器,需要双信号确认,从而削减了经典的 `git log -G ghp_` 误报集群。 - **置信度评分**:每个发现结果都带有一个 `[0.0, 1.0]` 的分数,由香农熵、周围上下文、配套匹配、校验和(GitHub CRC32、npm、Slack)和一个小型 ML 分类器(约 30k 参数)共同决定。默认阈值 `0.3` 过滤掉低质量匹配,而不会隐藏真正的秘密。 - **贝叶斯每个检测器校准**:`keyhog calibrate --fp generic-api-key` 提供 Beta(α,β) 后验,会抑制在您的代码库中错误触发的检测器,随着时间推移自动优化,无需手动调整规则。 ## 性能 与 BetterLeaks、Kingfisher、TruffleHog 和 Titus 进行直接比较,由 [`benchmarks/`](benchmarks/) 中的可重现测试框架进行相同评分:遵循 SecretBench 包含规则,**从每个扫描器的扫描树中排除**真实答案清单,因此没有工具会看到答案键。下表由 `make -C benchmarks report` 生成——**请勿手动编辑。** ### 检测排行榜 语料库:**mirror**——15000 个测试样本,3000 个标记为正例。每个扫描器的评分相同(SecretBench 重叠规则);答案键清单已从扫描树中排除。 | 排名 | 扫描器 | F1值 | 精确率 | 召回率 | 发现数 | 耗时 | 峰值内存 | |---|---|---|---|---|---|---|---| | 1 | **KeyHog** | **0.9108** | 0.9868 | 0.8457 | 2583 | 1.94s | 1077 MB | | 2 | TruffleHog | 0.5265 | 1.0000 | 0.3573 | 1072 | 1.73s | 308 MB | | 3 | Kingfisher | 0.4720 | 0.3912 | 0.5947 | 5241 | 4.88s | 421 MB | | 4 | Titus | 0.4127 | 0.3318 | 0.5457 | 5159 | 2.53s | 117 MB | | 5 | Nosey Parker | 0.4078 | 0.3414 | 0.5063 | 4532 | 0.75s | 285 MB | | 6 | BetterLeaks | 0.3585 | 0.2313 | 0.7967 | 10828 | 0.77s | 192 MB | ### 速度与内存 | 扫描器 | 配置 | 语料库 | 耗时 | 吞吐量 | 峰值内存 | |---|---|---|---|---|---| | Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.75s | 3.1 MB/s | 285 MB | | BetterLeaks | `default-nocache-nodaemon-no-validate` | mirror | 0.77s | 3.0 MB/s | 192 MB | | TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.73s | 1.3 MB/s | 308 MB | | KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.94s | 1.2 MB/s | 1077 MB | | Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.53s | 0.9 MB/s | 117 MB | | BetterLeaks | `default-nocache-nodaemon-no-validate` | creddata | 3.07s | 316.5 MB/s | 261 MB | | KeyHog | `simd-nocache-nodaemon-full` | creddata | 3.95s | 246.1 MB/s | 2035 MB | | Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.88s | 0.5 MB/s | 421 MB | | Kingfisher | `default-nocache-nodaemon-low-no-validate` | creddata | 8.13s | 119.4 MB/s | 657 MB | ### 按类别差距(竞争者仍占优的领域) | 类别 | KeyHog F1值 | 最佳竞争者 | 差距 | 竞争者总体精确率 | |---|---|---|---|---| | `generic-high-entropy-string` | 0.446 | BetterLeaks 0.893 | +0.447 | 0.231 | 重现:`make -C benchmarks bench` 会在 15k SecretBench-mirror 语料库上运行每个扫描器,并将结果写入 `benchmarks/results/标签:base64解码, DevSecOps, Docker镜像扫描, Git扫描, Hyperscan, protobuf解码, Rust, S3扫描, SARIF, URL解码, 上游代理, 云安全监控, 凭据泄漏, 十六进制解码, 可视化界面, 开源, 源代码审计, 秘密扫描, 网络流量审计, 置信度评分, 通知系统, 零配置, 静态分析