Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
Brotli-Node.js-CVE-2026-111497-Broccoli2Shell-Node2Shell-HTTP2Shell- — استشارة وتحليل حول CVE-2026-111497، وهو كتابة خارج الحدود في وحدة فك ترميز Brotli يمكن الوصول إليها عبر فك ضغط HTTP في Node.js، مع السبب الجذري وفرق التصحيح وقواعد الكشف وتدابير التخفيف. | Kitploit
أدوات/GitHubGitHub/certbn/brotli-node.js-cve-2026-111497-broccoli2shell-node2shell-http2shell-
تحليل الذاكرة الجنائيتحليل الثغرات الأمنيةالاستغلالأمن الويباستخبارات التهديداتالاستجابة للحوادث
GitHubcertbn/brotli-node.js-cve-2026-111497-broccoli2shell-node2shell-http2shell-

Brotli-Node.js-CVE-2026-111497-Broccoli2Shell-Node2Shell-HTTP2Shell-

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

استشارة وتحليل حول CVE-2026-111497، وهو كتابة خارج الحدود في وحدة فك ترميز Brotli يمكن الوصول إليها عبر فك ضغط HTTP في Node.js، مع السبب الجذري وفرق التصحيح وقواعد الكشف وتدابير التخفيف.

عرض المستودع
1منذ 2 أياملم تتم المراجعة بعد

CVE-2026-111497: كتابة خارج الحدود بسبب عدم فحص قيمة إرجاع تبديل الكتلة في مفكك ترميز Google Brotli (Node2Shell / HTTP2Shell / Broccoli2Shell)

CVSS CVSS Type KEV

تاريخ آخر تحقق: 2026-11-04 (KST). لم تُدرج سوى القيم التي تم التحقق منها من المصادر المذكورة في قسم المراجع أدناه، وفي حال اختلاف القيم بين المصادر تم إدراجها جميعًا.

📌 باختصار

  • ما هي: يتجاهل مفكك ترميز Google Brotli بلغة C (c/dec/decode.c) قيمة الإرجاع الخطأ عند تبديل الكتلة (block switch) غير الصحيح، فيستمر في فك الترميز بحالة تالفة مما يؤدي إلى الكتابة خارج حدود المخزن المؤقت (Out-of-Bounds Write).
  • أين: جميع البرمجيات التي تتضمن Brotli 1.0.3 ~ 1.2.0 — Node.js (22/24/26 وخطوط EOL)، Python Brotli/brotlicffi، Bun، .NET، Envoy، Istio وغيرها. تتأثر فقط إذا كان هناك مسار لفك ضغط (decompress) بيانات Content-Encoding: br يتحكم بها المهاجم.
  • مدى خطورتها: تتيح DoS وكشف الذاكرة وRCE عن بُعد دون مصادقة (CNA CVSS 4.0 9.2)، وأُدرجت في CISA KEV بتاريخ 2026-10-27. يلزم الترقيع الفوري.

📋 المعلومات الأساسية

البندالمحتوى
CVE IDCVE-2026-111497 (GHSA-9v8h-qqgm-4m35)
الأسماء البديلةNode2Shell (تسمية Imperva)، HTTP2Shell، Broccoli2Shell. خلافًا للاسم، ليست عيبًا في بروتوكول HTTP/2
تاريخ الإفصاح2026-10-21 إصدار Node.js الأمني وإصدار ترقيع Brotli / 2026-10-22 نشر سجل CVE
المكتشفOpenAI Codex Security (Khai Tran, Sylvie Mayer)
المنتجات/الإصدارات المتأثرةGoogle Brotli (libbrotlidec) 1.0.3 ~ 1.2.0 والمنتجات التي تحزمه أو تربط به (انظر الجدول أدناه)
الإصدارات المرقّعة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، Bun 1.4.4
CVSS v4.0 (CNA: Google)9.2 Critical — CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
CVSS v3.1 (NVD)9.8 Critical — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS v3.1 (Red Hat / Amazon Linux)8.1 — CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H (بمراعاة متطلبات الهجوم AT:P وتقوية المنصة)
تصنيف المورّد نفسهNode.js: High / Red Hat: Important
CWECWE-787 Out-of-bounds Write (NVD، Red Hat، مركز الأمن السيبراني الكندي) / CWE-252 Unchecked Return Value (وصف CISA KEV، ويُذكر في بعض المقالات التحليلية كسبب جذري)
الاستغلال الفعليتم تأكيد الاستغلال. إدراج في CISA KEV بتاريخ 2026-10-27، والموعد النهائي لإجراءات الوكالات الفيدرالية 2026-11-10. رصد مشغلو شبكات honeypot (Previdian، ELLIO) محاولات استغلال في 10-26~27

تفاصيل نطاق التأثير

المكوّنالإصدارات المتأثرةالإصدارات المصححة
Google Brotli (C, libbrotlidec)1.0.3 ~ 1.2.01.0.10, 1.1.1, 1.2.1
Node.js 26.x (Current)أقل من 26.12.126.12.1
Node.js 24.x (LTS)أقل من 24.22.124.22.1
Node.js 22.x (LTS)أقل من 22.23.422.23.4
Node.js 25.x / 23.x / 20.x وما دونجميع الإصدارات (EOL)لا يوجد ترقيع → الانتقال إلى 22/24/26
Bun1.4.3 وما دون1.4.4
Python Brotli (PyPI)1.2.0 وما دون1.2.1
Python brotlicffiأقل من 1.2.1.01.2.1.0
.NET / PowerShellراجع إرشادات المورّدتحديث Microsoft الطارئ لـ .NET (dotnet/announcements#494)
Envoy / Istioراجع إرشادات المورّدإصدارات تصحيحية وُزّعت مطلع أكتوبر (دون ذكر العيب صراحةً)
VMware SDDC Manager (VCF / vSphere Foundation)راجع إرشادات Broadcomراجع إرشادات Broadcom

مسارات التعرض غير المباشر: تقوم مكتبات Python requests وurllib3 وaiohttp[speedups] وhttpx بفك ضغط استجابات br تلقائيًا إذا كانت Brotli/brotlicffi مثبتة. وينطبق الأمر ذاته على curl عند استخدام خيار فك الضغط.

التواريخ الرئيسية (2026)

التاريخالحدث
02-27دمج commit إصلاح في مستودع google/brotli (مُعلَّم كمسألة أمنية ولم يُصدَر)
أوائل أكتوبرإصدار إصلاحات Envoy / Istio وتوزيعها
10-21إصدار أمني لـ Node.js (22.23.4 / 24.22.1 / 26.12.1)، وإصدار Google Brotli 1.0.10 / 1.1.1 / 1.2.1
10-22نشر سجل CVE، وعرض Imperva تنفيذ شيفرة على Node.js 24.22.0 (Linux arm64)
10-23توزيع حزم PyPI المُرقَّعة
10-25توصية Microsoft .NET وتحديثها
10-26تقرير ELLIO عن حركة مرور استغلالية
10-27إدراج في CISA KEV (الموعد النهائي للإجراء 11-10)

⚠️ بعض المقالات التحليلية المكتوبة بين 24 و28 أكتوبر تذكر أنه "لم تُؤكَّد هجمات فعلية، ولم يُدرَج في KEV"، لكن ذلك يعكس الوضع قبل الإدراج في KEV ويختلف عن الوضع الحالي.

🔍 تحليل السبب الجذري للثغرة (Root Cause)

1. ما هو: القيمة المُحمَّلة زائدًا عن الحد BROTLI_FALSE

فك ترميز Brotli هو آلة حالة (state machine). يتكوّن التدفق من وحدات تُسمى الميتابلوك (metablock)، وداخل كل ميتابلوك تظهر تعليمات تبديل نوع الكتلة (block switch) الخاصة بالحرف الحرفي (literal) وأمر الإدراج والنسخ (insert-and-copy command) والمسافة (distance).

تقوم DecodeBlockTypeAndLength() بتحليل تبديل الكتلة وتُرجع BROTLI_BOOL. المشكلة أن BROTLI_FALSE استُخدمت بمعنيين مختلفين تمامًا.

المعنىالطبيعةالمعالجة الصحيحة
الحاجة إلى مزيد من المدخلات (needs more input)قابل للاستردادانتظار المدخل التالي ثم الاستئناف
وجود نوع كتلة واحد فقط في الميتابلوك بحيث يكون التبديل نفسه مستحيلًاخطأ تنسيقي قاتلرفض التدفق

2. لماذا: تجاهل القيمة المُرجعة (CWE-252)

لم يفحص الطرف المستدعي هذه القيمة المُرجعة.

  • غلاف تبديل الكتلة في تدفق الأوامر (DecodeCommandBlockSwitch) مُعرَّف بـ static void فلا يحتفظ بالقيمة المُرجعة، كما أن الفرع non-safe في ماكرو BROTLI_SAFE يستدعي الدالة فقط ويتجاهل النتيجة. (تحليل SonicWall)
  • يوضح تحليل آخر (Redfox) أن القيمة المُرجعة تُهمَل كليًا في مسار تبديل كتلة الحرفيات (DecodeLiteralBlockSwitch). تختلف الدالة المُشار إليها بين التحليلات، لكن وفقًا لوصف إصلاح التوزيعة (TuxCare) فقد عُدِّلت جميع مفككات تبديل الكتل الثلاث: الحرفيات والأوامر والمسافات لتُرجع رمز الخطأ، لذا يمكن اعتبار المسارات الثلاثة ذات صلة.

ونتيجة لذلك، حتى عند حدوث خطأ تنسيقي يواصل المفكك التقدم كما لو أن التبديل نجح، ويبقى عدّاد طول الكتلة صفرًا، وتُورَّث حالة الموضع (position) والمسافة إلى مسار كان يجب رفضه.

3. كيف: الحالة التالفة تؤدي إلى OOB Write (CWE-787)

  • يحدث كتابة تتجاوز مخزن المدخلات الداخلي ذي 8 بايتات الذي يحتفظ به المفكك أثناء توقفه (parked) بانتظار المدخلات، فتُطمس حقول الموضع والمسافة في حالة المفكك المجاورة (BrotliDecoderState).
  • بعد ذلك تحسب نسخة الإسناد العكسي (backward-reference copy) في ProcessCommandsInternal() الوجهة بـ copy_dst = &s->ringbuffer[pos] وتنفذ تخزين متجهي بـ 16 بايت عبر memmove16. وبما أن pos لم يعد مقيَّدًا بنطاق المخزن الحلقي، تحدث كتابة خارج منطقة التخصيص.
  • بما أن المهاجم يستطيع التلاعب بـ pos، فإن هذا يشكّل بدائية write-what-where.

4. مقارنة الإصلاح (Before / After)

ما يلي شيفرة مفاهيمية أُعيد تركيب جوهر التغيير بناءً على أوصاف التحليلات المنشورة (SonicWall وRedfox ووصف إصلاح TuxCare). ليست الشيفرة الأصلية للـ commit الفعلي، والتفاصيل مثل الشروط تقديرية. راجع الفرق الدقيق (diff) في إصدار google/brotli v1.2.1 وتغييرات deps/brotli في Node.js. (لم يُتحقَّق من hash الـ commit المُصلِح من مصدر أولي وقت كتابة هذا المستند.)

Before (قابل للاستغلال)

/* 형식 오류와 "입력 부족"이 같은 BROTLI_FALSE로 표현됨 */
static BROTLI_BOOL DecodeBlockTypeAndLength(int safe, BrotliDecoderState* s, int tree_type) {
  ...
  if (/* 블록 타입이 1개뿐인 메타블록 */) {
    return BROTLI_FALSE;          /* 치명적 오류지만 복구 가능 신호와 구분 불가 */
  }
  ...
  return BROTLI_TRUE;
}

static void DecodeCommandBlockSwitch(BrotliDecoderState* s) {
  DecodeBlockTypeAndLength(0, s, 1);   /* 반환값 폐기 → 손상 상태로 계속 진행 */
}

بعد (التصحيح)

/* 명시적 오류 코드 반환 */
static BrotliDecoderErrorCode DecodeBlockTypeAndLength(int safe, BrotliDecoderState* s, int tree_type) {
  ...
  if (/* 블록 타입이 1개뿐인 메타블록 */) {
    return BROTLI_FAILURE(BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH);   /* 신규 오류 코드 */
  }
  ...
  return BROTLI_DECODER_SUCCESS;
}
تنزيل الأداة