
سيناريو إثبات المفهوم لاستغلال CVE2021-38297 تجاوز سعة المخزن المؤقت في GO WASM
تعمل WebAssembly (WASM) كتنسيق تعليمات ثنائي قابل للتنفيذ في معظم متصفحات الويب الحديثة. وهي بمثابة هدف ترجمة للعديد من اللغات عالية المستوى مثل C و C++ و Rust و GO، مما يسمح بكتابة الكود بهذه اللغات وترجمته إلى WASM.
يسلط CVE-2021-38297 الضوء على خطأ خطير داخل عملية ترجمة GO وتحميل ثنائيات WASM المترجمة بواسطة GO. توجد الثغرة في محمل JS wasm (wasm_exec.js) المقدم من GO، والذي يتيح تحميل ثنائيات WASM مع بيانات غير مقيدة في وسيطة argv. نظرًا لأن argv مخزنة في الذاكرة الخطية لـ WASM، يمكن للجهات الخبيثة استغلال ذلك لاستبدال الذاكرة الخطية لبرنامج WASM المترجم بواسطة GO بإدخال argv كبير بشكل مفرط.
استمرت هذه الثغرة في إصدارات GO السابقة لـ 1.17.2.
يُظهر هذا البرهان على المفهوم تطبيقًا للتواصل الاجتماعي، Vuln-Twitter، يسمح لعدة مستخدمين بنشر المحتوى والتعليقات. خادم الويب، المبني على Node.js، يستخدم SQLite لتخزين بيانات المنشورات والتعليقات.
يستخدم الواجهة الأمامية JS بسيطة إلى جانب وحدة GO WASM باسم . تعرض هذه الوحدة طرقًا مثل ، والتي تحول سلاسل الإدخال إلى "LeetSpeak" (على سبيل المثال، "Hello!" تصبح "h3ll0!").
wordprocessor.wasmtoLeetSpeakتساعد وحدات GO WASM في عرض المنشورات والتعليقات بلغة LeetSpeak.

أثناء عملية العرض في الواجهة الأمامية، عند استلام المنشورات والتعليقات من الخادم، يخضع كل تعليق للعرض إلى "LeetSpeak" باستخدام وحدة GO WASM. يتم تمرير التعليق الخاص بكل منشور كجزء من متغير argv بعد تحميل وحدة GO WASM.
علاوة على ذلك، توجد طريقة، processSharedVar()، في وحدة GO، مصممة لقراءة السلسلة الموجودة في العنوان 0x5000 وتحويلها إلى كلام مبسط (على سبيل المثال، "How are you?" تصبح "How r u?"). يتم إضافة المنشور الأصلي صراحةً إلى 0x5000 في الذاكرة الخطية ليتم الوصول إليها بواسطة هذه الطريقة، مما يغير محتوى المنشور.
راجع قسم الكود الذي يفعل نفس الشيء:

رسم تخطيطي للذاكرة الخطية لـ WASM عند عرض تعليق:

باختصار:
argv والمنشورات في عنوان الذاكرة 0x5000.toLeetSpeak و processSharedVar لمحتوى التعليق والمنشور، على التوالي.بالنظر إلى عدم وجود فحوصات للحجم في argv بناءً على CVE-2021-38297، يظهر تهديد محتمل. إذا قام مستخدم ضار بالتعليق بتعليق كبير الحجم على منشور لا يملكه، فسيتم تمرير هذا التعليق عبر argv أثناء العرض. نظرًا لعدم وجود حد للحجم، يصبح المحتوى الموجود في العنوان 0x5000 (الذي يمثل المنشور الأصلي) عرضة للاستبدال.
من خلال استغلال هذا العيب، يقوم المستخدم الضار بتغيير محتوى المنشور الأصلي فعليًا، على غرار هجوم Stored XSS. بعد ذلك، عندما يشاهد الآخرون الصفحة، يتم عرض المحتوى المعدل، ويستمر ذلك بواسطة منطق الواجهة الأمامية المشترك المطبق على عرض الجميع، مما يؤدي إلى ظهور المنشور المستبدل للجميع.

ملاحظة: لإعادة الإنتاج، تحتاج إلى تثبيت إصدار go go1.17.1 محليًا، وهو الإصدار القابل للاستغلال المستخدم في هذا السيناريو. يمكنك الرجوع إلى وثائق go الرسمية حول كيفية تثبيت إصدارات go محددة.
الآن دعنا نحاول إعادة إنتاج السيناريو أعلاه:
git clone [email protected]:gkrishnan724/CVE-2021-38297.git && cd vuln-twitternpm install لتثبيت جميع التبعياتnpm run resetDB والذي سيهيئ قاعدة البيانات ببعض المنشورات والتعليقات.npm run dev والذي سيبدأ الخادم المحلي، وافتح localhost:3000 في متصفح وستتمكن من رؤية صفحة تسجيل الدخول.الآن، دعنا نسجل الدخول بحساب ضار باستخدام بيانات الاعتماد اسم المستخدم: I_CANT_HACK، كلمة المرور: hacker، بمجرد تسجيل الدخول، يجب أن تتمكن من رؤية الخلاصة مع بعض المنشورات.
هذا المنشور يبدو مثيرًا للاهتمام:
Amazon: ready 4 black friday? https://www.amazon.com/blackfriday
ماذا لو، باستخدام التقنية أعلاه، تمكنا من استبدال المنشور من Amazon.com، للإشارة إلى رابط ضار؟.
راجع ملف exploit.txt، يحتوي هذا على التعليق المليء بحشو من حروف "A" بحيث نستبدل كل شيء حتى العنوان 0x5000، في النهاية يمكنك رؤية النص ready for black friday? https://evil.com/blackfriday إذا قمنا بنسخ هذا النص والتعليق على المنشور أعلاه. يجب أن نتمكن من استبدال المنشور الأصلي بالنص أعلاه.
جربها بنفسك وانظر :)

في هذا التطبيق، قمت أيضًا بتوفير سكربت تصحيح. والذي يستخدم إصدارًا أحدث من go:
npm run patchServerيجب أن يعيد هذا ترجمة ملف go بالإصدار الجديد ويبدأ الخادم بالإصدار المصحح
يجب أن تلاحظ الآن أن المنشور لا يتم استبداله، وإذا لاحظت وحدة التحكم، نرى خطأ بدلاً من ذلك Argument length too long.

لقد أظهرنا سيناريو حيث استخدام تجاوز سعة المخزن المؤقت لـ WASM على الذاكرة الخطية سمح لنا بتنفيذ هجوم Stored XSS. ومع ذلك، من الضروري ملاحظة خصوصية هذا الاستغلال: فهو يتطلب منا التلاعب بنص في عنوان محدد مسبقًا في الذاكرة الخطية. في تطبيقات الويب العملية، قد يكون اكتشاف مثل هذه الثغرات صعبًا للغاية بسبب هذا المستوى من الخصوصية. علاوة على ذلك، فإن استبدال البيانات العشوائية في الذاكرة الخطية دون التسبب في تعطل النظام أمر معقد، خاصة عند التعامل مع الوحدات والبيانات الداخلية لـ GO، ويرجع ذلك إلى حد كبير إلى نقص التوثيق الشامل لتخطيط ذاكرة GO.
بناءً على فهمنا، نعتقد أن تخطيط الذاكرة الخطية لـ GO موضح أدناه:

بينما يقدم هذا الاستغلال نواقل هجوم مثيرة للاهتمام في تطوير الويب، خاصة داخل WASM، فإنه يقدم أيضًا مخاطر أمنية متأصلة مرتبطة بلغات البرمجة. على سبيل المثال، ضع في اعتبارك سيناريو حيث يتم ترجمة برنامج C إلى WASM. إذا كان برنامج C الأصلي يحتوي على تجاوزات أو ثغرات، فإن هذه المخاطر تنتقل إلى بيئة WASM، مما يعرضها لثغرات وتهديدات مماثلة.
نحن طلاب من جامعة كارنيجي ميلون وقد قدمنا هذا البرهان على المفهوم لـ CVE في إحدى فصولنا (18-739D Hacking101). يمكنك الرجوع إلى مجموعة الشرائح الخاصة بنا هنا: GOWasm.pptx