# Плейбук — устранение CVE-2026-111497

Процедура, которую реализуют скрипты, изложенная так, чтобы аудитор-человек мог воспроизвести,
проверить или переопределить каждый шаг. Каждая фаза называет своё доказательство: команду, вывод
которой обосновывает решение.

## Фаза 0 — Инвентаризация периметра

Определите, какие хосты входят в область работ, и подтвердите доступ root по ключу.

```bash
for h in <host-alias-1> <host-alias-2>; do
  ssh "$h" 'grep PRETTY_NAME /etc/os-release; dpkg -l libbrotli1 2>/dev/null | tail -1'
done
```

Приёмка: каждый хост отвечает названием ОС и либо строкой пакета, либо ничем.

## Фаза 1 — Обнаружение (только чтение)

`detect.sh` собирает перечисленное ниже, не изменяя систему:

1. Идентичность хоста и ОС.
2. Версию `libbrotli1` и её классификацию по матрице уязвимых выпусков.
3. Применён ли уже backport дистрибутива (changelog указывает данную CVE).
4. Кандидата apt из `-security` после `apt-get update`.
5. Живых потребителей `libbrotlidec` по `/proc/*/maps`.
6. Поверхность декодирования: libcurl, Node, Python, PHP, `ngx_brotli`, `mod_brotli`.
7. Снимок inode реальных файлов `.so` — для последующего сравнения устаревших отображений.

Вердикт: `SAFE` (0), `VULNERABLE` (1), `NOT_INSTALLED` (3), `ERROR` (10).

Приёмка: `state.before` существует и содержит `installed`, `candidate` и три inode.

## Фаза 2 — Устранение

`remediate.sh` выполняет строгую последовательность и останавливается на первом нарушенном
инварианте:

1. **Резервное копирование** — старый `.deb`, текущие `.so`, снимок `dpkg -l` в
   `/root/cve-2026-111497-fix-<timestamp>/`.
2. **Проверка подлинности** — загрузить кандидата и потребовать наличия `CVE-2026-111497` в его
   changelog внутри пакета. Кандидат, который лишь выглядит новее, отклоняется.
3. **Сухой прогон** — `apt-get install --only-upgrade --dry-run`; ожидаемый набор — ровно пакеты
   Brotli и ничего кроме них.
4. **Установка** — `libbrotli1`, плюс `libbrotli-dev`, если он был установлен ранее.
5. **Перезапуск потребителей** — каждый юнит systemd, процессы которого отображают
   `libbrotlidec`, приведённый к самому внутреннему юниту под `/system.slice/`, чтобы были
   охвачены и шаблонные экземпляры юнитов; демоны панели, запущенные как временные scope,
   перезапускаются их собственным инструментом управления.
6. **Проверка inode** — ни один серверный потребитель не должен сохранять отображённым inode,
   существовавший до установки исправления.

Приёмка: код возврата 0 и строка `REMEDIATED:`, называющая старую и новую версии.

## Фаза 3 — Проверка

`verify.sh` подтверждает пять фактов:

1. Версия пакета изменилась.
2. Установленный changelog ссылается на `CVE-2026-111497`.
3. Ни один серверный процесс не отображает inode, существовавший до исправления.
4. `systemctl --failed` пуст.
5. Функциональный цикл декодирования проходит успешно (локальная конечная точка `br` или
   утилита `brotli`).

Приёмка: `VERIFY: PASS`, код возврата 0.

## Ручная перекрёстная проверка (независимо от скриптов)

```bash
dpkg -l | grep -E 'brotli'
apt-cache policy libbrotli1
zgrep -i CVE-2026-111497 /usr/share/doc/libbrotli1/changelog.Debian.gz
# no process may map the pre-patch decoder:
grep -l libbrotlidec /proc/[0-9]*/maps 2>/dev/null | wc -l
```

## Откат

```bash
dpkg -i /root/cve-2026-111497-fix-<timestamp>/deb/libbrotli1_*.deb
# then restart every service listed in phase 2, step 5
```

Откат по определению возвращает уязвимую версию. Применяйте его только тогда, когда
пропатченный пакет ломает зависимость, и фиксируйте это решение.

## Временная мера при отсутствии backport

Отклоняйте запросы, несущие `Content-Encoding: br` (включая составные значения вида `gzip, br`),
на обратном прокси или WAF до того, как они достигнут приложения, и отвечайте `415 Unsupported
Media Type`. Это временная мера, а не замена обновлению: она защищает только входящие тела
запросов и оставляет подверженным каждый исходящий запрос через libcurl.

## Критерии закрытия

- Повторный запуск `detect.sh` возвращает 0, либо после устранения `verify.sh` возвращает
  `VERIFY: PASS`.
- Каталог резервной копии существует и не пуст.
- Размещённые сайты отвечают в том же состоянии, что и до изменения.
- Отложенные потребители рабочего стола зафиксированы в отчёте с указанием, что они перезагрузят
  пропатченную библиотеку при следующем входе или перезагрузке.
