Mike-rk/vuln-Scanner
GitHub: Mike-rk/vuln-Scanner
一款离线、确定性输出的轻量级漏洞扫描器,用于检测 Docker 容器和小型 Linux 主机中的软件包 CVE 与安全配置问题。
Stars: 1 | Forks: 0
# 漏洞扫描器
适用于 Docker 容器和小型 Linux 主机的最小化、离线漏洞扫描器。
单次扫描,确定性,输出 JSON 格式。扫描时零网络调用。
## 项目结构
```
vuln-scanner/
├── src/
│ ├── scanner.py # CLI entry point + orchestration
│ ├── reporter.py # JSON report assembly, baseline diff, ignore list
│ ├── checks/
│ │ ├── packages.py # dpkg/apk inventory + CVE version checks
│ │ └── config.py # misconfiguration checks (root, socket, SUID, env secrets)
│ └── db/
│ └── signatures.json # offline CVE + misconfiguration signature DB
├── Dockerfile # Multi-stage Alpine build, non-root runtime
├── requirements.txt # Single dep: packaging (version parsing)
├── scan.json # Example report output
└── README.md
```
## 构建
```
docker build -t vuln-scanner:latest .
```
镜像大小目标:**< 80 MB**(python:3.12-alpine 基础镜像约 50 MB + 依赖项)。
## 运行
### 扫描运行中的容器(自扫描)
```
docker run --rm vuln-scanner
```
### 通过 volume 挂载扫描主机路径
```
docker run --rm \
-v /:/scan:ro \
vuln-scanner --target /scan
```
### 将报告写入挂载的输出目录
```
mkdir -p reports
docker run --rm \
-v /:/scan:ro \
-v $(pwd)/reports:/output \
vuln-scanner --target /scan --output /output/scan.json
```
### 基线对比 (Baseline diff) — 屏蔽上次扫描中已存在的发现结果
```
# 首次运行成为 baseline
docker run --rm -v $(pwd)/reports:/output \
vuln-scanner --output /output/baseline.json
# 后续运行:只有新发现出现在 summary.total_findings 中
docker run --rm -v $(pwd)/reports:/output \
vuln-scanner \
--baseline /output/baseline.json \
--output /output/scan.json
```
### 忽略列表
创建 `ignore.txt`(每行一个 CVE ID 或检查名称,`#` 用于注释):
```
# 此环境中的已知 false positive
CVE-2022-0778
running_as_root
```
```
docker run --rm \
-v $(pwd)/ignore.txt:/app/ignore.txt:ro \
vuln-scanner --ignore /app/ignore.txt
```
## CLI 参考
```
scanner --target PATH [options]
--target PATH Filesystem root to scan (default: /)
--output FILE Write JSON to FILE instead of stdout
--format json Output format; only json currently supported
--ignore FILE Ignore list: one CVE/check-name per line
--baseline FILE Previous scan.json; matching findings are suppressed
--show-suppressed Include suppressed findings in output
--log-level LEVEL info | warning | error (stderr, default: warning)
--sig-db FILE Custom signatures.json path
```
## 退出码
| Code | 含义 |
|------|----------------------------------|
| `0` | 无活跃发现结果 |
| `1` | 存在一个或多个发现结果 |
| `2` | 运行时错误(参数错误、I/O 等) |
适用于 CI 卡点:
```
# GitHub Actions 示例
- name: Vuln scan
run: |
docker run --rm \
-v ${{ github.workspace }}:/scan:ro \
vuln-scanner --target /scan
# Step fails automatically on exit code 1 or 2
```
## 已实现的检查
| Check | Module | Description |
|---|---|---|
| `package_version` | `checks/packages.py` | 将 dpkg/apk 安装的版本与 CVE DB 进行比对 |
| `running_as_root` | `checks/config.py` | 在扫描时检测 UID 0 |
| `docker_socket_exposed` | `checks/config.py` | 检测目标内部是否存在 `/var/run/docker.sock` |
| `world_writable_dir` | `checks/config.py` | 查找未设置 sticky bit 的全局可写目录 |
| `suid_binary` | `checks/config.py` | 查找意外的 SUID 二进制文件 |
| `secret_in_env` | `checks/config.py` | 检测环境变量中类似于 secret 的名称 |
## 通过新增检查进行扩展
1. 在 `src/checks/mycheck.py` 下添加一个新模块,其签名为 `run_all(target, signatures) -> list[dict]`。
2. 每个发现结果字典至少必须包含:`check`、`severity`、`detail`、`remediation`。
3. 将新的签名条目添加到 `src/db/signatures.json` 中对应的 key 下。
4. 在 `scanner.py` 的 `scan()` 函数内部导入并调用你的模块。
```
# scanner.py — 在 scan() 内部
from checks import mycheck
mycheck_findings = mycheck.run_all(target, signatures)
all_findings.extend(mycheck_findings)
```
无需其他更改。对于任何遵循标准字典 schema 的发现结果,报告器、忽略列表和基线对比都会自动生效。
## 本地运行(不使用 Docker)
```
pip install -r requirements.txt
python src/scanner.py --target / --log-level info
```
要求 Python 3.12+。
## 签名 DB 更新
`src/db/signatures.json` 是离线 DB。要对其进行扩展:
- 在 `"packages"` 下添加新 CVE 的条目(key = 包名)。
- 在 `"misconfigs"` 下添加新配置检查的条目。
- 这两个 key 都需要 `severity`(CRITICAL/HIGH/MEDIUM/LOW/INFO)和 `remediation` 字符串。
如需自动更新 DB,请在构建镜像之前,从受信任的上游源
(例如固定版本的 OSV 快照)替换 CI 中的 `signatures.json`。
标签:Claude, CVE检测, Docker, Python, Web报告查看器, 加密, 安全配置检查, 安全防御评估, 插件系统, 无后门, 漏洞扫描器, 离线工具, 系统运维, 请求拦截, 逆向工具