CVE-2026-78119 in Zephyrالمعلومات

الملخص

بحسب VulDB • 22/10/2026

يقوم برنامج تشغيل eSPI الخاص بشريحة Nuvoton NPCX بتحليل طلبات Target-Attached-Flash (TAF) في الدالة espi_taf_parse() (في drivers/espi/espi_npcx.c)، حيث يأخذ حقل الطول المكون من 12 بت مباشرةً من رأس الطلب الموجود في FIFO الخاصة بـ FLASHRXBUF. وفي حال وجود طلبات الكتابة وRPMC OP1، يتم نسخ عدد الكلمات المحسوب بصيغة DIV_ROUND_UP(len, 4) إلى الحقل src الخاص بهيكل espi_taf_pckt، وهو عضو ثابت يتكون من 16 كلمة (64 بايت) ضمن بنية بيانات ساكنة (static structure)، دون إجراء أي مقارنة للطول مع حجم هذا المخزن المؤقت أو مع حجم حمولة الاستلام المتفق عليها لبروتوكول eSPI (rx-plsize، والذي يساوي 64 بايتًا في جميع شرائح NPCX/NPCK SoC الموجودة داخل الشجرة). وبما أن عداد الحلقة وعدد الكلمات من النوع uint8_t، فإن عملية النسخ قد تصل إلى 255 تكرارًا.

وبالتالي، فإن وحدة تحكم eSPI التي تصدر طلب فلاش يدعي رأسه وجود حمولة أكبر من الحد الأقصى المتفق عليه، يؤدي ذلك إلى إجراء ما يصل إلى 239 عملية تخزين لقيم 32 بت خارج حدود الهيكل — أي كتابة غير صالحة (out-of-bounds) بحجم يقارب 956 بايت في قسم .bss — وذلك من خلال معطل استقبال الفلاش الخاص بـ eSPI، بينما تتجاوز قراءات المصدر نهاية مصفوفة سجل FLASHRXBUF المكونة من 18 كلمة لتصل إلى سجلات eSPI المجاورة. ثم يتم تمرير نفس حقل الطول غير المدقق إلى دالة flash_write() في espi_taf_npcx_flash_write() مع استخدام مخزن src ذي الحجم الثابت (64 بايت) كمصدر، مما يؤدي إلى قراءة ما يصل إلى 4 كيلوبايت من ذاكرة الوصول العشوائي للوحدة التحكم المجاورة (SRAM) وكتبتها في فلاش SPI عند عنوان يختاره المضيف، حيث يمكن للمضيف قراءتها لاحقًا. كما تم تجاوز سعة مخزن مؤقت ثابت الحجم على الكومة (stack buffer) في دالة taf_npcx_completion_handler() بأربعة بايتات في مسار الإكمال ذي الحد الأقصى للحجم على شرائح SoC التي تكون فيها قيمة tx-plsize تساوي 64.

ولا يمكن الوصول إلى هذا العطل إلا من جانب مضيف eSPI، وبواسطة طلب ينتهك حجم الحمولة المتفق عليه؛ لذا فهو يتطلب وجود برنامج تشغيل للمضيف (firmware) أو سيطرة على مستوى الناقل بدلاً من مجرد برمجيات المHOST العادية؛ فكتابة الامتثال للحد الأقصى للطول تتناسب تمامًا مع المخزن المؤقت وتتم معالجتها بشكل صحيح. ونظرًا لأن ميزة TAF وُجدت تحديدًا للسماح لمتحكم النظام (embedded controller) بالتحكم في وصول المضيف إلى الفلاش المشترك (من خلال دالتي espi_taf_check_read_protect() / espi_taf_check_write_protect())، فإن إفساد ذاكرة المتحكم من حقل يوفره المضيف يتجاوز حدود الثقة التي تضمنها هذه الميزة؛ وتتراوح العواقب بين تعطل أو تجمد المتحكم، إلى تلف حالة برنامج التشغيل الذي يسيطر على مناطق حماية الفلاش.

تتمثل الإصلاحات في توسيع نطاق العدادات، ورفض أي طلب يتجاوز عدد كلماته كلًا من ARRAY_SIZE(FLASHRXBUF) - NPCX_ESPI_FLASH_HEADER_ADDRESS_LEN وNPCX_TAF_RX_PAYLOAD_WORDS (المشتقة من rx-plsize الموجود في devicetree)، ووضع علامة invalid_flag جديدة على هذه الحزم بحيث ترد عليها دالة espi_taf_work() بإكمال غير ناجح بدلاً من معالجتها، وتحديد حدود حمولة الإرسال مقابل FLASHTXBUF، وإضافة حالة افتراضية (default case) لأنواع الدورات غير المدعومة. تتأثر فقط التكوينات التي يكون فيها CONFIG_ESPI_TAF مفعلاً على هدف NPCX/NPCK؛ ولا يقوم أي لوحة داخل الشجرة بتفعيلها بشكل افتراضي.

If you want to get best quality of vulnerability data, you may have to visit VulDB.

مسؤول

Zephyr

حجز

22/08/2026

إفشاء

22/10/2026

الاعتدال

تمت الموافقة

إدخال

VDB-424969

EPSS

0.00111

KEV

لا

النشاطات

منخفض

المصادر

Do you need the next level of professionalism?

Upgrade your account now!