
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)) |
2 | Intent.parseUri(mPkgContent, 0) फिर startActivity() / sendBroadcast() |
न तो भेजने वाले और न ही पेलोड को मान्य किया जाता है। चूँकि परिणामी गतिविधि 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 योजनाएँ, एक निर्यातित सेवा, शून्य अनुमतियाँ:
| # | योजना | परिणाम |
|---|---|---|
| 1 | https: | ब्राउज़र हमलावर-नियंत्रित फ़िशिंग पृष्ठ खोलता है |
| 2 | sms: | सामाजिक-इंजीनियरिंग संदेश के साथ पहले से भरा SMS कंपोज़र |
| 3 | tel: | हमलावर-नियंत्रित नंबर के साथ पहले से भरा डायलर |
| 4 | mailto: | क्रेडेंशियल बाहर निकालने के लिए पहले से भरा ईमेल कंपोज़र |
| 5 | market: | मैलवेयर इंस्टॉलेशन के लिए Play Store पुनर्निर्देशन |
| 6 | geo: | नकली सेवा केंद्र पर मानचित्र पुनर्निर्देशन |
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 को हल किया और उसे वितरित किया।