SourMint: código malicioso, fraude publicitária e vazamento de dados no iOS
24 de agosto de 2020
0 minutos de leituraATUALIZAÇÃO: Além das descobertas divulgadas originalmente, identificamos outros problemas nas versões do SDK para iOS e Android. Saiba mais sobre as descobertas atualizadas e as reações da Apple, do Google e da comunidade aqui.
A equipe de pesquisa da Snyk descobriu comportamentos maliciosos em um SDK de publicidade popular, usado por mais de 1.200 apps na AppStore, que somam mais de 300 milhões de downloads por mês, segundo estimativas de especialistas do setor.
O código malicioso foi encontrado em versões para iOS do SDK do provedor chinês de plataforma de publicidade móvel Mintegral, e remonta a julho de 2019. O código malicioso pode espionar a atividade dos usuários registrando solicitações baseadas em URL feitas pelo app. Essa atividade é registrada em um servidor de terceiros e pode incluir informações de identificação pessoal (PII) e outros dados confidenciais. Além disso, o SDK relata fraudulentamente cliques em anúncios, desviando possíveis receitas de redes de anúncios concorrentes e, em alguns casos, do desenvolvedor ou editor do app.
https://www.youtube.com/watch?v=MMuL5MaQeLM
Visão geral do código malicioso SourMint
O SDK da Mintegral se apresenta como uma ferramenta para ajudar desenvolvedores de apps e anunciantes a criar campanhas de marketing monetizadas com anúncios. No entanto, em nossa pesquisa e em colaboração com especialistas do setor de publicidade móvel, a equipe da Snyk descobriu que parte do código malicioso do SDK rouba possíveis receitas de outras redes de anúncios usadas pelo app e espiona todas as solicitações baseadas em URL feitas dentro do aplicativo.
Desenvolvedores podem se cadastrar como publishers e baixar o SDK no site da Mintegral. Depois de carregado, o SDK injeta código em funções padrão do iOS no app, executadas quando o aplicativo abre uma URL, inclusive links da App Store. Isso dá ao SDK acesso a uma quantidade significativa de dados e até a possíveis informações privadas dos usuários. O SDK também analisa especificamente esses eventos de abertura de URL para determinar se a atividade foi iniciada pelo SDK de uma rede de anúncios concorrente.
É interessante observar que o SDK da Mintegral também inclui várias proteções contra depuração, aparentemente criadas para impedir que pesquisadores descubram o verdadeiro comportamento do aplicativo. O código contém uma rotina específica que tenta determinar se o celular tem root e se há algum tipo de depurador ou ferramenta de proxy em uso. Se detectar que está sendo monitorado, o SDK altera seu comportamento, aparentemente para disfarçar suas ações maliciosas. Isso também pode ajudar o SDK a passar pela análise de apps da Apple sem ser detectado.

Fraude publicitária
O principal objetivo do código malicioso descoberto pela Snyk neste SDK parece ser sequestrar os cliques dos usuários em anúncios dentro do app. Em aplicativos móveis, os anúncios costumam ser exibidos por redes que o desenvolvedor integra ao código.
Os anunciantes pagam às redes de anúncios para exibir seus anúncios e são cobrados com base no desempenho deles (ou seja, na capacidade de levar os usuários a clicar no anúncio para visitar o site do anunciante ou instalar o app). Os desenvolvedores recebem uma parte dos lucros que a rede de anúncios obtém dos anunciantes.
É comum que publishers de apps incluam SDKs de várias redes de anúncios em seus aplicativos usando mediadores de anúncios. Esses mediadores otimizam a receita do publisher ao incluir várias redes e selecionar qual delas será usada em cada solicitação de anúncio, com base em métricas de desempenho.
No entanto, o SDK da Mintegral consegue interceptar todos os cliques em anúncios (e também outros cliques em URLs) dentro do aplicativo. Ele usa essas informações para forjar notificações de clique enviadas ao provedor de atribuição. Essas notificações falsas fazem parecer que o clique no anúncio veio da rede da Mintegral, mesmo que o anúncio tenha sido veiculado por uma rede concorrente.
A Mintegral consegue roubar receita publicitária de redes concorrentes de duas maneiras principais. Primeiro, desvia dos anunciantes a receita que deveria ser destinada a outras redes. Isso acontece simplesmente ao reivindicar a atribuição de cliques que não ocorreram em anúncios veiculados pela Mintegral. Esse parece ser o principal objetivo dessa funcionalidade maliciosa.
Um efeito secundário, porém, é que o desenvolvedor ou o SDK mediador pode perceber que a Mintegral tem desempenho superior ao das outras redes de anúncios, favorecendo sua seleção em detrimento das concorrentes.
O desenvolvedor ou publisher do app também pode perder receita mesmo quando a Mintegral não está sendo usada para veicular anúncios. Em nossa investigação, descobrimos que, depois que o SDK da Mintegral é integrado ao app, ele intercepta os cliques mesmo que a Mintegral não esteja habilitada para veicular anúncios. Nesse caso, a receita publicitária que deveria ser repassada ao desenvolvedor ou publisher por uma rede concorrente nunca chega ao desenvolvedor.
Riscos à privacidade causados pelo vazamento de dados
Embora a fraude publicitária pareça ser o principal objetivo do código malicioso, talvez não seja sua consequência mais grave. Em nossa pesquisa, a Snyk também descobriu que o SDK da Mintegral captura detalhes de todas as solicitações baseadas em URL feitas dentro do aplicativo comprometido.
As informações dessas solicitações, além de outros dados do dispositivo e do aplicativo, são enviadas para um servidor remoto de registro. O SDK acessa uma grande quantidade de informações, incluindo:
a URL solicitada, que pode conter identificadores ou outras informações confidenciais
os cabeçalhos da solicitação, que podem conter tokens de autenticação e outras informações confidenciais
o ponto do código do aplicativo em que a solicitação foi iniciada, o que pode ajudar a identificar padrões de uso
o Identifier for Advertisers (IDFA) do dispositivo, um número aleatório exclusivo usado para identificá-lo, e seu identificador exclusivo de hardware, o IMEI.
As solicitações capturadas pelo SDK incluem URLs da web, solicitações de esquemas de URL personalizados (manipuladores de protocolo) e chamadas à App Store feitas dentro do app.
Além da atribuição de cliques em anúncios, não está claro se esses dados são usados depois de enviados ao servidor de registro, nem como isso acontece. No mínimo, os dados capturados permitiriam uma análise detalhada da jornada do usuário dentro do aplicativo. Mais preocupante ainda: dependendo da natureza do app comprometido, as URLs e outros dados coletados podem expor informações privadas. Em última análise, a Mintegral poderia monetizar esses dados vendendo-os a terceiros para fins de análise de dados.
Essa funcionalidade de registrar grandes quantidades de dados confidenciais dos usuários chama atenção, especialmente diante das preocupações crescentes sobre a coleta de dados por aplicativos móveis em geral. Mais recentemente, o aplicativo TikTok passou a ser alvo de maior escrutínio por suas práticas de coleta de dados.
As tentativas da Mintegral de ocultar a natureza dos dados capturados, tanto por meio de controles antiviolação quanto de uma técnica proprietária de codificação, lembram funcionalidades semelhantes relatadas por pesquisadores que analisaram o app TikTok.
No caso do SourMint, o escopo dos dados coletados vai além do necessário para uma atribuição legítima de cliques. O app também usa métodos de programação questionáveis para obter esse nível de acesso aos dados.
Detalhes técnicos do exploit e medidas corretivas
Como funciona o ataque desse código malicioso? Vamos analisar os detalhes que descobrimos em nossa pesquisa.
Os desenvolvedores podem baixar o SDK no site da Mintegral e incorporá-lo ao aplicativo. Quando inicializado, o SDK faz várias solicitações ao servidor da Mintegral. Uma delas recebe uma resposta JSON com vários parâmetros usados diretamente pelo código malicioso no app. Entre eles estão:
um sinalizador para ativar ou desativar a detecção de violação ou depuração
um sinalizador para habilitar os hooks usados para capturar e registrar cliques em URLs
uma URL (codificada) para a qual a atividade de cliques dos usuários será enviada para registro
O JSON de configurações recuperado também contém um valor numérico que indica o intervalo até a próxima atualização das configurações. Isso mostra que as configurações do SDK podem ser atualizadas remotamente.
Como mencionado anteriormente, o SDK executa algumas verificações básicas contra violação. Ele procura as seguintes condições:
o aplicativo está sendo executado em um simulador
há um depurador conectado ao processo do aplicativo
o celular tem root (verificando a existência de vários arquivos, inclusive do app Cydia)
um proxy está habilitado
Se o SDK detectar qualquer uma das condições acima, define um sinalizador usado em outras funções e altera seu comportamento. A versão modificada parece desativar as atividades maliciosas de reescrever URLs e registrar dados dos usuários. Portanto, tudo indica que essa é uma tentativa de evitar a detecção das ações maliciosas do SDK.
Em tempo de execução, o SDK usa method swizzling para injetar código malicioso nas implementações de vários métodos e manipuladores. Esses hooks permitem interceptar qualquer solicitação baseada em URL feita dentro do app, inclusive as que ocorrem fora do SDK da Mintegral. Essa é a etapa crucial que permite ao SDK reunir as informações necessárias sobre os cliques dos usuários e criar uma notificação de clique para o provedor de atribuição. Entre os métodos que o SDK substitui por seu próprio código estão:
UIAplication OpenURLUIAplication OpenURL:options: completionHandler(após verificar se o app está sendo executado no iOS 10.x ou superior)NSURLProtocolSKStoreProductViewController loadProductwithParameters:completionBlock
Quando um dos métodos acima é chamado, o código injetado pelo SDK executa várias ações. Primeiro, verifica se o sinalizador antiviolação está definido; se estiver, ignora todo o código subsequente da Mintegral. Em seguida, verifica se a solicitação veio de um anúncio de marketing veiculado pela Mintegral ou de um concorrente. Se veio de um anúncio da Mintegral, o manipulador de método padrão é chamado, sem outras ações.
Se a solicitação veio de um método que não é da Mintegral, o código coleta informações sobre o evento, incluindo a URL, os cabeçalhos da solicitação, a classe em que o clique ocorreu, o método em que ocorreu e dados adicionais de rastreamento da pilha de chamadas. Esses dados da solicitação, junto com outras informações do celular, são enviados em formato codificado ao servidor de registro da Mintegral indicado no arquivo de configurações. Os dados registrados incluem:
versão do sistema operacional
endereço IP
estado de carregamento
versão do SDK da Mintegral
tipo de rede
modelo
nome do pacote
IDFA
URL
cabeçalhos da solicitação
nome do método
nome da classe
dados de rastreamento da pilha de chamadas
Depois que os dados são registrados na Mintegral, a execução do restante do método prossegue normalmente. Com base em informações fornecidas por um provedor de atribuição, podemos confirmar que, no back-end, a Mintegral cria notificações de clique para os pontos de contato que ocorreram por meio de outras redes de anúncios.
Para descobrir essas informações, a equipe de pesquisa de segurança da Snyk adicionou o SDK a um app de teste. Para evitar a detecção antiviolação, as comunicações do aplicativo foram interceptadas no ponto de acesso sem fio usando um proxy Man-in-the-Middle (mitm.it). A Snyk usou o desassemblador Hopper para investigar o código do SDK e mapear suas funcionalidades. Identificamos essa funcionalidade maliciosa em versões do SDK desde a 5.5.1 (a versão atual no momento desta publicação é a 6.4.0).
Por fim, por meio de nossa própria pesquisa interna e da colaboração com organizações e especialistas importantes do setor, conseguimos confirmar o sequestro completo, de ponta a ponta, de eventos de cliques dos usuários em anúncios.
Para ver uma descrição técnica ainda mais detalhada do código que descobrimos e dos métodos usados, acesse nosso artigo de pesquisa.
