
बूटलोडर-लॉक्ड ASUS Zenfone 9 पर CVE-2025-21479 + perf-आधारित फ़िज़िकल-एड्रेस लीक के माध्यम से अस्थायी root (uid 0)। GPLv3।
एक ASUS Zenfone 9 (AI2202) पर अस्थायी रूट (uid 0) प्राप्त करने के लिए शोध कोड और नोट्स, जिसका
बूटलोडर अनलॉक नहीं किया जा सकता — क्योंकि ASUS ने अपना अनलॉक टूल बंद कर दिया, Developer options से OEM-unlocking
टॉगल हटा दिया, और वर्तमान फर्मवेयर पर fastboot oem unlock / flashing unlock को सख्ती से अस्वीकार करता है।
यह बूटलोडर अनलॉक नहीं है और यह कुछ भी फ्लैश नहीं करता। यह एक रनटाइम रूट है: डिवाइस-साइड प्रिमिटिव्स की एक श्रृंखला जो कॉलिंग प्रोसेस के पास रूट क्रेडेंशियल्स होने पर समाप्त होती है। रीबूट इसे साफ़ कर देता है।
सत्यापित: ASUS Zenfone 9 (AI2202), Android 14, बिल्ड 34.0304.2004.145, SPL 2024-07-05,
kernel 5.10.205-android12-9-00029-g3f12df86bfdb-ab11799032, SM8475 / Adreno 730, बूटलोडर लॉक।
प्राधिकरण / दायरा। यहाँ सब कुछ ऑपरेटर के स्वामित्व वाले डिवाइस पर, एक अधिकृत ADB कनेक्शन के माध्यम से चलता है। किसी विक्रेता सर्वर पर हमला नहीं किया जाता, कोई साइनिंग की या अनलॉक टोकन बायपास नहीं किया जाता, और किसी भी पार्टीशन पर कुछ नहीं लिखा जाता। विकास के लिए उपयोग किया गया फ़ोन एक स्पेयर है, बैकअप लिया गया है, और ऑफ़लाइन रखा गया है। अपने स्वामित्व वाले और खोने का जोखिम उठा सकने वाले हार्डवेयर पर परीक्षण करें।
परिणाम u:r:kernel:s0 SELinux कॉन्टेक्स्ट में uid 0 है (यह init_cred का SID इनहेरिट करता है), यानी
प्रभावी रूप से अप्रतिबंधित। इस चरण के लिए SELinux का Permissive होना आवश्यक है — Enforcing के अंतर्गत प्रोसेस को
इसके बजाय मार दिया जाता है, क्योंकि क्रेडेंशियल स्वैप SELinux हुक को बायपास करता है।
पहले ZF9_SERIAL को अपने डिवाइस सीरियल पर सेट करें (सभी स्क्रिप्ट इसे पढ़ती हैं):
export ZF9_SERIAL=<your-device-serial>
# 0. one-time: build and push the device binaries (needs an Android NDK)
# see scripts/ for the exact clang invocations used
adb push cheese_pa call_capset /data/local/tmp/
# 1. full cycle: SELinux -> permissive, patch, run a command as root, restore everything
scripts/root-now.sh id
scripts/root-now.sh sh # root shell
स्क्रिप्ट हमेशा मूल कर्नेल टेक्स्ट और SELinux स्थिति को पुनर्स्थापित करती है (ट्रैप-सुरक्षित), और रीडबैक द्वारा पुनर्स्थापन को सत्यापित करती है।
uid=0(root) gid=0(root) context=u:r:kernel:s0,
capset(NULL,NULL) -> 0.gpu fault threshold exceeded 3 faults in 3000 msecs), जिसके बाद आगे के कमांड EPERM के साथ विफल होते हैं। देखी गई पैच सफलता रनों के बीच 13/13 और 2/13 dwords के बीच बदलती है।screenrecord लोड चलने के साथ 11-13/13 सत्यापित हुआ। स्क्रिप्ट
हर ऑपरेशन के लिए अपना लोड शुरू करती हैं (रीड भी रेस करते हैं), लेकिन इन टूल्स के इंटरनल्स को कभी बिना सुरक्षा के न चलाएँ।capset कॉलर कचरा निष्पादित कर सकता है)। स्क्रिप्ट
एंट्री इंस्ट्रक्शन को अंत में लिखती हैं, हर dword को सत्यापित करती हैं, और विफलता पर पुनर्स्थापित करती हैं — लेकिन यदि कोई रन बिगड़ जाए,
तो पुनः प्रयास से पहले रीबूट करें।सुरक्षा नियम जिन्हें बनाए रखना उचित है: हर लेखन से पहले पढ़ें, जो पैच करें उसे हमेशा पुनर्स्थापित करें, कभी भी इंजेक्ट की गई
पेज-टेबल एंट्री को लाइव न छोड़ें, सुरक्षित/TZ भौतिक मेमोरी को न छुएँ (यह घातक है), और खराब स्थिति से उबरने के लिए रीबूट करें। ROADMAP.md में
प्रत्येक के पीछे के प्रमाण सहित गॉचों की पूरी सूची है।
ROADMAP.md durable handoff: verified constants, procedure, gotchas, open paths
STATUS.md current state + verification receipts
src/ pa_leak.{c,h} · cheese.c · cheese_pa.c (workhorse: PROBE/POKE/SELFTEST/ROOT modes)
call_capset.c · host_kallsyms.c (offline symbol resolver)
scripts/ root-now.sh · patch-dwords.sh · demo-root.sh · verify-backup.sh
tools/ btf_offsets.py
फर्मवेयर इमेज, OTA पैकेज और डिवाइस लॉग जानबूझकर कमिट नहीं किए गए हैं (देखें .gitignore)।
GPLv3 — देखें LICENSE।
| चरण | यह क्या करता है | कहाँ |
|---|
| 1 | CVE-2025-21479 (Adreno KGSL): एक SDS पैकेट को गलत तरीके से रिंगबफ़र पैकेट के रूप में वर्गीकृत किया जाता है, जिससे यूज़रलैंड CP_SMMU_TABLE_UPDATE जारी कर सकता है और GPU के TTBR0 को हमलावर-चयनित भौतिक पते पर इंगित कर सकता है | src/cheese.c |
| 2 | भौतिक-पता लीक: इस बिल्ड पर perf_event_paranoid = -1, इसलिए हमारे स्वामित्व वाले पेज पर एक हार्डवेयर वॉचपॉइंट PERF_SAMPLE_PHYS_ADDR लौटाता है — उस पेज का भौतिक पता। यह उस pagemap लीक को प्रतिस्थापित करता है जिस पर अपस्ट्रीम निर्भर था (यहाँ PFNs शून्य हैं) | src/pa_leak.{c,h} |
| 3 | मनमाना भौतिक पढ़ना/लिखना: नकली पेज टेबल को एक ज्ञात भौतिक पते पर बनाएँ (चरण 2 से), ताकि कोई स्प्रे लॉटरी और कोई वाइल्ड वॉक न हो | src/cheese_pa.c |
| 4 | रूट: फर्मवेयर इमेज से ऑफ़लाइन कर्नेल सिंबल्स को हल करें, डिवाइस पर KASLR स्लाइड प्राप्त करें, __do_sys_capset को commit_creds(&init_cred) स्टब से पैच करें, capset() कॉल करें | src/call_capset.c, scripts/ |