
WebAssembly (WASM) 🌍، وهو تنسيق تعليمات ثنائية متطور، يتيح التنفيذ السلس للغات عالية المستوى مثل C وC++ وRust وGO في متصفحات الويب الحديثة. ومع ذلك، كشف اكتشاف CVE-2021-38297 🚩 عن خلل خطير في عملية تجميع وتحميل GO للملفات الثنائية WASM المترجمة بواسطة GO. توجد هذه الثغرة في محمّل JavaScript الخاص بـ WASM (wasm_exec.js) المقدم من GO، وقد سمحت بالإدراج غير المقيد للبيانات في وسيط argv. وبما أن argv يُخزَّن في الذاكرة الخطية لـ WASM، يمكن للجهات الخبيثة استغلال ذلك لاستبدال الذاكرة الخطية لبرنامج WASM المترجم بواسطة GO بمدخلات argv كبيرة الحجم، مما يؤدي إلى نتائج غير متوقعة وربما خطيرة. كانت هذه الثغرة مصدر قلق كبير في إصدارات GO قبل 1.17.2.
باختصار:
argv والمنشورات في عنوان الذاكرة 0x5000.toLeetSpeak وprocessSharedVar لمحتوى التعليقات والمنشورات، على التوالي.في إثبات المفهوم الخاص بنا، نقدّم «Vuln-Twitter»، وهي منصة تواصل اجتماعي محاكاة تتيح المحتوى الذي ينشئه المستخدمون عبر المنشورات والتعليقات. تستخدم الواجهة الأمامية لـ Vuln-Twitter خادم Node.js للويب وSQLite لتخزين البيانات، وتعتمد على JavaScript بسيطة إلى جانب وحدة GO WASM باسم wordprocessor.wasm لعرض المحتوى ديناميكيًا. تتضمن هذه الوحدة، بشكل ملحوظ، دوال مثل toLeetSpeak التي تحوّل مدخلات المستخدمين إلى «LeetSpeak» منمّقة لتجربة مستخدم جذابة.

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

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

للهواة والباحثين المهتمين باستكشاف هذه الثغرة بشكل أعمق، نقدم خطوات تفصيلية لإعادة إنتاج بيئة الاستغلال باستخدام إصدار معين من GO المعرّض للخطر. يسهّل هذا النهج العملي فهمًا أعمق لآليات الثغرة واستراتيجيات التخفيف المحتملة.
ملاحظة: لإعادة إنتاج هذا، تحتاج إلى تثبيت إصدار 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 للتخفيف من المخاطر. يعمل هذا القسم كدليل للمطورين ومسؤولي الأنظمة لتحصين تطبيقاتهم ضد هذه الثغرات، مع التأكيد على أهمية تحديثات البرامج المنتظمة والممارسات الأمنية اليقظة.
في هذا التطبيق، قدمت أيضًا نصًا برمجيًا للتصحيح (patch script) يستخدم إصدارًا أحدث من go:
npm run patchServerيجب أن يعيد هذا تجميع ملف go بالإصدار الجديد ويبدأ تشغيل الخادم بنسخة التصحيح
يجب أن تلاحظ الآن أن المنشور لا تتم الكتابة فوقه، وإذا لاحظت وحدة التحكم، سنرى خطأً بدلاً من ذلك: Argument length too long.

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

بوصفنا طلابًا في جامعة Carnegie Mellon، يسهم تحقيقنا في CVE-2021-38297 في الخطاب الأكاديمي والمهني الأوسع حول الأمن السيبراني، ويقدم دراسة حالة عملية حول آثار التقنيات الناشئة على أمن البرمجيات. وتوضح مواد العرض التقديمي الخاصة بنا، المتاحة للمراجعة، المزيد من نتائجنا ومنهجياتنا، وتدعو إلى الحوار والتعاون بين مجتمع الأمن السيبراني.
هذا المشروع شهادة على البحث التعاوني والاستقصاء الأكاديمي، بقيادة فريق متفانٍ من الطلاب والباحثين:
يعرض إثبات المفهوم هذا تطبيقًا للتواصل الاجتماعي، Vuln-Twitter، يسمح لعدة مستخدمين بنشر المحتوى والتعليقات. يستخدم خادم الويب، المبني على Node.js، SQLite لتخزين بيانات المنشورات والتعليقات.
تستخدم الواجهة الأمامية JavaScript بسيطة إلى جانب وحدة GO WASM باسم wordprocessor.wasm. تعرض هذه الوحدة دوال مثل toLeetSpeak، التي تحوّل سلاسل الإدخال إلى «LeetSpeak» (على سبيل المثال، «Hello!» تصبح «h3ll0!»).
تساعد وحدات GO WASM في عرض المنشورات والتعليقات بصيغة LeetSpeak.
أثناء عملية عرض الواجهة الأمامية، عند استلام المنشورات والتعليقات من الخادم، يخضع كل تعليق للعرض بصيغة «LeetSpeak» باستخدام وحدة GO WASM. يُمرَّر تعليق كل منشور كجزء من متغير argv بعد تحميل وحدة GO WASM.
علاوة على ذلك، توجد دالة processSharedVar() في وحدة GO، مصممة لقراءة السلسلة الموجودة في العنوان 0x5000 وتحويلها إلى كلام مبسط (على سبيل المثال، «How are you?» تصبح «How r u?»). يُضاف المنشور الأصلي صراحةً إلى 0x5000 في الذاكرة الخطية ليتم الوصول إليه بواسطة هذه الدالة، مما يغير محتوى المنشور.
للمهتمين بالتعمق في CVE-2021-38297 وآثاره الأوسع، نقدم قائمة منسقة من الموارد والقراءات، بدءًا من النشرات الأمنية الرسمية إلى المدونات التقنية والأوراق الأكاديمية. تقدم هذه المواد رؤى شاملة حول الثغرة، وتأثيرها على أمن البرمجيات، والجهود المستمرة لضمان سلامة ونزاهة تطبيقات الويب.
مستودع التطوير الأصلي: https://github.com/gkrishnan724/CVE-2021-38297