
CVE-2025-21479 प्रूफ-ऑफ-कॉन्सेप्ट, मुझे लगता है
Magisk, Cheese और Termux का रूट शेल के साथ स्क्रीनशॉट
रूट करना खतरनाक है। यदि आप Quest 3/3S को ब्रिक कर देते हैं, तो उसे ठीक करने का कोई तरीका नहीं है।
यह टेम्प रूट होने पर सभी सुरक्षा को अक्षम कर देता है।
जिन ऐप्स या वेबसाइटों पर आप भरोसा नहीं करते, उन्हें न चलाएँ / न खोलें।
बूट या सिस्टम पार्टीशन में न लिखें। आप डिवाइस को BRICK कर देंगे।
Magisk की "Install" सुविधा का उपयोग न करें।
रूट करने के बाद आप अपने deviceKey, Meta Access Token और Oculus Access Token का बैकअप लेना चाह सकते हैं।
आप Release अनुभाग में एक APK डाउनलोड कर सकते हैं।
Quest 3/3S रूट करने के लिए FreeXR की गाइड देखें।
अधिक जानकारी के लिए FreeXR के Discord से जुड़ें।
कोई नया संस्करण समर्थित नहीं है। (पुराने संस्करणों को अधिक मेहनत से समर्थित किया जा सकता है।)
Meta ने इन संस्करणों और उनसे नए सभी संस्करणों में CVE-2025-21479 को पैच कर दिया है। वे कभी समर्थित नहीं होंगे।
इस रिपॉजिटरी में कमांड-लाइन cheese एक्ज़ीक्यूटेबल का स्रोत कोड है।
ऐप का स्रोत कोड cheese-app रिपॉजिटरी में है।
यह अन्य शोधकर्ताओं के Adreno GPU विश्लेषणों पर आधारित है; इसमें इनका कोड उपयोग किया गया है:
Adreno GPU फ़र्मवेयर के बारे में अतिरिक्त जानकारी, जिसमें फ़र्मवेयर को diff करने का तरीका और फ़र्मवेयर कैसे काम करता है, Freedreno के afuc दस्तावेज़ से आती है, जिसे Rob Clark, Connor Abbott और अन्य Freedreno/Turnip योगदानकर्ताओं ने बनाया है।
XRBreak और FreeXR के डेवलपर्स को उनकी सभी मदद और योगदान के लिए धन्यवाद।
====
CVE-2025-21479 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो दर्शाता है कि यह केवल Adreno A7xx (Snapdragon 8 Gen 1 / XR2 Gen 2 और नए) डिवाइसों को प्रभावित करता है।
यह केवल जाँचता है कि डिवाइस असुरक्षित (vulnerable) है या नहीं — इसे वास्तव में कुछ दिलचस्प करने लायक बनाने के लिए अधिक प्रयास करना होगा।
बिना पैच वाले Adreno A7xx डिवाइसों पर, इसे चलाने पर यह प्रिंट होना चाहिए:
0 0
और यदि आप adb bugreport चलाते हैं, तो कर्नेल dmesg में आपको यह दिखाई देगा:
<2>[146532.566695][ T933] kgsl kgsl-3d0: GPU PAGE FAULT: addr = 4000031004 pid= 0 name=(null) drawctxt=1111638594 context pid = 0
<2>[146532.566756][ T933] kgsl kgsl-3d0: context=gfx3d_user TTBR0=0x1234567841414141 (write unknown fault)
<2>[146532.566783][ T933] kgsl kgsl-3d0: FAULTING BLOCK: CP
Adreno A6xx डिवाइसों पर, इसे चलाने पर यह प्रिंट होता है:
41414141 42424242
https://notnow.dev/notice/AvIZRBttG7DsDhx9hw
पैच किए हुए Adreno A7xx (जैसे मई 2025 सुरक्षा अपडेट के बाद के Samsung डिवाइस) को भी यह प्रिंट करना चाहिए, लेकिन मैंने इसका परीक्षण नहीं किया है।
# adjust path to point to your Android NDK
bash build.sh
adb push cheese /data/local/tmp
adb shell /data/local/tmp/cheese
https://notnow.dev/notice/Av4sfoQjyrxogkZ6Ya
यह Adreno GPU पर एक कमांड बफर चलाता है (Project Zero के Adrenaline कोड के संशोधित संस्करण का उपयोग करके)
CP_SET_MODE चलाएँ — यह ड्रॉ स्टेट्स को तुरंत चलाने में सक्षम बनाता है।
CP_SET_DRAW_STATE चलाएँ — यह IB_LEVEL को 0x4 पर सेट करता है, फिर एक इंस्ट्रक्शन बफर को कॉल करता है।
CP_SET_DRAW_STATE के अंदर, CP_SMMU_TABLE_UPDATE चलाएँ।
यहाँ CP_SMMU_TABLE_UPDATE को हैंडल करने वाला फ़र्मवेयर है:
CP_SMMU_TABLE_UPDATE:
// get IB level
and $02, $12, 0x3
// if not 0 (kernel ring buffer), go to CP_NOP
brne $02, 0x0, #l1873
<actual SMMU modify code >
तो IB_LEVEL=4 के साथ, 4 को 3 से मास्क करने पर 0 मिलता है, जो कर्नेल रिंग बफर की जाँच को पास कर देता है।
इसलिए आप पेजटेबल बदल सकते हैं और GPU को एरर करने पर मजबूर कर सकते हैं।
मैंने Freedreno के afuc डिसअसेंबलर का उपयोग करके कई Samsung Galaxy फ़र्मवेयर को diff किया।
Galaxy S24 फ़र्मवेयर सबसे उपयोगी था, क्योंकि इसका GPU फ़र्मवेयर केवल एक वर्जन से भिन्न है — सुरक्षा फिक्स:
https://notnow.dev/notice/AuueszvUVUQnWqMQeO
https://notnow.dev/notice/Av0kDfOUPKhqHyjyxE
Galaxy S24 फ़र्मवेयर: gen70900_sqe.fw
https://notnow.dev/notice/Av0a7wUouVSa3EKkE4
Galaxy S24 Adreno फ़र्मवेयर को v675 और v676 के बीच diff करने पर एक प्रकार का diff दिखता है:
0163: b80300a4 CP_ME_INIT:
0163: b80300a4 fxn355:
0163: b80300a4 cread $03, [$00 + 0x0a4]
- 0164: 2a440003 and $04, $12, 0x3
+ 0164: 2a440007 and $04, $12, 0x7
0165: 98641813 ushr $03, $03, $04
0166: c860004a brne $03, b0, #l432
0167: 01000000 nop
$12 की हर एक्सेस अब 0x3 की जगह 0x7 के साथ AND होती है। कोई अन्य बदलाव नहीं है।
https://gist.github.com/zhuowei/46a68b9ee53589cdeaa40c11d15d895f
रजिस्टर $12 IB level प्रतीत होता है: https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id23 https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id29
जो यह चुनता है कि ड्रॉ कमांडों की कौन सी कतार पढ़ी जाएगी। https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id31
Adreno 7xx हार्डवेयर 5 कतारों का समर्थन करता है (RB (kernel ringbuffer, विशेषाधिकार प्राप्त), IB1, IB2, IB3, या SDS): https://cs.android.com/android/platform/superproject/main/+/main:external/mesa3d/src/freedreno/registers/adreno/adreno_control_regs.xml;l=327;drc=c0867f48117dc2c18b1ae689235cb1f60b237600
https://notnow.dev/notice/Av0kDfOUPKhqHyjyxE
मुझे लगता है कि यह diff CVE-2025-21479 है। ऐसा लगता है कि यह केवल Adreno A7xx डिवाइसों (Snapdragon 8 Gen 1 और उससे ऊपर) को प्रभावित करता है। शायद Qualcomm बुलेटिन गलत है?
मेरा अनुमान है, एक Adreno A7xx डिवाइस पर:
CP_SET_DRAW_STATE के साथ IB level 4 (SDS) पर कमांड निष्पादित कर सकेंCP_SMMU_TABLE_UPDATEProject Zero ब्लॉग पोस्ट के अनुसार, CP_INDIRECT_BUFFER इंस्ट्रक्शन कंट्रोल प्रोसेसर इंस्ट्रक्शनों के एक इंडायरेक्ट बफर को कॉल करता है।
जब कोई ऐप GPU का उपयोग करना चाहता है, तो कर्नेल की RB (kernel ring buffer) में एक CP_INDIRECT_BUFFER कमांड होगा जो उपयोगकर्ता-प्रदत्त इंडायरेक्ट बफर — IB1 को कॉल करता है।
यह उपयोगकर्ता बफर अपने स्वयं के इंडायरेक्ट बफर IB2 को कॉल कर सकता है।
A7xx पर, IB3 भी होता है।
इसके अलावा, A6xx और A7xx दोनों पर, SDS होता है, जिसे इंडायरेक्ट बफर से नहीं, बल्कि CP_SET_DRAW_STATE से प्रवेश किया जाता है।
https://cs.android.com/android/platform/superproject/+/android15-qpr2-release:external/mesa3d/src/freedreno/decode/cffdec.c;l=3030;drc=0dc791ed57dacf9fe3df694d7f285a8d9f942fa7 https://cs.android.com/android/platform/superproject/+/android15-qpr2-release:external/mesa3d/src/freedreno/decode/cffdec.c;l=2283;drc=0dc791ed57dacf9fe3df694d7f285a8d9f942fa7
A6xx में RB, IB1, IB2 और SDS है।
CP_SET_DRAW_STATE IB level को 0x3 पर सेट करता है: Galaxy Fold 3 फ़र्मवेयर के a650_sqe.fw.v114 में:
mov $03, 0x3
or $12, $12, 0x20
call #fxn1132 // there's a branch delay slot, so this isn't executed yet...
cwrite $03, [$00 + @IB_LEVEL]
लेकिन A7xx में अब RB, IB1, IB2, IB3, या SDS है।
CP_SET_DRAW_STATE अब IB level को 0x4 पर सेट करता है:
mov $03, 0x4
cwrite $03, [$00 + @IB_LEVEL]
0x4 & 0x3 = 0x0.
इसलिए वर्तमान IB level की जाँच करने वाला कोड सोचेगा कि SDS (set draw state) RB (kernel ring buffer) है, और CP_SMMU_TABLE_UPDATE जैसे कमांड निष्पादन की अनुमति देंगे।