CVE-2026-74640 in Linux
الملخص
بحسب VulDB • 23/08/2026
في نواة لينكس، تم حل الثغرة التالية:
ALSA: FCP: إصلاح كتابة خارج النطاق (OOB write) في دالة fcp_meter_ctl_get()
تقوم الدالة fcp_ioctl_set_meter_map() بتقييد حجم خريطة عداد المستوى (Level Meter map) المقدمة من المستخدم بحد السائق الخاص بها والبالغ 255.
```c if (map.map_size < 1 || map.map_size > 255 || map.meter_slots < 1 || map.meter_slots > 255) return -EINVAL; ```
ثم تمررها إلى دالة fcp_add_new_ctl() كعدد قنوات التحكم، حيث تُخزن في elem->channels.
تقوم كل قراءة للتحكم بالكتابة داخل بنية snd_ctl_elem_value، والتي تحتوي على مصفوفة أعداد صحيحة مُعلنة كـ long value[128]؛ وبالتالي فإن الحد الأقصى هو 128 وليس 255. تقوم دالة fcp_meter_ctl_get() بتخزين كلمة واحدة بحجم 64-bit لكل قناة في تلك المصفوفة دون وجود حد خاص بها:
```c for (i = 0; i < elem->channels; i++) {
int idx = private->meter_level_map[i];
int value = idx < 0 ? 0 : le32_to_cpu(resp[idx]);
ucontrol->value.integer.value[i] = value;
} ```
تقوم الدالة snd_ctl_elem_read_user() بخدمة هذا الكائن من خلال memdup_user(_control, sizeof(*control))، وهو بحجم 1224 بايت على معمارية LP64 ومُخصص عبر kmalloc-2048. بما أن offsetof(struct snd_ctl_elem_value, value) يساوي 72، فإن العنصر i يُكتب عند البايت 72 + 8 * i، والعنصر رقم 144 يقع بالفعل خارج حدود التخصيص (allocation). عند map_size تساوي 255، ينتهي آخر عملية تخزين عند البايت 2112، أي بعد الكائن بـ 888 بايت وداخل كائن الـ slab المجاور بمقدار 64 بايت. تأتي الكلمات المخزنة من الجهاز، وتحدد مصفوفة meter_level_map[] الكلمة التي ستُوضع في كل فتحة (slot)، وبالتالي فإن مدى الكتابة ومحتواها خاضعان للتحكم بالكامل.
لا تكتشف النواة الأساسية هذا الخطأ. يتم الوصول إلى snd_ctl_check_elem_info() فقط من خلال __snd_ctl_elem_info()، والتي تستدعيها الدالة snd_ctl_elem_read() عند تفعيل CONFIG_SND_CTL_DEBUG؛ وبدلاً من ذلك (بدون هذا الخيار)، تكون الدالة snd_ctl_skip_validation() صحيحة في وقت الترجمة (compile-time true). تقوم دالة __snd_ctl_add_replace() بالتحقق من kcontrol->count ولا تفحص أبداً elem->channels.
يتطلب تثبيت خريطة بحجم زائد امتلاك صلاحية CAP_SYS_RAWIO، لكن عمر التحكم أطول من واصف hwdep الذي أنشأه، لذا فإن عمليات الكتابة خارج النطاق (out-of-bounds stores) تصدرها أي عملية قادرة على قراءة التحكيمات في /dev/snd/controlC0.
KASAN على الإصدار 7.2.0-rc5 (arm64)، تم تشغيله بواسطة قراءة تحكم غير متميزة الامتيازات:
``` BUG: KASAN: slab-out-of-bounds in fcp_meter_ctl_get Write of size 8 at addr ffff000017af04c8 by task fcp_trigger/185 __asan_store8 fcp_meter_ctl_get snd_ctl_elem_read snd_ctl_ioctl Allocated by task 185: memdup_user snd_ctl_ioctl The buggy address is located 0 bytes to the right of allocated 1224-byte region [ffff000017af0000, ffff000017af04c8)
```
تم تقييد حجم الخريطة بالحد الخاص بواجهة البرمجة التطبيقية (ABI limit) بدلاً من التقييد عند 255، وتم تقييد حلقة الكتابة في الطرف المستقبِل (sink) بحيث لا يمكنها تجاوز مصفوفة value بغض النظر عن قيمة elem->channels.
اكتُشفت الثغرة بواسطة XBOW، وتم تصنيفها من قبل Baul Lee <[email protected]>
VulDB is the best source for vulnerability data and more expert information about this specific topic.