
Расширение Checkmk, которое проверяет хосты Linux на наличие декодеров Brotli (libbrotlidec, Node.js, Python, .NET), затронутых CVE-2026-111497, проверяя версии, бэкпорты и устаревшие процессы.
Расширение для Checkmk, которое показывает для каждого декодера Brotli на Linux-хосте, затронут ли он уязвимостью Broccoli2Shell — CVE-2026-111497, записью за границы буфера в C-декодере Brotli от Google, которая может привести к удалённому выполнению кода, когда программа распаковывает данные Brotli из недоверенного источника (HTTP-ответа, тела запроса, архива). Уязвимость была раскрыта 2026-10-21/22 и исправлена в Brotli 1.0.10, 1.1.1 и 1.2.1, Node.js 22.23.4, 24.22.1 и 26.12.1, Python-пакетах Brotli 1.2.1 и brotlicffi 1.2.1.0, а также в .NET 8.0.33, 9.0.22 и 10.0.14.
Расширение поставляется с небольшим агентом-плагином на POSIX shell, который только собирает факты (системная библиотека libbrotlidec, бинарники Node.js, установки Python Brotli и brotlicffi, среды выполнения .NET, их версии, журналы изменений пакетов, с чем они слинкованы, какие процессы их загрузили и какие всё ещё выполняют заменённую версию). Решение о том, означает ли это «исправлено» или «уязвимо», принимает check-плагин на сервере Checkmk, поэтому новая информация — например, ещё один исправленный релиз — требует лишь обновлённого .mkp, а не нового скрипта на каждом хосте.
Почему не просто сравнить номера версий: дистрибутивы переносят исправление, не меняя upstream-версию, и собирают Node.js против системной библиотеки вместо копии, встроенной в Node.js. Debian 12 поставляет libbrotli 1.0.9 и Node.js 18.20.4 (upstream end of life, без исправления) — оба исправлены, потому что обновлённый пакет libbrotli1 — это декодер, который использует Node.js. Поэтому расширение читает журнал изменений пакета, которому принадлежит каждый декодер, и прослеживает расширения Node.js и Python до библиотеки, с которой они слинкованы.
cmk_addons.plugins)./proc/<pid>/maps всех процессов). Обычный POSIX sh с инструментами GNU или busybox; журналы изменений пакетов читаются через dpkg, rpm или apk. Протестировано на семействе Debian, семействе Red Hat, Amazon Linux и Alpine, см. ниже.| Образ Checkmk | Дата | Результат |
|---|---|---|
checkmk/check-mk-ultimate:2.5.0p17 | 2026-10-28 | OK (сборка, cmk-validate-plugins, smoke-тест, установка + discovery + check + agent bake) |
checkmk/check-mk-ultimate:3.0.0-2026.10.28 (daily) | 2026-10-28 | OK (сборка, cmk-validate-plugins, smoke-тест, установка + discovery + check + agent bake) |
Агент-плагин был запущен против собственных пакетов дистрибутивов и официальных образов 2026-10-28 (scripts/test_agent_plugin.sh), с процессом node и процессом python, в которых был загружен декодер. После этого библиотека, бинарник node и модули расширения Python были заменены на диске, и обнаружение перезапуска сообщило о работающих процессах.
Дистрибутивы
| Дистрибутив | Декодеры | Результат плагина |
|---|---|---|
| Debian 12 | libbrotli 1.0.9-2+deb12u1, Node.js 18.20.4 (связан), python3-brotli | исправлено бэкпортом (changelog), Node.js через библиотеку |
| Debian 13 | libbrotli 1.1.0-2+deb13u1, Node.js 20.19.2 (связан), python3-brotli, python3-brotlicffi (связан) | исправлено бэкпортом, Node.js и brotlicffi через библиотеку |
| Ubuntu 24.04 | libbrotli 1.1.0-2ubuntu0.1, Node.js 18.19.1 (связан), python3-brotli, dotnet-runtime-8.0 8.0.32 | исправлено бэкпортом - .NET уязвим (8.0.33 ещё не в архиве) |
| AlmaLinux 8.10 | libbrotli 1.0.6-5.el8_10, Node.js 10.24.0 (собственный декодер), python3-brotli | библиотека и Brotli исправлены бэкпортом - Node.js 10 уязвим (конец жизненного цикла, собственный декодер) |
| AlmaLinux 9.8 | libbrotli 1.0.9-10.el9_8.1, Node.js 16.20.2 (связан), python3-brotli, dotnet-runtime-8.0 8.0.32 | исправлено бэкпортом - .NET уязвим |
| AlmaLinux 10.2 | libbrotli 1.1.0-8.el10_2.1, Node.js 22.23.2 (связан), python3-brotli | исправлено бэкпортом |
| Fedora 44 | libbrotli 1.2.1, Node.js 22.23.1 (связан), python3-brotli 1.2.1 | исправлено версией |
| Amazon Linux 2023 | libbrotli 1.1.0-1.amzn2023.0.1, Node.js 18.20.8 (связан) | уязвим - исправленного пакета пока нет, Node.js через библиотеку |
| Alpine 3.22 | brotli-libs 1.1.1, Node.js 22.23.4 (связан), py3-brotli 1.1.1 | исправлено версией |
Официальные образы и PyPI
| Образ | Декодеры | Результат плагина |
|---|---|---|
node:24.22.0-slim | Node.js 24.22.0 (собственный декодер) | уязвим |
node:24.22.1-slim | Node.js 24.22.1 (собственный декодер) | исправлено версией |
node:20-alpine | Node.js 20.20.2 (собственный декодер) | уязвим - конец жизненного цикла, исправления нет |
node:24.22.0-slim, бинарник перемещён в /home/dev/.nvm/... (принадлежит пользователю) | Node.js 24.22.0 | уязвим - версия читается из бинарника, а не запускается |
python:3.12-slim + pip install Brotli==1.2.0 brotlicffi==1.2.0.0, venv с Brotli 1.1.0 в /srv/app/venv | Brotli, brotlicffi (собственные декодеры) | уязвим (venv обнаружен через его запущенный процесс) |
python:3.12-slim + актуальный PyPI | Brotli 1.2.1, brotlicffi 1.2.1.0 | исправлено версией |
mcr.microsoft.com/dotnet/runtime:8.0.32 / :8.0 | .NET 8.0.32 / 8.0.33 | уязвим / исправлено версией |
Сам сайт Checkmk (2.5.0p17) не поставляет пакет Brotli в своём Python. Плагин ещё не запускался на производственном хосте вне контейнеров - в частности, не с включённым режимом SELinux enforcing (семейство RHEL); обычно агент там работает в неограниченном домене.
Скачайте .mkp из релиза (или соберите его самостоятельно, см.
Разработка).
Setup > Maintenance > Extension packages > Upload package, или в командной строке внутри сайта:
mkp add broccoli2shell-<version>.mkp
mkp enable broccoli2shell <version>
Разверните плагин агента на хостах, которые вы хотите проверить:
Запустите обнаружение сервисов на хостах. Каждый декодер получает собственный сервис, плюс один
сервис Broccoli2Shell restart на каждый хост.
Опционально: настройте состояния в Setup > Services > Service monitoring rules > Broccoli2Shell (CVE-2026-111497) и Broccoli2Shell restart.
Скопируйте package/agents/plugins/broccoli2shell в подкаталог cache-interval
каталога плагинов агента и сделайте его исполняемым:
install -m 755 broccoli2shell /usr/lib/check_mk_agent/plugins/3600/broccoli2shell
Каталог 3600 заставляет агента запускать его в фоновом режиме раз в час и отдавать
кэшированный результат в промежутках. Не помещайте его напрямую в plugins/: он читает крупные бинарные файлы
и карту памяти каждого процесса, что слишком много для каждого запроса агента.