Uma vulnerabilidade crítica de segurança identificada como CVE-2024-5830 foi descoberta no mecanismo JavaScript V8 do Chrome. A falha foi relatada inicialmente em maio de 2024 como bug 342456991.
A vulnerabilidade é um bug de confusão de tipos que permite que um invasor execute código arbitrário dentro do sandbox do renderizador do Chrome simplesmente fazendo com que uma vítima visite um site malicioso.
EHA
Um bug de confusão de tipos no manuseio de mapas e transições de objetos pelo mecanismo V8. Mapas, ou classes ocultas, definem o layout de memória de objetos e otimizam o acesso à propriedade.
Uma falha no processo de transição de mapa pode levar ao manuseio incorreto de propriedades de objeto, resultando em um mapa obsoleto sendo inesperadamente atualizado para um mapa de dicionário. Essa discrepância pode causar acesso fora dos limites (OOB), levando a uma potencial exploração.
Hoje, Man Yue Mo, um pesquisador de segurança do GitHub Security Lab, publicou um artigo técnico; a vulnerabilidade é acionada quando o V8 tenta atualizar o mapa (classe oculta) de um objeto que se tornou obsoleto devido a alterações de tipo nas propriedades do objeto.
Em certos cenários, essa atualização de mapa resulta inesperadamente no objeto se tornando um tipo “dicionário” em vez de um tipo “rápido”. Isso causa confusão de tipo, pois o código que subsequentemente usa o mapa atualizado assume que está lidando com um objeto rápido, enquanto na realidade está operando em um objeto de dicionário.
Um invasor pode explorar essa confusão para corromper os campos internos do objeto de dicionário manipulando cuidadosamente as propriedades e o layout do objeto em JavaScript.
Obtendo leitura/gravação arbitrária no heap V8
O pesquisador conseguiu alavancar essa corrupção para construir um objeto falso dentro do heap V8, acionando uma função que tenta migrar o objeto de dicionário corrompido de volta para um tipo rápido, o objeto falso pode ser referenciado, levando ao acesso fora dos limites aos elementos do objeto falso.
Usando técnicas para preparar o layout da memória heap e prever endereços de objetos, esse acesso fora dos limites pode ser transformado em uma primitiva arbitrária de leitura e gravação dentro do heap V8.
Esse é um recurso poderoso que permite ao invasor corromper e manipular objetos e estruturas de dados dentro do mecanismo JavaScript.
Escapando do V8 Heap Sandbox
Versões modernas do V8 empregam um “heap sandbox” que isola o heap JavaScript de outras regiões de memória no processo do navegador, como páginas de código executáveis.
Isso torna a execução do código mais desafiadora, mesmo com um bug arbitrário de leitura/gravação no heap V8.
No entanto, o pesquisador encontrou uma maneira de contornar o heap sandbox explorando a interação entre o V8 e o Blink, o mecanismo de renderização do Chrome.
Ao corromper “objetos de API” que servem como wrappers no V8 para objetos DOM alocados pelo Blink, o pesquisador conseguiu causar confusão de tipos nos próprios objetos Blink.
Em particular, ao tratar um objeto DOMRect como um DOMTypedArray, o pesquisador substituiu o ponteiro de armazenamento de apoio do array digitado.
Isso forneceu uma primitiva de leitura/gravação arbitrária para toda a memória do processo do renderizador do Chrome, fora do sandbox do V8.
A partir daí, técnicas bem conhecidas podem ser usadas para localizar e corromper ponteiros de função ou código compilado por JIT para obter a execução de código nativo arbitrário.
CVE-2024-5830 – Patch
O Google corrigiu essa vulnerabilidade no V8 e lançou versões corrigidas do Chrome no final de julho de 2024. O pesquisador elogiou o Google por sua resposta rápida e tratamento profissional de problemas.
Essa vulnerabilidade é notável por sua gravidade e pelas novas técnicas demonstradas para escapar dos mecanismos de isolamento de heap do Chrome.
Isso ressalta os desafios de segurança contínuos em bases de código complexas, como navegadores da web, e a importância de continuar a pesquisa em técnicas de reforço e mitigação.