Vulnerabilidade de clickjacking no WhatsApp permite ataques de phishing
(00xbyte.github.io)- Foi descoberta uma vulnerabilidade de phishing no WhatsApp que exibe um link e uma prévia que parecem apontar para um site legítimo, enquanto o clique real leva o usuário para um site controlado pelo atacante
- A causa está na estrutura em que o link do corpo da mensagem e os dados da prévia são enviados separadamente, e na possibilidade de criar uma incompatibilidade na prévia ao remover
matchedText - O caractere
U+202ERight-To-Left Override pode inverter a direção de exibição da URL, fazendo o domínio real parecer um domínio legítimo - O atacante pode preparar um domínio espelho do alvo a ser falsificado, manter a prévia do site original e alterar apenas o valor de
textpara enganar a vítima - A Meta respondeu que pode ajustar dinamicamente a lógica de normalização de URL, e os usuários devem copiar o link antes de clicar para verificar o endereço real
Onde a prévia do link e o link real se separam no WhatsApp
- O pesquisador enviou um link do
webhook.sitea um amigo para verificar se, ao renderizar a prévia do link, o destinatário de uma mensagem no WhatsApp gerava uma requisição HTTP - A requisição HTTP ocorreu apenas uma vez, no lado do remetente, confirmando que o destinatário não renderiza o link separadamente
- Por causa desse comportamento, concluiu-se que as mensagens do WhatsApp são enviadas já contendo o link e as informações da prévia, e foi testado se os dois poderiam ser tornados diferentes entre si
Issue #1: incompatibilidade na prévia do link
- Tentou-se modificar diretamente uma mensagem do WhatsApp Web por proxy, mas por causa do E2EE do WhatsApp, a simples adulteração com ferramentas como Burp Suite não era fácil
- Em vez disso, foi colocado um breakpoint no JavaScript imediatamente antes de a mensagem criptografada ser enviada via WebSocket, para inspecionar o objeto da mensagem
- No objeto da mensagem, o link no corpo e as informações da prévia existem como propriedades separadas
text: corpo da mensagemcanonicalURL: domínio exibido na parte inferior da préviamatchedText: parece ser o valor comparado comcanonicalURL, e foi testado se esse valor também aparece dentro detext
- Ao trocar
textporgoogle.comem um objeto de mensagem parainstagram.com, a prévia desaparece e resta apenas o link do Google - Ao remover a propriedade
matchedText, foi possível criar uma mensagem inconsistente em que o link real e a prévia são diferentes
Issue #2: disfarce visual do link com U+202E
- Para impedir que o corpo real do link ficasse evidente, foi feito fuzzing para verificar se caracteres Unicode poderiam alterar a forma como o texto é exibido
U+202Eé o caractere Right-To-Left Override, que faz o texto ser exibido ao usuário em ordem invertida- Usar apenas
U+202Edeixava a aparência do link estranha e pouco convincente para clique, então foi necessário montar uma string invertida que parecesse uma URL normal
Como o URL espelho é construído
- O objetivo era criar uma URL que, quando invertida, parecesse
https://instagram.com - Uma simples string invertida seria
moc.margatsni//:sttph, mas um TLD como.margatsninão pode ser registrado - A solução foi usar um TLD realmente registrável de forma que ele parecesse um subdomínio
- Por exemplo, usando o TLD holandês
.nl, é possível criar uma string que pareçaln.instagram.com
- Por exemplo, usando o TLD holandês
- Como a URL precisava parecer começar com
https://, foi acrescentado ao final o caminho válido//:sptth - Como resultado,
https://moc.margatsni.nl//:sptth, quando combinado comU+202E, pode parecerhttps://ln.instagram.com//:sptth - O pesquisador chamou essa técnica de 2K2E
Fluxo do ataque
- O atacante compra um domínio espelho do site que quer falsificar
- Exemplo: para fazer parecer
ln.instagram.com, compra-semoc.margatsni.nl
- Exemplo: para fazer parecer
- Primeiro, cria-se uma mensagem com o link do domínio original para obter a prévia do site
- No objeto de exemplo,
text,matchedTextecanonicalUrlcontêmhttps://instagram.com/ - Também estão incluídos valores relacionados à prévia, como
description,title,jpegThumbnailethumbnailDirectPath
- No objeto de exemplo,
- Depois, remove-se
matchedTexte altera-se o valor detextpara o formato\u202ehttps://moc.margatsni.nl//:sptth - A mensagem final exibe a prévia do Instagram, mas ao clicar pode levar ao domínio preparado pelo atacante
Resposta da Meta e comparação com outras plataformas
- A Meta respondeu que, como oferece suporte a várias plataformas e ambientes, a forma de normalização de URL pode diferir da lógica do servidor dependendo da plataforma
- Também afirmou que possui um sistema capaz de ajustar dinamicamente a lógica de normalização de URL quando ocorrer spam ou abuso real
- O pesquisador avaliou que a Meta parece menos interessada em corrigir ativamente esse problema de segurança e mais inclinada a reagir apenas quando o sistema detectar spam
- X, TikTok e Pinterest fazem sanitização do caractere
U+202E, diferentemente do WhatsApp
Mitigação que o usuário pode adotar
- Não é confiável julgar links do WhatsApp apenas pela forma como são exibidos
- Para evitar phishing 2K2E, o usuário deve copiar o link antes de clicar e verificar o endereço real na prévia da área de transferência
- A prévia da área de transferência pode mostrar o endereço do link com o caractere
U+202Ejá sanitizado - O pesquisador afirmou ter encontrado depois outros serviços também vulneráveis ao 2K2E por não fazerem a sanitização adequada
1 comentários
Opiniões do Hacker News
É uma combinação de usos indevidos bem engenhosa, mas o impacto de segurança geral provavelmente é baixo
Mesmo no melhor cenário, isso no máximo faz o destinatário abrir um link no navegador, então, a menos que o atacante seja polícia ou agência de inteligência, normalmente seria preciso um ataque de acompanhamento explorando software desatualizado no dispositivo
Tecnicamente, é difícil chamar isso exatamente de clickjacking. Clickjacking normalmente se refere a uma técnica bem específica de sobrepor um frame HTML invisível sobre outro conteúdo
https://owasp.org/www-community/attacks/Clickjacking
https://portswigger.net/web-security/clickjacking
Todo mundo está focando só nos caracteres UTF da direita para a esquerda, mas a Meta pelo menos deveria ter reconhecido o problema de a URL da prévia poder ser diferente da URL da mensagem
Entendo que isso acontece por causa do comportamento de expandir URLs encurtadas, mas parece claro que Meta e WhatsApp poderiam implementar alguma solução alternativa inteligente
Clickjacking é quando você acha que está clicando em um elemento, mas na verdade outro elemento, geralmente transparente e sobreposto por cima, intercepta o clique
Se você der foco à camada visível de baixo e detectar a ocorrência do evento
onblur, o atacante pode perceber o clique mesmo que o usuário não receba o eventoO que o OP encontrou é legal, mas não é clickjacking. Eu mesmo já usei caracteres RTL para fazer um arquivo de protetor de tela, ou seja, um executável comum com uma extensão diferente no Windows, parecer um documento do Word. Acho que era para pregar uma peça em um amigo ou professor, mas não lembro bem por quê
O OP foi um passo além e encontrou uma forma de alterar a exibição em outro sistema. O usuário não se engana sobre em que elemento está clicando, mas sim sobre para onde o link vai, então isso não é clickjacking, e a página da Wikipedia linkada no começo do texto confirma isso
Nunca vi clickjacking ser explorado na prática, mas esse método que o OP encontrou parece algo que realmente pode ser abusado
Para ser sincero, já desisti há muito tempo de esperar que usuários consigam distinguir o domínio final ao clicar em um link. A maioria nem entende o conceito, e o restante também tem dificuldade
Até quem acha que consegue diferenciar acaba se frustrando quando todos os links vão para algo como
sendgrid.tld/j3ovi3bfogobbledypoop93jnri2o. Estamos treinando as pessoas diariamente a clicar em links suspeitos e ofuscados para rastreamento, e ninguém parece se importarHack bem interessante. O problema real não é o WhatsApp nem os caracteres reversos do Unicode, e sim que URLs são difíceis
Mesmo exemplos simples como
visa.securesite.comenganam muita gente. Não vejo uma boa solução no futuro próximoA confusão geral em torno de hostnames e domínios é um problema mais difícil, mas os navegadores vêm tentando amenizar isso destacando a parte do nome de domínio. Como na maioria das técnicas de phishing, parece que no fim as passkeys vão resolver isso
RTL tem sido uma enorme fonte de vulnerabilidades de segurança desde sempre. Não entendo por que não existe uma configuração no sistema operacional para desativar todo RTL, para que pessoas que não conhecem esses idiomas não fiquem expostas a riscos sem ganhar nada em troca
TextViewdo AndroidA menos que o desenvolvedor revise e permita explicitamente determinados trechos de texto, o padrão deveria ser desativar todos os controles de texto bidirecional
Não faz sentido tornar toda a pilha de renderização de texto vulnerável por padrão em nome de atender menos de 1% da população mundial
É decepcionante que a Meta tenha decidido não corrigir isso e também não pagar bug bounty a este pesquisador
Não vou entrar em detalhes aqui, mas por causa da forma como o Google Search às vezes reescreve URLs, um atacante pode disfarçar a URL real
É melhor nunca confiar cegamente em URLs exibidas em sites e aplicativos
O mais problemático em termos de design de UI é justamente o fato de “como era de se esperar, o link e a prévia foram enviados separadamente!”. Por que um usuário comum deveria ter que comparar link e prévia para se manter seguro?
No geral, acho que a opção 1 é a melhor. O remetente já pode “falsificar” todas as próprias mensagens de qualquer forma, e incluir a prévia como parte da mensagem não muda tanto assim
O problema aqui é que não fica claro que esse conteúdo veio do remetente. Como ele aparece como um balão separado, acho que 99% dos usuários não perceberiam que esse conteúdo foi fornecido pelo remetente
Além disso, no fim a URL é o que importa. Se você clicar em uma URL controlada por um atacante, ele pode mostrar o que quiser na prévia. Por isso, o ganho obtido ao forçar que a prévia seja “real” é muito pequeno
A opção 3 também pode ser aceitável. Especialmente se for implementada com algo como double blind, em que você se conecta a uma ponta e ela encaminha para uma segunda. Assim, a primeira vê o IP e a segunda vê o destino, mas, a menos que colaborem entre si, nenhuma das duas vê as duas coisas ao mesmo tempo
Só que o benefício é relativamente pequeno para justificar construir e manter esse nível de infraestrutura
Gosto que isso tenha sido classificado como engenharia reversa no fim do texto
Isso não é clickjacking. Clickjacking é quando um atacante sequestra o clique para fazer o usuário clicar de fato em outro alvo, algo que ele não pretendia ou do qual não tinha consciência
Code points RTL que fazem o texto fluir da direita para a esquerda são um recurso de internacionalização, e usá-los para confundir pessoas não é uma vulnerabilidade nova