
DockSec v2026.9.21
AI 驱动的 Docker 安全扫描器,以通俗易懂的英语解释漏洞。OWASP 实验室项目。
什么是 DockSec?
DockSec 是一个 OWASP 实验室项目,旨在弥合复杂的安全扫描结果与开发者可执行的修复措施之间的鸿沟。它集成了业界标准的扫描器(Trivy、Hadolint、Docker Scout)与 AI,提供上下文感知的安全分析。
DockSec 不会用 200 多个 CVE 的列表让你不知所措,而是:
- 优先排序真正影响你特定容器配置的问题。
- 解释漏洞时使用通俗易懂的语言,而非仅仅堆砌安全术语。
- 建议针对你的 Dockerfile 的具体修复方案。
- 生成专业、可交互的安全报告,供你的团队使用。
所有扫描均在本地进行;唯一离开你机器的内容是你所选择的 AI 提供商收到的(已脱敏的)文件内容——而使用本地模型或仅扫描模式时,则完全不会有任何内容离开。参见数据流与隐私。
工作原理
DockSec 工作流:从扫描到可执行的洞察
DockSec 遵循五阶段流水线:
- 扫描:在你的环境中本地运行 Trivy(镜像漏洞和 Dockerfile 错误配置)、 Hadolint 和 Docker Scout。
- 优先排序:根据严重性结合其 EPSS 利用可能性对每个 CVE 发现进行排序,因此列表 按应先修复的内容排序,而非按先发现的内容排序。
- 关联:检测利用链,即多个 独立发现组合成一条攻击路径——一个面向互联网的服务可以访问的带凭据数据库 是一条链,而非两个不相关的发现。 使用 API 密钥时,AI 会基于完整扫描输出进行推理,以排序、解释 并扩展这一过程。
- 建议:生成可直接复制运行的修复命令以及具体的 Dockerfile 或 compose 更改,并说明它们能解决多少发现。
- 报告:将可执行结果导出为 HTML、PDF、JSON、CSV、Markdown、SARIF 和 CycloneDX SBOM。
快速开始
1. 前置条件
DockSec 编排本地扫描器,因此需要:
| 要求 | 用途 | 安装 |
|---|---|---|
| Python 3.12+ | DockSec 本身 | python.org |
| Trivy | 所有扫描(必需) | brew install trivy 或 Trivy 文档 |
| Hadolint | Dockerfile 检查 | brew install hadolint 或 Hadolint 文档 |
| Docker | 镜像扫描(-i) | Docker 文档 |
或者让 DockSec 为你安装 Trivy 和 Hadolint:```bash python -m docksec.setup_external_tools
### 2. 安装 DockSec```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
3. 运行你的第一次扫描
本地扫描无需 API 密钥:```bash docksec Dockerfile --scan-only
每次扫描结束时都会生成结果摘要:一个严重性表格、一个 0-100 的安全评分及评级、一个“快速评估”操作块、生成的报告(默认保存到 `~/.docksec/results/`),以及一条建议的下一条命令。
### 4. 启用 AI 分析
AI 分析会解释发现的问题并建议修复方案。选择一个提供商,设置其 API 密钥,然后运行:```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
每个提供商都有合理的默认模型(OpenAI:gpt-4o,Anthropic:
claude-haiku-4-5,Google:gemini-1.5-pro,Ollama:llama3.1),因此 --model
是可选的。为避免重复指定标志,请设置环境变量(或将其放入你运行命令所在目录的 .env
文件中——DockSec 会自动加载它):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
在将任何内容发送给 AI 提供商之前,疑似敏感值(密码、令牌、API 密钥、私钥块)会被自动掩码处理。请参阅
[数据流与隐私](#data-flow-and-privacy)。
### 5. 或者运行容器镜像(无需安装任何内容)
已发布的镜像捆绑了固定版本的 Trivy 和 Hadolint,因此无需安装任何内容,也无需进行任何配置:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_DOCKERFILE=Dockerfile \
-e INPUT_SCAN_ONLY=true \
ghcr.io/owasp/docksec:latest
每个版本均发布多架构(amd64 和 arm64)镜像。在 CI 中应固定到特定版本(ghcr.io/owasp/docksec:2026.9.21)或次要版本系列(ghcr.io/owasp/docksec:2026.9),而非使用 latest。每个镜像都附带构建来源证明:```bash
gh attestation verify oci://ghcr.io/owasp/docksec:latest --repo OWASP/DockSec
该镜像读取与 GitHub Action 相同的 `INPUT_*` 变量,因此任何 Action 输入在此均可用:`INPUT_IMAGE`、`INPUT_COMPOSE`、`INPUT_SEVERITY`、`INPUT_FAIL_ON`、`INPUT_FORMAT`、`INPUT_SARIF`、`INPUT_OUTPUT_DIR`。将报告写入挂载点上的某个位置,以便在容器退出后保留它们:```bash
docker run --rm -v "$PWD:/github/workspace" \
-e INPUT_COMPOSE=docker-compose.yml \
-e INPUT_SCAN_ONLY=true \
-e INPUT_FORMAT=json,html \
-e INPUT_OUTPUT_DIR=/github/workspace/docksec-reports \
ghcr.io/owasp/docksec:latest
6. 或者使用 GitHub Action```yaml
- name: Run DockSec AI Scanner uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' openai_api_key: ${{ secrets.OPENAI_API_KEY }}
---
## 常用命令```bash
# Scan Dockerfile + Docker image (AI + scanners)
docksec Dockerfile -i myapp:latest
# Scan a Docker Compose file and all its services
docksec --compose docker-compose.yml
# Scan only a Docker image
docksec --image-only -i myapp:latest
# Fast local scan, no AI, no API key
docksec Dockerfile --scan-only
# Choose which severity levels the image scan reports (default: CRITICAL,HIGH)
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
# Fail the build (exit 1) if any finding is HIGH or above
docksec -i myapp:latest --image-only --fail-on high
# Write only the report formats you want, to a directory of your choice
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
# Write a Markdown report for posting directly into a pull request comment
docksec Dockerfile --scan-only --format markdown
# Print results as JSON to stdout for scripts and CI pipelines
docksec -i myapp:latest --image-only --json
# Write a SARIF report for GitHub Code Scanning
docksec Dockerfile --scan-only --sarif
# Write a CycloneDX SBOM of an image for supply-chain tooling
docksec --image-only -i myapp:latest --sbom
# Fully offline scan: local Trivy DB, no network, no AI
docksec --image-only -i myapp:latest --offline
# Save today's findings as a baseline, then only gate on new findings later
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
# Suppress triaged findings with an auditable ignore file
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
# Force a fresh scan, bypassing the results cache
docksec -i myapp:latest --image-only --no-cache
# Install AI-assistant skill files (Claude Code, Cursor, Copilot, and more)
docksec install-skill
# Output control
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only
docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr
docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log
docksec Dockerfile --scan-only --compact-output # shorter per-finding output
docksec Dockerfile --no-color # also honors NO_COLOR
# Apply the mechanical Dockerfile fixes (keeps a .bak, re-scans, shows the delta)
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix
# Rank findings by severity alone, with no EPSS lookup and no network call
docksec Dockerfile --scan-only --no-epss
# Treat a scan that could not complete as a failure, not a pass
docksec Dockerfile --scan-only --fail-on high --incomplete-policy fail
配置文件
在仓库根目录提交一个 .docksec.yml,整个团队——以及每个 CI 任务——都会在同一策略下进行扫描,而不是每个开发者各自传递自己的标志。```yaml
yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH fail_on: HIGH formats: [json, html] output_dir: ./security-reports
rules: disabled: - compose-missing-healthcheck
每个设置都是可选的;任何省略的设置都会回退到环境变量,然后再回退到内置默认值。完整的带注释示例见
[`examples/.docksec.yml`](https://github.com/owasp/docksec/blob/main/examples/.docksec.yml)。
### 优先级
优先级从高到低:```
CLI flag > environment variable > .docksec.yml > built-in default
因此,提交的 severity: LOW 仍会被命令行上的 --severity CRITICAL 以及环境变量中的 DOCKSEC_DEFAULT_SEVERITY 覆盖。
发现机制
DockSec 会在工作目录中查找 .docksec.yml(或 .docksec.yaml),然后向上遍历至仓库根目录,因此 monorepo 子目录中的服务会继承顶层提交的策略。搜索会在包含 .git 的目录处停止,因此它绝不会拾取仓库之外的文件。
--config FILE使用指定文件而非进行搜索。--no-config忽略任何配置文件,用于可复现的 CI 运行。
生效的配置文件会显示在扫描横幅中,因此始终可以清楚地知道应用了哪个策略。
设置
| 设置 | 等效标志 | 备注 |
|---|---|---|
severity | --severity | 镜像扫描的严重性级别 |
fail_on | --fail-on | CI 门禁阈值 |
formats | --format | 列表形式:[json, html] |
output_dir | --output-dir | 报告目标位置 |
provider | --provider | openai、anthropic、google、ollama |
model | --model | 提供程序的模型名称 |
offline | --offline | 无网络;跳过 AI 和 Docker Scout |
skip_ai_scoring | --skip-ai-scoring | 已弃用并被忽略;评分始终是确定性的 |
no_redact | --no-redact | 在 AI 调用前不遮蔽机密 |
no_cache | --no-cache | 绕过扫描缓存 |
ignore_file | --ignore-file | 豁免文件路径 |
baseline | --baseline | 基线文件路径 |
rules.disabled | - | 要完全关闭的规则 ID |
无效的配置文件——未知键、错误的严重性——是硬错误,会以 2 退出而非警告,因此损坏的策略文件绝不会导致扫描在团队未提交的规则下运行。
编辑器自动补全
第一行的 # yaml-language-server: 注释可在 VS Code 和 JetBrains 编辑器中提供补全和内联验证。该 schema 发布在 docs/docksec-config-schema.json,可通过 docksec --print-config-schema 重新生成。
禁用规则
rules.disabled 会在所有位置完全关闭某项检查——它会在评分、报告、--json 和 --fail-on 门禁之前被移除。将其用于不适用于你环境的检查。对于团队已分类并接受的个别发现,请优先使用豁免文件,其条目带有原因和到期日期,因此保持可审计。
CI/CD 集成
退出码
DockSec 使用对 CI 友好的退出码,以便构建和 shell 可以对结果做出反应:
| 代码 | 含义 |
|---|---|
0 | 成功,没有达到或超过 --fail-on 的发现 |
1 | 存在达到或超过 --fail-on 阈值的发现 |
2 | 用法或参数错误 |
3 | 工具或运行时错误(扫描失败、镜像未找到、缺少工具) |
--fail-on 会对每个结构化发现进行门禁:镜像漏洞、Dockerfile 错误配置和 compose 错误配置。当 --fail-on 低于请求的 --severity 时,扫描严重性会自动放宽,以便门禁能够观察到这些发现。
不完整的扫描
如果扫描器无法运行,结果可能缺少发现,而非真正干净。DockSec 会将其报告为 Coverage 块中的检测缺口,并在 --json 中的 scan_info.completeness 下报告。在这种情况下,使用 --incomplete-policy fail 以退出码 3 退出,这样 CI 就无法在未完成的扫描上通过:```bash
docksec Dockerfile --incomplete-policy fail
### 优先级:先修复什么
每个 CVE 发现都会根据 [EPSS](https://www.first.org/epss/) 进行评分,该评分
估计其在未来 30 天内被利用的概率。将其与严重性结合,
得到四个层级:
| 层级 | 含义 |
|---|---|
| **立即修复** | 严重或高严重性,且在被利用可能性方面位列 CVE 前 10% |
| **尽快修复** | 严重或高严重性,但被利用的情况较少见 |
| **监控** | 较低严重性,但正被积极利用 |
| **低优先级** | 较低严重性,被利用的情况不常见 |
这是 DockSec 在 AI 处理之外进行的唯一网络调用,并且它
刻意保持范围狭窄:**仅发送 CVE ID**——不发送镜像名称、不发送文件内容、
不发送路径。评分会缓存 24 小时。`--offline` 和 `--no-epss` 可将其禁用,
任何失败都会回退到仅按严重性排序,而不会导致扫描失败。
### 利用链
按服务划分的视图会一次报告一个发现。DockSec 还会报告
多个独立发现组合成单一攻击路径的情况:```text
Exploit chains
[HIGH] 'web' is internet-facing and can reach 'db' with a committed credential
services: web, db
combines: compose-plaintext-secret-env, compose-no-network-segmentation
'web' accepts connections from outside the host and shares the default
network with 'db'. 'db' is not exposed directly, but its credential is in
the compose file, so compromising 'web' yields authenticated access to it.
Neither service looks critical on its own.
break it: Put 'db' on its own network that 'web' does not join, or move
POSTGRES_PASSWORD to a Docker secret.
链检测基于规则,因此可与 --scan-only 配合使用、可离线运行,且无需 API 密钥,并且每次运行都返回相同的结果。AI 处理只是对其进行排序和扩展,而非必需环节。链也会出现在 --json 输出中的 exploit_chains 下。
完整列表请参阅漏洞利用链指南,它们组合的每条规则请参阅compose 规则参考。
修复命令
扫描以具体命令结尾,而不是一列标识符,并附有一句关于它们能解决多少发现项的明确说明:```text Fix commands
apt-get install --only-upgrade -y libgnutls30=3.7.9-2+deb12u7 CRITICAL - 3.7.9-2+deb12u4 -> 3.7.9-2+deb12u7 (CVE-2026-33845 +6)
Dockerfile changes
- [CRITICAL] Move the secret out of ENV; inject it at runtime (line 4)
- [HIGH] Add a non-root USER before CMD/ENTRYPOINT (line 7)
Applying all of the above resolves 37 of 93 finding(s); 56 have no mechanical fix yet.
### 机器可读输出
`--json` 会向 stdout 打印单个 JSON 对象(扫描信息、漏洞、严重性计数以及任何 AI 发现),而不是人类可读的摘要,因此可以直接管道传输到其他工具:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
仅使用 --json 时,不会写入任何报告文件;将其与 --format 结合使用,可在同一次运行中写入文件并打印 JSON。在 --json 模式下,所有人类可读的消息都会移至 stderr,因此 stdout 中只会包含 JSON 负载。
报告格式
--format 接受以逗号分隔的文件输出列表:
| 格式 | 你将获得 |
|---|---|
json | 一个 .json 文件,包含扫描元数据、严重性计数以及完整的漏洞列表(与 --json stdout 负载结构相同,但写入磁盘)。 |
csv | 一个 .csv 发现结果表格(ID、严重性、包、版本、标题及相关字段)。 |
pdf | 一份可打印的 PDF 摘要,包含扫描信息、评分和漏洞详情。 |
html | 一份带样式的 HTML 报告,可在浏览器中浏览结果。 |
markdown | 一份 .md 报告,可在拉取请求评论和 CI 作业摘要中原生渲染。需显式启用:除非请求,否则不会写入。 |
json、csv、pdf 和 html 默认写入;需显式添加 markdown 才能获得它。
零发现结果的 CSV: 如果扫描未报告任何漏洞,但 csv 在你的 --format 列表中,DockSec 仍会写入一个仅包含列标题的 CSV 文件。这是有意为之(该导出是有效的,而非写入失败),以便下游工具即使在干净的扫描中也能依赖稳定的模式。
关于 stdout JSON 以及管道传输到其他工具,请参见上文的机器可读输出。对于 CI 和 GitHub Code Scanning,请使用 --sarif(见下一节);SARIF 与 --format 相互独立,并且在请求时始终会生成。
用于 GitHub Code Scanning 的 SARIF 输出
--sarif 会与其他报告格式一起写入一份 SARIF 2.1.0 报告。使用标准的 github/codeql-action/upload-sarif 操作上传它,即可直接在拉取请求和 Security 选项卡中看到发现结果的注释:```yaml
-
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
-
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` 很重要:没有它,每当 `--fail-on` 导致 DockSec 以非零状态退出时,上传步骤就会被跳过,恰恰在最需要的时候丢失了发现结果。
### 基线 / 棘轮模式
`--baseline FILE` 让你可以在现有项目上采用 `--fail-on`,而不会被大量预先存在的发现结果阻塞每一次构建。先用 `--update-baseline` 运行一次,对当前的发现结果进行快照,然后提交基线文件;从那时起,`--fail-on` 只会对不在基线中的发现结果进行拦截:```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
发现项通过漏洞 ID、目标和包名进行匹配,因此基线在无关发现项出现和消失时仍保持有效。每当你想将当前状态接受为新基线时,使用 --update-baseline 重新运行。
忽略发现项(豁免)
--ignore-file FILE 会抑制团队已分类并接受的单个发现项。与基线(某一时间点的快照)不同,忽略文件是一个显式、可审查的列表,其中每个条目都带有原因和可选的到期日期。
如果当前目录中存在 .docksec-ignore.yml 文件,它会被自动读取。```yaml
.docksec-ignore.yml
ignores:
- id: CVE-2023-45853 # Trivy vulnerability ID or DockSec rule ID reason: "zlib CVE; code path not reachable, vendor fix pending" expires: 2026-12-31 # optional; entry stops applying after this date
- id: compose-missing-healthcheck reason: "healthchecks are handled by the orchestrator"
被抑制的发现项在评分、报告、`--json` 输出以及 `--fail-on` 门禁之前会被移除。过期的条目会自动停止生效(并给出警告),而没有原因的条目会被标记,以确保豁免保持可审计。请将该文件提交到版本控制,以便抑制项像其他任何变更一样接受审查。
---
## 报告
### 报告格式
默认情况下,每次扫描都会写入四个报告文件;使用 `--format` 选择子集:
- **html**:一个交互式、视觉简洁的网页报告:严重性卡片、评分等级、包含修复版本的完整漏洞表,以及完整的 AI 发现项。
- **pdf**:一个便于携带、可直接用于演示的文档。
- **json**:完整的、机器可读的扫描数据(与 `--json` 标准输出格式相同)。
- **csv**:一个可直接用于电子表格的单个漏洞表格。
- **markdown**:一个轻量、易读的报告(严重性摘要 + 包含修复版本的漏洞表),可在拉取请求评论和 CI 作业摘要中原生渲染。需主动启用:将 `markdown` 添加到 `--format`;默认不会写入。
> 关于 CSV 行为的说明:在零漏洞的情况下,DockSec 仍会写入一个仅含表头的
> CSV(列名,无数据行),以便下游自动化永远不会因文件缺失或
> 为空而中断。这是有意为之。
### CycloneDX SBOM
`--sbom` 会写入所扫描镜像的 CycloneDX 软件物料清单(`<image>.cdx.json`),
列出每个软件包组件以及已知漏洞。该 BOM 由 Trivy 的原生导出器生成(因此符合规范),
DockSec 会将自身信息写入工具元数据。可将其输入到 Dependency-Track、GitHub 的依赖图,
或任何其他 SBOM 消费者:```bash
docksec --image-only -i myapp:latest --sbom
--sbom 需要单个镜像(-i),因此在 compose 运行时会被跳过。与 --sarif 一样,
它独立于 --format。
数据流与隐私
DockSec 的设计让你始终清楚什么数据离开了你的机器:
- 扫描完全在本地进行。 Trivy、Hadolint 和安全评分都在你的机器上运行。 DockSec 绝不会将镜像内容上传到任何地方。
- AI 分析仅发送被扫描的文件。 当 AI 分析运行时,Dockerfile 或 compose 文件的内容(加上用于评分的漏洞数量简短摘要) 会被发送到你配置的 LLM 提供商。除此之外不会传输任何其他内容。
- 敏感信息在离开前会被脱敏。 文件中看起来像敏感信息的值(密码、
令牌、API 密钥、私钥块)在内容发送到 AI 提供商之前会被遮蔽。键名保持可见,
因此暴露的凭据仍会被标记。使用
--no-redact可选择退出。 - 支持完全本地化的 AI。 使用
--provider ollama将 AI 分析保留在 你自己的硬件上,或使用--scan-only/--offline完全跳过 AI。 - 无遥测。 DockSec 不收集任何使用数据,也不会向任何地方回传信息。
离线模式
--offline 在无网络访问的情况下运行扫描。它使用磁盘上已有的 Trivy 漏洞数据库
(不更新数据库),并跳过 AI 分析和 Docker Scout 高级扫描,这两者都需要网络。
这是在气隙或锁定环境中进行扫描的最简单方式:```bash
docksec --image-only -i myapp:latest --offline
确保 Trivy DB 至少已下载过一次(任何先前的在线扫描都会完成此操作),然后再依赖 `--offline`。
### 扫描结果缓存
镜像扫描结果会被缓存(默认:24 小时,可通过
`DOCKSEC_CACHE_TTL_HOURS` 覆盖),并以镜像的内容摘要为键,因此重新构建的标签
(例如被复用的 `:latest`)始终会获得全新的扫描。使用 `--no-cache`(或
`DOCKSEC_USE_CACHE=false`)可在某次运行中绕过缓存。
### 拉取本地不存在的镜像
扫描本地不存在的镜像时会先拉取它。一个 compose 栈通常会指定该机器从未拉取过的镜像,
如果没有此功能,这些服务中的每一个都会被报告为未扫描。
设置 `DOCKSEC_PULL_MISSING_IMAGES=false` 可关闭此功能并改为失败,这在
按流量计费的连接或共享 runner 上值得这样做。无论此设置如何,`--offline` 都不会拉取。
---
## AI 助手技能(`install-skill`)
`docksec install-skill` 会将 DockSec 使用说明写入主流 AI 编程助手的知名上下文
文件中,这样在你的仓库中工作的助手就知道如何调用 DockSec:```bash
docksec install-skill
这会创建或更新:
.claude/commands/docksec.md(Claude Code 斜杠命令/docksec).cursor/rules/docksec.mdc(Cursor)AGENTS.md(Codex CLI)、GEMINI.md(Gemini CLI).github/copilot-instructions.md(GitHub Copilot)
这些文件是纯文本,你可以审查并提交;不会执行任何内容。重新运行该 命令会就地更新 DockSec 部分,而不是重复添加。
功能特性
- 智能分析:AI 解释漏洞对你特定设置意味着什么。
- 多 LLM 支持:OpenAI、Anthropic Claude、Google Gemini,或通过 Ollama 使用本地模型。
- 隐私优先:在任何内容到达 AI 提供商之前,敏感值会被脱敏,扫描完全在本地进行,且没有遥测。
- Docker Compose 扫描:检测编排层面的错误配置,并扫描 compose 文件中的所有服务。
- 深度集成:结合 Trivy(漏洞)、Hadolint(代码检查)和 Docker Scout。
- 安全评分:0-100 分及评级,用于随时间跟踪你的安全态势。
- 丰富格式:HTML(交互式)、PDF、JSON、CSV、SARIF 和 CycloneDX SBOM。
- CI/CD 就绪:
--fail-on退出码、基线/棘轮模式、可审计豁免、JSON 输出到 stdout,以及 Marketplace 上的 GitHub Action。 - 离线模式:使用本地 Trivy 数据库进行完全气隙扫描(
--offline)。 - AI 助手技能:
docksec install-skill教会 Claude Code、Cursor、Copilot 等如何在你的仓库中运行 DockSec。
DockSec 对比
| 能力 | DockSec | Trivy(独立) | Snyk Container | Aikido |
|---|---|---|---|---|
| 许可证和成本 | 免费、开源(MIT) | 免费、开源(Apache 2.0) | 商业(有限免费层) | 商业(有限免费层) |
| 治理 | OWASP Lab 项目,供应商中立 | 开源,由 Aqua 维护 | 单一供应商 | 单一供应商 |
| 检测 CVE 和 Dockerfile 错误配置 | 是 | 是 | 是 | 是 |
| 用通俗英语解释发现 | 是(AI 编写的上下文和影响) | 否(原始 CVE 数据) | 部分(严重性和修复提示) | 部分(平台中的 AI 摘要) |
| 上下文相关的 Dockerfile 修复 | 是(带解释的具体重写) | 否(仅检测) | 是(基础镜像升级建议、修复 PR) | 是(AI AutoFix PR) |
| Docker Compose(多服务)扫描 | 是(编排检查和逐服务扫描) | 部分(配置扫描,无逐服务展开) | 部分 | 部分 |
| 基线/棘轮模式(仅对新发现失败) | 是 | 否 | 部分(平台策略) | 部分(平台策略) |
| 可审计的逐发现豁免,含原因和到期时间 | 是 | 部分(.trivyignore,不强制原因) | 部分(平台策略) | 部分(平台策略) |
| CI 原生输出(用于 GitHub Code Scanning 的 SARIF) | 是 | 是 | 是 | 是 |
| SBOM 导出(CycloneDX) | 是(--sbom) | 是 | 是 | 是 |
| AI 助手技能安装(Claude Code、Cursor、Copilot) | 是(install-skill) | 否 | 否 | 否 |
| 完全离线/气隙运行 | 是(通过 Ollama 使用本地 LLM,仅扫描模式,无 API 密钥) | 仅扫描(无修复层) | 否(云平台) | 否(托管平台) |
| 你的镜像数据保留在你的网络中 | 是 | 是 | 否 | 否 |
| 自带 LLM/模型选择 | 是(OpenAI、Anthropic、Gemini 或本地 Ollama) | 不适用 | 否(专有 AI) | 否(专有 AI) |
| 可自托管,无需平台部署 | 是 | 是 | 否 | 否 |
| 供应商锁定 | 无 | 无 | 是 | 是 |
| 安全评分(0-100)和多格式报告 | 是 | 部分(机器格式,无修复报告) | 部分(仪表板报告) | 部分(仪表板报告) |
DockSec 是其中唯一将上下文相关的 Dockerfile 修复与完全开源、OWASP 治理、可本地运行的 设计相结合的工具。Snyk 和 Aikido 提供强大的 AI 修复,但仅作为商业云平台,会将你的数据发送到 它们的服务。Trivy 是开源且本地的,但止步于检测,不帮助你修复任何内容。DockSec 填补了 开发人员以及受监管或气隙团队的空缺,他们既需要修复指导,又需要完全控制自己的数据,且无需 任何成本。
自动应用修复
--fix 会应用建议的 Dockerfile 更改中的机械子集,
重新扫描,并报告差异:```bash
docksec Dockerfile --scan-only --fix --dry-run # print the diff, change nothing
docksec Dockerfile --scan-only --fix # apply, keeping a .bak
## 工具
- [**AFL++**](https://github.com/AFLplusplus/AFLplusplus) - 基于 AFL 的模糊测试工具,具有许多改进。
- [**Angr**](https://github.com/angr/angr) - 一个强大的二进制分析平台,具有符号执行引擎。
- [**APKLab**](https://github.com/APKLab/APKLab) - 用于逆向工程 Android 应用的 VS Code 扩展。
- [**Apktool**](https://github.com/iBotPeaches/Apktool) - 用于逆向工程 Android APK 文件的工具。
- [**BinDiff**](https://github.com/google/bindiff) - 用于二进制文件的快速差异比较工具。
- [**Binwalk**](https://github.com/ReFirmLabs/binwalk) - 用于分析、逆向工程和提取固件映像的工具。
- [**Cutter**](https://github.com/rizinorg/cutter) - 基于 Rizin 构建的逆向工程平台。
- [**decomp2dbg**](https://github.com/mahaloz/decomp2dbg) - 将反编译器与调试器集成,以改善逆向工程工作流程。
- [**dnSpy**](https://github.com/dnSpy/dnSpy) - .NET 调试器和程序集编辑器。
- [**Frida**](https://github.com/frida/frida) - 面向开发人员、逆向工程师和安全研究人员的动态代码插桩工具包。
- [**Ghidra**](https://github.com/NationalSecurityAgency/ghidra) - 由 NSA 研究理事会创建的软件逆向工程(SRE)套件。
- [**GhidraMCP**](https://github.com/LaurieWired/GhidraMCP) - 一个模型上下文协议服务器,允许 LLM 自主逆向工程应用程序。
- [**Hopper**](https://www.hopperapp.com/) - 用于 macOS、Linux 和 Windows 的反汇编器和反编译器。
- [**IDA Pro**](https://hex-rays.com/ida-pro/) - 事实上的标准逆向工程工具。
- [**ImHex**](https://github.com/WerWolv/ImHex) - 面向逆向工程师、程序员以及重视其宝贵时间和视网膜的 24/7 工作人士的十六进制编辑器。
- [**JADX**](https://github.com/skylot/jadx) - 用于从 Android Dex 和 Apk 文件生成 Java 源代码的 Dex 到 Java 反编译器。
- [**Kaitai Struct**](https://github.com/kaitai-io/kaitai_struct) - 一种用于描述二进制数据格式的语言。
- [**LIEF**](https://github.com/lief-project/LIEF) - 用于解析、修改和抽象 ELF、PE 和 MachO 格式的库。
- [**Manticore**](https://github.com/trailofbits/manticore) - 用于分析智能合约和二进制文件的符号执行工具。
- [**Miasm**](https://github.com/cea-sec/miasm) - 逆向工程框架。
- [**PE-bear**](https://github.com/hasherezade/pe-bear) - 用于恶意软件分析的 PE 文件逆向工程工具。
- [**pwndbg**](https://github.com/pwndbg/pwndbg) - 使 GDB 不再令人痛苦的 GDB 插件。
- [**pwntools**](https://github.com/Gallopsled/pwntools) - 用于 CTF 框架和漏洞利用开发的快速利用开发库。
- [**radare2**](https://github.com/radareorg/radare2) - 面向 UNIX 的逆向工程框架和命令行工具集。
- [**Rizin**](https://github.com/rizinorg/rizin) - 一个免费且开源的逆向工程框架。
- [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget) - 该工具允许你在二进制文件中搜索你的 ROP 利用所需的 gadget。
- [**ropper**](https://github.com/sashs/Ropper) - 显示有关二进制文件的信息,并查找用于构建 ROP 链的 gadget。
- [**Unicorn**](https://github.com/unicorn-engine/unicorn) - 基于 QEMU 的轻量级、多平台、多架构 CPU 模拟器框架。
- [**x64dbg**](https://github.com/x64dbg/x64dbg) - 适用于 Windows 的开源 x64/x32 调试器。```text
Applied 4 change(s)
- added --no-install-recommends on line(s) 2 [DS029]
- converted ADD to COPY on line(s) 3 [DL3020]
- replaced 'USER root' with 'USER appuser' on line 5 [DS002]
- inserted a placeholder HEALTHCHECK before line 6 [DS026]
Original saved to Dockerfile.bak
Dockerfile findings: 7 -> 2 (5 resolved)
它刻意保持保守。它不会选择基础镜像版本、移动密钥、转换会获取 URL 或解压归档的 ADD,或编辑 compose 文件——这些会被归入“需要审查”下报告。除非给出 --force,它也会拒绝编辑有未提交更改的文件,因此 git 始终能够撤销该更改。
文档
| 指南 | 涵盖内容 |
|---|---|
| 评估指南 | 15 分钟评估,包括 DockSec 不做什么 |
| 利用链 | 跨服务攻击路径及其局限 |
| Compose 规则参考 | 全部 17 条规则:每条规则能捕获什么,以及何时保留它是合理的 |
| CI 集成 | Jenkins、GitLab、Azure Pipelines、pre-commit |
| 示例 | 十个 Dockerfile 和 compose 栈及其预期发现 |
| 案例研究 | 对官方镜像的真实扫描,附有数据 |
路线图
请参阅 ROADMAP.md 了解 DockSec 的发展方向:无需本地 Docker 守护进程的注册表扫描、仓库级策略配置文件、Jenkins/GitLab/Azure DevOps 模板、官方容器镜像、Kubernetes 和 Helm 扫描等。欢迎在 issues 和 OWASP Slack 中提供反馈并对优先级投票。
贡献
DockSec 依靠社区贡献蓬勃发展。无论你是开发者、设计师还是安全爱好者,都有许多方式参与其中:
- 代码贡献:修复 bug 或添加新功能。
- 文档:改进指南或创建教程。
- 问题报告:识别并报告 bug。
- 反馈:分享你的经验和建议。
领导者和社区
DockSec 由一支致力于让容器安全触手可及的专注团队领导:
- Advait Patel - 项目负责人
- Arkadii Yakovets - 项目联合负责人
在这里找到我们:
- OWASP 项目页面:owasp.org/DockSec/
- OWASP Slack:#project-docksec
- PyPI:pypi.org/project/docksec/
- Issues:报告 bug
- 更新日志:CHANGELOG.md
由 Advait Patel 和 OWASP 社区构建。