
إضافة Checkmk تفحص مضيفات Linux بحثًا عن مفككات ترميز Brotli (libbrotlidec، Node.js، Python، .NET) المتأثرة بـ CVE-2026-111497، مع التحقق من الإصدارات والـ backports والعمليات القديمة.
امتداد لـ Checkmk يُظهر، لكل مُفكِّك ترميز Brotli على مضيف Linux، ما إذا كان متأثرًا بـ Broccoli2Shell - CVE-2026-111497، وهو كتابة خارج الحدود في مُفكِّك ترميز Brotli بلغة C من 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 يجمع الحقائق فقط (مكتبة النظام 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 إلى المكتبة التي ترتبط بها.
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 (build, cmk-validate-plugins, smoke test, install + discovery + check + agent bake) |
checkmk/check-mk-ultimate:3.0.0-2026.10.28 (daily) | 2026-10-28 | OK (build, cmk-validate-plugins, smoke test, install + 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 | مُصلح عبر backport (سجل التغييرات)، Node.js عبر المكتبة |
| Debian 13 | libbrotli 1.1.0-2+deb13u1، Node.js 20.19.2 (مرتبط)، python3-brotli، python3-brotlicffi (مرتبط) | مُصلح عبر backport، 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 | مُصلح عبر backport - .NET عرضة للثغرة (8.0.33 ليس في المستودع بعد) |
| AlmaLinux 8.10 | libbrotli 1.0.6-5.el8_10، Node.js 10.24.0 (فك ترميز خاص به)، python3-brotli | المكتبة وBrotli مُصلحان عبر backport - 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 | مُصلح عبر backport - .NET عرضة للثغرة |
| AlmaLinux 10.2 | libbrotli 1.1.0-8.el10_2.1، Node.js 22.23.2 (مرتبط)، python3-brotli | مُصلح عبر backport |
| 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 (عائلة RHEL)؛ إذ يعمل الوكيل عادةً هناك دون تقييد.
Setup > Maintenance > Extension packages > Upload package، أو من سطر الأوامر داخل الموقع:
mkp add broccoli2shell-<version>.mkp
mkp enable broccoli2shell <version>
انشر إضافة الوكيل (agent plug-in) على المضيفين الذين تريد فحصهم:
نفّذ اكتشاف الخدمات (service discovery) على المضيفين. يحصل كل مُفكِّك ترميز (decoder) على خدمته الخاصة، بالإضافة إلى خدمة
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/: فهو يقرأ ملفات ثنائية كبيرة وخريطة الذاكرة لكل عملية، وهو ما يمثّل عبئًا كبيرًا على كل استعلام للوكيل.
| الخدمة | واحدة لكل | الحالات (افتراضيًا، قابلة للتهيئة) |
|---|---|---|
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 ما زالت العمليات تستخدم فاكّ ترميز مُستبدَلًا |