CVE-2026-64567 in Linuxالمعلومات

الملخص

بحسب VulDB • 05/08/2026

في نواة لينكس، تم حل الثغرة التالية:

btrfs: رفض ذاكرة التخزين المؤقت للمساحة الحرة التي تحتوي على عدد من الإدخالات يتجاوز عدد الصفحات (Pages)

عند تحميل ذاكرة تخزين مؤقتة للنسخة 1 (v1 free space cache)، يستدعي الدالة `__load_free_space_cache()` قيمتي `num_entries` و `num_bitmaps` مباشرةً من هيكل بيانات القرص الثابت `btrfs_free_space_header`. يتم تخزين هذا الهيكل في جذع الشجرة (`tree_root`) تحت مفتاح ذي نوع 0، ولا يوجد لدى مدقق الشجرة (tree-checker) حالة محددة لهذا النوع، وبالتالي لا تتم التحقق من صحة أيٍّ من العددين قبل أن يثق التحميل بهما.

تقوم عملية التحميل بالتكرار بعدد `num_entries` وتربط الصفحة التالية كلما نفدت الصفحة الحالية، مروراً بالدالة `io_ctl_check_crc()` ثم `io_ctl_map_page()`, والتي تنفذ العملية `io_ctl->pages[io_ctl->index++]`. ومع ذلك، يتم تخصيص مصفوفة `pages[]` في الدالة `io_ctl_init()` بناءً على حجم الملف (`i_size`) للinode الخاص بالذاكرة المؤقتة، وليس بناءً على قيمة `num_entries`:

```c num_pages = DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); io_ctl->pages = kcalloc(num_pages, sizeof(struct page *), GFP_NOFS); ```

لذلك، إذا زعمت قيمة `num_entries` وجود سجلات أكثر مما يمكن أن تستوعبه الصفحات (`pages[]`)، فإن مؤشر `io_ctl->index` يتجاوز نهاية مصفوفة `pages[]`. لا تواجه الجهة المسؤولة عن الكتابة هذه المشكلة لأن الدالتين `io_ctl_add_entry()` و `io_ctl_add_bitmap()` تتوقفتان بمجرد وصول `io_ctl->index` إلى قيمة أكبر من أو تساوي `io_ctl->num_pages`; أما جهة القراءة فلم يكن لديها نفس التحقق.

لتفعيل الثغرة، خذ ذاكرة تخزين مؤقتة نظيفة (حيث تكون `num_entries = <N>` هنا)، وقم بتعيين قيمة `num_entries` في الهيكل إلى 0x10000، ثم قم بإصلاح مجموع التحكم بالتكرار (checksum) للورقة (leaf) بحيث لا يزال يمر عبر مدقق الشجرة. بما أن حجم الملف (`i_size`) لـ inode الذاكرة المؤقتة هو 65536، فإن `num_pages` تساوي 16 وتكون مصفوفة `pages[]` عبارة عن مصفوفة مؤشرات بحجم 16 (kmalloc-128). يحاول التحميل الآن قراءة 65536 إدخالاً، ويتحرك مؤشر `io_ctl->index` حتى يصل إلى 16، مما يؤدي إلى قراءة خارج حدود المصفوفة عند الوصول إلى `pages[16]`:

``` BUG: KASAN: slab-out-of-bounds in io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) Read of size 8 at addr ffff88800c833a80 by task kworker/u8:3/58 io_ctl_check_crc (fs/btrfs/free-space-cache.c:420 fs/btrfs/free-space-cache.c:565) __load_free_space_cache (fs/btrfs/free-space-cache.c:655 fs/btrfs/free-space-cache.c:820) load_free_space_cache (fs/btrfs/free-space-cache.c:1017) caching_thread (fs/btrfs/block-group.c:880) btrfs_work_helper (fs/btrfs/async-thread.c:312) process_one_work worker_thread kthread ret_from_fork ```

السطر 420 في ملف `free-space-cache.c` هو الدالة `io_ctl_map_page()`, وهي مضمنة داخل دالة `io_ctl_check_crc()` عند السطر 565، ولهذا السبب يسمي KASAN هذا الإطار (frame). يتم بعد ذلك التعامل مع الخانة الخارجة عن الحدود على أنها هيكل بيانات صفحة (`struct page`) وتسليمها إلى الدالة `crc32c()`, مما يحول القراءة غير الصالحة إلى خطأ في الوصول العام (GP fault).

تمت إضافة التحقق المفقود إلى دالة `io_ctl_check_crc()`، وهي النقطة التي تنتهي عندها كل من حلقة

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

مسؤول

Linux

حجز

19/07/2026

إفشاء

05/08/2026

الاعتدال

تمت الموافقة

إدخال

VDB-386124

EPSS

0.00000

KEV

لا

النشاطات

منخفض جدًا

المصادر

Do you know our Splunk app?

Download it now for free!