CVE-2024-53139 in Linux
الملخص
بحسب VulDB • 12/05/2026
فيما يلي تحليل للقطعة البرمجية (Assembly) وسجل المعالج (Registers) التي قدمتها، والتي تشير إلى **خطأ في تنفيذ syscall** في بيئة Linux (على الأرجح عبر glibc أو مكتبة مشابهة).
### 1. تحليل السجلات (Registers Analysis)
* **`ORIG_RAX: 0000000000000031`**: * هذا هو رقم الـ **System Call** الذي تم استدعاؤه. * في Linux x86_64، الرقم `31` يتوافق مع **`getrandom`** (تم تقديمه في Linux 3.17). * وظيفة `getrandom` هي توليد بيانات عشوائية آمنة.
* **`RAX: ffffffffffffffda`**: * بعد تنفيذ الـ syscall، تحتوي `RAX` على قيمة الإرجاع. * القيمة `0xffffffffffffffda` هي تمثيل ثنائي لـ **-38** في العدد الصحيح الموقّع (Signed 64-bit). * في Linux، الأخطاء تُرجع قيم سالبة صغيرة. الخطأ **-38** يتوافق مع **`-ENOSYS`** (Function not implemented).
* **`RDI: 0000000000000005`**: * الوسيطة الأولى لـ `getrandom` هي مؤشر إلى المخزن المؤقت (buffer). هنا القيمة `5` تبدو غريبة كمؤشر، لكن قد يكون هناك خلط في تفسير السجلات أو أن البرنامج يستخدم قيمًا خاصة. ومع ذلك، الخطأ الرئيسي ليس في الوسيطة بل في عدم دعم الـ syscall نفسه.
* **`RSP: 002b:00007ffe2d0ad398`**: * مؤشر المكدس (Stack Pointer) يشير إلى مكدس المستخدم، مما يؤكد أن الكود يعمل في وضع المستخدم (User Space).
---
### 2. تحليل الكود (Code Analysis)
القطعة البرمجية تظهر نمطًا شائعًا في **glibc** (مكتبة C القياسية في Linux) للتعامل مع الـ syscalls:
```asm 23: b8 31 00 00 00 mov $0x31,%eax ; تحميل رقم syscall (31 = getrandom) 28: 0f 05 syscall ; تنفيذ syscall 2a: 48 3d 01 f0 ff ff cmp $0xfffffffffff001,%rax ; مقارنة النتيجة بـ -4096 30: 73 01 jae 0x33 ; إذا كانت النتيجة >= -4096 (أي خطأ)، اذهب إلى المعالجة 32: c3 ret ; إذا كانت النتيجة >= 0 (نجاح)، ارجع 33: ... ; معالجة الخطأ (Error Handling) ```
* **الخط `2a`**: يقارن قيمة `RAX` (نتيجة الـ syscall) بـ `0xfffffffffffff001` (أي `-4095`). * **الخط `30`**: إذا كانت النتيجة **أكبر من أو تساوي** `-4095` (أي خطأ، لأن أخطاء Linux تكون بين `-1` و `-4095`)، ينتقل إلى قسم معالجة الخطأ. * بما أن `RAX = -38`، فإن الشرط `jae` (Jump if Above or Equal) يكون **صحيحًا**، لذا ينتقل إلى `0x33` لمعالجة الخطأ.
---
### 3. السبب الجذري (Root Cause)
الخطأ **-ENOSYS (-38)** يعني أن **نواة Linux لا تدعم syscall `getrandom`** في هذا السياق.
هذا يحدث عادةً في الحالات التالية:
1. **بيئة محاكاة أو قديمة**: * إذا كنت تشغل الكود على **محاكي** (مثل QEMU) لنظام قديم، أو على نواة Linux قديمة جدًا (أقدم من 3.17). * أو إذا كنت تستخدم **Wine** أو **Box86/Box64** على نظام لا يدعم هذا الـ syscall بشكل صحيح.
2. **محاكاة غير كاملة (Emulation)**: * إذا كنت تستخدم أداة مثل **User-Mode Linux (UML)** أو **Docker** على نواة قديمة،
If you want to get best quality of vulnerability data, you may have to visit VulDB.