---
name: cve-2026-111497-brotli
description: 对 apt 系 Linux 主机上 CVE-2026-111497（Google Brotli 解码器中的越界写入，CVSS 4.0 9.2）进行确定性审计与修复。三个脚本 —— detect.sh、remediate.sh、verify.sh —— 取代手工探查主机，并把语言模型的 token 开销降到最低。在任何 Debian 或 Ubuntu 主机上审计或修复该 CVE 时加载。
whenToUse: 当需要在 Debian 或 Ubuntu 服务器上检查或修复 CVE-2026-111497（Brotli）时使用 —— 漏洞判定、解码路径发现、发行版回溯移植、消费者重启、实际效果验证。
metadata:
  severity: critical
  cve: CVE-2026-111497
  cwe: CWE-787
  platform: Debian 12, Ubuntu 24.04, Ubuntu 26.04
---

# CVE-2026-111497（Brotli）修复代理

## 目的

CVE-2026-111497 是 Google Brotli 解码器中的越界写入。利用该漏洞无需认证：精心构造的
Brotli 流会使进程崩溃、破坏内存，并在某些配置下实现远程代码执行。

本代理把完整的审计与修复压缩为**三个确定性步骤**，每一步都返回紧凑的、机器可读的判定结论。
模型负责编排整个运行过程并读取一至两行结论；它不必手工探查主机。

## 操作流程（最小 token 开销）

准备 —— 把脚本一次性投递到目标主机：

```bash
scp src/common.sh src/detect.sh src/remediate.sh src/verify.sh <host>:/root/cve-2026-111497/
```

### 步骤 1 —— 审计（只读）

```bash
ssh <host> 'bash /root/cve-2026-111497/detect.sh'
```

只读最后一行：判定结论与一段紧凑摘要（约七行）。JSON 报告写入
`/var/lib/cve-2026-111497/report.json`。

| 退出码 | 判定 | 处置 |
|---|---|---|
| 0 | SAFE | 无需动作，记录结果 |
| 1 | VULNERABLE | 进入步骤 2 |
| 3 | NOT_INSTALLED | `libbrotli1` 不存在 —— 记录 |
| 10 | ERROR | 阅读消息，上报 |

### 步骤 2 —— 修复（仅在 VULNERABLE 时）

```bash
ssh <host> 'bash /root/cve-2026-111497/remediate.sh'
```

脚本在没有模型参与的情况下按以下顺序执行：

1. 把旧 `.deb`、当前 `.so` 文件与一份 `dpkg` 快照备份到
   `/root/cve-2026-111497-fix-<timestamp>/`。
2. **真实性闸门** —— 下载候选软件包，其变更日志必须引用
   `CVE-2026-111497`。若无该引用，则不执行安装。
3. 对 `apt-get install --only-upgrade` 做试运行。
4. 安装回溯移植版本（`libbrotli1`，若原先安装了 `libbrotli-dev` 则一并处理）。
5. 重启解码器的**服务器侧**消费者，其范围由 `/proc/*/maps` 与 cgroup 解析得出；
   桌面与基础设施进程（GNOME、NetworkManager、VPN、fwupd）被刻意延迟 —— 它们会在下次
   登录或重启时重新加载该库。
6. 检查没有任何进程继续映射旧的 inode。

### 步骤 3 —— 验证实际达成的效果

```bash
ssh <host> 'bash /root/cve-2026-111497/verify.sh'
```

读取最后一行：`VERIFY: PASS`（退出码 0）或 `VERIFY: FAIL`（退出码 1）。

## 审计范围

- `libbrotli1` 版本，按受影响版本矩阵（1.0.3–1.0.9、1.1.0、
  1.2.0）分类，并计入发行版回溯移植。
- 解码器（`libbrotlidec`）的活跃消费者，通过 `/proc/*/maps` 获取。
- 解码路径：libcurl（`brotli/...`）、Node.js、Python `Brotli`/`brotlicffi`、PHP brotli
  扩展、`ngx_brotli`、`mod_brotli`。
- 使用 `CURLOPT_ENCODING` / `CURLOPT_ACCEPT_ENCODING` 的 PHP 文件计数 —— 即 WordPress
  Requests、SimplePie 与 Guzzle 中自动解码 `Content-Encoding: br` 的位置。

## 适用范围与边界

- 覆盖带有 apt 的发行版（Debian、Ubuntu），且 `-security` 中有官方回溯移植。没有回溯移植时，
  脚本停止并要求人工缓解（在边缘阻断 `Content-Encoding: br`），或者从源码构建 brotli 1.2.1
  或更新版本。
- 不触及 Envoy、Istio、.NET、Bun 或 Deno —— 它们不在本代理所面向主机的范围之内。

## 安全规则（强制）

- 目标主机上需要 root 权限。
- 在候选版本通过真实性闸门之前，不做任何变更。
- 回滚：`dpkg -i <backup>/deb/libbrotli1_*.deb`，然后重启步骤 2 中列出的服务。
- 修复后检查 `systemctl --failed` 以及所托管站点的可用性。
