
تحرير مزدوج
CVE-2020-25637
*** الوصف ***
حدثت مشكلة تحرير مزدوج للذاكرة في واجهة برمجة تطبيقات libvirt، في الإصدارات السابقة للإصدار 6.8.0، المسؤولة عن طلب معلومات حول واجهات الشبكة لنطاق QEMU قيد التشغيل. تؤثر هذه الثغرة على برنامج تشغيل التحكم في الوصول polkit. وبشكل أكثر تحديدًا، يمكن للعملاء المتصلين بالمقبس (socket) في وضع القراءة-الكتابة مع صلاحيات ACL محدودة استخدام هذه الثغرة لتعطيل خادم libvirt، مما يؤدي إلى رفض الخدمة، أو ربما زيادة صلاحياتهم على النظام. التهديد الأكبر لهذه الثغرة يتعلق بسرية وسلامة البيانات وكذلك توفر النظام.
أهم تهديد لهذه الثغرة يتعلق بـ:
درجات الثغرة:
ثغرة متوسطة حسب RedHat بمتوسط 6.4
ثغرة متوسطة حسب NVD بمتوسط 6.7
*** أدوات ومتطلبات أساسية مختلفة يجب تجهيزها لاستغلال هذه الثغرة ***
قبل كل شيء، من الضروري التحقق من توافق نظام التشغيل لدينا، يكفي تشغيل هذا الأمر:
grep -E -c "vmx|svm" /proc/cpuinfo
إذا استجاب الأمر بنجاح (ok) يمكنك المتابعة إلى التثبيت:
sudo apt-get -y install qemu-kvm libvirt-bin virt-top outils-libguestfs virtinst bridge-utils
2) تثبيت vagrant:
لتثبيت vagrant يكفي تشغيل هذا الأمر:
sudo apt -y install vagrant
بمجرد تثبيت Vagrant وKVM، يجب أن تكون جاهزًا لتثبيت إضافة libvirt لتتمكن من بدء إدارة الأجهزة الافتراضية KVM باستخدام Vagrant.
vagrant plugin install vagrant-libvirt
يمكنك تأكيد تثبيت الإضافة:
vagrant plugin list
3) صندوق فاجرانت (box vagrant):
من الممكن استخدام قالب جاهز مباشرة عبر vagrant، وفي حالتنا سنستخدم صورة ubuntu 20.04.
لإضافة صورتنا إلى صندوق فاجرانت يكفي تشغيل هذا الأمر:
vagrant box add generic / ubuntu1804 --provider = libvirt
لعرض قائمة الصناديق الموجودة محليًا:
vagrant box list
4) التصحيح
هناك إمكانيتان للتصحيح:
GDB، إذا لم تكن الأداة متوفرة في نظام التشغيل لديك، قم بتشغيل هذا الأمر:
sudo apt-get install gdb
Valgrind، إذا لم تكن الأداة متوفرة في نظام التشغيل لديك، قم بتشغيل هذا الأمر:
sudo apt-get install valgrind
*** تنفيذ الكود ***
تشغيل جهاز افتراضي عبر vagrant:
vagrant up
قبل كل شيء، قم بتثبيت المكتبة:
sudo apt-get install -y libvirt-dev
الترجمة:
gcc -g -Wall info1.c -o info1 -lvirt
تنفيذ الكود:
./info1 qemu:///system vagrant-vms_ubuntu-01
التنفيذ مع التصحيح:
valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind-out.txt ./info1 qemu:///system vagrant-vms_ubuntu-01
*** تفعيل الثغرة ***
قبل تفعيل الثغرة، من الضروري معرفة آلية عمل الدالة التي تسبب المشكلة في libvirt.
لنفترض أن المهاجم يمكنه التسبب في استخدام منطقة ذاكرة محررة عبر الدالة qemuAgentGetInterfaces () من libvirt، وتحديدًا في منطقة ذاكرة المتغير ifname، من أجل التسبب في رفض الخدمة، وربما تنفيذ كود.
لقد حانت اللحظة المنتظرة
بمجرد تشغيل ملف vagrant، يجب تشغيل الكود info1.c داخل جهاز افتراضي يتم تشغيله بدوره بواسطة Qemu/KVM. أي إنشاء أجهزة افتراضية داخل جهاز افتراضي، بمعنى آخر تنفيذ الكود داخل الجهاز الافتراضي الذي أنشأه vagrant.
*** إصلاح هذه الثغرة ***
يكفي تعيين المتغير ifname إلى null في الدالة qemuAgentGetInterfaces () من libvirt، أي يجب تحرير المتغير ifname لكل واجهة.
*** العرض التوضيحي ***
ستجد عرضًا توضيحيًا بسيطًا لمشكلة ( double free ) في ملف PowerPoint.
*** مهم ***
لم يكتمل المشروع حتى النهاية لأسباب تتعلق بتعقيد الثغرة والعتاد، وكذلك ضيق الوقت.