- O WhatsApp, com mais de 3 bilhões de usuários, introduziu uma camada de segurança baseada em Rust para reforçar a defesa contra ameaças de malware
- A biblioteca de consistência de mídia foi reescrita em Rust e distribuída para bilhões de dispositivos e navegadores, concluindo a validação em uso real em escala global
- As 160 mil linhas de código existentes em C++ foram substituídas por 90 mil linhas em Rust, melhorando tanto o desempenho quanto a eficiência de memória
- Após a vulnerabilidade Stagefright de 2015, a empresa vinha promovendo a adoção de linguagens com segurança de memória, como Rust, para aumentar a segurança no processamento de arquivos de mídia
- Essa mudança marca um ponto de virada na estratégia de segurança do WhatsApp, Messenger e Instagram, ampliando o peso de linguagens com segurança de memória
Estratégia de processamento de mídia do WhatsApp
- O WhatsApp é um serviço de mensagens com criptografia de ponta a ponta usado por mais de 3 bilhões de pessoas e vem evoluindo sua estratégia para responder a ameaças de segurança contínuas
- Quando usuários compartilham mídias como imagens e vídeos, existe a possibilidade de conteúdo malicioso estar embutido
- Alguns arquivos podem explorar vulnerabilidades não corrigidas do sistema operacional ou do aplicativo
- Para evitar isso, o Rust foi introduzido no recurso de compartilhamento de mídia para garantir segurança de memória
- Isso é citado como um dos maiores casos de distribuição de biblioteca baseada em Rust em escala global
A vulnerabilidade Android Stagefright de 2015 e a resposta
- A vulnerabilidade Stagefright do Android em 2015 existia em uma biblioteca de processamento de mídia no nível do sistema operacional, o que impossibilitava correção no nível do aplicativo
- O WhatsApp então modificou sua própria biblioteca em C++, “wamedia”, para detectar arquivos fora do padrão MP4
- Com isso, foi possível proteger usuários sem depender de atualizações do sistema operacional
- No entanto, como o wamedia processa automaticamente entradas não confiáveis, surgiu a necessidade de migrar para uma linguagem com segurança de memória
Migração para Rust: grande reescrita e resultados
- O WhatsApp desenvolveu uma versão em Rust do wamedia em paralelo com a versão existente em C++
- Differential fuzzing, testes de integração e testes unitários foram usados para verificar a compatibilidade entre as duas implementações
- No início, houve problemas de aumento do tamanho do binário por causa da biblioteca padrão do Rust e de compatibilidade com o sistema de build, mas foi criada uma estrutura de suporte de longo prazo
- Como resultado, houve a substituição de 160 mil linhas em C++ → 90 mil linhas em Rust, com melhoria tanto no desempenho quanto na eficiência no uso de memória
- A implantação completa da versão em Rust foi concluída em todas as plataformas, incluindo Android, iOS, Mac, Web e wearables
- Depois, foi introduzido o sistema “Kaleidoscope” para detectar tipos de arquivo de risco, como PDFs e executáveis, além de identificar falsificação de extensão e MIME spoofing
Abordagem de segurança do WhatsApp
- O WhatsApp opera várias camadas de segurança, incluindo criptografia de ponta a ponta, backups criptografados, transparência de chaves e proteções de chamadas
- A empresa identifica riscos por meio de divulgação de CVEs, auditorias de segurança internas e externas, fuzzing e análise estática, gestão da cadeia de suprimentos e análise de superfície de ataque
- O programa Bug Bounty foi ampliado para oferecer um Research Proxy, permitindo que pesquisadores analisem o protocolo de rede do WhatsApp
- Foi constatado que grande parte das vulnerabilidades importantes tem origem em problemas de segurança de memória em C/C++, e três estratégias vêm sendo aplicadas em paralelo
- Minimizar superfícies de ataque desnecessárias
- Reforçar as garantias de segurança do código C/C++ remanescente
- Mudar a linguagem padrão de novos códigos para uma linguagem com segurança de memória
Aceleração da adoção de Rust e direção futura
- O Rust possibilita ao WhatsApp desenvolver bibliotecas de segurança de alto desempenho e multiplataforma
- Essa mudança fornece aos usuários uma camada extra de segurança invisível, como parte de uma estratégia de defesa em profundidade (defense-in-depth)
- As equipes de segurança do WhatsApp e da Meta estão ampliando as áreas de aplicação de alto impacto do Rust e planejam acelerar sua adoção no futuro
1 comentários
Comentários do Hacker News
O WhatsApp é um mensageiro usado por 3 bilhões de pessoas por dia
Nos EUA ele não é tão usado, mas globalmente já se consolidou como uma infraestrutura básica de comunicação
Se você quer criar um produto para o mercado global, precisa entender a mentalidade e os hábitos desses usuários
Ainda existem pelo menos algumas dezenas de pessoas independentes assim
Por favor, não participem de tornar o WhatsApp ainda mais inevitável
A maioria das pessoas quase não checa e-mail
Eu administro uma comunidade de desenvolvedores e frequentemente bato no limite do grupo (1024 pessoas)
Mesmo tentando migrar para Discord ou Slack, no fim todo mundo volta para o WhatsApp
Isso porque, graças aos pacotes de dados das operadoras, o WhatsApp é praticamente grátis
A TechCrunch já publicou várias matérias sobre spam de mensagens empresariais no WhatsApp, como esta, mas na prática quase nada mudou
A UX do recurso de comunidades também não é boa
No fim, acho que o problema é o aprofundamento da dependência do ecossistema do Facebook
Eu não uso WhatsApp há 10 anos, e a maioria dos meus amigos e familiares também migrou para o Signal
Na Europa ainda existem regiões onde o Viber continua sendo usado
Foi dito que seria uma das maiores implantações de uma biblioteca escrita em Rust, mas na prática Fontations talvez seja ainda maior
Está incluída no Chromium e, considerando suas dependências, a base instalada pode ser mais ampla
Pela citação, parece que o WhatsApp não usou libsignal diretamente
Ex.: image-png, CrabbyAvif, qr_code, icu4x
É bom que o código tenha caído de 160 mil para 90 mil linhas, mas a estratégia de rollout paralelo é ainda mais interessante
Rodar as versões em Rust e em C++ ao mesmo tempo e validar a equivalência com differential fuzzing foi uma abordagem bem realista
Em clientes móveis, o tamanho do binário é importante, e foi impressionante ver o investimento em tooling de build
Talvez seja uma otimização disponível só em builds nightly
A parte mais difícil nesse tipo de rewrite não é a implementação em Rust em si, mas manter a compatibilidade com bugs do parser existente
Arquivos de mídia reais frequentemente estão malformados, e fazer um parsing rígido demais pode quebrar dados dos usuários
Na prática, differential fuzzing é quase a única abordagem viável
Dizer que o WhatsApp fez a maior implantação de Rust provavelmente significa que ele roda em mais dispositivos que o Windows 11
Ainda assim, fica a dúvida se o WhatsApp usa libsignal diretamente
O próprio Android já inclui bastante código baseado em Rust, e ele também é amplamente usado em dispositivos embarcados
enquanto o Windows continua centrado em C/C++
Foi mencionado que houve aumento no tamanho do binário com a adoção da biblioteca padrão do Rust, mas não ficou claro como isso foi resolvido
Commits relacionados: commit1, commit2
O problema não é tanto o tamanho em si, mas as dependências Rust duplicadas
Em builds mistos de C++ e Rust, cada lado inclui sua própria libstd, então é preciso um sistema de build unificado como o Bazel
No começo aceitaram um overhead de cerca de 200 KiB, mas com a migração para o Buck2 reduziram tanto o tamanho quanto o tempo de build
Isso graças às otimizações mais recentes do clang e às melhorias em LTO
Fiquei curioso se o Signal está tentando algo parecido
O libsignal é implementado em Rust, mas não sei muito sobre o resto
Havia a frase “fornece criptografia de ponta a ponta por padrão para 3 bilhões de pessoas”, mas também já houve notícias dizendo que as mensagens podiam ser lidas
O Skype também era criptografado por padrão, mas isso podia ser desativado dependendo da configuração do servidor
A questão é se dá para confiar que a Meta não esteja bisbilhotando os dados
É irônico que a Meta se esforce tanto em outras coisas enquanto não bloqueia phishing nem golpes com cartão pré-pago
Foi impressionante ver que a adoção de Rust reduziu bastante os bugs
O C++ tem uma enorme quantidade de comportamento indefinido (UB), mas o Rust bloqueia isso de forma estrutural
Graças ao seu forte sistema de tipos, a confiabilidade melhora muito