Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
checkmk_broccoli2shell — Checkmk 扩展,用于审计 Linux 主机上受 CVE-2026-111497 影响的 Brotli 解码器(libbrotlidec、Node.js、Python、.NET),检查版本、向后移植和残留进程。 | Kitploit
工具/GitLabGitLab/checkmk1/checkmk_broccoli2shell
防御工具漏洞扫描器漏洞分析配置审计事件响应
GitLabcheckmk1/checkmk_broccoli2shell

checkmk_broccoli2shell

Checkmk 扩展,用于审计 Linux 主机上受 CVE-2026-111497 影响的 Brotli 解码器(libbrotlidec、Node.js、Python、.NET),检查版本、向后移植和残留进程。

查看仓库
130天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

checkmk_broccoli2shell

一个 Checkmk 扩展,用于在 Linux 主机上为每个 Brotli 解码器显示其是否受 Broccoli2Shell 影响——CVE-2026-111497,这是 Google 的 C 语言 Brotli 解码器中的一个越界写入漏洞,当程序解压来自不可信来源(HTTP 响应、请求体、归档文件)的 Brotli 数据时,可能导致远程代码执行。该漏洞于 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 运行时、它们的版本、包变更日志、它们链接的对象、哪些进程加载了它们以及哪些仍在运行已被替换的版本)。这些事实意味着“已修复”还是“存在漏洞”,由 Checkmk 服务器上的检查插件决定,因此新信息——例如另一个已修复版本——只需更新 .mkp,而无需在每台主机上部署新脚本。

为什么不直接比较版本号: 各发行版会在不更改上游版本号的情况下回移植修复,并且它们会针对系统库构建 Node.js,而不是使用 Node.js 自带的副本。Debian 12 附带 libbrotli 1.0.9 和 Node.js 18.20.4(上游已停止维护,无修复)——两者均已修复,因为更新后的 libbrotli1 包才是 Node.js 实际运行所用的解码器。因此,该扩展会读取拥有每个解码器的包的变更日志,并沿着 Node.js 和 Python 扩展追踪到它们所链接的库。

要求

  • Checkmk >= 2.5.0(使用当前的 cmk_addons.plugins 插件 API)。
  • 被监控主机:Linux,Checkmk 代理以 root 身份运行(该插件会读取所有进程的二进制文件和 /proc/<pid>/maps)。使用 GNU 或 busybox 工具的纯 POSIX sh;包变更日志通过 dpkg、rpm 或 apk 读取。已在 Debian 系、Red Hat 系、Amazon Linux 和 Alpine 上测试,详见下文。
  • 代理烘焙部署需要商业版 Checkmk(Pro、Ultimate 或支持多租户的 Ultimate)。在社区版上,请手动将代理插件复制到主机,参见手动部署代理插件(社区版)。检查插件、规则和服务在两种方式下工作方式相同。

测试环境

Checkmk 镜像日期结果
checkmk/check-mk-ultimate:2.5.0p172026-10-28通过(构建、cmk-validate-plugins、冒烟测试、安装 + 发现 + 检查 + 代理烘焙)
checkmk/check-mk-ultimate:3.0.0-2026.10.28(每日构建)2026-10-28通过(构建、cmk-validate-plugins、冒烟测试、安装 + 发现 + 检查 + 代理烘焙)

代理插件于 2026-10-28 针对各发行版自带的包和官方镜像运行(scripts/test_agent_plugin.sh),并加载了解码器的 node 和 python 进程。随后在磁盘上替换了库、node 二进制文件和 Python 扩展模块,重启检测报告了正在运行的进程。

发行版

发行版解码器插件结果
Debian 12libbrotli 1.0.9-2+deb12u1、Node.js 18.20.4(链接)、python3-brotli已通过向后移植修复(changelog),Node.js 通过该库
Debian 13libbrotli 1.1.0-2+deb13u1、Node.js 20.19.2(链接)、python3-brotli、python3-brotlicffi(链接)已通过向后移植修复,Node.js 和 brotlicffi 通过该库
Ubuntu 24.04libbrotli 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.10libbrotli 1.0.6-5.el8_10、Node.js 10.24.0(自带解码器)、python3-brotli库和 Brotli 已通过向后移植修复 - Node.js 10 存在漏洞(已停止维护,自带解码器)
AlmaLinux 9.8libbrotli 1.0.9-10.el9_8.1、Node.js 16.20.2(链接)、python3-brotli、dotnet-runtime-8.0 8.0.32已通过向后移植修复 - .NET 存在漏洞
AlmaLinux 10.2libbrotli 1.1.0-8.el10_2.1、Node.js 22.23.2(链接)、python3-brotli已通过向后移植修复
Fedora 44libbrotli 1.2.1、Node.js 22.23.1(链接)、python3-brotli 1.2.1已通过版本修复
Amazon Linux 2023libbrotli 1.1.0-1.amzn2023.0.1、Node.js 18.20.8(链接)存在漏洞 - 尚无修复包,Node.js 通过该库
Alpine 3.22brotli-libs 1.1.1、Node.js 22.23.4(链接)、py3-brotli 1.1.1已通过版本修复

官方镜像与 PyPI

镜像解码器插件结果
node:24.22.0-slimNode.js 24.22.0(自带解码器)存在漏洞
node:24.22.1-slimNode.js 24.22.1(自带解码器)已通过版本修复
node:20-alpineNode.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,/srv/app/venv 中的 venv 带有 Brotli 1.1.0Brotli、brotlicffi(自带解码器)存在漏洞(通过其运行进程发现该 venv)
python:3.12-slim + 当前 PyPIBrotli 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)的 Python 中不附带 Brotli 包。该插件尚未在容器之外的生产主机上运行过 - 尤其是在启用 SELinux 强制模式(RHEL 系列)的情况下;在该环境中,代理通常以非受限模式运行。

安装

  1. 从 release 下载 .mkp(或自行构建,参见 开发)。

  2. Setup > Maintenance > Extension packages > Upload package,或在站点内使用命令行:

    mkp add broccoli2shell-<version>.mkp
    mkp enable broccoli2shell <version>
    
  3. 将 agent 插件部署到要检查的主机:

    • 商业版: Setup > Agents > Windows, Linux, Solaris, AIX > Agent rules,Agent plug-ins 部分,Broccoli2Shell agent plug-in 规则。为目标主机创建 规则,然后烘焙并更新 agent。该插件始终异步运行;默认间隔为一小时。
    • 社区版 / 手动: 见下文。
  4. 在主机上运行服务发现。每个解码器都会获得自己的服务,另外每台主机还会获得一个 Broccoli2Shell restart 服务。

  5. 可选:在 Setup > Services > Service monitoring rules > Broccoli2Shell (CVE-2026-111497) 和 Broccoli2Shell restart 中调整状态。

手动部署 agent 插件(社区版)

将 package/agents/plugins/broccoli2shell 复制到 agent 插件目录的 cache-interval 子目录中,并使其可执行:

install -m 755 broccoli2shell /usr/lib/check_mk_agent/plugins/3600/broccoli2shell

3600 目录会让 agent 每小时在后台运行一次,并在两次运行之间提供缓存结果。不要把它直接放进 plugins/:它会读取大型二进制文件以及每个进程的内存映射,这对每次 agent 查询来说负担过重。

监控内容

服务每个状态(默认,可配置)
Broccoli2Shell <path>解码器,例如 Broccoli2Shell /usr/lib/x86_64-linux-gnu/libbrotlidec.so.1、Broccoli2Shell /usr/bin/node、Broccoli2Shell /usr/lib/python3/dist-packages (brotli)、Broccoli2Shell /usr/lib/dotnet (.NET 8.0)OK 已修复或不受影响 - CRIT 存在漏洞,且被运行中的进程加载 - CRIT 存在漏洞,但未被加载 - UNKNOWN 无法确定版本或链接的库
Broccoli2Shell restart带有解码器的主机OK - CRIT 进程仍在使用已被替换的解码器

这些截图来自一个 Checkmk 2.5.0p17 测试站点,其四台主机使用 sample-data/ 中的录制数据代替真实 agent(没有真实主机):Debian 12 和 Ubuntu 24.04 通过向后移植修复,Node.js 通过系统库修复,但 Ubuntu 上的 .NET 8.0.32 仍存在漏洞;Amazon Linux 2023 的库尚未修复,因此其 Node.js 也未修复;还有一个使用来自 PyPI 的 Brotli 和 brotlicffi 的 Python 应用。它们都仍有进程在运行已被替换的解码器。

四台示例主机在 OK 和 CRIT 状态下的 Broccoli2Shell 服务

服务详情会指明下一步、相关软件包、其变更日志内容以及它所链接的库:

一个 CRIT 状态的 Broccoli2Shell 服务的详情

flowchart TD
    A[Decoder] --> L{"Linked against the<br/>system libbrotlidec?"}
    L -- "yes (distribution Node.js,<br/>Debian's brotlicffi)" --> LIB[result of that library's service]
    L -- "not found" --> U[UNKNOWN]
    L -- no --> B{Version known?}
    B -- no --> U
    B -- yes --> C{"Version >= fix of its branch?<br/>libbrotli/Brotli 1.0.10 / 1.1.1 / 1.2.1<br/>brotlicffi 1.2.1.0<br/>Node.js 22.23.4 / 24.22.1 / 26.12.1<br/>.NET 8.0.33 / 9.0.22 / 10.0.14<br/>or a newer branch"}
    C -- yes --> OK[OK: fixed]
    C -- no --> D{"Package changelog names<br/>CVE-2026-111497?"}
    D -- yes --> OKB[OK: fixed by distribution backport]
    D -- no --> E{"Loaded by a running process?"}
    E -- yes --> CR[CRIT: vulnerable]
    E -- no --> CR2["CRIT: vulnerable<br/>(own state in the rule)"]
  • Fixed 指至少包含该分支的上游修复,或包含点名该 CVE 的软件包变更日志。libbrotli 以及早于 1.0.3 的 Python 包 Brotli 不受影响。除 22、24 和 26 之外的 Node.js 发布线(25、23、20 及更早版本)已停止维护,不会获得修复,8.0 之前的 .NET 同样如此——除非该二进制文件链接到系统库,此时起决定作用的是该解码器。
  • 链接的解码器: Debian、Ubuntu、RHEL 及其衍生版本、Fedora、Amazon Linux 和 Alpine 的 Node.js 软件包均以 --shared-brotli 构建(通过 libnode.so 或直接链接),Debian 还将 brotlicffi 针对系统库构建。它们的服务显示该库的结果,并指向该库对应的服务。官方 Node.js 构建和 PyPI wheel 自带解码器;Node.js 24.22.1 在 process.versions.brotli 中仍报告 Brotli 1.2.0,因为 Node.js 修补了其捆绑副本——在那里只有 Node.js 版本起作用。
  • .NET: 依赖框架的应用程序会前滚到其 major.minor 的最新补丁版本,因此每个安装和分支由一个服务按最新运行时进行评估;较旧的补丁目录列在详情中。
  • 是否已加载: 服务会列出已映射该解码器的进程。未被任何进程加载的易受攻击解码器默认仍为 CRIT——之后启动的每个程序(curl、cron 任务、下一次部署)都会使用它——但它在规则中有自己的状态,因此可以在合适的地方将其降低。
  • 该插件看不到任何临时缓解措施:Node.js 未发布任何缓解措施,而变通方法(在代理处拒绝 Content-Encoding: br 请求体,卸载 Python 包以使 urllib3、requests 和 aiohttp 回退到 gzip/deflate)位于解码器之外。服务输出始终会指明下一步操作。

工作原理

下载工具