Análise do Valor Sentinel no motor V8 do Google Chrome e seus riscos de segurança
O valor Sentinel é um valor especial em algoritmos, frequentemente utilizado como condição de término para loops ou recursões. O código fonte do Chrome contém vários valores Sentinel, alguns dos quais, se vazados para o ambiente JavaScript, podem causar problemas de segurança. Este artigo irá explorar métodos para contornar o mecanismo HardenProtect do Chrome V8 utilizando objetos Uninitialized Oddball vazados.
Valor Sentinel no V8
O arquivo roots.h do código-fonte V8 define uma grande quantidade de objetos nativos, que estão dispostos na memória em sequência. Se esses objetos nativos, que não deveriam ser expostos ao JavaScript, forem vazados, isso pode levar a uma fuga da sandbox. O vazamento do objeto TheHole no passado é um caso típico.
Para verificar o problema na versão mais recente do V8, pode-se modificar a função %TheHole() para que retorne um objeto Uninitialized Oddball:
javascript
print(%DebugPrint(%TheHole()));
// Saída: Valor não inicializado
Contornar a proteção HardenType
Usando Oddball não inicializado, é possível construir o seguinte código PoC para realizar leituras arbitrárias:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized = %TheHole();
let arr = [1.1];
%PrepareFunctionForOptimization(ler);
read(arr, 0);
read(arr, 0);
%OptimizeFunctionOnNextCall(ler);
read(arr, 0);
print(ler(não inicializado, 0x1234n));
A função read otimizada pela descompilação mostra que não verifica estritamente o tipo Value de obj.prop, calculando diretamente o deslocamento de acordo com a semântica JavaScript e retornando elementos do array, o que leva a uma confusão de tipos que permite a leitura arbitrária.
A proposta de solução é adicionar uma verificação do array map ao retornar elementos do array da função otimizada, evitando o cálculo direto do valor de retorno de deslocamento.
Aviso de Risco PatchGap
A análise revelou que alguns softwares como o Skype podem ter problemas de PatchGap, que ainda não foram corrigidos. Os hackers podem explorar essa vulnerabilidade para completar uma cadeia de exploração em um curto espaço de tempo.
Além disso, após a divulgação do novo método de contorno, a dificuldade de exploração de algumas vulnerabilidades históricas (, como Issue1314616 e Issue1216437), diminuiu significativamente. Recomenda-se que os fabricantes reavaliem o risco de segurança associado a essas vulnerabilidades.
Resumo
Existem muitos outros valores Sentinel no V8 que valem a pena ser pesquisados mais a fundo. É aconselhável considerar a adição de variáveis como %TheHole/Uninitialized_Oddball ao Fuzzer, para explorar novos primitivos de exploração. Independentemente de esses tipos de problemas serem oficialmente classificados como problemas de segurança, eles podem encurtar significativamente o ciclo de exploração completo dos hackers.
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
Análise e exploração das vulnerabilidades de segurança do Valor Sentinel do motor Chrome V8
Análise do Valor Sentinel no motor V8 do Google Chrome e seus riscos de segurança
O valor Sentinel é um valor especial em algoritmos, frequentemente utilizado como condição de término para loops ou recursões. O código fonte do Chrome contém vários valores Sentinel, alguns dos quais, se vazados para o ambiente JavaScript, podem causar problemas de segurança. Este artigo irá explorar métodos para contornar o mecanismo HardenProtect do Chrome V8 utilizando objetos Uninitialized Oddball vazados.
Valor Sentinel no V8
O arquivo roots.h do código-fonte V8 define uma grande quantidade de objetos nativos, que estão dispostos na memória em sequência. Se esses objetos nativos, que não deveriam ser expostos ao JavaScript, forem vazados, isso pode levar a uma fuga da sandbox. O vazamento do objeto TheHole no passado é um caso típico.
Para verificar o problema na versão mais recente do V8, pode-se modificar a função %TheHole() para que retorne um objeto Uninitialized Oddball:
javascript print(%DebugPrint(%TheHole())); // Saída: Valor não inicializado
Contornar a proteção HardenType
Usando Oddball não inicializado, é possível construir o seguinte código PoC para realizar leituras arbitrárias:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized = %TheHole(); let arr = [1.1]; %PrepareFunctionForOptimization(ler); read(arr, 0); read(arr, 0); %OptimizeFunctionOnNextCall(ler); read(arr, 0);
print(ler(não inicializado, 0x1234n));
A função read otimizada pela descompilação mostra que não verifica estritamente o tipo Value de obj.prop, calculando diretamente o deslocamento de acordo com a semântica JavaScript e retornando elementos do array, o que leva a uma confusão de tipos que permite a leitura arbitrária.
A proposta de solução é adicionar uma verificação do array map ao retornar elementos do array da função otimizada, evitando o cálculo direto do valor de retorno de deslocamento.
Aviso de Risco PatchGap
A análise revelou que alguns softwares como o Skype podem ter problemas de PatchGap, que ainda não foram corrigidos. Os hackers podem explorar essa vulnerabilidade para completar uma cadeia de exploração em um curto espaço de tempo.
Além disso, após a divulgação do novo método de contorno, a dificuldade de exploração de algumas vulnerabilidades históricas (, como Issue1314616 e Issue1216437), diminuiu significativamente. Recomenda-se que os fabricantes reavaliem o risco de segurança associado a essas vulnerabilidades.
Resumo
Existem muitos outros valores Sentinel no V8 que valem a pena ser pesquisados mais a fundo. É aconselhável considerar a adição de variáveis como %TheHole/Uninitialized_Oddball ao Fuzzer, para explorar novos primitivos de exploração. Independentemente de esses tipos de problemas serem oficialmente classificados como problemas de segurança, eles podem encurtar significativamente o ciclo de exploração completo dos hackers.