परियोजना
चलाने के लिए: ./script.sh
गिटहब पर रिपॉजिटरी - https://github.com/LaCinquette/practice-22-23
कार्यान्वयन की प्रक्रिया
-
भेद्यता खोजने के लिए मैंने FFmpeg प्रोजेक्ट चुना। इसमें मुझे एक कमिट मिला जो आवश्यकताओं को पूरा करता था, अर्थात्:
- CWE-476 प्रकार से मेल खाता था - शून्य पॉइंटर का डीरेफरेंस
-
एक डॉकरफ़ाइल बनाया, जिसमें:
- आधार इमेज के रूप में Ubuntu 22.04 चुना
- पैकेज स्थापना और अन्य कमांड के दौरान कमांड लाइन इंटरैक्शन को रोकने के लिए
DEBIAN_FRONTEND=nointeractive सेट किया
- आधिकारिक विकी में बताई गई आवश्यक निर्भरताएं स्थापित कीं
- कार्य स्थान तैयार करता हूँ (फ़ोल्डर workdir)
- अभी तक ठीक न की गई भेद्यता वाले कमिट को डाउनलोड, अनज़िप और कार्य स्थान पर ले जाता हूँ
- make उपयोगिता का उपयोग करके प्रोग्राम का बिल्ड चलाता हूँ
- एक स्क्रिप्ट copy_out.sh बनाता हूँ जो त्रुटि वाली आवश्यक ऑब्जेक्ट फ़ाइल खोजता है और उसे निर्देशिका workspace/out में कॉपी करता है
- स्क्रिप्ट copy_out.sh को चलाने का निर्देश छोड़ता हूँ, जो कंटेनर शुरू होने पर निष्पादित होनी चाहिए
-
स्वचालन के लिए मैं एक स्क्रिप्ट script.sh बनाता हूँ जो इमेज बनाता है और कंटेनर चलाता है, जिसके बाद फ़ाइल निकालकर वर्तमान निर्देशिका में ले जाता है:
- वर्तमान फ़ोल्डर out हटाता हूँ (यदि मौजूद है)
- इमेज को ffmpeg_image नाम से बनाता हूँ
- बनाई गई इमेज के आधार पर कंटेनर चलाता हूँ, जिसमें निम्नलिखित पैरामीटर पास करता हूँ:
--rm समाप्ति पर कंटेनर को स्वचालित रूप से हटाने के लिए
-v $PWD/out:/workspace/out अस्थायी निर्देशिका माउंट करने के लिए, जिसके माध्यम से ऑब्जेक्ट फ़ाइल होस्ट पर स्थानांतरित होती है
- आवश्यक फ़ाइल को out फ़ोल्डर से कॉपी करता हूँ
- फ़ोल्डर out हटाता हूँ
भेद्यता का विश्लेषण
स्रोत:
- कमिट सही त्रुटि के साथ
- Github पर भेद्यता के बारे में पेज
- सुरक्षा शोधकर्ता का भेद्यता के बारे में पत्र
विश्लेषण:
समस्या:
- कमांड
ffmpeg -c:v dnxhd -i poc.mov -y output.ts के साथ प्रोग्राम को विशेष रूप से बनाई गई .mov फ़ाइल दी जाती है
- DNxHD प्रारूप को पार्स करने के लिए फ़ाइल dnxhd_parser में फ़ंक्शन dnxhd_parse कॉल किया जाता है
- यह आगे फ़ंक्शन dnxhd_find_frame_end (उसी फ़ाइल में) कॉल करता है, जो कुछ शर्तों के तहत अंत नहीं ढूंढता और एक ऋणात्मक संख्या देता है जो त्रुटि कोड नहीं है
- यह संख्या अन्य पैरामीटर के साथ फ्रेम जोड़ने के लिए फ़ंक्शन ff_combine_frame (फ़ाइल parser में) में भेजी जाती है
- चूंकि यह संख्या त्रुटि कोड नहीं है, ff_combine_frame इसे शिफ्ट के रूप में पहचानता है और बफर में इन बाइट्स को फिर से पढ़ने का प्रयास करता है, लेकिन चूंकि उस समय बफर खाली है, शून्य पॉइंटर का डीरेफरेंस होता है, जिससे Segmentation fault होता है
असेंबली में:
0x08000d4e - सेक्शन की शुरुआत
-
movsxd rcx, dword [rbx + 0xc]
रजिस्टर rcx में हमें pc->buffer का संदर्भ मिलता है
-
add rcx, rdi
pc->buffer में next जोड़ते हैं
-
add rcx, qword [rbx]
pc->last_index को next और pc->buffer में जोड़ते हैं
-
movzx edi, byte [rcx]
पते rcx पर बाइट की गणना करते हैं, लेकिन चूंकि pc->buffer प्रारंभ में null है - Segmentation fault पकड़ते हैं
समाधान:
अनआवंटित मेमोरी क्षेत्र तक पहुंच को रोकना, असाधारण मामले के सही प्रबंधन द्वारा। शेष बाइट्स की ऋणात्मक संख्या का पता चलने पर, लूप को छोड़कर फ़ाइल प्रसंस्करण जारी रखना।