Análise de vulnerabilidades de estouro de inteiros na linguagem Move
Após uma pesquisa aprofundada na linguagem Move, descobrimos uma nova vulnerabilidade de estouro de inteiro. Esta vulnerabilidade ocorre na fase de verificação da segurança das referências no processo de validação do bytecode da linguagem Move. Este artigo irá analisar detalhadamente o processo de ativação desta vulnerabilidade e explorar alguns conceitos fundamentais da linguagem Move.
Processo de Verificação de Bytecode da Linguagem Move
A linguagem Move realiza a verificação de código antes da execução do bytecode, dividindo-se em 4 etapas. Esta vulnerabilidade ocorreu na etapa de reference_safety. Esta etapa é responsável principalmente por verificar a segurança das referências, incluindo a verificação da existência de referências suspensas e se o acesso a referências mutáveis é seguro.
O processo de verificação começa por identificar os blocos básicos no código. Um bloco básico é uma sequência de código sem instruções de ramificação, exceto para a entrada e saída. O Move determina os blocos básicos percorrendo o bytecode, procurando todas as instruções de ramificação e instruções de loop.
Segurança de referências em Move
Move suporta dois tipos de referências: referência imutável (&) e referência mutável (&mut). O módulo de segurança de referências irá escanear as instruções de bytecode de cada bloco básico na função, verificando se todas as operações de referência são legais.
O processo de verificação utiliza a estrutura AbstractState para representar o estado, que inclui o grafo de empréstimos e os locais. Durante a verificação, será comparado o estado antes e depois da execução, e os estados dos blocos serão mesclados e atualizados.
Análise de Vulnerabilidades
A vulnerabilidade ocorre na função join_. Esta função é usada para combinar os estados antes e depois da execução, atualizando o mapa de locais e o gráfico de empréstimos. O problema é que o iterador de locais retorna um tipo u8, e um estouro acontece quando a soma do comprimento dos parâmetros e do comprimento das variáveis locais excede 256.
Embora o Move tenha um processo de verificação do número de locals, apenas verifica a quantidade de variáveis locais, não inclui o comprimento dos parâmetros.
Exploração de Vulnerabilidades
Usar este overflow pode alterar o estado do bloco básico. No código em loop, cada vez que um bloco básico é executado, o estado muda. Quando executado novamente, se o índice acessado pela instrução não existir no novo mapa de locais, resultará em panic, permitindo assim um ataque DoS.
Demonstração de PoC
Forneceu um código PoC reprodutível que, ao definir parâmetros específicos e a quantidade de variáveis locais, provoca um estouro de inteiro, levando à falha do programa.
Resumo
Esta vulnerabilidade prova novamente a importância da auditoria de código. Para a linguagem Move, recomenda-se aumentar mais verificações de segurança em tempo de execução, e não apenas depender das verificações na fase de validação. Continuaremos a investigar profundamente as questões de segurança da linguagem Move, contribuindo para o seu desenvolvimento.
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.
25 gostos
Recompensa
25
7
Partilhar
Comentar
0/400
RektButStillHere
· 07-11 04:35
Já transbordou, tsk tsk.
Ver originalResponder0
consensus_failure
· 07-11 01:01
Ainda há esse bug
Ver originalResponder0
SchrodingersPaper
· 07-09 07:32
move já enviou? Brincou e saiu mal, saiu mal.
Ver originalResponder0
DevChive
· 07-08 16:28
菜鸟被 fazer as pessoas de parvas
Ver originalResponder0
ProposalManiac
· 07-08 06:09
Já disse que a verificação de parâmetros não pode estar apenas escrita na documentação.
Revelação da vulnerabilidade de estouro de inteiros na linguagem Move: riscos na validação de bytecode
Análise de vulnerabilidades de estouro de inteiros na linguagem Move
Após uma pesquisa aprofundada na linguagem Move, descobrimos uma nova vulnerabilidade de estouro de inteiro. Esta vulnerabilidade ocorre na fase de verificação da segurança das referências no processo de validação do bytecode da linguagem Move. Este artigo irá analisar detalhadamente o processo de ativação desta vulnerabilidade e explorar alguns conceitos fundamentais da linguagem Move.
Processo de Verificação de Bytecode da Linguagem Move
A linguagem Move realiza a verificação de código antes da execução do bytecode, dividindo-se em 4 etapas. Esta vulnerabilidade ocorreu na etapa de reference_safety. Esta etapa é responsável principalmente por verificar a segurança das referências, incluindo a verificação da existência de referências suspensas e se o acesso a referências mutáveis é seguro.
O processo de verificação começa por identificar os blocos básicos no código. Um bloco básico é uma sequência de código sem instruções de ramificação, exceto para a entrada e saída. O Move determina os blocos básicos percorrendo o bytecode, procurando todas as instruções de ramificação e instruções de loop.
Segurança de referências em Move
Move suporta dois tipos de referências: referência imutável (&) e referência mutável (&mut). O módulo de segurança de referências irá escanear as instruções de bytecode de cada bloco básico na função, verificando se todas as operações de referência são legais.
O processo de verificação utiliza a estrutura AbstractState para representar o estado, que inclui o grafo de empréstimos e os locais. Durante a verificação, será comparado o estado antes e depois da execução, e os estados dos blocos serão mesclados e atualizados.
Análise de Vulnerabilidades
A vulnerabilidade ocorre na função join_. Esta função é usada para combinar os estados antes e depois da execução, atualizando o mapa de locais e o gráfico de empréstimos. O problema é que o iterador de locais retorna um tipo u8, e um estouro acontece quando a soma do comprimento dos parâmetros e do comprimento das variáveis locais excede 256.
Embora o Move tenha um processo de verificação do número de locals, apenas verifica a quantidade de variáveis locais, não inclui o comprimento dos parâmetros.
Exploração de Vulnerabilidades
Usar este overflow pode alterar o estado do bloco básico. No código em loop, cada vez que um bloco básico é executado, o estado muda. Quando executado novamente, se o índice acessado pela instrução não existir no novo mapa de locais, resultará em panic, permitindo assim um ataque DoS.
Demonstração de PoC
Forneceu um código PoC reprodutível que, ao definir parâmetros específicos e a quantidade de variáveis locais, provoca um estouro de inteiro, levando à falha do programa.
Resumo
Esta vulnerabilidade prova novamente a importância da auditoria de código. Para a linguagem Move, recomenda-se aumentar mais verificações de segurança em tempo de execução, e não apenas depender das verificações na fase de validação. Continuaremos a investigar profundamente as questões de segurança da linguagem Move, contribuindo para o seu desenvolvimento.