
CVE-2026-12960 - Improper Export of Android Application Components in the ASUS Router app (com.asus.aihome). PoC, exploit APK, video, and vendor report. Fixed in 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 |
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:
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.
poc/
poc_commandservice_exploit.sh Script automatizado de reprodução em três fases
ExploitCommandService.java Código-fonte da atividade PoC + receptor de broadcast
PublicMsg.java Parcelable compatível com o layout de campos do alvo
AndroidManifest_PoC.xml Manifesto PoC (nota: sem <uses-permission>)
exploit_commandservice.apk PoC pré-compilado, assinado para debug, zero permissões
media/
poc_commandservice.mp4 Gravação completa do PoC
attack1-browser.jpg Fotos extraídas da gravação
attack2-sms.jpg
attack3-dialer.jpg
poc-app-no-permissions.jpg
vendor/
asus-security-advisory-submission.pdf O relatório conforme submetido à ASUS
A URL de saída do PoC é um subdomínio do Burp Collaborator que foi usado para confirmar que a navegação realmente ocorreu. Está morto há muito tempo. Substitua pelo seu próprio se estiver reproduzindo.
Para o fornecedor, a correção é um atributo:
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="false" />
Ou, se o componente realmente precisar ser acessível externamente, proteja-o com uma
permissão de nível de proteção signature e valide o PublicMsg desserializado
antes de agir sobre ele. A ASUS enviou a correção na versão 1.0.0.9.74.
Para usuários: atualize o aplicativo ASUS Router para 1.0.0.9.74 ou posterior.
Para todos os outros que distribuem aplicativos Android: audite o que seus SDKs de terceiros exportam.
Execute aapt dump xmltree base.apk AndroidManifest.xml em sua própria versão de lançamento
e leia cada exported="true" nela. O manifesto que você distribui é a soma de todos os
manifestos que você mesclou, e você é responsável por todos eles.
| Data | Evento |
|---|---|
| 2026-03-17 | Relatado à ASUS com APK PoC, script automatizado e vídeo |
| 2026-06-23 | CVE-2026-12960 reservado pela ASUS como CNA |
| 2026-07-03 | CVE publicado; correção disponível na versão 1.0.0.9.74 |
| 2026-07-25 | Artigo público e PoC divulgados |
Publicado após divulgação coordenada e correção do fornecedor, para uso defensivo e educacional. O PoC tem como alvo uma versão corrigida e não faz nada além de lançar URIs. Não execute-o em dispositivos que você não possui ou para os quais não tenha autorização por escrito para testar.
2 | Intent.parseUri(mPkgContent, 0) e em seguida startActivity() / sendBroadcast() |
| # | 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 |

![]() |
![]() |