Separação de processos é um dos pilares do modelo de segurança do Firefox. Em vez de executar o Firefox como um único processo, vários processos com privilégios diferentes comunicam-se entre si via Comunicação entre processos (IPC). Por exemplo: carregar um site, processar seus recursos e renderizá-lo é feito por um usuário isolado Processo de conteúdo com uma sandbox muito restritiva, enquanto operações críticas, como acesso ao sistema de arquivos, só podem ser executadas no Processo pai.
Ao executar código potencialmente prejudicial com privilégios mais baixos, o impacto de uma potencial vulnerabilidade de execução de código é mitigado. Para obter controle total, o invasor precisa agora encontrar uma segunda vulnerabilidade que permita contornar essas restrições de privilégio – que é coloquialmente conhecida como “fuga da caixa de areia”.
Para conseguir escapar da sandbox, um invasor tem essencialmente duas opções: A primeira é atacar diretamente o sistema operacional subjacente a partir do processo de conteúdo comprometido. Como todo processo precisa interagir com o sistema operacional para diversas tarefas, um invasor pode se concentrar em encontrar bugs nessas interfaces para elevar privilégios.
Já que temos já implantado mudanças no Firefox que limitam severamente as interfaces do sistema operacional expostas a processos de baixo privilégio, a segunda opção de ataque se torna mais interessante: explorar bugs em endpoints IPC privilegiados. Como os processos de conteúdo com poucos privilégios precisam interagir com o processo pai privilegiado, o pai precisa expor certas interfaces.
Se essas interfaces não realizarem as verificações de segurança necessárias ou contiverem erros de segurança de memória, o processo de conteúdo poderá explorá-las e executar ações com privilégios mais elevados, possivelmente levando ao controle de todo o processo pai.
Tradicionalmente, o fuzzing teve várias histórias de sucesso na história da Mozilla e nos permitiu encontrar todos os tipos de problemas, incluindo vulnerabilidades de segurança em nosso código. No entanto, aplicar fuzzing às nossas interfaces IPC críticas historicamente sempre foi difícil. Isso ocorre principalmente porque as interfaces IPC não podem ser testadas isoladamente, ou seja, exigem o navegador completo para teste, e porque o uso incorreto das interfaces IPC pode forçar a reinicialização do navegador, o que introduz uma quantidade proibitiva de latência entre as iterações.
Para encontrar uma solução para esse desafio, nos envolvemos com a comunidade de pesquisa para aplicar um novo método de rebobinar o estado da aplicação durante a difusão. Vimos nossos primeiros resultados com essa abordagem em 2021, usando um protótipo experimental que mais tarde se tornaria a ferramenta de difusão de instantâneos de código aberto chamada “Nyx”.
A partir de 2024, temos o prazer de anunciar que estamos executando vários difusão de instantâneo metas para IPC na produção. A difusão de instantâneos é uma nova tecnologia que se tornou mais popular nos últimos anos e estamos orgulhosos de nosso papel em levá-la do conceito à praticidade.
Usando esta tecnologia já conseguimos identificar e corrigir uma série de problemas potenciais em nossa camada IPC e continuaremos melhorando nossos testes para fornecer a você a versão mais segura do Firefox.
Se você quiser saber mais, ou até mesmo considerar contribuir para a Mozilla, confira nossa postagem no blog de segurança explicando a arquitetura técnica por trás desta nova ferramenta.
Christian é líder técnico do Firefox e engenheiro principal da Mozilla.
Mais artigos de Christian Holler…

