
डबल फ्री
CVE-2020-25637
*** विवरण ***
libvirt API में, संस्करण 6.8.0 से पहले के संस्करणों में, एक दोहरी मुक्त मेमोरी (double free) की समस्या उत्पन्न हुई, जो चल रहे QEMU डोमेन के नेटवर्क इंटरफेस के बारे में जानकारी मांगने के लिए जिम्मेदार है। यह दोष polkit पहुँच नियंत्रण ड्राइवर को प्रभावित करता है। विशेष रूप से, सीमित ACL अनुमतियों के साथ रीड-राइट सॉकेट से जुड़ने वाले क्लाइंट इस दोष का उपयोग libvirt डेमॉन को क्रैश करने के लिए कर सकते हैं, जिससे सेवा से वंचित (denial of service) हो सकता है, या संभावित रूप से सिस्टम पर अपने विशेषाधिकारों को बढ़ा सकते हैं। इस भेद्यता का सबसे बड़ा खतरा डेटा गोपनीयता और अखंडता के साथ-साथ सिस्टम की उपलब्धता से संबंधित है।
इस भेद्यता का सबसे महत्वपूर्ण खतरा निम्नलिखित है:
दोष के स्कोर:
RedHat द्वारा 6.4 के औसत के साथ एक मध्यम दोष
NVD द्वारा 6.7 के औसत के साथ एक मध्यम दोष
*** इस दोष का शोषण करने के लिए विभिन्न उपकरण और महत्वपूर्ण पूर्वापेक्षाएँ ***
सबसे पहले हमारे ऑपरेटिंग सिस्टम की अनुकूलता को सत्यापित करना आवश्यक है, बस यह कमांड चलाएँ:
grep -E -c "vmx|svm" /proc/cpuinfo
यदि कमांड ठीक प्रतिक्रिया देती है तो आप स्थापना के लिए आगे बढ़ सकते हैं:
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 स्थापित कर लेते हैं, तो आपको Vagrant का उपयोग करके KVM वर्चुअल मशीनों का प्रबंधन शुरू करने के लिए libvirt प्लगइन स्थापित करना चाहिए।
vagrant plugin install vagrant-libvirt
आप पुष्टि कर सकते हैं कि प्लगइन स्थापित हो गया है
vagrant plugin list
3) vagrant बॉक्स:
vagrant द्वारा सीधे एक तैयार टेम्पलेट का उपयोग करना संभव है, हमारे मामले में हम ubuntu 20.04 इमेज का उपयोग करेंगे।
हमारी इमेज को vagrant बॉक्स में जोड़ने के लिए बस यह कमांड चलाएँ:
vagrant box add generic / ubuntu1804 --provider = libvirt
स्थानीय रूप से मौजूद बॉक्स की सूची देखने के लिए:
vagrant box list
4) डीबगिंग (Debugging)
डीबगिंग की दो संभावनाएँ:
GDB, यदि उपकरण आपके ऑपरेटिंग सिस्टम में उपलब्ध नहीं है तो यह कमांड चलाएँ:
sudo apt-get install gdb
Valgrind, यदि उपकरण आपके ऑपरेटिंग सिस्टम में उपलब्ध नहीं है तो यह कमांड चलाएँ:
sudo apt-get install valgrind
*** कोड का निष्पादन ***
vagrant के माध्यम से एक VM चलाएँ:
vagrant up
सबसे पहले लाइब्रेरी स्थापित करें:
sudo apt-get install -y libvirt-dev
संकलन (Compilation):
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 में समस्या पैदा करने वाले फ़ंक्शन के काम करने के तरीके को समझना आवश्यक है।
मान लीजिए कि एक हमलावर libvirt के qemuAgentGetInterfaces () के माध्यम से मुक्त की गई मेमोरी क्षेत्र (ifname वेरिएबल के मेमोरी क्षेत्र में) के उपयोग को प्रेरित कर सकता है, ताकि सेवा से वंचित किया जा सके, और संभवतः कोड निष्पादित किया जा सके।
प्रतीक्षित क्षण आ गया है।
एक बार vagrant फ़ाइल चालू हो जाने पर, Qemu/KVM द्वारा स्वयं चलाई गई वर्चुअल मशीन के अंदर info1.c कोड चलाना आवश्यक है। अर्थात, vagrant द्वारा बनाई गई VM के अंदर VM बनाना, यानी कोड को vagrant द्वारा बनाई गई VM में निष्पादित करना।
*** इस दोष का सुधार ***
libvirt के qemuAgentGetInterfaces () फ़ंक्शन में ifname वेरिएबल को शून्य (null) पर सेट करना पर्याप्त है, अर्थात प्रत्येक इंटरफ़ेस के लिए ifname वेरिएबल को मुक्त (free) किया जाना चाहिए।
*** प्रदर्शन ***
आपको PowerPoint फ़ाइल में समस्या (दोहरी मुक्त) का एक सरल प्रदर्शन मिलेगा।
*** महत्वपूर्ण ***
यह परियोजना दोष की जटिलता और हार्डवेयर के साथ-साथ समय की कमी के कारण अंत तक पूर्ण नहीं हो पाई है।