
CVE-2026-12960 - Exportação imprópria de componentes de aplicativos Android no aplicativo ASUS Router (com.asus.aihome). PoC, APK de exploit, vídeo e relatório do fornecedor. Corrigido em 1.0.0.9.74.
Exportação Incorreta de Componentes de Aplicativo Android no Aplicativo ASUS Router
Um componente incluído no aplicativo ASUS Router para Android (com.asus.aihome) foi declarado
android:exported="true" sem android:permission. Qualquer outro aplicativo no mesmo
dispositivo, sem nenhuma permissão, poderia enviar uma Intent manipulada e fazer com que o
aplicativo ASUS Router abrisse uma URI controlada pelo atacante em nome do usuário.
Relatado à ASUS em 2026-03-17. Corrigido pela ASUS e publicado como CVE-2026-12960 em 2026-07-03.
Descoberto e relatado por Sedric Louissaint da Show Up Show Out Security.
| CVE | CVE-2026-12960 |
| Produto | Aplicativo ASUS Router para Android (com.asus.aihome) |
| Afetado | ≤ 1.0.0.9.71 |
| Corrigido em | 1.0.0.9.74 |
| Vulnerabilidade | CWE-926: Exportação Incorreta de Componentes de Aplicativo Android |
| CVSS 4.0 | 6.0 Médio 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 |
| Aviso do fornecedor | https://www.asus.com/security-advisory/ |
| Testado em | com.asus.aihome 1.0.0.9.71 (Google Play), emulador Android 11 |
O aplicativo inclui o SDK Baidu Push, que declara:
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="true" />
Nenhum atributo android:permission, portanto o controle de acesso em nível de componente do Android nunca é acionado.
Qualquer aplicativo instalado pode chamar startService() contra ele.
CommandService.onStartCommand() lê um PublicMsg Parcelable do extra public_msg da Intent recebida
e o passa para handlePrivateNotification(), que ramifica com base no campo mOpenType fornecido pelo atacante:
mOpenType | Comportamento |
|---|---|
1 | startActivity(ACTION_VIEW, Uri.parse(mUrl)) com o mUrl do atacante |
2 | Intent.parseUri(mPkgContent, 0) e em seguida startActivity() / sendBroadcast() |
Nem o remetente nem a carga são validados. Como a atividade resultante é iniciada a partir do próprio UID e processo do aplicativo ASUS, o que quer que apareça na tela parece ter vindo do aplicativo confiável de gerenciamento de roteador que o usuário acabou de abrir.
Nada disso é específico da Baidu em efeito. O SDK fornece o componente exportado, o aplicativo hospedeiro o herda, e a identidade do aplicativo hospedeiro é o que é emprestado.
PublicMsg Parcelable compatível com o layout de campos do alvo.mOpenType = 1 e mUrl para uma URI controlada pelo atacante.CommandService. Nenhuma permissão necessária, nenhum SecurityException.onStartCommand() → handlePrivateNotification().startActivity(ACTION_VIEW, Uri.parse(mUrl)) é disparada a partir do processo do aplicativo ASUS.A ordem dos campos PublicMsg, recuperada de writeToParcel no smali descompilado e reimplementada em 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
Se a ordem estiver errada, o Parcel é desserializado em lixo. Se estiver correta, o serviço aceita a mensagem como se a própria infraestrutura de push da Baidu a tivesse enviado.
Seis esquemas de URI, um serviço exportado, zero permissões:
| # | Esquema | Resultado |
|---|---|---|
| 1 | https: | Navegador abre uma página de phishing controlada pelo atacante |
| 2 | sms: | Compositor de SMS pré-preenchido com uma mensagem de engenharia social |
| 3 | tel: | Discador pré-preenchido com um número controlado pelo atacante |
| 4 | mailto: | Compositor de e-mail pré-preenchido para exfiltrar credenciais |
| 5 | market: | Redirecionamento para a Play Store para instalação de malware |
| 6 | geo: | Redirecionamento para o Maps para um centro de serviço falso |
media/poc_commandservice.mp4 é a execução completa de 31 segundos:
compilar, instalar, disparar e o emulador reagindo a cada carga útil em sequência.
| Ataque 1: página de phishing | Ataque 2: compositor de SMS | Ataque 3: discador | Permissões do aplicativo PoC |
|---|---|---|---|
![]() | ![]() | ![]() | ![]() |
Essa última captura de tela é todo o argumento. Nenhuma permissão solicitada. O aplicativo que acabou de conduzir seis ações através do aplicativo ASUS Router não pediu nada ao usuário.
Requer ADB, um JDK e as ferramentas de build do Android SDK (aapt2, d8/dx, zipalign,
apksigner) além de platforms;android-30.
./poc/poc_commandservice_exploit.sh <device_serial>
O script executa três fases:
CommandService de com.android.shell
e relata se alguma é rejeitada. Um serviço protegido por permissão lança
SecurityException aqui. Este aceitou todas as três.exploit_commandservice.apk, e
o instala. Uma cópia pré-compilada está em poc/ se preferir pular esta etapa.Saída da Fase 1 em um dispositivo vulnerável:
[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
E o ServiceRecord de dumpsys activity services, que registra o chamador:
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
Fase 3, a partir de um aplicativo real não privilegiado em vez do shell:
W PoCExploit: [OK] attack1_url_open → com.asus.aihome/com.baidu.android.pushservice.CommandService
W PoCExploit: [OK] attack2_sms_compose → ...
(all 6 succeed)
startService() retornou o ComponentName alvo em vez de null, e nenhum
SecurityException foi lançado. O Android resolveu a Intent e a entregou.