A área de transferência do sistema é um canal global entre apps, e uma página WebView pode ler tudo que seu usuário copiou: cartões, senhas, códigos de uso único. No Android a área de transferência era legível por qualquer app em segundo plano antes do Android 10 e só ganhou um aviso e uma marca de dados sensíveis no Android 12. No iOS, a área geral é do sistema, persiste após reinícios e sincroniza entre dispositivos via Universal Clipboard; o iOS 14 acrescentou aviso de leitura e o iOS 16 um aviso de colagem. Mas o caminho de leitura web dentro de um WebView fica fora dessas mitigações nativas: uma página com acesso à área e um gesto do usuário pode colher as credenciais que o app acabou de copiar. Um runtime próprio do host media a área de transferência na camada nativa: marca itens sensíveis como localOnly com expiração e condiciona leituras web à intenção explícita do usuário.
A área de transferência era uma escuta global
A área de transferência do Android é uma estrutura para copiar e colar dados entre aplicativos, e uma implementação fraca expõe os dados do usuário a outros apps (Android Developers, OWASP MASVS-CODE). A exposição varia por versão: antes do Android 10, apps em segundo plano podiam ler silenciosamente a área do app em primeiro plano —qualquer senha, OTP ou número de cartão copiado ficava disponível para um app malicioso. A partir do Android 12, o sistema mostra um aviso cada vez que um app acessa a área, e os desenvolvedores podem marcar dados sensíveis com EXTRA_IS_SENSITIVE para ofuscar a visualização no teclado. Isso ajuda nas escritas nativas, mas não faz nada contra o que uma página web lê.
O iOS a torna persistente e sincronizada
No iOS, a área geral é compartilhada entre todos os apps em primeiro plano e, desde o iOS 10, sincroniza com dispositivos Apple próximos via Universal Clipboard; persiste após reinícios e reinstalações a menos que seja limpa (OWASP MASTG-KNOW-0083). Desde o iOS 14 o sistema avisa quando um app lê conteúdo escrito por outro app, e desde o iOS 16 pede confirmação de colagem. Áreas com nome têm escopo por app ou equipe, mas a maioria dos apps usa a geral. O aviso de permissão também é um imposto: apps de comércio que leem a área ao iniciar para detectar links copiados agora bombardeiam o usuário com avisos de colagem —e o detectPatterns ainda pode revelar que a área se parece com uma URL, número ou telefone sem devolver seu valor.
Dentro de um WebView, a web também a lê
Aqui está a parte que as mitigações do sistema operacional deixam passar. Uma página WebView pode invocar a Clipboard API ou execCommand('paste') com um gesto do usuário e ler o que ele copiou. Some isso aos padrões de autopreenchimento e leitura automática de OTP já comuns em apps híbridos, e uma página de catálogo maliciosa ou comprometida vira um coletor de credenciais: o usuário copia um código de uso único para entrar, a página o lê e a sessão some. A marca nativa EXTRA_IS_SENSITIVE protege o que seu app escreve, mas a leitura da página web segue as mesmas regras de área do navegador —e um WebView não aplica a intenção do host como faria uma tela nativa. A área de transferência, pensada como conveniência, vira uma porta dos fundos que os próprios controles de privacidade da plataforma não fecham.
A solução do runtime
Um runtime próprio do host medeia o acesso à área de transferência na camada nativa em vez de deixá-la à página. Itens sensíveis são escritos como localOnly com uma expirationDate para que nunca cheguem ao Universal Clipboard nem sobrevivam a uma reinicialização. Leituras web da área são condicionadas à intenção explícita do usuário —um controle de colagem visível, não uma leitura silenciosa— e entradas de catálogo não confiáveis têm o acesso negado por completo. A conveniência fica; a porta dos fundos se fecha.
| Dimensão | WebView | Runtime próprio do host |
|---|---|---|
| Escopo da área | Global, entre apps, no iOS sincronizada e persistente | Mediada na camada nativa, localOnly + expiração |
| Leitura em segundo plano | Silenciosa antes do Android 10; aviso desde 12 | O host controla cada leitura web |
| Exposição 2FA / OTP | Código copiado legível por qualquer página | Entradas não confiáveis negadas; por intenção |
| Caminho de leitura web | Clipboard API com gesto, sem controle | Controle de colagem visível, sem leitura silenciosa |
| Lacuna de mitigação nativa | EXTRA_IS_SENSITIVE só ajuda escritas | Cobre escritas e leituras web |
O fio desta série sempre volta à mesma lição: um WebView herda as superfícies mais fracas da plataforma e acrescenta uma com formato de web. A área de transferência é uma conveniência que, em um WebView, vira uma escuta entre apps e entre páginas que o sistema operacional não consegue fechar por completo. Um runtime coloca o host entre a página e a área de transferência —assim a conveniência é do app, e a exposição não.
Fontes
- Android Developers — Tratamento seguro da área de transferência (MASVS-CODE): área global, leituras em segundo plano pré-Android 10, marca EXTRA_IS_SENSITIVE, aviso desde Android 12 — o lado nativo da exposição da área e suas mitigações.
- OWASP MASTG-KNOW-0083 — Pasteboard: a área geral do iOS é do sistema, persistente, sincronização Universal Clipboard, aviso iOS 14, confirmação iOS 16 — por que a área de transferência do iOS é uma superfície entre dispositivos e entre apps.
- web.dev — Web no Android: WebView dá ao host acesso completo ao conteúdo renderizado e carece da UI de segurança do navegador; relevante para área de transferência e DOM — a brecha estrutural entre WebView e um navegador reforçado.
- Juejin — Mudanças de privacidade de colagem no iOS 16: apps que leem a área ao iniciar agora inundam com avisos; como evitar o diálogo — o imposto de UX das leituras de área não gerenciadas.
- HackTricks — iOS UIPasteboard: detectPatterns revela metadados sem devolver valor; orientação localOnly e expirationDate — o oráculo de metadados e opções de endurecimento.