
تحليل CVE-2020-1362
قامت WalletService بإصلاح ثغرات تصعيد الامتيازات في آخر تحديث Patch Tuesday، وقد خُصصت إحدى هذه الثغرات بـ CVE-2020-1362. تستغل هذه الثغرة خللاً في الوصول خارج الحدود في الخدمة. نشارك هنا تقنياتنا لاستغلالها.
أجرينا تحليلًا ثنائيًا للدوال التالية في walletservice.dll:
تكتب دالة SetGroup بيانات يتحكم فيها المستخدم في عنوان ذاكرة يتحكم فيه المستخدم.
signed __int64 __fastcall Wallet::WalletCustomProperty::SetGroup(__int64 this, int a2, int a3, int a4)
{
signed __int64 result; // rax
result = 0i64;
if ( a2 == 1 )
{
if ( a3 & 0xFFFFFFDF )
return 0x80070057i64;
}
else if ( a3 == 0x20 )
{
return 0x80070057i64;
}
if ( a4 == -1 )
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = 0;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = 0x7FFFFFFF;
}
else
{
*(_DWORD *)(this + 8i64 * a2 + 0x74) = a3;
*(_DWORD *)(this + 8i64 * a2 + 0x78) = a4;
}
return result;
}
يمكننا ملاحظة أن الدالة لا تتحقق من نطاق الإزاحة التي يمكن للمستخدم التحكم بها. وهنا يقع الخلل.
يمكننا الآن كتابة ذاكرة خارج الحدود. وبالملاحظة نجد أن هناك دالتين لتعيين واسترجاع BSTR في نفس الكلاس:
لذلك يمكننا بسهولة تعديل المؤشر إلى BSTR عبر oobw للحصول على القدرة على قراءة وكتابة أي عنوان.
بمجرد حصولنا على WWW (write-what-where)، يمكننا كتابة جدول الوظائف الافتراضية (vtable) لكائنات Wallet::WalletCustomProperty في الكومة للتحكم في RIP. في البداية، حاولنا تعديله مباشرة عبر oobw، لكننا وجدنا أن oobw ليس محاذيًا لـ 8 بايت. لذا كان علينا الكتابة مرتين لتحقيق اختطاف vtable باستخدام حالة سباق (race condition). لكن هذا قد يجعل الاستغلال غير مستقر. توجد طرق أخرى لتجاوز ذلك. لكن في برهان المفهوم (POC) الخاص بنا استخدمنا ثغرة تسريب معلومات أخرى (CVE-2020-1361) لتسريب عنوان الكومة واستخدمنا www لكتابة vtable مباشرة. على فكرة، على الرغم من أن CVE-2020-1361 مصنفة كثغرة تسريب معلومات، إلا أنها في الواقع يمكن استخدامها لتحقيق EOP. سننشر تحليلًا لها في المستقبل.
وجدنا الدالة ATL::CComObject<CDXGIAdapter>::`vector deleting destructor في dxgi.dll لمساعدتنا في الانتقال من تنفيذ دوال عشوائية إلى تنفيذ تعليمات برمجية عشوائية. تستدعي هذه الدالة الدالة loadlibraryEx وتستخدم مؤشرًا عامًا كوسيط أول لـ loadlibraryEx. وبذلك يمكننا تحقيق تنفيذ تعليمات برمجية عشوائية عبر تحميل مكتبة DLL مخصصة.
يتم توفير مثال لبرهان المفهوم (POC) في مجلد POC.
من خلال هذه الثغرة، يمكننا تحقيق تصعيد الامتيازات من مستوى متوسط إلى NT AUTHORITY\system.
اختُبرت على Windows 10.0.18363.815، x64

10 أبريل 2020: تم الإبلاغ عن الثغرات
21 أبريل 2020: قام MSRC بالتحقيق وتأكيد الخلل
14 يوليو 2020: تم إصدار التصحيح
17 يوليو 2020: نُشر التحليل