The Most Comprehensive Docker Security Scanner
当前访问频次受限,请登录后继续访问
目录
Warning
2.0.6 及更早版本会静默地报告软件包 CVE 数量为零。 一个查询缺陷导致软件包漏洞检查在每次扫描时失败并丢弃错误,因此旧版二进制文件无论镜像或数据库如何,始终显示 0 个软件包 CVE 结果。强烈建议升级到 v2.1.0 或更高版本 —— 这是软件包 CVE 检测真正可用的第一个版本。
概述
DockerScan v2 是面向 Docker 容器和镜像的下一代安全扫描器,使用 Go 完全重写。它基于 2024—2025 年最新研究、行业标准(CIS Benchmark、NIST SP 800-190)以及生产环境中发现的真实攻击模式,融合了多种安全扫描技术。
为什么选择 DockerScan v2?
- 覆盖全面:将 5 种以上安全扫描技术整合到一个工具中
- 最新研究:基于 2024—2025 年供应链攻击和 CVE
- 生产可用:提供 SARIF 输出用于 CI/CD,并提供退出码以支持自动化
- 速度极快:使用 Go 编写,并支持并发扫描
- 易于扩展:采用插件架构,支持自定义扫描器
- 源码可获取:免费用于内部使用、教学、研究以及非竞争性商业用途(参见 License)
功能
安全扫描模块
1. CIS Docker Benchmark v1.7.0
提供完整的合规检查,包含 80 多项自动化控制项:
- 主机配置安全(13 项检查)
- Docker daemon 加固(18 项检查)
- 文件与目录权限(9 项检查)
- 容器镜像最佳实践(13 项检查)
- 运行时安全验证(31 项以上检查)
- 安全运维合规
2. 供应链攻击检测
基于 2024 年真实攻击活动:
- 无镜像容器检测 - 识别没有实际镜像层的恶意容器(在 Docker Hub 发现 400 万多个)
- 加密货币挖矿检测 - 检测挖矿恶意软件(已检测 12 万多次恶意镜像拉取)
- 后门依赖库检测 - 发现被入侵的依赖项(xz-utils、liblzma 事件)
- 镜像签名验证 - 使用 Notary/Cosign 验证签名
- 钓鱼内容检测 - 扫描文档中的社会工程内容
- 恶意网络目的地 - 识别 C2 服务器、矿池和 Tor 节点
3. 高级敏感信息检测
包含 40 多种敏感信息模式,覆盖现代 API(2024 年更新):
- 云服务提供商:AWS、GCP、Azure 凭证
- 版本控制:GitHub、GitLab、Bitbucket token
- AI/ML API:OpenAI、Anthropic、Hugging Face 密钥
- 支付:Stripe、PayPal、Square 密钥
- 通信服务:Slack、SendGrid、Twilio、Mailchimp
- 身份认证:JWT token、OAuth token
- 加密:私钥(RSA、SSH、PGP、EC、DSA)、证书
- 数据库:PostgreSQL、MySQL、MongoDB 连接字符串
- Docker:Registry 认证 token
- 熵分析:对未知敏感信息进行 Shannon 熵计算(阈值 >4.5)
4. CVE 与漏洞扫描
检测 2024—2025 年关键 CVE:
- CVE-2024-21626 - runc 容器逃逸(CVSS 8.6)
- CVE-2024-23651 - BuildKit 缓存投毒 RCE(CVSS 9.1)
- CVE-2024-23652 - BuildKit 竞态条件(CVSS 7.5)
- CVE-2024-23653 - BuildKit 权限提升
- CVE-2024-8695/8696 - Docker Desktop RCE(CVSS 8.8)
- CVE-2025-9074 - Docker Desktop 本地访问漏洞
- 生命周期结束的基础镜像检测
- 已知存在漏洞的软件包扫描
5. 运行时安全分析
容器运行时加固检查:
- Linux Capabilities 审计 - 检测危险 capability(CAP_SYS_ADMIN、CAP_NET_ADMIN 等)
- Seccomp Profile 验证 - 确保已启用系统调用过滤
- AppArmor/SELinux 检查 - 验证强制访问控制
- 特权容器检测 - 识别拥有完整主机访问权限的容器
- 命名空间隔离 - 检查 PID、IPC、网络和用户命名空间
- 容器逃逸迹象 - 检测常见容器逃逸技术
报告与集成
- JSON - 面向自动化流程的机器可读输出
- SARIF - 原生集成:
- GitHub 安全页签
- Azure DevOps
- VS Code 扩展
- GitLab 安全仪表盘
- 精美的 CLI - 带表情符号的彩色严重级别
- 退出码 - 兼容 CI/CD(0=无问题,1=警告,2=严重)
性能
- 速度提升 10 倍,相比 Python 替代方案
- 并发扫描,使用 Go goroutine
- 低内存占用(约 50-100MB)
- 单一二进制文件 - 无依赖
v2.1.0 更新内容
版本 2.1.0(发布于 2026-07-13)全面重构了 CVE 数据管道与软件包漏洞匹配:
- 基于 MITRE cvelistV5 构建的 CVE 数据库 - 数据库现在基于官方 MITRE cvelistV5 每日快照生成,而不再依赖 NVD API。无 NVD API 依赖、无 API 密钥,且无速率限制。
- 软件包 CVE 检测全链路修复 - 软件包到 CVE 的匹配逻辑已围绕 dpkg 风格版本比较器(Debian Policy 5.6.12)重写,并使用按(供应商、产品)划分的版本范围实现精准匹配。
- 供应商验证的别名匹配 - 匹配结果现在携带
vendor_verified检测元数据。仅凭名称的匹配会被明确标记,并包含修复注意事项,以便区分供应商验证匹配和启发式匹配。 - 派生修复信息 -
FixedVersion根据匹配到的版本范围推导得出,并包含回移披露元数据(match_basis、distro_revision),确保发行版回移修复不会被误报为存在漏洞。 - 可选的 NVD CVSS 增强 - 一个尽力而为的增强步骤可通过
--enrich-from-nvd、--enrich-only和--enrich-timeout从 NVD API 拉取 CVSS 评分。该步骤为非阻塞,且在 CI 中可安全跳过(不会导致构建失败)。
v2.0 有哪些新变化?
DockerScan v2.0 是一次从头开始的完整重写。与 v1.x 相比,变化如下:
主要变化
| 功能 | v1.x(Python) | v2.0(Go) |
|---|---|---|
| 语言 | Python 3.5+ | Go 1.21+ |
| 性能 | 约 500 个镜像/小时 | 约 5000 个镜像/小时 |
| 内存使用量 | 200-500 MB | 50-100 MB |
| 分发方式 | pip 安装 + 依赖 | 单一二进制文件 |
| 安全扫描器 | 2 个模块 | 5 个模块 |
| CIS 基准 | 部分支持 | 完整 v1.7.0(80+ 项检查) |
| 供应链 | 不可用 | 基于 2024 年研究 |
| 密钥模式 | 10 种模式 | 40+ 种模式 |
| CVE 检测 | 基础 | 2024-2025 年 CVE |
| 运行时安全 | 不可用 | 完整能力审计 |
| SARIF 输出 | 不可用 | 完整支持 |
| CI/CD 集成 | 手动 | 原生(退出码、SARIF) |
v1.x 中保留的内容
- 攻击工具 - 镜像木马化能力(v2.1 即将推出)
- 镜像仓库操作 - 推送、拉取和删除操作(v2.1 即将推出)
- 网络扫描 - Docker 镜像仓库发现(v2.1 即将推出)
v2.0.5 新增内容
- 私有镜像仓库认证 - 完整支持扫描来自私有镜像仓库的镜像(修复 #24)
- 多镜像仓库支持 - Docker Hub、GHCR、ECR、GCR、ACR、GitLab 以及自建镜像仓库
- 多种认证方式 - 环境变量(CI/CD)、CLI 参数(测试)、Docker 配置文件(无缝)
- 智能认证优先级 - CLI 参数 > 环境变量 > Docker 配置(自动选择)
- 增强错误提示 - 针对特定镜像仓库的提示(ECR 令牌过期、速率限制、证书)
- 全面测试 - 64 个测试用例,91.2% 覆盖率,并针对真实私有镜像仓库进行测试
- 完整文档 - 提供所有主流云镜像仓库和认证方式的示例
v2.0.4 新增内容
- CVE 数据库集成 - 包含 NVD 数据的本地 SQLite 数据库(覆盖 2.5 年的 CVE)
- 每日自动更新 - GitHub Action 每日更新 CVE 数据库
- CVE 并行下载 - 4 个并发进程,加快数据库构建(nvd2sqlite)
- 带退避的重试 - 对受速率限制的 NVD API 请求自动重试
--from-file参数 - 从本地文件安装 CVE 数据库(离线/物理隔离)- 安静模式(
-q) - 在 CI/CD 流水线中隐藏启动横幅 - 减少误报 - 通过熵值过滤提升敏感信息检测能力
为什么重写?
- 性能 - 借助 goroutines,Go 可提供 10 倍更快的扫描速度
- 现代威胁 - 纳入 2024-2025 年的攻击模式
- 企业级就绪 - SARIF 输出、退出码、单二进制文件分发
- 可扩展性 - 清晰的插件架构,便于自定义扫描器
- 可维护性 - 类型安全、更完善的错误处理、更便于贡献
安装
选项 1:下载预构建二进制文件(推荐)
预编译二进制文件会通过 GitHub Actions 针对每个版本标签自动构建并发布。
支持的平台:
- Linux:amd64、arm64、386
- macOS:amd64(Intel)、arm64(Apple Silicon)
- Windows:amd64、arm64、386
- FreeBSD:amd64
Linux(amd64)
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/
Linux (arm64)
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-arm64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/
macOS (Intel)
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-darwin-amd64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/
macOS(Apple Silicon)
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-darwin-arm64 -o dockerscan
chmod +x dockerscan
sudo mv dockerscan /usr/local/bin/
Windows (PowerShell)
Invoke-WebRequest -Uri "https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-windows-amd64.exe" -OutFile "dockerscan.exe"
验证下载(可选,但推荐)
# Download checksums
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/checksums.txt -o checksums.txt
# Verify (Linux/macOS)
sha256sum -c checksums.txt --ignore-missing
选项 2:从源码构建
# Clone repository
git clone https://github.com/cr0hn/dockerscan
cd dockerscan/dockerscan-v2
# Build
make build
# Install
sudo make install
# Or build manually
go build -o bin/dockerscan ./cmd/dockerscan
选项 3:Go 安装
go install github.com/cr0hn/dockerscan/v2/cmd/dockerscan@latest
快速开始
首次配置
扫描前,请下载 CVE 数据库(每日更新,压缩包约 30MB):
# Download latest CVE database from GitHub
dockerscan update-db
提示:该数据库每天通过 GitHub Actions 更新。请定期运行
update-db,以获取最新的 CVE 数据。
基础扫描
# Scan a Docker image
dockerscan nginx:latest
# Scan with specific scanners
dockerscan --scanners cis,secrets ubuntu:22.04
# Scan and save reports
dockerscan alpine:latest --output /tmp/reports
# Quiet mode (suppress banner)
dockerscan -q nginx:latest
示例输出
╔══════════════════════════════════════════════════════════════════════════╗
║ ██████╗ ██████╗ ██████╗██╗ ██╗███████╗██████╗ ███████╗ ██████╗ █████╗ ███╗ ██╗
║ ██╔══██╗██╔═══██╗██╔════╝██║ ██╔╝██╔════╝██╔══██╗██╔════╝██╔════╝██╔══██╗████╗ ██║
║ ██║ ██║██║ ██║██║ █████╔╝ █████╗ ██████╔╝███████╗██║ ███████║██╔██╗ ██║
║ ██║ ██║██║ ██║██║ ██╔═██╗ ██╔══╝ ██╔══██╗╚════██║██║ ██╔══██║██║╚██╗██║
║ ██████╔╝╚██████╔╝╚██████╗██║ ██╗███████╗██║ ██║███████║╚██████╗██║ ██║██║ ╚████║
║ ║
║ Advanced Docker Security Scanner v2.0.0 ║
║ ║
║ Author: Daniel Alfocea (cr0hn) ║
║ Website: https://danielalfocea.com ║
╚══════════════════════════════════════════════════════════════════════════════════════╝
🔍 Scanning image: nginx:latest
═══════════════════════════════════════════════════════════════════
SCAN RESULTS
═══════════════════════════════════════════════════════════════════
📊 Summary:
Total Findings: 47
Duration: 2.3s
🔴 By Severity:
Critical: 8
High: 15
Medium: 18
Low: 6
📁 By Category:
CIS-Benchmark: 12
Secrets: 8
Supply-Chain: 5
Vulnerability: 10
Runtime-Security: 12
📄 JSON report saved to: dockerscan-report.json
📄 SARIF report saved to: dockerscan-report.sarif
使用方法
命令行选项
dockerscan [COMMAND] [OPTIONS] <IMAGE>
Commands:
scan Scan a Docker image (default)
update-db Download or update the CVE database
Options: --from-file <path> Install from local SQLite file
version Show version information
help Show help message
Options:
-h, --help Show help message
-v, --version Show version
-q, --quiet Suppress banner output (quiet mode)
--scanners SCANNERS Comma-separated list of scanners to run
(default: all)
Options: cis,secrets,supplychain,vulnerabilities,runtime
--output DIR Output directory for reports (default: .)
--only-critical Show only critical/high severity findings
--verbose, -v Show scan progress (scanner names, findings count, image pull status). Output to stderr.
--debug Show verbose output plus internal errors and technical details. Output to stderr.
Authentication (for private registries):
--registry-user <username> Registry username
--registry-password <password> Registry password (not recommended, use env vars)
--registry <url> Registry URL (optional, auto-detected from image)
--docker-config <path> Path to Docker config file (default: ~/.docker/config.json)
Environment variables (recommended for CI/CD):
DOCKER_USERNAME or REGISTRY_USERNAME Registry username
DOCKER_PASSWORD or REGISTRY_PASSWORD Registry password or token
DOCKER_REGISTRY or REGISTRY Registry URL (optional)
Exit Codes:
0 No issues found
1 HIGH severity issues found
2 CRITICAL severity found
示例
# Scan with all scanners (default)
dockerscan myapp:latest
# Only run specific scanners
dockerscan --scanners secrets,supplychain redis:7
# Save reports to specific directory
dockerscan --output /var/reports postgres:14
# Only show critical issues
dockerscan --only-critical production-app:v1.0
# Ver progreso del scan (scanner names, findings count, image pull status)
dockerscan --verbose ubuntu:22.04
# Debug detallado (errores internos, detalles técnicos)
dockerscan --debug ubuntu:22.04
# Scan private registry images (see Authentication section below)
dockerscan ghcr.io/myorg/private-app:v1.0
私有镜像仓库身份验证
DockerScan 支持通过三种方式对私有镜像仓库进行身份验证:
方法 1:Docker 配置文件(推荐本地使用)
最便捷的方式——使用您现有的 Docker 凭据:
# First, authenticate with your registry using Docker
docker login ghcr.io
# Username: your-username
# Password: ghp_your-token-here
# Now DockerScan can use these credentials automatically
dockerscan ghcr.io/myorg/private-app:latest
DockerScan 会自动从 ~/.docker/config.json 读取凭据。所有您已通过 docker login 登录的镜像仓库均适用。
完全支持 Credential helpers。 DockerScan 通过以下方式原生解析凭据:
credsStore— 全局凭据助手(例如 macOS 上 Docker Desktop 使用osxkeychain,Windows 使用wincred,Linux 使用pass)credHelpers— 按镜像仓库配置的凭据助手(优先级高于credsStore)- 自动回退 — 如果指定的助手二进制文件未安装,DockerScan 将回退到
config.json中的明文auths块
在 macOS 上的 Docker Desktop 中,此功能无需额外配置即可开箱即用:
{
"credsStore": "osxkeychain"
}
DockerScan 会透明调用 docker-credential-osxkeychain 来获取 tokens,因此你无需显式传递 credentials。
方法 2:环境变量(推荐用于 CI/CD)
最适用于自动化环境和 CI/CD 流水线:
# Set environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=mytoken
# Scan private image
dockerscan ghcr.io/myorg/private-app:latest
# Or use alternative variable names
export REGISTRY_USERNAME=myusername
export REGISTRY_PASSWORD=mytoken
dockerscan myregistry.example.com/app:v1.0
CI/CD 示例(GitHub Actions):
- name: Scan private image
env:
DOCKER_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.REGISTRY_TOKEN }}
run: dockerscan ghcr.io/${{ github.repository }}:${{ github.sha }}
方法 3:命令行参数(不推荐)
仅用于快速测试(凭据在进程列表中可见):
dockerscan --registry-user myuser --registry-password mytoken ghcr.io/myorg/app:v1
安全警告: 该方法会在 shell 历史记录和进程列表中暴露凭据。请改用环境变量或 Docker 配置。
针对特定镜像仓库的示例
Docker Hub(私有仓库)
# Using Docker config
docker login docker.io
dockerscan myusername/private-repo:latest
# Using environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=dckr_pat_XXXXXXXXXXXXX
dockerscan myusername/private-repo:latest
GitHub 容器注册表 (GHCR)
# Using Docker config
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
dockerscan ghcr.io/myorg/myapp:v1.0
# Using environment variables
export DOCKER_USERNAME=myusername
export DOCKER_PASSWORD=ghp_XXXXXXXXXXXXXXXXXXXX
dockerscan ghcr.io/myorg/myapp:v1.0
AWS Elastic Container Registry (ECR)
# Get login credentials from AWS
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.us-east-1.amazonaws.com
# Scan ECR image
dockerscan 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest
# Or use environment variables with ECR credentials
export DOCKER_USERNAME=AWS
export DOCKER_PASSWORD=$(aws ecr get-login-password --region us-east-1)
dockerscan 123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp:latest
Google Container Registry (GCR) / Artifact Registry
# Authenticate with gcloud
gcloud auth configure-docker gcr.io
# Scan GCR image
dockerscan gcr.io/my-project/myapp:latest
# For Artifact Registry
gcloud auth configure-docker us-docker.pkg.dev
dockerscan us-docker.pkg.dev/my-project/my-repo/myapp:latest
# Or use service account JSON key
export DOCKER_USERNAME=_json_key
export DOCKER_PASSWORD="$(cat service-account-key.json)"
dockerscan gcr.io/my-project/myapp:latest
Azure Container Registry (ACR)
# Login with Azure CLI
az acr login --name myregistry
# Scan ACR image
dockerscan myregistry.azurecr.io/myapp:v1.0
# Or use service principal credentials
export DOCKER_USERNAME=<service-principal-id>
export DOCKER_PASSWORD=<service-principal-password>
dockerscan myregistry.azurecr.io/myapp:v1.0
GitLab 容器镜像仓库
# Using Docker config
docker login registry.gitlab.com
dockerscan registry.gitlab.com/mygroup/myproject/myapp:latest
# Using environment variables with deploy token
export DOCKER_USERNAME=gitlab+deploy-token-1
export DOCKER_PASSWORD=DEPLOY_TOKEN_HERE
dockerscan registry.gitlab.com/mygroup/myproject/myapp:latest
自托管/私有镜像仓库
# Standard authentication
docker login myregistry.example.com:5000
dockerscan myregistry.example.com:5000/myapp:latest
# With environment variables
export DOCKER_USERNAME=admin
export DOCKER_PASSWORD=secret
dockerscan myregistry.example.com:5000/myapp:latest
# Insecure registries (not recommended for production)
# Add to Docker daemon config: /etc/docker/daemon.json
# {
# "insecure-registries": ["myregistry.example.com:5000"]
# }
认证故障排查
常见问题
1. “authentication required” 错误
# Make sure you're logged in
docker login <registry>
# Or set environment variables
export DOCKER_USERNAME=your-username
export DOCKER_PASSWORD=your-token
2. "unauthorized: authentication failed" 错误
- 确认凭据正确
- 检查令牌是否已过期(尤其是云服务商)
- 确保您的账户具有拉取该镜像的权限
3. AWS ECR "authorization token has expired"
# ECR tokens expire after 12 hours - refresh them
aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.us-east-1.amazonaws.com
4. Docker Hub 限流
- 完成身份认证以提升限流阈值(免费账户为每 6 小时 200 次拉取)
- 如需更高限制,可考虑使用 Docker Hub Pro 账户
5. 自签名证书导致的证书错误
- 将 CA 证书添加到系统信任库
- 或配置 Docker 信任该镜像仓库(参见 Docker 文档)
安全扫描器
CIS Docker Benchmark
针对 CIS Docker Benchmark v1.7.0 的自动化合规检查:
dockerscan --scanners cis nginx:latest
检查项包括:
- 容器用户不是 root
- 未安装不必要的软件包
- 存在 HEALTHCHECK 指令
- 使用特定版本标签(非
:latest) - 最小化暴露端口
- 无特权容器
- 限制 Linux 能力
- 应用 Seccomp/AppArmor 配置
- 根文件系统为只读
- 还有 70 多项检查……
供应链安全
检测真实场景中的供应链攻击:
dockerscan --scanners supplychain suspicious-image:1.0
检测项目:
- 无镜像容器(纯文档型攻击)
- 加密货币挖矿程序(xmrig、claymore 等)
- 含后门的库(xz-utils 事件)
- 未签名/未验证镜像
- 文档中的钓鱼尝试
- 与挖矿池、C2 服务器的连接
密钥检测
查找硬编码的密钥:
dockerscan --scanners secrets webapp:prod
可检测项:
- 云凭据(AWS、GCP、Azure)
- API 密钥(40 多项服务)
- 私钥与证书
- 数据库凭据
- Docker registry 认证信息
- 高熵字符串(可能存在的未知机密)
漏洞扫描
检测已知 CVE:
dockerscan --scanners vulnerabilities node:16
检查项:
- 严重 Docker CVE(2024-2025)
- 容器逃逸漏洞
- BuildKit RCE 漏洞
- 停止维护的基础镜像
- 存在漏洞的软件包
运行时安全
审计运行时配置:
dockerscan --scanners runtime running-container
分析内容:
- Linux 能力(CAP_SYS_ADMIN 等)
- Seccomp 配置文件
- AppArmor/SELinux 策略
- 命名空间隔离
- 特权模式使用情况
输出格式
JSON 输出
{
"target": {
"image_name": "nginx:latest"
},
"start_time": "2024-11-22T10:30:00Z",
"findings": [
{
"id": "CIS-4.1",
"title": "Container should not run as root",
"severity": "HIGH",
"category": "CIS-Benchmark",
"description": "Running containers as root increases attack surface...",
"remediation": "Use USER instruction in Dockerfile..."
}
],
"summary": {
"total_findings": 47,
"by_severity": {
"CRITICAL": 8,
"HIGH": 15
}
}
}
SARIF 输出
兼容 GitHub Security、Azure DevOps 和 VS Code:
{
"$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
"version": "2.1.0",
"runs": [
{
"tool": {
"driver": {
"name": "DockerScan",
"version": "2.0.0"
}
},
"results": [...]
}
]
}
使用场景
1. CI/CD 流水线集成
GitHub Actions:
name: Docker Security Scan
on: [push]
jobs:
security-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Install DockerScan
run: |
curl -L https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -o dockerscan
chmod +x dockerscan
- name: Update CVE Database
run: ./dockerscan update-db
- name: Run Security Scan
run: ./dockerscan -q myapp:${{ github.sha }}
- name: Upload SARIF results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: dockerscan-report.sarif
GitLab CI:
docker-security-scan:
stage: test
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- wget https://github.com/cr0hn/dockerscan/releases/latest/download/dockerscan-linux-amd64 -O dockerscan
- chmod +x dockerscan
- ./dockerscan update-db
- ./dockerscan -q $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
artifacts:
reports:
sast: dockerscan-report.sarif
2. 安全审计
# Comprehensive audit of production images
for image in $(docker images --format "{{.Repository}}:{{.Tag}}"); do
echo "Scanning $image..."
dockerscan $image --output /audit-reports/
done
# Generate summary report
cat /audit-reports/*.json | jq -s '
{
total_images: length,
total_findings: map(.summary.total_findings) | add,
critical_findings: map(.summary.by_severity.CRITICAL // 0) | add
}
'
3. 部署前验证
# Fail deployment if critical issues found
dockerscan production-app:v2.0
exit_code=$?
if [ $exit_code -eq 2 ]; then
echo "❌ Critical vulnerabilities found. Deployment blocked."
exit 1
elif [ $exit_code -eq 1 ]; then
echo "⚠️ High severity issues found. Manual review required."
# Send notification...
else
echo "✅ No critical issues. Proceeding with deployment."
fi
4. 合规报告
# Generate CIS compliance report
dockerscan --scanners cis --only-critical all-production-images:* > cis-compliance-report.txt
# Weekly security scan for compliance
0 0 * * 0 /usr/local/bin/dockerscan --scanners cis,vulnerabilities production-images:latest --output /compliance/weekly/
5. 开发者工作流
# Pre-commit hook
#!/bin/bash
# .git/hooks/pre-commit
docker build -t local-test:latest .
dockerscan --only-critical local-test:latest
if [ $? -ne 0 ]; then
echo "❌ Docker security scan failed. Fix issues before committing."
exit 1
fi
与其他工具对比
| 功能 | DockerScan v2.0 | Trivy | Clair | Snyk | Grype |
|---|---|---|---|---|---|
| CIS Benchmark v1.7 | 完整(80+ 项检查) | 不支持 | 不支持 | 部分支持 | 不支持 |
| 供应链检测(2024) | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 敏感信息扫描 | 40+ 种模式 | 基础 | 不支持 | 支持 | 不支持 |
| CVE 数据库 | 2024-2025 年 CVE | 支持 | 支持 | 支持 | 支持 |
| 运行时安全 | 完整支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| SARIF 输出 | 支持 | 支持 | 不支持 | 支持 | 支持 |
| 速度(Go) | 极速 | 极速 | 较慢 | 快速 | 极速 |
| 可扩展性 | 插件系统 | 有限 | 有限 | 不支持 | 有限 |
| 退出码 | 适用于 CI/CD | 支持 | 部分支持 | 支持 | 支持 |
| 成本 | 免费 | 免费 | 免费 | 付费版本 | 免费 |
| 离线模式 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
| 许可证 | 专有源码可见 | Apache-2.0 | Apache-2.0 | 专有 | Apache-2.0 |
为什么选择 DockerScan?
- 最全面:唯一集 CIS + 供应链 + 敏感信息 + CVE + 运行时于一体的工具
- 最新研究成果:基于 2024-2025 年真实攻击案例
- 零配置:开箱即用
- 开发者友好:美观的 CLI 输出,并给出可操作的修复建议
- 企业级就绪:SARIF + 退出码 + JSON 输出
架构
项目结构
dockerscan/
├── logo.png # Project logo
├── cmd/
│ ├── dockerscan/ # Main CLI application
│ │ └── main.go
│ └── nvd2sqlite/ # CVE database builder tool
│ └── main.go
├── data/ # CVE database (auto-updated daily)
│ ├── latest.db.gz # Compressed SQLite database
│ └── metadata.json # Database version info
├── internal/
│ ├── scanner/ # Extensible scanner framework
│ │ ├── scanner.go # Scanner interface & registry
│ │ ├── cis/ # CIS Benchmark implementation
│ │ ├── secrets/ # Secrets detection
│ │ ├── supplychain/ # Supply chain attacks
│ │ ├── vulnerabilities/ # CVE scanning
│ │ └── runtime/ # Runtime security
│ ├── report/ # Report generators
│ │ ├── json.go # JSON reporter
│ │ └── sarif.go # SARIF reporter
│ ├── models/ # Data models
│ │ └── models.go # Findings, scan results, etc.
│ └── config/ # Configuration
│ └── config.go # App config & banner
└── pkg/docker/ # Docker client wrapper
└── client.go
CVE Database & nvd2sqlite-cvelistV5 Tool
DockerScan 使用本地 SQLite 数据库进行 CVE 查询。该数据库通过 GitHub Actions 每日自动更新,并托管在仓库中,因此你始终可以访问最新的 CVE 数据。
该数据库基于 MITRE cvelistV5 数据集 构建(官方 CVE 列表,以每日快照形式发布在 GitHub 上)。与 NVD API 不同,该数据源没有速率限制,无需 API 密钥,也没有可用性问题:完整快照是一个约 525 MB 的 zip 文件,由 GitHub CDN 提供。
Database Features
- Pre-built database - 开箱即用,无需手动配置
- Daily updates - GitHub Action 每天于 06:47 UTC 基于 MITRE cvelistV5 午夜快照重建完整数据库
- 30-month window - 约 125,000 个 CVE 和约 432,000 条受影响产品记录(schema_version 2)
- Fast lookups - 使用经过优化的索引的 SQLite
- Hosted on GitHub - 通过
update-db命令自动下载
Updating the Database
# Download latest database from GitHub (recommended)
dockerscan update-db
# Install from local file (for air-gapped/offline environments)
dockerscan update-db --from-file /path/to/cve-db.sqlite
说明:首次运行
dockerscan时,程序会提示下载数据库。之后,你可以使用update-db定期更新数据库。
手动构建数据库(nvd2sqlite-cvelistV5)
对于高级用户,可以直接从 MITRE 的 cvelistV5 快照构建 CVE 数据库:
# Build the tool
go build -o bin/nvd2sqlite-cvelistV5 ./cmd/nvd2sqlite-cvelistV5
# Download the latest snapshot and build the database (last 30 months by default)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite --verbose
# Optionally enrich CVSS scores from the NVD API (best-effort, non-blocking)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite --enrich-from-nvd
# Custom date range
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite \
--start-date 2023-01-01 \
--end-date 2024-12-31
# From an already-downloaded snapshot zip (offline / air-gapped)
./bin/nvd2sqlite-cvelistV5 --output data/cve-db.sqlite \
--input 2026-07-13_all_CVEs_at_midnight.zip.zip
nvd2sqlite-cvelistV5 功能特性:
- 无需 API 密钥,无速率限制 - 从 GitHub 的 CDN 下载单个 zip 包
- 并行解析 - 每个 CPU 核心一个 worker,几分钟内处理约 30 万条 CVE 记录
- 版本范围规范化 - 将 CNA 的自由文本范围(
>=1.0, <2.0、逗号分隔列表、v前缀)转换为规范范围 - 可选 CVSS 数据富集 - 通过
--enrich-from-nvd/--enrich-only/--enrich-timeout进行尽力而为的 NVD 查询 - SQLite 输出 - 带索引的表,便于快速查询
已弃用:先前的
cmd/nvd2sqlite工具(NVD API 2.0 数据源)仅保留供参考,不再使用或维护。NVD API 的速率限制以及频繁的 503 错误/超时使每日自动化构建不可靠。
可扩展性
新增扫描器很简单:
package myscan
import (
"context"
"github.com/cr0hn/dockerscan/v2/internal/models"
"github.com/cr0hn/dockerscan/v2/internal/scanner"
)
type MyScanner struct {
scanner.BaseScanner
}
func NewMyScanner() *MyScanner {
return &MyScanner{
BaseScanner: scanner.NewBaseScanner(
"my-scanner",
"Description of my scanner",
true, // enabled
),
}
}
func (s *MyScanner) Scan(ctx context.Context, target models.ScanTarget) ([]models.Finding, error) {
var findings []models.Finding
// Your scanning logic here...
return findings, nil
}
// Register in main.go:
// registry.Register(myscan.NewMyScanner())
参与贡献
欢迎贡献!DockerScan 采用可扩展设计。
如何参与贡献
- Fork 仓库
- 创建功能分支(
git checkout -b feature/amazing-scanner) - 添加你的扫描器至
internal/scanner/ - 编写测试(我们保持 90% 以上的代码覆盖率)
- 提交你的更改(
git commit -am 'Add amazing scanner') - 推送到该分支(
git push origin feature/amazing-scanner) - 发起 Pull Request
开发
# Clone and setup
git clone https://github.com/cr0hn/dockerscan
cd dockerscan/dockerscan-v2
# Install dependencies
make deps
# Run tests
make test
# Run with coverage
make coverage
# Build
make build
# Format code
make fmt
# Lint
make lint
添加新的扫描器
我们特别欢迎:
- 与漏洞数据库集成(NVD、GitHub Security Advisories)
- Kubernetes 安全扫描
- 容器镜像仓库安全
- Docker Compose 安全分析
- IaC 扫描(Dockerfiles)
参考资料
标准与基准
- CIS Docker Benchmark v1.7.0 - Center for Internet Security
- NIST SP 800-190 - 应用容器安全指南
- OWASP Docker Security Cheat Sheet
研究与 CVE
- 400 万个恶意无镜像容器 - The Hacker News,2024 年 4 月
- 利用容器镜像的供应链攻击 - Aqua Security
- CVE-2024-21626:runc 容器逃逸 - NIST NVD
- CVE-2024-23651:BuildKit RCE - NIST NVD
- xz-utils 后门(2024 年 3 月) - OpenWall
工具与项目
- Trivy - 漏洞扫描器
- Docker Bench Security - CIS 基准脚本
- Cosign - 容器签名与验证
- SARIF 规范 - 静态分析结果格式
许可证
本项目采用 DockerScan 专有源码可用许可证。
具体含义
您可以(免费):
- 免费将 DockerScan 用于内部安全扫描
- 在您的 CI/CD 流水线 和安全工作流中使用它
- 修改、fork 并回馈社区
- 将其用于教育和研究目的
- 将其作为专业服务中的工具(咨询、安全审计、渗透测试)使用
- 将其集成到其他产品中,作为辅助组件
您不可(除非获得明确书面许可或商业许可):
- 将Docker 扫描作为商业 SaaS提供服务
- 出售 DockerScan 的托管实例
- 构建主要基于 DockerScan 的商业平台
- 创建以 DockerScan 为主要产品的付费托管服务
为什么采用此许可证?
此许可证通过以下方式保护项目的可持续性:
- 授予自由,以便为合法目的使用本软件
- 防止有害的搭便车行为,即企业将其作为服务对外提供并从中获利,却不回馈项目
- 通过对竞争性用途实施商业许可,确保项目保持可持续发展
- 保持源代码可获取,以保障透明度并支持社区贡献
这并非开源——它是源码可见,并对商业竞争性使用设有限制。
商业许可
以下情形需要商业许可:
- SaaS 或托管服务
- 以 DockerScan 作为主要功能的商业平台
- 作为商业产品进行转售或再分发
- 以 DockerScan 为核心服务的托管服务
商业许可联系方式:
邮箱:daniel [at] danielalfocea.com 网站:https://danielalfocea.com 企业和初创公司均可获得灵活的许可条款
完整法律条款请参见 LICENSE 文件。
作者
致谢
特别感谢:
- Docker 安全社区
- CIS 的 Docker Benchmark
- NIST 的 SP 800-190
- 发现 2024 年供应链攻击的安全研究人员
- DockerScan 的所有贡献者和用户
支持
- 问题:GitHub Issues
- 讨论:GitHub Discussions
- 安全:安全漏洞请报告至 daniel@danielalfocea.com