2 pontos por GN⁺ 2025-03-30 | 1 comentários | Compartilhar no WhatsApp
  • Desde o Android 11, o Google restringiu a consulta entre apps, mas vários aplicativos ainda conseguiam verificar a lista de apps instalados apenas com declarações no AndroidManifest.xml
  • A política de package visibility exige que um app veja apenas os outros apps necessários para sua função principal, mas declarações de pacotes individuais e o filtro ACTION_MAIN vinham sendo usados como uma rota de contorno
  • O Swiggy declarava 154 apps, o Zepto 165, o KreditBee 860 e o Moneyview 944, podendo verificar se determinados apps estavam presentes no dispositivo do usuário
  • Entre 47 apps indianos analisados aleatoriamente, 31 usavam o filtro de intent ACTION_MAIN, o que permite ver a maioria dos apps instalados com interface, mesmo sem QUERY_ALL_PACKAGES
  • Dados de apps instalados e a permissão READ_SMS podem levar a criação de perfis, discriminação de preços e avaliação de crédito ou elegibilidade, mas é difícil para o usuário saber quando e o que um app está lendo

Brecha na política de visibilidade de apps do Android

  • No passado, no Android, um app podia ver outros apps instalados no telefone do usuário sem permissão separada
  • A partir do Android 11, o Google introduziu a política de package visibility para restringir esse acesso
    • Um app só deve poder ver outros apps quando isso for essencial para sua função principal
    • O desenvolvedor precisa especificar os apps que quer verificar no AndroidManifest.xml, o arquivo de configuração obrigatório de todo app Android
  • Em casos de uso específicos, como gerenciadores de arquivos, navegadores e antivírus, a permissão QUERY_ALL_PACKAGES é excepcionalmente permitida
  • Casos como exibir apps de pagamento UPI ou detectar apps de clonagem e múltiplas contas podem ser motivos legítimos para consultar outros apps
    • Em muitos manifests analisados, a consulta de apps aparecia com finalidades de pagamento, segurança e detecção de fraude

Consulta extensa de apps por Swiggy e Zepto

  • O Swiggy listava 154 nomes de pacotes no manifest, podendo verificar se esses apps estavam no telefone
    • A lista incluía apps como Xbox, PlayStation, Naukri e Upstox
    • Como as categorias eram muito amplas, havia grande potencial de coleta de dados para criação de perfis de usuário e perfis comportamentais
    • O Google considera listas de apps instalados como dados pessoais e sensíveis do usuário
  • O Zepto registrava 165 apps no manifest para verificar no dispositivo
    • Incluía apps populares de várias categorias, como Netflix, Bumble e Binance
    • Houve reportagem de que o Zepto mostrava preços diferentes para usuários de iOS e Android, e alguns clientes relataram diferenças de preço entre aparelhos Android
  • Ao instalar um app pela Play Store, o usuário não consegue ver quais listas de consulta de apps estão incluídas no manifest desse app

Alcance da consulta em apps de entregadores e de empréstimo pessoal

  • Os apps para entregadores do Swiggy e do Zepto tinham listas de consulta diferentes das versões para consumidores
    • Ambos incluíam itens que permitiam verificar em quais outras empresas o entregador trabalhava
    • O Swiggy também verificava apps de empréstimo pessoal, apps de finanças pessoais e até jogos como Ludo King e Carrom Pool
  • As práticas predatórias de apps de empréstimo pessoal na Índia já foram documentadas, e uma grande operação alguns anos atrás removeu milhares de apps da Play Store
  • O KreditBee é um dos principais apps de empréstimo pessoal da Play Store, com mais de 50 milhões de downloads, e verificava 860 apps no manifest
    • Entre eles estavam Tamil Calendar, Odia Calendar, Qibla Direction Finder, apps de templos e apps de astrologia
    • Também apareciam como exemplo o app matrimonial Jodii for Diploma, +2,10 below, voltado a pessoas sem ensino médio completo, e o app de compra e venda de gado e búfalos Buy Sell Cows and Buffaloes Animall, ambos com mais de 10 milhões de downloads
  • O Moneyview também é um app de empréstimo pessoal com mais de 50 milhões de downloads e incluía 944 apps no manifest
  • A política da Play Store restringe explicitamente o uso de QUERY_ALL_PACKAGES por apps de empréstimo pessoal, mas KreditBee e Moneyview contornavam essa limitação listando no manifest, um por um, os apps que queriam consultar

Como ver a lista de apps sem QUERY_ALL_PACKAGES

  • Entre os apps investigados, só o Cred incluía a permissão sensível e de alto risco QUERY_ALL_PACKAGES no manifest
    • A Play Store permite uma “exceção temporária” para apps com finalidade principal verificável de facilitar transações financeiras ligadas a produtos regulados financeiramente
    • Os manifests de PhonePe e PayTM, do mesmo setor, não tinham essa permissão
    • O Cred também oferece empréstimo pessoal, e aparentemente não se enquadraria nessa exceção pela política da Play Store para empréstimos pessoais
  • Alguns manifests continham o seguinte filtro de intent ACTION_MAIN
<queries>
  [...]
  <intent>
    <action android:name="android.intent.action.MAIN" />
  </intent>
  [...]
</queries>
  • O filtro ACTION_MAIN dá visibilidade à maioria dos apps instalados que têm interface, permitindo ver a lista de apps do telefone mesmo sem a permissão QUERY_ALL_PACKAGES
    • Ao consultar apps instalados com um app Android básico configurado da mesma forma, era retornada a lista completa de apps do telefone
  • Entre 47 apps indianos analisados aleatoriamente, 31 usavam esse filtro, ou seja, cerca de dois em cada três
    • Usavam: Astrotalk, Axis Mobile, Bajaj Finserv, BookMyShow, Cars24, Cure.fit, Fibe, Groww, Housing, Instamart, Ixigo, JioHotstar, KreditBee, KukuTV, LazyPay, Ludo King, Meesho, MoneyTap, Moneyview, Navi, NoBroker, Nykaa, Ola, PhonePe, PhysicsWallah, Slice, Spinny, Swiggy, Swiggy Delivery, Tata Neu, Zomato
    • Não usavam: Airtel Thanks, Blinkit, Byju’s, MyGate, Dream11, Flipkart, HDFC Mobile, Healthify, INDmoney, MyJio, Paytm, PaisaBazaar, ShareChat, Unacademy, Vedantu, Zepto
  • O Swiggy também tinha o filtro ACTION_MAIN, mas listava explicitamente apps na consulta, revelando parte de suas práticas de coleta de dados
  • Os manifests lidos estão publicados em android-manifest-files, e a maioria foi baixada em 18 ou 19 de março
  • Essa configuração não se limitava a apps de empresas indianas
    • Facebook, Instagram, Snapchat, Subway Surfers e Truecaller tinham a mesma configuração
    • Amazon, Spotify, X, Discord e WhatsApp não tinham

Sensibilidade dos dados de apps instalados e da permissão de SMS

  • Dados de apps instalados são dados pessoais sensíveis
    • Em 2022, a Vice noticiou que, logo após a notícia de que Roe v. Wade poderia ser derrubada, um marketplace de dados chamado Narrative estava vendendo dados de usuários que haviam baixado apps de rastreamento menstrual
  • Além da consulta de apps instalados, o manifest de um app pode incluir amplamente permissões que parecem ir além do necessário
  • O Zepto solicita a permissão READ_SMS
    • O usuário pode recusá-la, mas ela é obrigatória para aderir ao Zepto Postpaid
    • Se a permissão for concedida, várias sender IDs de bancos registradas na TRAI e também SMS de Blinkit, Swiggy, Bigbasket e Flipkart entram no escopo de leitura
    • Isso parece servir para ler SMS bancários a fim de verificar elegibilidade para o plano Postpaid, mas a leitura pode ocorrer mesmo que o usuário não escolha esse recurso
  • Depois de conceder permissões como READ_SMS, o usuário não consegue ver quando e o que o app acessa
  • Informações sobre apps instalados no Android podem ser usadas por desenvolvedores e corretores de dados para criação de perfis, cruzamento com dados de redes de anúncios e definição de preços

1 comentários

 
GN⁺ 2025-03-30
Opiniões no Hacker News
  • A brecha do ACTION_MAIN já foi abordada antes: https://commonsware.com/blog/2020/04/05/android-r-package-vi...
    O Google não tenta corrigir isso. Fico curioso para saber o que aconteceria se alguém enviasse isso ao Android VDP como uma forma de contornar permissões.
    Há também uma pergunta do autor no SO sobre o bypass: https://stackoverflow.com/q/79527331

    • Parece que essa brecha poderia ser fechada algum dia se fosse exigido que um app que declara ACTION_MAIN realmente fosse um launcher. Para integrações legítimas, provavelmente seria preciso usar intents mais específicos.
      Nesse ponto, o próprio fluxo em que o Android pergunta se você quer definir um jogo aleatório recém-baixado como launcher padrão se torna uma interação bastante arriscada para um app suspeito. É bem provável que o usuário desista e denuncie, ou que um usuário menos experiente o escolha como launcher padrão, estrague a tela inicial e denuncie na Play Store. Na prática, para distribuir algo como um app de nível launcher, também deve haver testes automatizados e requisitos adicionais, o que seria um peso para o desenvolvedor.
    • É por isso que projetos como XPL-Extended ou o antigo XPrivacyLua são absolutamente necessários. Eu não uso um celular Android sem algo assim.
    • Essa brecha existe desde que as restrições de visibilidade de pacotes foram introduzidas, e parece que quase todo mundo sabe como contornar essa limitação.
      É difícil acreditar que os engenheiros do Google não conheçam essa brecha amplamente usada, mas fico curioso se há alguma fonte dizendo que o Google se recusou a corrigi-la.
    • Enviar ao Android VDP é uma boa ideia, mas eu não ficaria surpreso se eles descartassem como comportamento intencional.
    • Não sei o que quer dizer “se recusou a corrigir”. Na Play Store, o Google rejeita tentativas de distribuição de apps que pedem esse filtro mas não são launchers.
  • Ainda não entendo nem um pouco por que “apps” nativos são necessários. Até hoje nunca vi um “app” para o qual um site ou webapp não fosse suficiente, e na maioria dos casos provavelmente teria sido melhor como webapp.
    A única vantagem de um “app” parece ser permitir que o desenvolvedor acesse informações pessoais de que ele na verdade não precisa.
    Também há a vantagem de poder estar na “App Store”, mas a App Store é um conceito desnecessário criado pela Apple/Google para ficarem com uma grande fatia das vendas.
    Navegadores oferecem um sandbox razoável, não cobram taxa de “submissão” e são acessíveis a todas as pessoas em todos os celulares.

    • A resposta é simplesmente experiência do usuário.
      Na prática, a maioria dos webapps móveis é péssima. A experiência do usuário não chega nem perto da de apps nativos. Odeio quando o texto é selecionado, odeio o gesto de puxar para atualizar em todas as páginas e odeio quando deslizar para a esquerda volta para a página anterior.
      Dá para encontrar formas de contornar esses problemas, mas a nova biblioteca Silk (https://silkhq.co/) parece ser o primeiro caso que chega muito perto de uma experiência nativa. E só o fato de ela ser uma biblioteca paga já mostra que esse problema não é tão trivial.
    • É uma perspectiva estranha. No fundo, é a mesma pergunta que dizer que notebooks também não precisam de apps nativos.
      Há muitas coisas que apps nativos conseguem fazer e que o navegador faz mal ou simplesmente não consegue fazer. Por exemplo, edição pesada de vídeo/áudio, acesso a muita RAM, uso de computação na GPU e tarefas próximas ao hardware ainda são insuficientes só com o navegador.
    • No iOS, quando existe tanto um app nativo quanto um webapp, muitas vezes há uma grande diferença em consumo de bateria e engasgos. Como outros comentários disseram, também prefiro apps totalmente offline, como mapas ou notas.
      Isso não significa que a forma como Apple e Google implementaram as coisas seja boa, mas não vejo um futuro em que usemos apenas webapps. Pelo mesmo motivo, não vou trocar meu computador de verdade por um Chromebook tão cedo.
    • Concordo em parte. Os apps que empresas lançam para coletar e gerenciar tokens de compras ou para conectar ao atendimento ao cliente teriam sido muito melhores como sites.
      Mas apps que funcionam offline no dispositivo e não espalham meus dados por serviços que eu não controlo ainda são bons. Também não quero depender de conexão com a internet onde quer que eu esteja.
      Gosto de apps offline como OsmAnd/Organic Maps, que mostram caminhos quando estou em uma floresta ou montanha, e também de apps que compartilham dados conectando-se diretamente ao meu dispositivo local em vez de a servidores de terceiros.
      Se possível, todos os apps deveriam ser desenvolvidos com offline em primeiro lugar e só exigir internet quando necessário. Um app que não consegue funcionar sem internet basta ser um webapp e não precisa estar no meu dispositivo.
    • É realmente difícil entender ou concordar com isso. A web móvel ainda parece uma experiência horrível, enquanto apps geralmente não são assim.
      Fico imaginando quando foi a última vez que você tentou reservar uma passagem aérea na web móvel. Também não sei como lidar com o espaço de tela ocupado pelo navegador. Apps conseguem manter a autenticação em cache e usar FaceID, enquanto ter que fazer login toda vez também é um problema.
  • É por isso que eu gosto do Hacker News
    Ontem encontrei este texto e publiquei no fórum de Android do Reddit: https://old.reddit.com/r/Android/comments/1jmwg4w/everyone_k...
    Teve 0 upvotes, e os comentários ficaram cheios de reações que não dava para saber se eram de gente deprimida ou bots
    Aqui está perto do 2º lugar, e a maioria dos comentários é interessante
    Há muitos subreddits mortos, mas r/android chega perto de ser um dos piores

    • Não sei exatamente o que acontece no Reddit, mas, se existe algum lugar onde a teoria da internet morta se aplica, acho que é lá
      Além disso, os subreddits temáticos em geral parecem ser moderados por pessoas com interesses naquele tema, o que prejudica a comunidade. Publiquei um texto detalhando sob qual licença proprietária o Llama da Meta está, e o que exatamente essa licença significa, mas os moderadores do r/LocalLlama removeram manualmente sem motivo e não responderam por que removeram quando perguntei para entender melhor as regras
      Na última “purga do Reddit”, quando trocaram muitos moderadores da comunidade por funcionários do Reddit, fiquei com a impressão de que uma parte considerável da plataforma talvez tenha sido vendida para cada empresa moderar diretamente seu próprio espaço
    • O sucesso de uma postagem é questão de sorte. Você pode publicar e não ter reação nenhuma, ou as pessoas podem aparecer em massa
      Se clicar no link “past” abaixo do título, há uma thread de 2 dias atrás que está completamente morta
    • Por outro lado, muitas vezes publico no HN um link que acho interessante e ele fica com 0 comentários
    • r/android foi muito afetado pelo apagão dos subreddits, e a atividade caiu bastante
    • Aquele subreddit, em geral, tem um público mais jovem e uma postura mais próxima de “fanboy”, então parece que deram downvote só por ser uma crítica ao Android
      O Hacker News entende o conceito de crítica construtiva
  • O trecho essencial é: “ele verifica até coisas além das categorias comuns, como Tamil Calendar, Odia Calendar, Qibla Direction Finder, apps de mandir e apps de astrologia. Ele sabe o que está fazendo”
    Esse app de empréstimos está perfilando pessoas com base em identidade étnica/regional (Tamil, Odia) e religião (Qibla Direction Finder indica muçulmanos; apps de mandir indicam hindus)

  • O app Android do HSBC UK examina os apps instalados e se recusa a abrir se houver apps com determinadas permissões. Por exemplo, você não pode ter um launcher alternativo, e agora ele se recusa a abrir se houver qualquer app instalado fora da loja de apps do Google
    Já reclamei disso aqui antes, mas no fim acabei pedindo um dispositivo de segurança em hardware e passei a usar o site no lugar

    • Diretrizes para apps que se recusam a funcionar com gambiarras suspeitas e frágeis, e ainda afirmam que isso “protege” o usuário
    • Curiosamente, o app do FirstDirect, que pertence ao grupo HSBC, não tem esse problema. Ele até rodava em um celular que eu tinha rooteado no passado
    • É bem engraçado. Para avisar que outros apps podem espionar o usuário, primeiro ele precisa espionar o usuário
      Fico curioso se eles dizem que esses dados não são enviados para a empresa
    • É um nível absurdo. Parece bem típico do HSBC
  • A resposta à pergunta “por que saber se tenho os apps do Xbox ou do Playstation instalados no meu celular é necessário para a função principal do Swiggy? Como saber se tenho os apps Naukri ou Upstox ajuda a entregar mantimentos na minha casa?” é: para fingerprinting

    • Eles também verificam apps populares de acesso remoto à área de trabalho. Apps que permitem conexões de entrada para o celular podem ser usados para aumentar a taxa de sucesso de golpes
      O mesmo vale para apps bancários: se você é golpista, saber de antemão qual banco a vítima usa é realmente útil
      Especialmente se isso puder ser vinculado ao número de telefone, deve haver muitos grupos interessados nesse tipo de informação
    • Se for fingerprinting, ainda é o melhor cenário
  • No trecho “para casos de uso bem específicos, como gerenciadores de arquivos, navegadores e antivírus, o Google concede uma exceção à permissão QUERY_ALL_PACKAGES para permitir ver todos os apps instalados”, não entendo por que um navegador precisaria enumerar os apps instalados
    Por quê?!

    • Quando o usuário visita uma URL de play.google.com, o Google quer mostrar um botão “Instalar” ou “Abrir” dependendo de o app já estar instalado
      Ou seja, culpe a gestão de produto do Google
    • Alguns desses apps pedem permissões muito mais amplas do que realmente precisam
      Por exemplo, o Obsidian pede permissão para todo o sistema de arquivos, mas na prática bastaria acessar os arquivos que o usuário mandou ele ver
    • Gerenciadores de arquivos precisam de acesso total. Com essa função, é possível extrair e examinar o código de qualquer app instalado no sistema
      É um recurso muito útil, e eu não gostaria que desaparecesse
    • Também pode ser para verificar qual app consegue lidar com um link
  • “Todo mundo sabe todos os apps no seu celular” é sobre celulares Android. O iPhone não tem essa falha de privacidade

    • Na verdade, dá para fazer com uma API privada. Apps da Apple sempre a usam, mas o uso por outros apps é proibido
      https://blog.verichains.io/p/technical-analysis-improper-use...
    • Em certo sentido, o iOS é pior. Se você registra o aparelho no MDM da empresa, a empresa consegue ver todos os apps
      No Android, usando o perfil de trabalho, que hoje é o método padrão, ela só consegue ver os apps dentro do perfil de trabalho
    • O iPhone tende a ser um pouco menos pesadelo de privacidade
      Um dos maiores incentivos para criar apps é extrair todo tipo de dado dos usuários. Basta ver quantos apps pedem acesso aos contatos e quantos realmente precisam dos contatos para a funcionalidade em si. Por isso ainda me surpreende um pouco que tanta gente fique surpresa com descobertas como essa
    • No iOS, isso foi mitigado em certa medida há alguns anos
      Antes, era possível tentar se comunicar com um app por um esquema de URI customizado e, se desse certo, saber que aquele app estava instalado. O Twitter usava isso para fingerprinting
      Agora, o app precisa aceitar intents especiais e declarar a lista de apps que serão usados para esse fim
    • Já que o assunto é iPhone, há uma coisa que me deixa curioso. Às vezes, para um app novo [antigo], basta verificar os principais follows, então eu entro pelo web app
      Recentemente, os recursos de LLM deles receberam uma grande atualização, então instalei o app para conferir. Enquanto o app estava instalado, toda vez que eu via o site móvel aparecia um banner enorme mandando ir para o app, e ele não sumia nem com bloqueador de anúncios nem com bloqueador de elementos incômodos. Quando apaguei o app de novo, ele desapareceu
      Por que isso acontece? Fico curioso para saber como o site móvel sabe se o app está instalado. Quando o app não está instalado, consigo bloquear todos os convites para usar o app com bloqueadores de conteúdo/elementos incômodos; mas, quando está instalado, não sei por que não dá para bloquear
  • Exige root, mas dá para bloquear ou falsificar isso com algo como o XPrivacyLua[2], um módulo do LSPosed[1]. Também ouvi falar do AppOps[3], de código fechado, mas nunca usei
    [1]: https://lsposed.org
    [2]: https://github.com/M66B/XPrivacyLua / https://github.com/0bbedCode/XPL-EX
    [3]: https://appops.rikka.app

  • Fico curioso se apps do Windows, especialmente apps que não foram instalados pela MS Store, conseguem enumerar os títulos de todas as janelas abertas. Quão difícil seria um app monitorar todo o tráfego web só pelos títulos?
    É uma pergunta de verdade. O ChatGPT só concorda com tudo e não ajuda muito; preciso de alguém que diga por que isso não é viável no mundo real

    • Como programador que lida com Win32 há muito tempo, digo que é possível. É o design intencional. Por analogia, o Windows é como uma sociedade de alta confiança
      Existem as funções EnumWindows() e EnumChildWindows() para esse propósito
      Como exemplos desse recurso, veja o utilitário “Windows Modifier v2.00” e o Spy++ (SPYXX.EXE) da Microsoft. Quando o baixei pela primeira vez, havia muitas páginas relacionadas, mas hoje quase nada aparece mesmo pesquisando pelo nome exato; isso parece um sinal de como a internet ficou boa em esquecer
      A solução para apps em que você não confia é simplesmente não usá-los ou usá-los em uma VM
    • A maioria dos apps não só consegue ver os títulos de todas as outras janelas abertas no sistema, como também registrar todas as teclas digitadas, tirar screenshots, gravar áudio/vídeo do usuário ou da tela e copiar ou apagar arquivos do diretório home. Tudo sem permissão explícita nem notificação
      Isso vale ao menos para o Windows e para a maioria dos sistemas *nix tradicionais, especialmente com X11
      Nesse ponto, há algo que o Android fez bem: por padrão, executa todos os aplicativos como usuários diferentes. Ou seja, eles têm pastas home diferentes e não conseguem ver outros apps
    • Monitorar tráfego web só pelo título da janela não é muito preciso, porque os títulos das páginas variam bastante
      Mesmo assim, ferramentas como ManicTime ou ActivityWatch rastreiam o histórico do navegador por meio dos títulos das janelas se você não instalar um plugin de navegador
      https://www.manictime.com/
      https://activitywatch.net/
    • O Windows é bem diferente, mais permissivo e tem um modelo de segurança antigo. Não há barreira de segurança entre janelas executadas no mesmo desktop
      Em especial, continua sendo correto dizer que “o UAC [ainda] não é uma barreira de segurança”. Quando você confirma ou digita a senha para elevar um processo, na prática está elevando junto todo o desktop e tudo que está em execução
    • Exato. O fato de o AutoHotKey conseguir fazer isso é a base de muitos scripts AHK úteis