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报告查看器, 加密, 安全配置检查, 安全防御评估, 插件系统, 无后门, 漏洞扫描器, 离线工具, 系统运维, 请求拦截, 逆向工具