Análise da Exploração da Vulnerabilidade de Valor Sentinel no Motor Chrome V8
O valor sentinel é um valor especial em algoritmos, normalmente utilizado como condição de término em algoritmos de loop ou recursão. Existe uma grande quantidade de valores sentinel no código-fonte do Chrome. Estudos anteriores mostraram que, ao vazar o objeto TheHole, é possível executar qualquer código dentro da sandbox do Chrome. A equipe do Google posteriormente corrigiu as vulnerabilidades relacionadas.
No entanto, existem outros objetos nativos em V8 que não devem ser expostos ao JS. Este artigo discute o objeto Uninitialized Oddball, cuja divulgação pode levar a métodos de contorno de sandbox que ainda estão disponíveis na versão mais recente do V8.
É importante notar que este método tem uma certa universalidade:
CVE-2021-30551 O PoC inicial é a divulgação de um oddball interno não inicializado.
O PoC do CVE-2022-1486 também vazou diretamente UninitializedOddball.
Issue1352549 ( não alocado CVE) descreve detalhadamente o método de exploração.
Estes casos mostram que a possibilidade de ataques utilizando a exploração de Uninitialized Oddball merece atenção.
Valor Sentinel no V8
A maior parte dos objetos nativos do V8 é definida no arquivo v8/src/roots/roots.h, e eles estão dispostos de forma adjacente na memória. Uma vez que esses objetos nativos, que não deveriam ser divulgados, são expostos ao JavaScript, pode-se potencialmente executar qualquer código dentro do sandbox.
Para verificar isso, pode-se modificar o valor de retorno da função nativa %TheHole() do V8 para Uninitialized Oddball.
Contornar a proteção HardenType
A Issue1352549 fornece o código completo de contorno. A lógica central simplificada é a seguinte:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized = %TheHole();
let arr = [1.1];
let res = read(uninitialized, 0x12345);
%DebugPrint(res);
Este código ainda pode realizar leituras relativas em versões mais recentes do V8 11.0.0.
Analisando o código de montagem da função read otimizada, pode-se perceber que ela apenas verifica se a propriedade prop do obj está correta, mas não verifica o Value do obj.prop como chave. Isso leva a uma confusão de tipos durante o cálculo, permitindo a leitura arbitrária.
Quando uninitialized_oddball é passado, começa a calcular a partir do obj a partir de uma instrução específica, completando a leitura arbitrária na instrução vmovsd xmm0,[r9+r11*8+0x7], com os dados armazenados no registrador xmm0.
A sugestão de correção é, ao retornar elementos do array na função otimizada, adicionar uma verificação do array map, evitando calcular diretamente o deslocamento para retornar os valores do array.
Aviso PatchGap
Durante a investigação de software que pode ter a vulnerabilidade PatchGap, foi descoberto que o Skype ainda não corrigiu essa falha. Na arquitetura x86, devido à ausência de compressão de endereços, a leitura e escrita arbitrárias são diretamente em relação a todo o processo.
Embora o Skype tenha ativado o ASLR, devido ao seu tamanho de arquivo, colocado diretamente na memória de 4GB, um atacante só precisa ler e gravar em um endereço fixo, tendo uma grande probabilidade de ler e gravar o conteúdo do arquivo do Skype. Combinando isso com métodos tradicionais como a análise PE, é possível completar toda a cadeia de exploração de vulnerabilidades.
Desta vez, o PatchGap não apenas envolve o Issue1352549, mas também reduziu significativamente a dificuldade de exploração de problemas semelhantes como o Issue1314616 e o Issue1216437. Os hackers quase não precisam de pesquisa adicional para conseguir uma exploração completa de qualquer vazamento do uninitialized_oddball.
Resumo
Este artigo apresenta um método para realizar leitura arbitrária através da revelação de uninitialized_Oddball no valor Sentinel. Existem outros valores Sentinel no V8 que podem causar problemas semelhantes. Isso nos dá a seguinte lição:
Outras vazamentos uninitialized_Oddball podem também possibilitar facilmente RCE do V8.
Existe ainda controvérsia sobre se tais questões devem ser formalmente tratadas como questões de segurança.
No fuzzer, pode-se considerar adicionar valores sentinel como %TheHole/uninitialized_Oddball como variáveis para explorar outras utilizações primitivas.
De qualquer forma, esse tipo de problema irá encurtar significativamente o ciclo para os hackers explorarem completamente.
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
9 gostos
Recompensa
9
5
Republicar
Partilhar
Comentar
0/400
CoffeeNFTrader
· 07-22 08:13
Mais uma vulnerabilidade de segurança, que preocupação!
Ver originalResponder0
Hash_Bandit
· 07-21 21:23
a mineração do motor js acabou de se tornar real...exploração de dificuldade no máximo
Ver originalResponder0
ConsensusDissenter
· 07-20 00:25
Outro buraco negro de código apareceu, é assustador.
Ver originalResponder0
Blockblind
· 07-20 00:19
O v8 também tem uma falha tão grande? Estou a rir até morrer.
Ver originalResponder0
BlockchainTalker
· 07-20 00:12
na verdade, fiquei surpreso que o V8 ainda tem dificuldades com isto... p.s. onde está a minha isolamento de runtime, família?
Análise de exploração da vulnerabilidade Sentinel Value do motor Chrome V8: RCE alcançado sem necessidade de pesquisa adicional
Análise da Exploração da Vulnerabilidade de Valor Sentinel no Motor Chrome V8
O valor sentinel é um valor especial em algoritmos, normalmente utilizado como condição de término em algoritmos de loop ou recursão. Existe uma grande quantidade de valores sentinel no código-fonte do Chrome. Estudos anteriores mostraram que, ao vazar o objeto TheHole, é possível executar qualquer código dentro da sandbox do Chrome. A equipe do Google posteriormente corrigiu as vulnerabilidades relacionadas.
No entanto, existem outros objetos nativos em V8 que não devem ser expostos ao JS. Este artigo discute o objeto Uninitialized Oddball, cuja divulgação pode levar a métodos de contorno de sandbox que ainda estão disponíveis na versão mais recente do V8.
É importante notar que este método tem uma certa universalidade:
CVE-2021-30551 O PoC inicial é a divulgação de um oddball interno não inicializado.
O PoC do CVE-2022-1486 também vazou diretamente UninitializedOddball.
Issue1352549 ( não alocado CVE) descreve detalhadamente o método de exploração.
Estes casos mostram que a possibilidade de ataques utilizando a exploração de Uninitialized Oddball merece atenção.
Valor Sentinel no V8
A maior parte dos objetos nativos do V8 é definida no arquivo v8/src/roots/roots.h, e eles estão dispostos de forma adjacente na memória. Uma vez que esses objetos nativos, que não deveriam ser divulgados, são expostos ao JavaScript, pode-se potencialmente executar qualquer código dentro do sandbox.
Para verificar isso, pode-se modificar o valor de retorno da função nativa %TheHole() do V8 para Uninitialized Oddball.
Contornar a proteção HardenType
A Issue1352549 fornece o código completo de contorno. A lógica central simplificada é a seguinte:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized = %TheHole(); let arr = [1.1]; let res = read(uninitialized, 0x12345); %DebugPrint(res);
Este código ainda pode realizar leituras relativas em versões mais recentes do V8 11.0.0.
Analisando o código de montagem da função read otimizada, pode-se perceber que ela apenas verifica se a propriedade prop do obj está correta, mas não verifica o Value do obj.prop como chave. Isso leva a uma confusão de tipos durante o cálculo, permitindo a leitura arbitrária.
Quando uninitialized_oddball é passado, começa a calcular a partir do obj a partir de uma instrução específica, completando a leitura arbitrária na instrução vmovsd xmm0,[r9+r11*8+0x7], com os dados armazenados no registrador xmm0.
A sugestão de correção é, ao retornar elementos do array na função otimizada, adicionar uma verificação do array map, evitando calcular diretamente o deslocamento para retornar os valores do array.
Aviso PatchGap
Durante a investigação de software que pode ter a vulnerabilidade PatchGap, foi descoberto que o Skype ainda não corrigiu essa falha. Na arquitetura x86, devido à ausência de compressão de endereços, a leitura e escrita arbitrárias são diretamente em relação a todo o processo.
Embora o Skype tenha ativado o ASLR, devido ao seu tamanho de arquivo, colocado diretamente na memória de 4GB, um atacante só precisa ler e gravar em um endereço fixo, tendo uma grande probabilidade de ler e gravar o conteúdo do arquivo do Skype. Combinando isso com métodos tradicionais como a análise PE, é possível completar toda a cadeia de exploração de vulnerabilidades.
Desta vez, o PatchGap não apenas envolve o Issue1352549, mas também reduziu significativamente a dificuldade de exploração de problemas semelhantes como o Issue1314616 e o Issue1216437. Os hackers quase não precisam de pesquisa adicional para conseguir uma exploração completa de qualquer vazamento do uninitialized_oddball.
Resumo
Este artigo apresenta um método para realizar leitura arbitrária através da revelação de uninitialized_Oddball no valor Sentinel. Existem outros valores Sentinel no V8 que podem causar problemas semelhantes. Isso nos dá a seguinte lição:
Outras vazamentos uninitialized_Oddball podem também possibilitar facilmente RCE do V8.
Existe ainda controvérsia sobre se tais questões devem ser formalmente tratadas como questões de segurança.
No fuzzer, pode-se considerar adicionar valores sentinel como %TheHole/uninitialized_Oddball como variáveis para explorar outras utilizações primitivas.
De qualquer forma, esse tipo de problema irá encurtar significativamente o ciclo para os hackers explorarem completamente.