BarAppTeam/nginx-cve-fix

GitHub: BarAppTeam/nginx-cve-fix

这是一个通过源码构建修复Nginx 1.25.5中CVE漏洞的容器镜像项目,提供完整的溯源证明和VEX支持。

Stars: 0 | Forks: 0

# Nginx CVE 修复 - 针对 `nginx:1.25-bookworm` 的源码构建替代镜像 一个源码构建的 nginx 1.25.5 容器镜像,用于修复官方 `nginx:1.25-bookworm` 镜像中存在的两个 CVE,同时保留上游运行时行为。 | CVE | 组件 | 严重性 | 修复方法 | 验证模型 | | ------------------- | ----------------------------- | ------ | ----------------------- | ----------------------------------------------------------------------------------- | | **CVE-2024-6119** | OpenSSL / libssl3 | 高危 | 依赖版本升级 | 扫描器可验证:`libssl3 3.0.20` 在 dpkg 数据库中可见 | | **CVE-2026-42945** | nginx `ngx_http_rewrite_module` | 严重 | 后移植源码补丁 | 溯源可验证:补丁来源 + 回归测试 + 构建证明 + VEX | 这代表了两种不同的修复模型: 1. **版本升级**(CVE-2024-6119)- 修复后的库版本可直接通过 dpkg 数据库被扫描器识别。无需额外证明。 2. **源码后移植**(CVE-2026-42945)- 包版本保持为 1.25.5,因此扫描器无法区分已修补和未修补的二进制文件。 修复通过源码溯源、构建时验证和回归测试来证明。VEX 提供扫描器层面的信号。 ### 等同状态 此镜像的 `nginx -V` 配置参数与 `nginx:1.25-bookworm` **完全匹配**(在规范化 `-ffile-prefix-map` 构建路径后逐字符比较;在 `test/compat.py::test_nginx_version` 中验证)。 测试套件 (`make test`) 包含 89 项断言,覆盖了镜像元数据、动态模块、文件系统布局、入口点行为、dpkg 包以及与上游实时镜像对比的 HTTP 请求处理。 **与上游的已知差异**(未验证为完全相同): - `nginx -V` 中 `built with OpenSSL X.X.X` 行反映了构建器的 libssl-dev 版本,可能与上游编译时使用的 OpenSSL 版本不同。 - 二进制内容不是逐字节完全相同(不同的编译环境、不同的工具链调用时间戳)。 - 镜像包集合不同 - 使用 `debian:bookworm-slim` 基础镜像,而非官方镜像继承的包树。 - 运行时 `libssl3` 版本为 bookworm 当前提供的版本(写作时为 3.0.20),而非上游镜像中固定的版本。 ## 快速开始 ``` # 构建全部内容 (builder → .deb → 最终镜像) make image # 运行自动化兼容性测试 make test # 运行 CVE-2026-42945 回归测试 make test-cve # 验证补丁来源 (从上游 tarball 重新推导) make verify-patch # 扫描并展示 VEX make scan ``` 一条命令完成构建、测试和扫描: ``` make all ``` ## 仓库结构 ``` build/ Dockerfile.build Builder image (debian:bookworm-slim + compilation deps) build.sh Fetch → verify → patch → compile → package nginx generate-vex.sh Generate OpenVEX document for backported CVE verify-patch.sh Re-derive patch from upstream tarballs (audit tool) patches/ CVE-2026-42945.patch Backported one-line fix from nginx 1.30.1 CVE-2026-42945.provenance.json Machine-readable patch provenance and derivation metadata test/ compat.py 89-assertion compatibility test suite (runs against live upstream) test_cve_2026_42945.py CVE-specific regression test (exercises vulnerable code path) artifacts/ patch-attestation.json Build-time patch attestation (tracked) nginx_*.deb Compiled package (gitignored - rebuilt via `make build-source`) nginx Compiled binary (gitignored) Containerfile Final runtime image definition Makefile Orchestrates build → test → scan pipeline vex.json Generated OpenVEX v0.2.0 document baseline-trivy.txt Point-in-time Trivy scan of nginx:1.25-bookworm baseline-grype.txt Point-in-time Grype scan of nginx:1.25-bookworm fixed-trivy.txt Trivy scan of the fixed image fixed-grype.txt Grype scan of the fixed image (without VEX) fixed-grype-vex.txt Grype scan of the fixed image (with VEX applied) ``` ## 构建流程 ### 架构 ``` debian:bookworm-slim (builder) └─ build.sh ├─ curl nginx-1.25.5.tar.gz (SHA256-verified) ├─ curl njs-0.8.4 from github.com/nginx/njs ├─ patch -p1 < CVE-2026-42945.patch ├─ ./configure (flags identical to upstream nginx -V) ├─ make: release binary, debug binary, 4 dynamic module families (×2 release/debug) ├─ make: NJS modules (×2 release/debug) + njs CLI binary └─ dpkg-deb → nginx_1.25.5-1~bookworm+echo1_.deb debian:bookworm-slim (runtime) ├─ apt-get install runtime deps (libssl3 ≥ 3.0.14 enforced) ├─ dpkg -i nginx_*.deb └─ COPY --from=upstream /docker-entrypoint.sh + /docker-entrypoint.d/ ``` Containerfile **没有**从上游复制 `/etc/nginx`。所有配置文件都包含在 `.deb` 内,并由 dpkg 的 conffile 机制跟踪。 这对于 `10-listen-on-ipv6-by-default.sh` 入口点脚本是必需的,该脚本使用 `dpkg-query` 检测 `default.conf` 是否已被用户修改。 ### 完整性保证 - **源码压缩包**:所有源码存档(nginx, NJS)在解压前都根据硬编码哈希进行 SHA256 校验。校验失败则构建中止。 - **从源码构建**:在干净的 Debian 容器内执行 `./configure && make`。不使用上游二进制文件,不执行 `apt install nginx`。 - **编译期间无网络访问**:依赖项在构建器 Docker 镜像层中安装;`build.sh` 仅获取固定的源码压缩包。 ### 可复现性 构建是_大部分_可复现的,但不是密封的: - nginx 源码版本和 SHA256 已固定,并在解压前验证。 - NJS 版本和 SHA256 已固定,并在解压前验证。 - 构建器依赖项在 `Dockerfile.build` 中列出,但版本未固定。 - Debian 运行时包在构建时从实时 bookworm 仓库解析,因此不同构建之间的小版本号可能漂移。 为提高可复现性,请固定基础镜像摘要: ``` docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}' # 随后使用:FROM debian:bookworm-slim@sha256: ``` ## CVE 修复详情 ### CVE-2024-6119 - OpenSSL 版本升级 | 字段 | 值 | | -------------------- | ---------------------------------------------------- | | **组件** | OpenSSL / libssl3 | | **严重性** | 高危 (CVSS 7.5) | | **类型** | 通过 X.509 名称检查导致的拒绝服务 | | **基线版本** | 3.0.11-1~deb12u2 | | **修复版本** | 3.0.14-1~deb12u2 (或更高) | | **我们的版本** | 3.0.20-1~deb12u1 | | **NVD** | https://nvd.nist.gov/vuln/detail/CVE-2024-6119 | | **安全公告** | https://openssl-library.org/news/secadv/20240903.txt | **修复原理:** `.deb` 包声明 `Depends: libssl3 (>= 3.0.14)`,这强制 `apt-get install` 拉取包含修复的 OpenSSL 版本。当前 Debian bookworm 仓库提供 3.0.20,该版本修复了 CVE-2024-6119 以及基线版本中的数十个其他 OpenSSL CVE(CVE-2024-2511, CVE-2024-5535, CVE-2024-4741, CVE-2023-5678, CVE-2023-6129, CVE-2023-6237, CVE-2024-9143, CVE-2025-15467, CVE-2025-69420)。 **扫描器行为:** Grype 和 Trivy 在 dpkg 数据库中看到 `libssl3 3.0.20`,并识别出 3.0.20 ≥ 3.0.14,因此不再报告 CVE-2024-6119。无需 VEX - 版本升级不言自明。 **验证:** ``` grep "CVE-2024-6119" baseline-grype.txt # present grep "CVE-2024-6119" fixed-grype.txt # absent ``` ### CVE-2026-42945 - 后移植补丁 | 字段 | 值 | | -------------------- | --------------------------------------------------------------------- | | **组件** | nginx `ngx_http_rewrite_module` | | **严重性** | 中危 (nginx.org 分类) | | **基线版本** | nginx 1.25.5 | | **修复版本** | nginx 1.30.1 (发布于 2026-05-13) | | **NVD** | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 | | **安全公告** | https://my.f5.com/manage/s/article/K000161019 | | **上游 CHANGES** | nginx 1.30.1 CHANGES: "heap memory buffer overflow in rewrite module" | **漏洞描述:** `src/http/ngx_http_script.c` 中的 `ngx_http_script_regex_end_code()` 在处理 rewrite 正则表达式结果时未能重置 `e->is_args`。如果 `is_args` 由之前的脚本引擎操作设置,则后续在重定向/rewrite 路径中的缓冲区长度计算将不正确,导致通过精心构造的请求 URI 引发攻击者可控大小的堆缓冲区溢出。 **修复(一行代码):** ``` // Added before the existing e->quote = 0; at line 1205 e->is_args = 0; ``` **补丁来源:** | 证据 | 位置/值 | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | 上游提交 | [`2046b45aa0c6e712c216b9075886f3f26e9b4ca9`](https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9) | | 上游作者 | Roman Arutyunyan (arut), 由 Sergey Kandaurov (pluknet) 提交, 2026-05-13 | | 上游 PR | [nginx/nginx#1350](https://github.com/nginx/nginx/pull/1350) | | 上游标签 | `release-1.31.0`, `release-1.30.1` | | 相关历史修复 | [`74d9399`](https://github.com/nginx/nginx/commit/74d939974d430a2c2e71b0134114d2a7b04dcc20) (2012, 类似的 `is_args` 转义问题) | | 补丁文件 | `build/patches/CVE-2026-42945.patch` | | 溯源元数据 | `build/patches/CVE-2026-42945.provenance.json` | | 源码压缩包 (有漏洞) | `https://nginx.org/download/nginx-1.25.5.tar.gz` SHA256:`2fe2294f8af4144e7e842eaea884182a84ee7970e...` | | 源码压缩包 (已修复) | `https://nginx.org/download/nginx-1.30.1.tar.gz` SHA256:`99765000d974896b31ca5882d8c279ce3fe7ef6f...` | | 有漏洞文件 SHA256 | `c4b10c95b00e43d731a61f2380d406155e037f3cfb40a3bf58711ecefddc799a` | | 已修复文件 SHA256 | `a6182175a22d88f66b9a61ae051bdcfece10d1bb2e643f7f175eb07589143403` | | 衍生方法 | 在两个压缩包之间执行 `diff src/http/ngx_http_script.c`(确认与上游提交相同) | | 变更行数 | 1 行 (仅增加) | | 补丁可干净应用 | 已验证:`patch --dry-run -p1 < build/patches/CVE-2026-42945.patch` 退出码为 0 | | 构建时验证 | `build.sh` 验证补丁后源码中存在 `e->is_args = 0`,若不存在则中止构建 | | 构建时证明 | 构建期间写入 `artifacts/patch-attestation.json` | | 回归测试 | `test/test_cve_2026_42945.py` - 测试易受攻击的代码路径 | | 补丁验证脚本 | `make verify-patch` - 从上游压缩包独立重新生成补丁 | **补丁创建过程:** 1. 下载 `nginx-1.25.5.tar.gz` (SHA256 根据固定哈希验证) 2. 下载 `nginx-1.30.1.tar.gz` (SHA256 验证: `99765000d974896b31ca5882d8c279ce3fe7ef6f5c6f9f0a967ed7fd3407f9cc`) 3. 在两个目录树之间运行 `diff src/http/ngx_http_script.c` 4. diff 产生恰好一行 - 添加 `e->is_args = 0;` 5. 提取为包含上下文行的 unified diff 补丁 6. 验证补丁可干净应用于 nginx 1.25.5 7. 两个源码树保留在 `research/` 中供独立验证 **回归测试:** 测试套件 `test/test_cve_2026_42945.py` 通过发送利用 rewrite 规则操作查询字符串状态 (`is_args`) 的请求来测试易受攻击的代码路径。它验证: - 带尾随 `?` 的 rewrite 重定向(查询清除)产生格式良好的响应 - 链式 rewrite 切换 `is_args` 状态不会导致 worker 崩溃 - 长查询字符串(4KB+)不会导致缓冲区溢出伪影(空字节、过长的 Location 头部) - 100 个快速混合请求不会导致 worker 崩溃 - worker 进程在所有测试用例中存活,无 SIGSEGV 或堆损坏 运行:`make test-cve` **扫描器行为:** 由于包版本保持 `1.25.5`,当其数据库中存在安全公告时,扫描器会标记 CVE-2026-42945。这是预期的 - 扫描器通过 `(包名, 上游版本)` 匹配,无法检查源码是否已打补丁。VEX 文档通过机器可读的正当理由抑制此发现。扫描器抑制是一种沟通机制,而非修复的主要证据。主要证据是上面的补丁溯源链和回归测试。 ## VEX (漏洞可利用性交换) ### 为什么需要 VEX 扫描器通过 dpkg 数据库中的 `(name, version)` 识别包。 我们的包是 `nginx 1.25.5-1~bookworm+echo1` - 扫描器将其解析为上游版本 1.25.5,并标记所有影响 nginx ≤ 1.25.5 的 CVE。 对于后移植的修复,扫描器无法确定易受攻击的代码已打补丁。版本故意保持为 1.25.5 以保持包兼容性。VEX 提供机器可读的证明,表明 CVE 已得到解决,并链接到可验证的证据。 ### VEX 可信链 针对 CVE-2026-42945 的 VEX 声明**不仅仅是文件工作**。它由以下支持: 1. **补丁来源** - `build/patches/CVE-2026-42945.provenance.json` 记录了确切的上游源码、衍生方法和文件哈希 2. **构建时验证** - `build.sh` 断言修复标记存在于编译后的源码中,失败则中止构建 3. **构建证明** - `artifacts/patch-attestation.json` 记录了构建期间生成的补丁前后文件哈希 4. **回归测试** - `test/test_cve_2026_42945.py` 测试易受攻击的代码路径,无崩溃或损坏 5. **独立重新生成** - `make verify-patch` 下载两个上游压缩包,并证明提交的补丁是最小安全差异 ### VEX 覆盖范围 | CVE | 状态 | 正当理由 | 证据 | | --------------- | ------ | --------------------------- | ---------------------------------------------------------- | | CVE-2026-42945 | `fixed`| `vulnerable_code_not_present`| 后移植补丁 + 溯源 + 回归测试 + 构建门控 | VEX 范围有意限定:仅覆盖本项目通过可验证证据主动修复的 CVE。仅“预期被缓解”的发现不会被抑制 - 这避免了将 VEX 用作通用抑制工具。 ### 工作原理 `build/generate-vex.sh` 脚本生成 OpenVEX v0.2.0 文档。 应用它的扫描器命令: ``` # 不使用 VEX 时 - CVE 被报告 (基于版本的匹配): grype nginx-fixed > fixed-grype.txt # 使用 VEX 时 - CVE 被依据理由压制: grype nginx-fixed --vex vex.json > fixed-grype-vex.txt ``` ### 扫描器证据 VEX 抑制可在保存的扫描工件中观察到。注意扫描器数据库会定期重建,CVE 的存在可能在不同运行之间变化。 保存的 `baseline-grype.txt` 和 `fixed-grype.txt` 文件是特定时间点的证据。VEX 文档的有效性**不**依赖于扫描器数据库状态 - 它可以通过上面的溯源链独立验证。 ## 扫描器完整性 ### 包命名决定 包命名为 **`nginx`**(而非 `nginx-custom`)。这很关键,因为: 1. **诚实报告:** 如果包被重命名,扫描器不会将其识别为 nginx,所有 nginx CVE 都会静默消失 - 包括未修复的那些。这是一种虚假的安全感。 2. **VEX 演示:** VEX 只能抑制扫描器实际报告的 CVE。重命名的包使 VEX 变得多余(且无法测试)。 3. **包管理:** 命名为 `nginx` 允许它满足依赖关系并由标准 Debian 工具管理。 ### 扫描器数据库波动性 扫描器安全公告数据库会定期重建。某周存在的 CVE 下周可能就不存在。本项目**不**依赖扫描器输出作为修复的主要证明。证据链是: 1. 补丁来源(独立于任何扫描器可验证) 2. 构建时证明(编译期间生成) 3. 回归测试(测试易受攻击的代码路径) 4. VEX 抑制(扫描器层面的认可) 保存的扫描文件仅为特定时间点的证据。 ### 扫描器所见(已修复镜像) | 包 | 版本 | CVE-2024-6119 | CVE-2026-42945 | | ------- | ------------------------- | ------------------------------- | --------------------------------------------------- | | libssl3 | 3.0.20-1~deb12u1 | 未报告(通过版本修复) | 不适用 | | nginx | 1.25.5-1~bookworm+echo1 | 不适用 | 当存在于数据库中时报告(后移植对扫描器不可见) | 使用 `--vex vex.json` 时,CVE-2026-42945 发现(如果存在于扫描器数据库中)将被抑制。VEX 文档的有效性由溯源链(补丁衍生、构建证明、回归测试)建立,而非仅依赖扫描器输出。 ## 兼容性测试 测试套件 (`test/compat.py`) 启动 `nginx:1.25-bookworm` 和 `nginx-fixed` 作为 Docker 容器并比较行为。每项断言直接针对实时修复镜像与实时上游镜像进行测试。 **89 项断言。全部通过。** 此外,`test/test_cve_2026_42945.py` 提供了约 20 项专门针对后移植 CVE 修复的断言(见上文“回归测试”)。 | 类别 | 比较内容 | 断言数量 | | ------------------- | ------------------------------------------------------------------- | -------- | | 镜像元数据 | Entrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels | 7 | | nginx -V 参数 | 配置标志相同(规范化 `-ffile-prefix-map` 路径) | 1 | | 动态模块 | 所有 12 个上游 `.so` 文件存在 + `/etc/nginx/modules` 符号链接 | 13 | | nginx-debug 二进制 | debug -V 中存在 `--with-debug` 和 `--with-http_v3_module` | 2 | | 文件系统布局 | 约 20 个关键路径,日志符号链接到 /dev/stdout 和 /dev/stderr | ~20 | | 用户/组配置 | `getent passwd/group nginx` 输出相同 | 2 | | dpkg conffiles | `dpkg-query` 报告 default.conf 和 nginx.conf 为 conffiles | 1 | | 包提供的元数据 | `dpkg -s nginx` 显示 `Provides: nginx-r1.25.5` | 1 | | NJS 二进制 | `njs -v` 返回 0.8.4 | 1 | | IPv6 入口点 | `10-listen-on-ipv6-by-default.sh` 以相同方式修改 default.conf | 1 | | Envsubst 模板 | `NGINX_ENVSUBST` 模板替换产生相同输出 | 1 | | 启动日志 | 所有入口点日志行匹配上游格式 | 1 | | HTTP GET/HEAD/POST | 多个端点的响应体、状态码、头部匹配 | ~10 | | 格式错误的请求 | 原始 TCP 错误响应相同 | 1 | | 静态文件服务 | 挂载的文件以正确内容提供 | 1 | | TLS 终止 | 使用自签名证书的 HTTPS 工作方式相同 | 1 | | 优雅关闭 | SIGQUIT 产生干净退出(退出码 0) | 1 | | 配置重载 | SIGHUP 应用新配置无需重启 | 1 | | 并发请求 | 50 个并行请求全部返回 200 | 1 | ### 未测试内容 - HTTP/3 QUIC 协议行为(仅验证 `--with-http_v3_module` 标志存在;未发送 UDP/QUIC 流量) - 负载下的性能或延迟特性 - 所有可能的 nginx 配置指令 - 很少使用的动态模块(GeoIP, image_filter, XSLT)的行为,除了验证 `.so` 文件存在于磁盘上 运行: ``` make test ``` ## 镜像大小 | 镜像 | 大小 (arm64, `docker images`) | | --------------------- | ----------------------------- | | `nginx:1.25-bookworm` | ~278 MB | | `nginx-fixed` | ~332 MB | 修复镜像比上游大。这是预期的:官方镜像使用预编译二进制文件和优化层,而我们的镜像将构建工件和完整运行时依赖(包括所有 12 个动态模块的库)安装到 `debian:bookworm-slim` 基础镜像中。大小差异是源代码级构建控制的权衡,而非功能回退。 ## 残余风险评估 ### 修复镜像中剩余的 CVE 修复镜像仍然包含本项目未解决的系统库漏洞(特定时间点;运行 `make scan` 获取当前状态): | 风险等级 | 包 | CVE(s) | 备注 | | -------- | ------------ | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | 高危 | nginx | CVE-2023-44487 | 根据上游在 nginx ≥ 1.25.3 中缓解;扫描器仍标记是因为 Debian 跟踪器未关闭安全公告 | | 严重 | libgnutls30 | CVE-2026-42010, CVE-2026-33845 | bookworm 中无可用修复 | | 严重 | libc6/libc-bin| CVE-2026-5450 | 此 Debian 版本中不会修复 | | 高危 | libc6/libc-bin| CVE-2026-5928, CVE-2026-5435, CVE-2026-4437 | bookworm 的 glibc 不会修复 | | 高危 | dpkg | CVE-2025-6297, CVE-2026-2219 | 可修复(升级到 1.21.23) | | 高危 | libldap-2.5-0| CVE-2023-2953 | 不会修复 | | 高危 | curl/libcurl4| CVE-2026-5773, CVE-2026-6276 | 不会修复 | | 高危 | ncurses | CVE-2025-69720 | 不会修复 | 这些继承自 `debian:bookworm-slim`,不在本项目以 nginx 为重点的 CVE 修复范围内。 ### 此方法的局限性 1. **非密封构建。** 基础镜像和 apt 包在构建时从实时 Debian 仓库解析。固定基础镜像 SHA 并使用 apt 快照可以提高可复现性。 2. **无 QUIC 行为测试。** HTTP/3 支持已编译(通过标志验证),但测试套件中未测试 QUIC 流量。 3. **无性能验证。** 50 个并发请求测试证明了正确性,而非吞吐量或延迟等效性。 4. **仅模块加载。** 动态模块(GeoIP, image_filter, XSLT)已验证存在且可加载,但除基本加载外未测试其功能行为。 5. **单架构证据。** 测试仅在构建主机架构上运行(开发中为 arm64;需要 CI 进行多架构测试)。 ### 未来改进(未实现) 1. 固定基础镜像摘要并使用 apt 快照 URL 进行密封构建。 2. 去除作为传递依赖拉取的不必要包(ncurses, util-linux)。 3. 生成 SBOM(`make sbom` 目标已存在,使用 `syft`)并通过 SBOM purl 链接到 VEX。 4. 使用 `cosign` 签名镜像,并将 VEX + SBOM + 补丁证明作为 OCI 证明附加。 5. 添加 CI 流水线(GitHub Actions)进行自动化构建 → 测试 → 扫描 → 推送。 6. 添加 HTTP/3 协议测试(QUIC 客户端、证书设置、UDP 端口)。 7. 考虑使用 distroless 基础镜像以完全消除操作系统级别的 CVE 噪音。 8. 添加 ASan (AddressSanitizer) 构建变体,以证明在测试负载下无堆损坏。 ## 构建标志 vs. 上游 `build.sh` 中的 `./configure` 标志与官方 `nginx:1.25-bookworm` 镜像中 `nginx -V` 报告的标志相同。这由 `test/compat.py::test_nginx_version` 验证,该测试规范化了 `-ffile-prefix-map=` 差异并逐字符比较剩余标志。 值得注意的标志(两个镜像中都存在): | 标志/功能 | 目的 | | ----------------------- | ---------------------------------------------------------------------------- | | `--prefix=/etc/nginx` | Docker 镜像惯例(非 Debian 的 `/usr/share/nginx`) | | `--with-http_v3_module` | 内置 QUIC 栈(独立于 OpenSSL QUIC API) | | `--with-pcre` (PCRE2) | 链接到 `libpcre2-8-0`(非旧版 PCRE1) | | `--with-stream` | TCP/UDP 代理模块(动态) | | 安全加固 | `-fstack-protector-strong`, `FORTIFY_SOURCE=2`, RELRO, PIE | | 动态模块 (×12) | geoip, stream_geoip, image_filter, xslt, http_js, stream_js (发布版 + 调试版) | | `--with-debug` (调试版) | 单独构建的 nginx-debug 二进制文件,具有相同标志 + 调试信息 | ## Debian 包 `.deb` 包元数据: ``` Package: nginx Version: 1.25.5-1~bookworm+echo1 Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libpcre2-8-0 (>= 10.22), libssl3 (>= 3.0.14), zlib1g (>= 1:1.2.11), libgeoip1 (>= 1.6.12), libgd3 (>= 2.1.0~alpha~), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), lsb-base (>= 3.0-6), adduser Provides: httpd, nginx, nginx-r1.25.5 Conflicts: nginx-common, nginx-core Replaces: nginx-common, nginx-core ``` 关键打包决定: - **`libssl3 (>= 3.0.14)`** - 明确要求修复的 OpenSSL(上游声明 `>= 3.0.0`)。这是强制执行 CVE-2024-6119 修复的机制。 - **`Provides: nginx-r1.25.5`** - 满足依赖此虚拟包的动态模块包。 - **向 dpkg 注册的 Conffiles**:`/etc/nginx/nginx.conf` 和 `/etc/nginx/conf.d/default.conf`。这对于 IPv6 入口点脚本的 `dpkg-query --showformat` 检查是必需的。 - **postinst** 创建 uid/gid 为 101、shell 为 `/bin/false` 的 nginx 用户/组(与上游匹配 - 在测试套件中验证)。 - 包含:nginx 二进制文件、nginx-debug 二进制文件、所有 12 个 `.so` 模块、完整的 `/etc/nginx` 配置树、init.d/systemd/logrotate 文件、man 手册页、HTML 默认文件,以及 `/etc/nginx/modules` → `/usr/lib/nginx/modules` 符号链接。 ## 设计决策与权衡 1. **包命名为 `nginx`,而非 `nginx-custom`。** 如果重命名,扫描器不会将其与 nginx 安全公告匹配 - 所有 nginx CVE 都会静默地从报告中消失,包括未修复的那些。保持名称 `nginx` 确保诚实的扫描器报告,并使 VEX 有意义。 2. **VEX 需要 CVE 可见性。** VEX 的目的是抑制一个已经被报告的 CVE。如果扫描器找不到该 CVE(由于包重命名或数据库时机),VEX 就没有东西可抑制。 3. **`libssl3 (>= 3.0.14)` 作为包依赖。** 而非寄希望于运行时基础镜像恰好包含修复的 OpenSSL,`.deb` 硬性要求一个包含 CVE-2024-6119 修复的版本。 4. **扫描器数据库波动性。** 安全公告数据库会定期重建。某周存在的 CVE 下周可能就不存在。本仓库中保存的扫描文件是特定时间点的证据;当前扫描可能不同。 5. **使用了 AI 工具。** GitHub Copilot 协助进行补丁分析(比较 nginx 1.25.5 和 1.30.1 源码树)、测试套件结构、识别包重命名的扫描器规避问题以及 VEX 文档撰写。Debian 打包细节和 Grype 版本匹配启发式需要手动验证。
标签:CVE修复, Docker, GPT, Nginx, OpenSSL, osquery, VEX证明, Web截图, 依赖管理, 回溯补丁, 安全扫描, 安全测试工具, 安全补丁, 安全防御评估, 容器安全, 容器镜像, 时序注入, 构建证明, 源代码构建, 溯源链, 漏洞管理, 漏洞补丁, 版本管理, 网络安全, 请求拦截, 软件供应链安全, 运维安全, 远程方法调用, 逆向工具, 隐私保护