Dispositivos Android saem de fábrica com malware pré-instalado

O Laboratório de Ameaças da Avast analisou um malware que afetou milhares de usuários em todo o mundo.

Publicação de blog e análise de Vojtech Bocek e Nikolaos Chrysaidos

Quando você compra um telefone novo, você espera que ele esteja completamente livre de malwares e adwares. Infelizmente, isso nem sempre acontece. O Laboratório de Ameaças da Avast encontrou adware pré-instalado em centenas de diferentes modelos e versões de dispositivos Android, incluindo dispositivos de fabricantes como a ZTE, Archos e myPhone. A maioria desses dispositivos não é certificada pela Google.

O adware que analisamos foi descrito pela Dr. Web anteriormente e ganhou o nome de “Cosiloon”. Como você pode ver nas capturas de tela abaixo, o adware cria uma sobreposição para exibir um anúncio por cima de uma página web no navegador dos usuários. O adware está ativo há pelo menos três anos e é difícil de ser removido, pois é instalado no nível do firmware e usa uma ofuscação forte. Milhares de usuários foram afetados e, só em abrir deste ano, encontramos a versão mais recente do adware em cerca de 18.000 dispositivos que pertencem a usuários da Avast localizados em mais de 100 países, incluindo Rússia, Itália, Alemanha, Reino Unido, além de alguns usuários nos EUA.

1-Cosiloon-sample-adware-12-Cosiloon-sample-adware-2

A Google tomou medidas para mitigar os recursos malignos de muitas variantes de aplicativo em diversos modelos de dispositivos, usando técnicas desenvolvidas internamente. O Google Play Protect foi atualizado para garantir que haja proteção contra esses apps no futuro. No entanto, como os apps vêm pré-instalados com o firmware, o problema é difícil de ser tratado. A Google entrou em contato com os desenvolvedores do firmware para tratar dessas preocupações e encorajá-los a tratar do problema.

Observamos amostras estranhas do Android aparecendo em nosso banco de dados ocasionalmente, já há alguns anos. As amostras parecem ser iguais a de outras amostras de adware, com exceção de que o adware parece não ter nenhum ponto de infecção e vários nomes de pacotes similares, sendo os mais comuns:

  • google.eMediaService
  • google.eMusic1Service
  • google.ePlay3Service
  • google.eVideo2Service

Recentemente, uma das amostras chegou ao topo das nossas estatísticas, depois que nossa plataforma de inteligência de ameaças apk.io a marcou como malware e, por isso, começamos a investigar. Descobrimos que esses pacotes de adware são apenas cargas originárias de um aplicativo do sistema pré-instalado pelo fabricante em uma variedade de dispositivos surpreendente. Ainda mais surpreendente é que a amostra mais antiga do dropper, que é um app que baixa mais apps malignos, que encontramos é de janeiro de 2015 e foi pré-instalado em um tablet barato vendido na Polônia. Além disso, as datas nos arquivos dentro do APK mais antigo que temos são tão antigas como 1 de janeiro de 2016 e 7 de março de 2013. Essa família de adware também tem muitas variantes de cargas e droppers, indicando um desenvolvimento contínuo.

O servidor C&C usado para controlar o malware ainda estava ativo e sendo atualizado com cargas. Entramos em contato com a CNCERT, além de empresas que hospedam o servidor C&C, e o servidor foi encerrado em 10 de abril de 2018. Os domínios, no entanto, ainda estão ativos.

A família do malware é antiga e não especificamente difícil de detectar. Pelo menos partes dela são detectadas comumente por apps antivírus comuns, mas, apesar disso, não conhecíamos nenhuma análise detalhada que juntaria todas a peças. Por isso, resolvemos investigar.

Análise de aplicativos

O conjunto inteiro consiste de dois APKs separados: o dropper e a carga. Outras versões do malware têm um app adware separado pré-instalado na partição “/system”, mas essa abordagem parece ter mudado em favor de uma carga nova que utiliza um dropper.

Dropper variante A

O dropper é um pequeno aplicativo sem ofuscação, localizado na partição “/system” dos dispositivos afetados. O app é completamente passivo, visível apenas ao usuário na lista de aplicativos do sistema em “configurações”. Vimos o dropper com dois nomes diferentes: “CrashService” e “ImeMess”. Há várias versões ativas e todas compartilham o mesmo comportamento:

1. Eles baixam um manifesto de http://www.cosiloon.com/version.xml quando o dispositivo está conectado à Wi-Fi. Diferentes subdomínios (abc, abd) e nomes de arquivos diferentes (version_2.xml, version_3.xml, information.xml) são também usados, presumidamente para debugging. No momento, todos eles apontam para o mesmo arquivo ou estão desfeitos.

O manifesto XML contém informações sobre o que baixar, quais serviços iniciar e contém uma lista branca programada para excluir potencialmente países específicos e dispositivos da infecção. No entanto, nunca vimos a lista branca de países em utilização e apenas alguns dispositivos estão na lista branca, nas primeiras versões. Atualmente, nenhum país ou dispositivo está na lista branca. Todo o URL do Cosiloon está codificado no APK. O manifesto mudou ao longo do tempo e temos várias versões registradas. Mantemos um histórico de conteúdo do manifesto aqui e esse era o conteúdo em 19 de março de 2018:

<update>
<version>27</version>
<name>Temp</name>
<package>com.google.eVideo2Service</package> <url>http://app.storage.yunvm.com/ba.apk</url>
<ipurl>http://pull-3045.kxcdn.com/getip.php</ipurl> <startup1>com.google.eVideo2Service</startup1>
<startup2>null</startup2>
<startup3>null</startup3>
<startup4>null</startup4>
<startup5>null</startup5>
<startup6>null</startup6>
<startup7>null</startup7>
<startup8>null</startup8>
<startup9>null</startup9>
<country>allable</country>
<reject>null</reject>
</update>

2. Depois, o dropper instala uma carga de um URL. O dropper baixa um APK de um <url> encontrado no manifesto (isso muda de uma versão para outra) para /sdcard/Download/<name> e depois instala o APK através do comando pm install, que é o comando padrão para instalar apps em dispositivos Android.
cmd = Runtime.getRuntime().exec("pm install -r " + this.mPath + "\n").getInputStream();

3. Finalmente, o dropper inicia o serviço de carga. As entradas <startupX> do manifesto são usadas para iniciar os serviços da carga. Essa etapa é repetida sempre que o telefone reinicia.

Encontramos pelo menos oito variações do dropper com código e várias assinaturas diferentes (como ele é um aplicativo do sistema, ele sempre é assinado pela mesma chave que o fornecedor usou para assinar a imagem do sistema). As funções básicas de todas as variantes são as mesmas, com algumas diferenças sutis nos URLs codificados e suporte para mais pacotes de malware pré-instalados. Concluindo, esse é um dropper simples e flexível que funciona bem, desde que os autores tenham controle do domínio codificado e possam manter o URL ativo.

Para resumir:

  • O dropper pode instalar pacotes de aplicativos definidos pelo manifesto baixado através de uma conexão HTTP não criptografada sem o consentimento ou conhecimento do usuário.

  • O dropper é pré-instalado em algum ponto da cadeia de suprimento, pelo fabricante, OEM ou operadora.

  • O usuário não pode remover o dropper, pois ele é um aplicativo do sistema, parte do firmware do dispositivo.

A detecção do dropper é ainda mais complicada por ele ser um app do sistema, parte do firmware apenas para leitura dos dispositivos, que está integrado no dispositivo enviado da fábrica. Além disso, provavelmente são “odexed” na maioria dos firmwares, o que significa que o código do app foi removido do arquivo APK original, otimizado e armazenado separadamente durante o processo de criação do firmware. Como resultado, as empresas de segurança cibernética estão deixando escapar muitas das amostras do dropper e precisam contar com a carga para detecção e estatística.

Dropper variante B

Uma segunda variação do dropper é um mais interessante. O código é muito parecido com o da primeira variante, mas não é um aplicativo do sistema separado. O código está integrado ao SystemUI.apk, que faz parte do sistema operacional Android. Isso torna quase impossível para o usuário remover o dropper.

SystemUI.apk geralmente contém a implantação da interface do usuário, como status e barra de notificação, tela de bloqueio, entre outros. As amostras que examinamos tem o código do dropper oculto no pacote com.android.keyguard:

  • android.keyguard.KeyStateBroad
  • android.keyguard.KeyManager
  • android.keyguard.KeyguardService
  • android.keyguard.KeyguardReceiver

Essa variação usa manifestos em http://www.cosiloon.com/version_4.xml e http://www.cosiloon.com/version_5.xml, que servem a uma versão ligeiramente diferente da carga (com intenção e nomes de receptor diferentes). Por isso, podemos dizer que essa variação é significativamente menos popular do que a outra, com a variante A afetando milhares de usuários e a variante B, cerca de 200.

As amostras do SystemUI.apk que examinamos também foram infectadas com mais dois pacotes de malware, todos capaz de exibir apps, instalar mais APKs da internet e enviar dados privados, como IMEI, endereço Mac e número de telefone, a servidores remotos, mas seu código parece não estar relacionado à família Cosiloon, por isso, não os examinamos com mais detalhe.

Outra implicação de o dropper fazer parte do pacote SystemUI.apk, em vez de um APK separado, é que o código fonte do firmware foi sequestrado e modificado de alguma forma, o que é difícil de se fazer.

Carga

Encontramos centenas de diferentes versões de carga. Vamos nos concentrar na mais recente1, mas a maioria das análises se aplica também a outras.

A carga, ao contrário do dropper, é fortemente ofuscada e muito complexa. Além de renomear a classe e usar reflexão, que são ações comuns dos malwares, ela também contém métodos de inserção aleatória, que não afetam o estado do aplicativo e até mesmo contém métodos que são completamente inúteis. Eles provavelmente foram adicionados para dificultar a análise manual, mas podem, na verdade, acionar algumas heurísticas de análise estática devido ao seu conteúdo (intenções de CALL ou SEND podem parecer comportamento maligno). O mecanismo de ofuscação certamente exigiu muito trabalho.

3-Cosiloon-method-that-does-nothingExemplo de um método que não faz realmente nada

4-Cosiloon-randomly-added-statementsExemplo de declarações adicionadas aleatoriamente sem nenhum efeito

O APK da carga contém um arquivo JAR codificado em XOR2 que, atualmente, contém estruturas de anúncios do Google, Facebook e Baidu. Ele também contém detecção de emulador com base nos arquivos em “/dev”, o que significa que ele é capaz de detectar se o arquivo é executado em um emulador de antivírus e, se for, evitará ações suspeitas para que fique desapercebido. Um mecanismo de atualização também está integrado e é capaz de baixar arquivos dex adicionais da internet.

hXIHYcEMs8uVzE3RuXokbEHEPFb7glLrdD5Ge00wOsQOizI0PzD6ZHpv4T4p0Zo-vwAGPG7sbRHekT5_2QrToq1n5XoU2vspotwRxLMXuMXFST_s6Bu3UQuDprooCUL34bwRzMU1

A carga parece estar ativa apenas se o dropper do sistema estiver presente, mas conseguimos disparar seu comportamento algumas vezes. Para nós, ele ofereceu downloads de jogos questionáveis da rede Baidu:

7-Cosiloon-sample-adware-popups

Os pop-ups invasivos tem uma limitação para que não apareçam com muita frequência. A variante de anúncio de tela cheia também parece incluir uma verificação que evita que ele apareça sobre todo o resto, além do navegador web padrão.

A maioria das versões da carga não tem nenhum ponto de entrada voltada ao usuário, exceto pela versão H5GameCenter que foi usada por pouco tempo e a nova versão número 293, que mostra entradas no iniciador de aplicativos, disfarçado de “Goolge Contacts”. Tocar no ícone inicia o serviço de anúncios e abre o navegador web padrão. As versões da carga que não estão visíveis na tela do tablet ou telefone e, novamente, estão visíveis ao usuário apenas como aplicativos do sistema, em “Configurações” e podem ter cerca de 15 nomes diferentes, incluindo “MediaService”, “eVideo2Service” e “VPlayer”.

8-Cosiloon-payload-app-in-app-drawer-Goolge-ContactsO ícone da carga na bandeja de aplicativos

9-Cosiloon-payload-codeO código correspondente na carga

Em 8 de abril de 2018, a carga foi atualizada novamente. O nome do iniciador de aplicativos mudou para “Google Download” e alguns nome de classe no código mudaram (notavelmente “.backservice” para “.startService”), provavelmente em uma tentativa para evitar detecção.

A próxima atualização aconteceu em 17 de abril de 2018. O código da carga foi simplificada significativamente e foi renomada como “Google++”. Ela não contém mais um pacote de código criptografado, mas mostra ainda anúncios como as versões anteriores. Ela parece ser uma versão temporária que eles foram forçados a desenvolver com a desativação do servidor C&C, pois a atualização feita no dia seguinte trouxe quase todo o código de volta e a carga parece muito similar ao estado antes de ter sido desativado.

Métodos de lista branca

O dropper do sistema contém métodos de lista branca que desativam todo o pacote sob certas condições. Eles são muito interessantes e permitem que o criador modifique o comportamento do adware com base nas exigências atuais.

Contagem mínima de aplicativos instalados pelo usuário

O dropper verifica quantos apps o usuário instalou e para se o número for menor que três. Isso impede que os anúncios apareçam, por exemplo, em dispositivos de demonstração em lojas e talvez durante o processo de certificação CTS da Google.

cc7GAN1RkUN_GQ3C4-l7EbuPfrcrAilwzXQtL4dPj6L_uh1svgGz5MXHLW2HpJz6v7fxy6kSj0y_VTyD7lkD6fiNoceMyFsTMiHOpVmMn6LxxnfZ0OwQUWGk48qjGWiHiLNXVpmU

Idioma do dispositivo

Além disso, a carga não é lançada se o idioma do dispositivo for configurado como chinês.

shIyfw2nDg0ESqbT_J1ysDbUvW3jLPv2P5oWG4rszypHsgER8kUw2UwP-mXg34G2oDCnnJno7omlLpHzGP-_8Hi-mTi3fU8m_ZuH8Gu1ytw36j09pp3fNxH4WBBnHYXf9XDab8rN

O manifesto XML também especifica uma tag <country> que parece ser usada para colocar os dispositivos em uma lista branca em países específicos, mas, como mencionado anteriormente, essa lista branca não parece ser usada.

Modelo do dispositivo

A tag <reject> do manifesto version.xml é usada para essa lista branca.

NHuNl4LLAWzUmz5b9vkYn2KvsLuHGSGMevTKmo2phOHuwYPY6fnBPu4ZigECNkhqduGZF1r_lijEiWXcdSZ5DrUQE-25vuldIyG9dWMoKXZ2PYK5Wh5GVyRsWcAdRDhJD1dLko0h

Locais

A lista branca de locais é implementada de uma maneira bem interessante. Primeiro, o URL especificado no tag <ipurl> dentro de version.xml é consultado, que é atualmente http://pull-3045.kxcdn.com/getip.php. Ela retorna o endereço IP do servidor, mas, como está usando uma rede de entrega de conteúdo (CDN), o <ipurl> é resolvido em diferentes servidores com base no local do usuário.

O IP retornado é verificado novamente em relação ao banco de dados SQLite de intervalos de IP contido no aplicativo do dropper, em assets/data. Ele contém mais de 320.000 diferentes intervalos de IP, quase todos na China.

Usuários afetados

Países

De acordo com nossas estatísticas, usuários em mais de 90 países foram afetados. Os dez países mais afetados no mês passado foram Rússia, Itália, Alemanha, Reino Unido, Ucrânia, Portugal, Venezuela, Grécia, França e Romênia.

Dispositivos

Várias centenas de dispositivos diferentes foram afetados. Os dispositivos afetados geralmente apresentam um chipset Mediatek e são principalmente tablets baratos. A lista, incluindo os dispositivos mais afetados, pode ser encontrada aqui e contém dispositivos das marcas Archos, ZTE, myPhone e Prestigio. O tamanho da lista deve-se, provavelmente, ao fato de o malware fazer parte de um pacote de plataforma de chipset que foi reutilizado em muitos dispositivos similares de marcas diferentes. Não verificamos todos os dispositivos, mas verificamos muitos deles e notamos que o chipset nos dispositivos inspecionados eram da MediaTek. Os dispositivos usavam versões diferentes do Android, da 4.2 a 6.0.

Nem todos os modelos de dispositivo listados foram afetados, pois cada modelo tem inúmeras variantes de firmware (por exemplo, para países e operadoras diferentes) e apenas poucas ou uma variação de um dispositivo pode estar afetada, ou talvez uma versão de ROM personalizada contém o dropper. Essa lista contém apenas modelos de dispositivos nos quais identificamos a carga do dropper pelo menos uma vez no caminho <downloads>/Temp, que é o caminho em que o dropper do sistema baixa a carga antes de instalá-la, e a carga também está instalada no mesmo dispositivo.

É impossível verificar todos esses dispositivos, mas baixamos algumas das imagens de firmware original e confirmamos que o dropper estava realmente pré-instalado em alguns deles, em caminhos como /system/priv-app/CSTR.apk (ZTE E10Q, 4.4.2) ou /system/priv-app/ANLRadio/ANLRadio.apk (Alcor Access Q784M, 5.1).

Como o APK do dropper vem com o firmware, um antivírus tem dificuldades para detectá-lo e ele não pode ser removido. Os apps antivírus detectarão a carga. No entanto, assim que o antivírus a remover, o dropper voltará a funcionar e baixará novamente a carga.

Reclamações dos usuários

O alcance da linhagem de malware parece ser muito grande. Ao pesquisar os nomes dos apps, você pode encontrar avaliações de usuários de diferentes dispositivos em muitos países, que reclamam sobre a exibição de anúncios. Alguns exemplos:

Amostras relacionadas

com.mediatek.mtkmusicprovider

Essa amostra parece ser uma versão antiga do dropper. Ela não baixa nada, mas armazena as cargas na pasta de ativos dentro do APK e as instala periodicamente. A amostra mais antiga que encontramos é de novembro de 2014. Os mesmos nomes de classe (.BackService) e a estrutura de código semelhante fazem com que ela esteja conectada ao resto da família.

DIaXKiP7YqDvG5LgJ1yQUr8PbPyIGKOHf6yrXM1JndF2QV26yAT_j40IkI2pb4OKFgjVHjLkxql4v4_HSsKJezgUohasfEqpU6qmvh3T4p_ExG3bp5xZ29lXiJCY8DcULmJa--PY

com.android.keysetting

Com.android.keysetting parece ser a versão antiga da carga de adware. Ele também parece estar instalado como um app do sistema. O app agora não faz nada, já que os servidores (*.7176.com) foram desativados, mas ele estava pronto para exibir sobreposições. Ele contém as mesmas classes e o verificador “se o local for definido como chinês, não faça nada” das cargas mais recentes e contém um arquivo .jar criptografado com a estrutura de anúncios compartilhada com vários outros apps invasivos. O jar contém strings com datas de julho de 2014.

com.get.googleApps

com.get.googleApps é outra versão antiga do aplicativo adware. Ele foi instalado como um aplicativo do sistema e geralmente usava o Google AdSense, mas essa abordagem terminou e muito do código desse app foi movido para a carga.

H5GameCenter - com.google.ePlay4Service

Essa versão da carga é de aproximadamente dezembro de 2016. Ela é notável, pois, ao contrário de outras cargas, tem uma atividade voltada ao usuário além dos pop-ups de anúncios. Supostamente, ela seria uma “loja de jogos”. Ela foi notícia em dezembro de 2016, quando a Dr. Web a encontrou.

Conclusão

De longe, o fato mais chocante é que a Dr. Web relatou isso em 2016 e nada ainda foi feito. O servidor de controle estava ativo até abril de 2018 e os autores continuam atualizando ele com novas cargas. Os fabricantes também continuaram a enviar novos dispositivos com os droppers pré-instalados. Alguns apps antivírus denunciaram as cargas, mas o dropper os reinstala imediatamente e o dropper em si não pode ser removido. Assim, o dispositivo sempre terá um método que permite que um desconhecido instale qualquer aplicativo que ele deseja. Vimos o dropper instalar adware em dispositivos, no entanto, ele poderia baixar também spywares, ransomwares ou qualquer outro tipo de ameaça.

Tentamos desativar o servidor C&C da Cosiloon enviando solicitações de desativação ao registrador do domínio e provedores do servidor. O primeiro provedor, a ZenLayer, respondeu rapidamente e desativou o servidor, mas ele foi restaurando posteriormente usando outro servidor. O registrador do domínio não respondeu às nossas solicitações e, por isso, o servidor C&C ainda funciona.

O Avast Mobile Security pode detectar e desinstalar a carga, mas não pode adquirir as permissões exigidas para desativar o dropper, por isso, o Google Play Protect precisa fazer o serviço pesado. Se seu dispositivo estiver infectado, ele deve desativar automaticamente o dropper e a carga. Sabemos que isso funciona, pois observamos uma queda no número de dispositivos infectados pelas novas versões da carga depois que o Play Protect começou a detectar o Cosiloon.

Os usuários podem encontrar o dropper em suas configurações (com o nome “CrashService”, “ImeMess” ou “Terminal” com o ícone genérico do Android) e clicar no botão “desativar” na página do app, se disponível (depende da versão do Android). Isso desativa o dropper e, assim que o Avast remover a carga, ela não retornará.

Amostras

https://docs.google.com/spreadsheets
/d/10GREhHGREaQvx45kb7AI4FkXDFX1VDjNWyRpU9qGJ5k/edit?usp=sharing

Referências

1) 838d70c21ab98bfbf9c69ce516ddebbd988cade05d25558b086e1c103dadcb06
2) b81a7e72197fa8dff5970e6c326d18f678799f316985daf6aef7b3e562bfb2ad
3) 12a6a5e9c58f8a04f54ef812f2159a0fa760ae9272141749f8ed6fc919622da1

--> -->