
PoC لإثارة تجاوز سعة المخزن المؤقت عبر CVE-2020-0796
./CVE-2020-0796.py servername
يتصل هذا السكريبت بالخادم الهدف، ويضغط طلب المصادقة مع تعيين حقل الإزاحة (offset field) بقيمة خاطئة في رأس التحويل (transformation header)، مما يتسبب في تجاوز سعة المخزن المؤقت (buffer overflow) لمفكك الضغط وتعطل الهدف.
يحتوي هذا على تعديل لبروتوكول smbprotocol الممتاز مع إضافة دعم لضغط وفك ضغط SMB 3.1.1 (فقط LZNT1). معظم الإضافات موجودة في smbprotocol/connection.py. تم تضمين نسخة من lznt1 معدلة لدعم Python 3.
رأس تحويل الضغط موجود في الفئة SMB2CompressionTransformHeader. يتم استدعاء الدالة _compress لضغط طلبات الشجرة (tree requests). وهنا يتم تعيين حقل الإزاحة إلى قيمة مرتفعة لإحداث التعطل.
def _compress(self, b_data, session):
header = SMB2CompressionTransformHeader()
header['original_size'] = len(b_data)
header['offset'] = 4294967295
header['data'] = smbprotocol.lznt1.compress(b_data)
CVE-2020-0796 هو خلل في ميزة ضغط SMB3 الجديدة في Windows 10 1903/1909. يقدم إصدار بروتوكول SMB 3.1.1 إمكانية إعلان قدرات الضغط من قبل العميل أو الخادم، وضغط رسائل SMB3 بشكل انتقائي حسب الحاجة. ولتحقيق ذلك، عند التفاوض على جلسة SMB، يجب على كل من العميل والخادم تضمين SMB2_COMPRESSION_CAPABILITIES كما هو موثق في MS-SMB2 2.2.3.1.3.
بمجرد التفاوض على جلسة بهذه الإمكانية، يمكن للعميل أو الخادم ضغط رسائل SMB معينة بشكل انتقائي. وللقيام بذلك، يتم ضغط حزمة SMB بالكامل، ويتم إضافة رأس محول (transformed header) في البداية، كما هو موثق في MS-SMB2 2.2.42. هذا الرأس عبارة عن بنية صغيرة (16 بايت) تحتوي على قيمة سحرية (magic value)، وحجم البيانات غير المضغوطة، وخوارزمية الضغط المستخدمة، وقيمة الإزاحة.
ينتج CVE-2020-0796 عن عدم التحقق من حدود حجم الإزاحة، والذي يتم تمريره مباشرة إلى عدة دوال فرعية. سيؤدي تمرير قيمة كبيرة إلى تجاوز سعة المخزن المؤقت وتعطل النواة. ومع مزيد من العمل، يمكن تطوير هذا إلى استغلال لتنفيذ التعليمات البرمجية عن بُعد (RCE).