
CVE-2026-12960 - ASUS Router ऐप (com.asus.aihome) में Android अनुप्रयोग घटकों का अनुचित निर्यात। PoC, exploit APK, वीडियो और विक्रेता रिपोर्ट। संस्करण 1.0.0.9.74 में ठीक किया गया।
ASUS राउटर ऐप में एंड्रॉयड एप्लिकेशन घटकों का अनुचित निर्यात
ASUS राउटर एंड्रॉयड ऐप (com.asus.aihome) में बंडल किया गया एक घटक
android:exported="true" के साथ और बिना किसी android:permission के घोषित किया गया था।
उसी डिवाइस पर मौजूद कोई भी अन्य ऐप, जिसके पास शून्य अनुमतियाँ हों, उसे एक क्राफ्टेड Intent भेज सकता था
और ASUS राउटर ऐप को उपयोगकर्ता की ओर से एक हमलावर-नियंत्रित URI खोलने पर मजबूर कर सकता था।
2026-03-17 को ASUS को सूचित किया गया। ASUS द्वारा ठीक किया गया और 2026-07-03 को CVE-2026-12960 के रूप में प्रकाशित किया गया।
Show Up Show Out Security के Sedric Louissaint द्वारा खोजा और रिपोर्ट किया गया।
| CVE | CVE-2026-12960 |
| उत्पाद | एंड्रॉयड के लिए ASUS राउटर ऐप (com.asus.aihome) |
| प्रभावित | ≤ 1.0.0.9.71 |
| इसमें ठीक किया गया | 1.0.0.9.74 |
| कमज़ोरी | CWE-926: एंड्रॉयड एप्लिकेशन घटकों का अनुचित निर्यात |
| CVSS 4.0 | 6.0 मध्यम CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:N/VA:N/SC:H/SI:N/SA:N |
| CNA | ASUS |
| विक्रेता सलाह | https://www.asus.com/security-advisory/ |
| परीक्षित | com.asus.aihome 1.0.0.9.71 (Google Play), एंड्रॉयड 11 इम्यूलेटर |
ऐप Baidu Push SDK को बंडल करता है, जो घोषित करता है:
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="true" />
कोई android:permission विशेषता नहीं है, इसलिए एंड्रॉयड का घटक-स्तरीय अभिगम नियंत्रण कभी
नहीं चलता। कोई भी स्थापित ऐप उसके विरुद्ध startService() को कॉल कर सकता है।
CommandService.onStartCommand() आने वाले Intent के public_msg अतिरिक्त डेटा से एक PublicMsg Parcelable पढ़ता है और उसे handlePrivateNotification() को भेजता है, जो
हमलावर-आपूर्ति किए गए mOpenType फ़ील्ड पर शाखा बनाता है:
mOpenType | व्यवहार |
|---|---|
1 | हमलावर के mUrl के साथ startActivity(ACTION_VIEW, Uri.parse(mUrl)) |
न तो भेजने वाले और न ही पेलोड को मान्य किया जाता है। चूँकि परिणामी गतिविधि ASUS ऐप के स्वयं के UID और प्रक्रिया से लॉन्च की जाती है, स्क्रीन पर जो कुछ भी दिखाई देता है वह भरोसेमंद राउटर-प्रबंधन ऐप से आया हुआ प्रतीत होता है जिसे उपयोगकर्ता ने अभी खोला है।
प्रभाव की दृष्टि से इसमें कुछ भी Baidu-विशिष्ट नहीं है। SDK निर्यातित घटक भेजता है, होस्ट ऐप इसे विरासत में प्राप्त करता है, और होस्ट ऐप की पहचान ही वह है जो उधार ली जाती है।
PublicMsg Parcelable बनाता है।mOpenType = 1 और mUrl को हमलावर-नियंत्रित URI पर सेट करता है।CommandService को भेजता है। कोई अनुमति आवश्यक नहीं, कोई SecurityException नहीं।onStartCommand() → handlePrivateNotification()।startActivity(ACTION_VIEW, Uri.parse(mUrl)) ASUS ऐप की प्रक्रिया से चलता है।PublicMsg फ़ील्ड क्रम, जो डीकंपाइल किए गए smali में writeToParcel से प्राप्त किया गया और
poc/PublicMsg.java में पुनः कार्यान्वित किया गया:
String mMsgId, mAppId, mTitle, mDescription, mUrl, mPkgName
int mPkgVercode, mNotificationBuilder, mNotificationBasicStyle
int mOpenType, mUserConfirm
String mCustomContent, mPkgContent
int mAdvertiseStyle
String mAdvertiseSmallIconUrl, mAdvertiseLargeIconUrl, mAdvertiseClickUrl,
mAdvertiseBigPictureUrl, mAdvertiseBigPictureClickUrl, mAdvertiseDownloadClickUrl
क्रम गलत पाएँ और Parcel कचरे में अनमार्शल हो जाता है। इसे सही पाएँ और सेवा संदेश को स्वीकार कर लेती है जैसे कि Baidu का अपना पुश इन्फ्रास्ट्रक्चर इसे भेज रहा हो।
छह URI योजनाएँ, एक निर्यातित सेवा, शून्य अनुमतियाँ:
media/poc_commandservice.mp4 पूर्ण 31-सेकंड की
रन है: बिल्ड, इंस्टॉल, फायर, और इम्यूलेटर प्रत्येक पेलोड पर क्रम से प्रतिक्रिया करता है।
| हमला 1: फ़िशिंग पृष्ठ | हमला 2: SMS कंपोज़र | हमला 3: डायलर | PoC ऐप की अनुमतियाँ |
|---|---|---|---|
![]() | ![]() |
वह अंतिम स्क्रीनशॉट पूरी दलील है। कोई अनुमति अनुरोध नहीं। जिस ऐप ने ASUS राउटर ऐप के माध्यम से छह क्रियाएँ चलाईं, उसने उपयोगकर्ता से कुछ भी नहीं माँगा।
ADB, एक JDK, और एंड्रॉयड SDK बिल्ड टूल्स (aapt2, d8/dx, zipalign,
apksigner) के साथ-साथ platforms;android-30 की आवश्यकता है।
./poc/poc_commandservice_exploit.sh <device_serial>
स्क्रिप्ट तीन चरण चलाती है:
com.android.shell से तीन CommandService क्रियाएँ भेजता है
और रिपोर्ट करता है कि क्या कोई अस्वीकार की गई है। अनुमति-संरक्षित सेवा यहाँ SecurityException फेंकती है। इसने तीनों को स्वीकार कर लिया।exploit_commandservice.apk को पैकेज और हस्ताक्षरित करता है, और
इसे इंस्टॉल करता है। यदि आप इसे छोड़ना चाहें तो poc/ में एक पूर्व-निर्मित प्रति है।असुरक्षित डिवाइस पर चरण 1 का आउटपुट:
[ACCESS] passthrough.notification.CLICK → service accepted intent
[ACCESS] privatenotification.CLICK → service accepted intent
[ACCESS] privatenotification.DELETE → service accepted intent
Phase 1 result: 3/3 actions accepted without permission check
और dumpsys activity services से ServiceRecord, जो कॉल करने वाले को रिकॉर्ड करता है:
intent={act=com.baidu.android.pushservice.action.privatenotification.CLICK
cmp=com.asus.aihome/com.baidu.android.pushservice.CommandService}
recentCallingPackage=com.android.shell
startRequested=true callStart=true
चरण 3, शेल के बजाय एक वास्तविक गैर-विशेषाधिकार प्राप्त ऐप से:
W PoCExploit: [OK] attack1_url_open → com.asus.aihome/com.baidu.android.pushservice.CommandService
W PoCExploit: [OK] attack2_sms_compose → ...
(all 6 succeed)
startService() ने null के बजाय लक्ष्य ComponentName लौटाया, और कोई
SecurityException नहीं फेंका गया। एंड्रॉयड ने Intent को हल किया और उसे वितरित किया।
poc/
poc_commandservice_exploit.sh Automated three-phase reproduction script
ExploitCommandService.java PoC activity + broadcast receiver source
PublicMsg.java Parcelable matching the target's field layout
AndroidManifest_PoC.xml PoC manifest (note: no <uses-permission>)
exploit_commandservice.apk Prebuilt PoC, debug-signed, zero permissions
media/
poc_commandservice.mp4 Full PoC recording
attack1-browser.jpg Stills pulled from the recording
attack2-sms.jpg
attack3-dialer.jpg
poc-app-no-permissions.jpg
vendor/
asus-security-advisory-submission.pdf The report as filed with ASUS
PoC का आउटबाउंड URL एक Burp Collaborator सबडोमेन है जिसका उपयोग यह पुष्टि करने के लिए किया गया था कि नेविगेशन वास्तव में हुआ। यह बहुत पहले मर चुका है। यदि आप पुनरुत्पादन कर रहे हैं तो अपना स्वयं का डालें।
विक्रेता के लिए, समाधान एक विशेषता है:
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="false" />
या, यदि घटक को वास्तव में बाहर से पहुँच योग्य होना है, तो इसे signature-सुरक्षा-स्तर की अनुमति से गेट करें और उस पर कार्रवाई करने से पहले डिसीरियलाइज़ किए गए PublicMsg को मान्य करें। ASUS ने 1.0.0.9.74 में समाधान भेजा।
उपयोगकर्ताओं के लिए: ASUS राउटर ऐप को 1.0.0.9.74 या बाद के संस्करण में अपडेट करें।
एंड्रॉयड ऐप भेजने वाले बाकी सभी के लिए: ऑडिट करें कि आपके तृतीय-पक्ष SDK क्या निर्यात करते हैं।
अपनी खुद की रिलीज़ बिल्ड के विरुद्ध aapt dump xmltree base.apk AndroidManifest.xml चलाएँ
और उसमें हर exported="true" पढ़ें। आप जो मेनिफेस्ट भेजते हैं वह आपके द्वारा मर्ज किए गए हर
मेनिफेस्ट का योग है, और उस सबके लिए आप ही उत्तरदायी हैं।
| दिनांक | घटना |
|---|---|
| 2026-03-17 | PoC APK, स्वचालित स्क्रिप्ट और वीडियो के साथ ASUS को रिपोर्ट किया गया |
| 2026-06-23 | CVE-2026-12960 को CNA के रूप में ASUS द्वारा आरक्षित किया गया |
| 2026-07-03 | CVE प्रकाशित; समाधान 1.0.0.9.74 में उपलब्ध |
| 2026-07-25 | सार्वजनिक लेख और PoC जारी किए गए |
समन्वित प्रकटीकरण और विक्रेता समाधान के बाद, रक्षात्मक और शैक्षिक उपयोग के लिए प्रकाशित। PoC एक पैच किए गए संस्करण को लक्षित करता है और URI लॉन्च करने के अलावा कुछ नहीं करता है। इसे उन डिवाइसों के विरुद्ध न चलाएँ जिनके मालिक आप नहीं हैं या जिनके परीक्षण के लिए आपके पास लिखित प्राधिकरण नहीं है।
2 | Intent.parseUri(mPkgContent, 0) फिर startActivity() / sendBroadcast() |
| # | योजना | परिणाम |
|---|
| 1 | https: | ब्राउज़र हमलावर-नियंत्रित फ़िशिंग पृष्ठ खोलता है |
| 2 | sms: | सामाजिक-इंजीनियरिंग संदेश के साथ पहले से भरा SMS कंपोज़र |
| 3 | tel: | हमलावर-नियंत्रित नंबर के साथ पहले से भरा डायलर |
| 4 | mailto: | क्रेडेंशियल बाहर निकालने के लिए पहले से भरा ईमेल कंपोज़र |
| 5 | market: | मैलवेयर इंस्टॉलेशन के लिए Play Store पुनर्निर्देशन |
| 6 | geo: | नकली सेवा केंद्र पर मानचित्र पुनर्निर्देशन |
![]() |
![]() |