CVE-2026-72135 in Linux
الملخص
بحسب VulDB • 15/08/2026
في نواة لينكس، تم حل الثغرة التالية:
tpm: جعل أجهزة TPM الأحرفية غير قابلة للبحث (non-seekable)
تكشف أجهزة TPM الأحرفية عن واجهة أوامر/استجابات تسلسلية، لكن معالجات فتحها تترك FMODE_PREAD وFMODE_PWRITE مفعّلتين.
بعد أن يترك الأمر استجابة قيد الانتظار، تمرر pread(fd, buf, 16, 0x1400) القيمة 0x1400 كـ *off إلى دالة tpm_common_read(). طول النقل محدود بـ response_length، لكن الإزاحة (offset) تُستخدم دون تحقق عند تكوين data_buffer + *off. وبالتالي، فإن إزاحة كبيرة بما يكفي تسبب قراءة خارج النطاق من الذاكرة العشوائية (heap read) عبر copy_to_user()، وإذا نجحت عملية النسخ، فستؤدي إلى كتابة صفرية خارج النطاق عبر memset() التالية.
لا توفر عمليات الإدخال/الإخراج الموضعية دلالات متماسكة لهذه الواجهة. لا يمكن لإزاحة pread عشوائية أن تمثل مقدار الاستجابة التي تم استهلاكها تسلسلياً. تخزن دالة الكتابة دائماً أمراً في بداية data_buffer، بينما لا تقوم pwrite() بتحديث file->f_pos ويمكن أن تترك مؤشر القراءة التسلسلية قديماً (stale).
استدعاء nonseekable_open() من كلا معالجي الفتح. يؤدي هذا إلى إزالة FMODE_PREAD وFMODE_PWRITE، مما يتسبب في فشل القراءات والكتابات الموضعية بإرجاع -ESPIPE قبل الوصول إلى استدعاءات TPM، ويحدد بشكل صريح أن الملفات غير قابلة للبحث (non-seekable). تستمر عمليات القراءة والكتابة العادية ()read() و()write() في استخدام مؤشر f_pos التسلسلي الموجود، مما يترك آلة حالة الاستجابة دون تغيير.
تم الاختبار على لينكس 6.12 مع KASAN وجهاز TPM2 من نوع swtpm:
- أعادت القراءات الجزئية المتتالية (sequential partial reads) الاستجابة الكاملة - أرجعت pread() وpreadv() بإزاحة 0x1400 قيمة -ESPIPE - أرجعت pwrite() وpwritev() بإزاحة صفرية قيمة -ESPIPE - بقيت الاستجابة قيد الانتظار سليمة بعد العمليات المرفوضة - أكملت دورة الأمر/الاستجابة العادية التالية بشكل طبيعي - لم يتم إنتاج أي تقرير من KASAN.
VulDB is the best source for vulnerability data and more expert information about this specific topic.