- A combinação entre os Boosts do navegador Arc e um problema nas regras do Firestore permitia que um invasor vinculasse à conta da vítima um Boost contendo JavaScript arbitrário
- O uso de Firebase Authentication e Firestore foi confirmado por hooking com Frida, revelando o fluxo de acesso às coleções
preferences,users,user_referralseboosts - A vulnerabilidade surgiu porque o alvo de aplicação do Boost era determinado por
creatorID, mas o invasor podia alterar ocreatorIDde seu próprio documento de Boost para o ID de outro usuário - O ID da vítima podia ser obtido em
user_referrals, nosboostSnapshotsde Boosts públicos, em Easels compartilhados etc.; quando a vítima visitasse o site-alvo, o Boost malicioso poderia ser executado - The Browser Company pagou uma recompensa de US$ 2.000 junto com a correção e, após a atribuição de CVE-2024-45489, decidiu avançar com a redução do uso do Firebase, auditorias de segurança e um programa de bug bounty
Recursos de nuvem do Arc e uso do Firestore
- O Arc exigia uma conta para uso, e foi confirmado que o processo de cadastro usava Firebase Authentication
- Na observação inicial da rede, não apareciam outras requisições, mas ao analisar o recurso de compartilhamento do Easels surgiu a possibilidade de uso do Firestore
- Easels é uma interface do tipo quadro branco que, ao ser compartilhada com outras pessoas, pode ser visualizada na web
- O Firestore é um serviço de database-as-a-backend que permite criar funcionalidades com regras de segurança de banco de dados e acesso direto pelo cliente, sem um backend separado
- Como exemplo anterior de regras de segurança frágeis no Firestore, foi relacionado o Firewreck
Como as chamadas ao Firebase foram confirmadas
- Como o SDK Swift do Firebase tende a não seguir as configurações de proxy do sistema, em vez do mitmproxy foi usado um script Frida para despejar as chamadas relacionadas
- O script fazia hooking de chamadas do Firestore em classes Objective-C
FIRCollectionReference["- documentWithPath:"]FIRQuery["- queryWhereField:isEqualTo:"]FIRFirestore["- collectionWithPath:"]- Métodos de execução como
getDocuments,addSnapshotListener:,getDocument - Métodos de escrita de documentos das famílias
updateDataesetData
- Durante a execução do Arc, foram observados os seguintes tipos de caminhos e consultas do Firestore
preferences/{userID}preferences/{userID}/stringValues/...users/{userID}- Consulta em
user_referralscominviter_id == {userID} - Consulta em
boostscomcreatorID == {userID}
- Nessa estrutura, o Arc armazenava no Firestore algumas preferências, o objeto básico do usuário, informações de indicação e Boosts
Por que os Boosts viraram o caminho de ataque
- Arc Boosts é um recurso que permite aos usuários personalizar sites
- Bloqueio de elementos
- Alteração de fontes
- Alteração de cores
- CSS personalizado
- JavaScript personalizado
- Os Boosts são armazenados no Firestore, e o navegador Arc consulta pelo campo
creatorIDpara decidir quais Boosts aplicar - O invasor criou, em sua própria conta, um Boost para Google.com e testou alterando alguns parâmetros do documento no Firestore
- Por causa da consulta baseada em
creatorID, não era possível consultar diretamente Boosts de outros usuários, mas era possível alterar ocreatorIDdo próprio documento de Boost para o ID de usuário de outra conta - Em um teste com outra conta, quando o computador da vítima acessou Google.com, o Boost criado pelo invasor foi aplicado
Cadeia de ataque e obtenção do ID de usuário
- O fluxo final do ataque era o seguinte
- Obter o ID de usuário da vítima
- Criar, na conta do invasor, um Boost malicioso contendo o payload desejado
- Alterar o campo
creatorIDdo documento do Boost para o ID da vítima - Quando a vítima visitar o site-alvo, o Boost malicioso será executado
- Essa vulnerabilidade se sustentava porque Arc Boosts podia conter JavaScript arbitrário, era armazenado no Firestore e o alvo de aplicação era decidido pelo campo
creatorID - Havia várias formas de obter o ID de usuário da vítima
user_referrals: ao convidar alguém para o Arc ou receber uma indicação, era possível obter o ID de usuário da outra pessoa na tabelauser_referrals- Boosts públicos: Boosts sem JavaScript podem ser compartilhados, e os
boostSnapshotsdo site público de Arc Boosts incluem o ID de usuário do criador - Easels: também era possível obter o ID de usuário por meio do recurso compartilhável de quadro branco
Correção e cronograma de divulgação
- The Browser Company normalmente não mantinha bug bounty, mas pagou US$ 2.000 por essa vulnerabilidade
- O cronograma da vulnerabilidade foi o seguinte
- 25 de agosto, 17h48: primeiro contato por Signal com Hursh, cofundador do Arc
- 25 de agosto, 18h02: execução do PoC da vulnerabilidade na conta Arc de Hursh
- 25 de agosto, 18h13: detalhes compartilhados em formato criptografado, seguido de adição a um canal do Slack
- 26 de agosto, 21h41: vulnerabilidade corrigida e recompensa paga
- 6 de setembro, 19h49: CVE-2024-45489 atribuída
- Depois disso, o Arc publicou seu próprio texto sobre o caso, CVE-2024-45489 incident response
Execução em páginas privilegiadas e conflito com privacidade
- Mesmo que Boosts não pudessem ser criados no cliente, eles podiam ser executados em outros protocolos
- Ao criar um Boost tendo a página
settingscomo alvo, ele era executado emchrome://settings, o que poderia levar a elevação de privilégios - Ao visitar um site, ocorria a seguinte consulta ao Firestore
- Consulta na coleção
boostscom as condiçõescreatorID == {userID}ehostPattern == "www.google.com"
- Consulta na coleção
- Nesse caso,
hostPatternsignifica o site visitado, o que entra em conflito com a política de privacidade do Arc, que afirmava que o Arc não sabia quais sites eram visitados
Medidas posteriores do Arc
- Com a vulnerabilidade e a introdução de novos recursos, o Arc passou a caminhar na direção de sair do Firebase
- O resumo do próprio Arc incluía as seguintes medidas
- Confirmar a correção do problema
- Adicionar um recurso para desativar Boosts no cliente
- Auditoria interna das regras atuais de ACL do Firebase
- Estabelecimento de um protocolo de resposta a questões de segurança
- As medidas adicionais compartilhadas em discussões internas do Arc foram as seguintes
- Corrigir o problema de privacidade na atualização v1.61.1
- Deixar de usar Firebase em novos recursos e produtos
- Auditoria externa de segurança para essa versão
- Lançar um programa de bug bounty para vulnerabilidades futuras
1 comentários
Comentários do Hacker News
Aqui é Hursh, cofundador e CTO da The Browser Company, que faz o Arc. Não houve usuários realmente afetados e corrigimos isso imediatamente, mas considero a gravidade potencial dessa vulnerabilidade inaceitável
Reuni aqui os detalhes técnicos e os planos de melhoria daqui para frente, incluindo sair do Firebase e criar um programa formal de bug bounty: https://arc.net/blog/CVE-2024-45489-incident-response
Sinto muito de verdade tanto pela vulnerabilidade em si quanto pela demora na comunicação, e o feedback — incluindo decepção, raiva e encorajamento — me faz sentir ainda mais responsabilidade para fazer melhor
Parece que só reagiram quando a situação ficou barulhenta o suficiente
Não quero usar um navegador feito por uma empresa que trata a segurança dos usuários com tanta leveza. Não tenho certeza, mas para algo dessa gravidade provavelmente daria para vender por muito mais no mercado clandestino
Vulnerabilidades podem acontecer, mas enviar dados de navegação parece uma escolha deliberada de design
Acho que é um caso em que o CTO deveria renunciar
É praticamente uma oportunidade perfeita para tomar a direção certa
Muita gente aqui nos comentários está culpando o Firebase, mas parece mais repetir algo que não entende de fato. Eu não uso Firebase, mas já usei antes, e isso não é um caso de canto nem um problema difícil de resolver; é o básico do básico
O problema real foi fazer a API confiar em um valor que o cliente informa para dizer “quem ele é”. No fim das contas, é provavelmente um erro de amador, e talvez desse para corrigir com uma única linha. Só de olhar a documentação, em https://firebase.google.com/docs/rules/rules-and-auth#cloud-... o
request.authjá fornece o ID de usuário necessário (request.auth.uid)As regras de segurança precisam ser tratadas com seriedade e, na prática, são praticamente a única linha de defesa
Fazendo autenticação própria ou não, o ponto central é um só: nunca confie no cliente
matchnofirestore.rules. Isso aparece exatamente na documentação introdutória de segurança do Firebase FirestoreEu adorei o pequeno gato em pixel art que vinha correndo até onde eu clicava. Foi um detalhe divertido e criativo, difícil de ver com frequência hoje em dia, e pareceu um lembrete de que a internet também pode ser um lugar assim, se quisermos
prefers-reduced-motion, então ele não é exibido quando essa configuração está ativa. Uma excelente solução: dá alegria a quem quer isso e evita incômodo para quem não querhttps://en.wikipedia.org/wiki/Neko_(software)
sudo apt install onekooneko &Ótimo para presentear o computador do colega que deixou a mesa por um instante
Segundo este texto, o Arc exige conta e envia para o Google Firebase o nome do host de todas as páginas visitadas e o ID do usuário. Nesse caso, o Arc não seria o navegador com pior privacidade entre os que existem hoje?
É um bug realmente impressionante. As regras de segurança de serviços de backend como o Firebase têm padrões estranhos que são difíceis de explicar. Se eu mesmo criasse a API, definiria o
userIdde um registro como oboostdeste caso com base no ID de usuário da sessão, em vez de recebê-lo no payload da requisiçãoQualquer desenvolvedor minimamente experiente normalmente nem cogita deixar que o cliente envie, numa rota de API protegida, um valor alegando ser seu próprio
userId. Já nas regras de segurança, é preciso imaginar todas as formas de abuso do sistema, independentemente de como o uso real foi programadoA solução correta provavelmente é ter permissões de negação por padrão para todos os campos. Assim, no mínimo, seria preciso marcar explicitamente o campo de proprietário como gravável e pensar nas implicações de transferir esse objeto para outro usuário
Impressiona o quão absurdamente idiota essa vulnerabilidade é. Para obter execução arbitrária de código, bastava literalmente enviar o ID de usuário de outra pessoa, e esse ID também era bem fácil de conseguir
Não trabalho numa FAANG, e trabalho numa empresa que faz um produto ruim de que ninguém realmente precisa, mas nem eu cometeria um bug desses. Aí esses caras querem fazer um navegador e ainda assumir toda a especialização em segurança e a responsabilidade moral que isso implica?
Seria bom que colocassem Arc no título do post, para que quem usa o Arc ou conhece alguém que usa perceba melhor
Sinceramente, acho fortemente que o título deveria ser algo como “Bug fundamental no navegador Arc (CVE 123-4567)”
Há muitas vulnerabilidades de segurança graves que são compreensíveis e podem ser perdoadas se tratadas com responsabilidade e corrigidas direito
Mas este não é um desses casos. Pessoalmente, isso mostra um nível de incompetência capaz de arruinar reputações, a ponto de me fazer decidir nunca mais usar o Arc
aug 25 5:48pm: primeiro contato com Hursh, cofundador do Arc, por canal criptografado do Signalaug 25 6:02pm: execução da prova de conceito da vulnerabilidade na conta do Arc de Hurshaug 25 6:13pm: detalhes divulgados em formato criptografado e entrada no canal do Slackaug 26 9:41pm: vulnerabilidade corrigida, recompensa pagasep 6 7:49pm: CVE atribuído (CVE-2024-45489)Quatro horas entre o contato inicial repentino e a distribuição da correção já seria bem bom, mesmo considerando que a correção talvez fosse simples. Correção: como a data virou, na verdade foram 28 horas. Ainda assim é respeitável, e responder com “entre no nosso canal do Slack” apenas 30 minutos após o primeiro contato foi muito rápido
Num produto tão importante e pessoal quanto um navegador, receber entre 50 e 60 milhões de dólares em caixa e uma avaliação de 500 milhões de dólares sem ter modelo de negócio é um enorme sinal de alerta. Não é filantropia; alguém vai acabar pagando a conta de algum jeito
Também é uma pena que o Firebase não consiga tornar isso mais à prova de idiotas. E foram mesmo só $2,500? Era literalmente possível tomar controle de todos os usuários do Arc; a NSA teria acrescentado mais alguns zeros
Ainda mais quando concorrentes funcionais como o Supabase seguem a abordagem de encapsular um DBMS comum e um modelo de autenticação
Obrigado por compartilhar. Uso o Arc desde a primeira semana do beta
Mas o fato de eles não terem mencionado esse bug nem a correção em nenhuma rede social é bem preocupante. Foi agradável usar o Arc, mas vendo como trataram isso, não acho que conseguirei continuar usando
$2,000 por uma vulnerabilidade desse tamanho é um valor insultante
Talvez isso aconteça porque elas não sofrem punições regulatórias por incidentes de violação