ManassYPanicker/Secret-scanner
GitHub: ManassYPanicker/Secret-scanner
一款基于上下文感知与香农熵评分来降低误报率的 Python 硬编码密钥扫描器,可集成为 GitHub Action 在 CI/CD 流水线中自动检测敏感凭证泄露。
Stars: 0 | Forks: 0
# Secret Scanner
一款基于 Python 的 CLI 工具,旨在扫描目录中的硬编码 secret。它可以检测 7 种类型的硬编码 secret(AWS Access Key ID、AWS Secret Key、通用 API Key、私钥块、数据库连接字符串、Slack Token 和 GitHub Token),并利用基于文件路径、周围关键字和香农熵的上下文感知置信度评分来减少误报。
## 功能
- **7 种 Secret 类型检测器**:精确匹配 AWS、API Key、私钥、数据库、Slack 和 GitHub Token 的常见格式。
- **三因素置信度评分**:通过分析路径上下文、周围的占位符关键字和字符串熵,过滤掉干扰性的占位符/虚假凭证。
- **适配 GitHub Action**:可轻松集成到你的 CI pipeline 中,用于扫描 PR 并以评论形式发布 Markdown 摘要。
- **[经基准测试验证的降噪效果](#benchmark-results)**:在海量的真实仓库中进行了测试,可显著降低误报率。
## 项目结构
- `scanner/patterns.py`:7 种 Secret 类型的正则表达式和定义。
- `scanner/entropy.py`:香农熵计算逻辑,用于区分随机生成的 secret 和低熵的占位符。
- `scanner/context.py`:可疑路径和关键字列表,以及需排除的二进制文件扩展名。
- `scanner/core.py`:主要的扫描和置信度评分循环。
- `cli.py`:命令行界面入口。
- `benchmark.py`:用于测试各仓库中原始匹配与过滤后匹配结果的基准测试脚本。
- `action.yml`:GitHub Action 元数据定义。
- `Dockerfile`:将扫描器作为 GitHub Action 运行的容器定义。
- `tests/`:全面的单元测试套件。
## 安装
```
git clone
cd secret-scanner
pip install -r requirements.txt
```
## 用法
要扫描目录中的 secret,请运行 `cli.py` 脚本并传入目录路径:
```
python cli.py
```
### 示例
```
python cli.py ./my_project
```
该脚本会将所有发现以 JSON 格式输出到标准输出(并附带文本摘要)。作为 GitHub Action 运行时,它会生成 Markdown 摘要。
## 基准测试结果
### 测试方法
为了测试扫描器基于上下文感知的误报消除能力,我们针对三个大型的真实 Python 仓库(`boto3`、`aws-cli` 和 `stripe-python`)进行了基准测试,这些仓库以包含大量测试夹具和示例文档而闻名。我们对比测量了“原始匹配数”(被简单正则模式捕获的发现)、“可审查”匹配数(高置信度+中置信度的发现)以及“已抑制”匹配数(被系统成功作为虚假或占位符凭证过滤掉的低置信度发现)。
### 结果
| 仓库 | 原始匹配数 | 可审查 (高+中) | 已抑制 (低) | 降噪比例 |
|---|---|---|---|---|
| boto3 | 3 | 1 | 2 | 66.7% |
| aws-cli | 306 | 126 | 180 | 58.8% |
| stripe-python | 0 | 0 | 0 | N/A |
| **总计** | **309** | **127** | **182** | **58.9%** |
### 这些数据意味着什么
我们扫描器的改进分为两个阶段。首先,通过改进基础的正则表达式模式并排除常见的二进制/编码文件(如 `.crt` 或 `.pem`),将总的原始匹配数从惊人的 2,533 个减少到了 309 个,成功消除了大量由 Git commit 哈希和 SSL 证书等引起的误报。在这个清理过后的基准之上,我们的上下文感知评分层——通过分析文件路径、周围关键字和香农熵——进一步抑制了剩余匹配结果中 58.9% 的低置信度噪音。这使得在三个庞大的仓库中,最终只剩下 127 个真正需要人工审查的发现。
### 局限性
需要注意的是,该基准测试是在三个同类型的仓库(包含大量文档的 Python SDK/CLI)上进行的,因此在具有不同命名约定的代码库中,结果可能会有所不同。例如,如果一个仓库将 mock 数据存储在名为 `mock_data/` 而不是 `tests/` 的文件夹中,则需要扩展我们的 `SUSPICIOUS_PATH_SEGMENTS` 列表才能达到相同的降噪效果。此外,该工具目前仅支持 7 种特定的 Secret 类型,并不能完全替代像 Gitleaks 或 TruffleHog 这样全面的企业级工具。它的作用是展示一种极其有效且切实可行的上下文感知误报消除方案。
## 作为 GitHub Action 使用
你可以轻松地将此工具集成到你的 GitHub Actions CI pipeline 中,用于扫描 pull request 并防止 secret 被合并。
将以下工作流文件添加到你的仓库的 `.github/workflows/secret-scanner.yml` 路径下:
```
name: Secret Scanner PR Check
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Run Secret Scanner
id: secret_scanner
uses: yourusername/secret-scanner@v1
with:
scan-path: '.'
fail-on-high: 'true'
- name: Post Summary to PR
if: always()
uses: actions/github-script@v7
with:
script: |
const summary = `${{ steps.secret_scanner.outputs.markdown-summary }}`;
if (summary && summary.trim() !== "") {
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: summary
})
}
```
标签:LNA, meg, Python, StruQ, 信息安全, 动态分析, 安全助手, 无后门, 请求拦截, 逆向工具