Reproduzindo a vulnerabilidade de estouro de inteiros na linguagem Move
Recentemente, uma grave vulnerabilidade de estouro de inteiro foi descoberta na linguagem Move. Esta vulnerabilidade ocorre durante a verificação de segurança das referências e pode levar a ataques de negação de serviço. Ao analisar essa vulnerabilidade em profundidade, podemos ter uma compreensão mais profunda da linguagem Move.
A linguagem Move realiza a verificação de código antes de executar o bytecode, dividindo-se em quatro etapas. Esta vulnerabilidade surge na etapa reference_safety. O módulo reference_safety é responsável por validar a legalidade das operações de referência, incluindo a verificação da existência de referências pendentes e se o acesso a referências mutáveis é seguro.
O processo de verificação é feito por unidade de função. Para cada função, primeiro são identificados os blocos básicos. Um bloco básico é uma sequência de código contínua, onde apenas nas entradas e saídas podem existir ramificações. Em seguida, cada bloco básico é analisado, gerando os estados antes e depois da execução, e propagando os estados para os blocos subsequentes.
O estado contém informações sobre locals e o gráfico de empréstimos. Locals registra informações sobre variáveis locais, enquanto o gráfico de empréstimos representa as relações de referência entre variáveis. O processo de análise irá atualizar continuamente essas informações de estado.
A vulnerabilidade ocorre durante o processo de mesclagem de estados. Quando o número total de parâmetros de função e variáveis locais excede 256, ocorre um estouro de inteiro devido ao uso do tipo u8 para representar o índice. Isso leva a erros nas informações do estado mesclado, o que pode resultar em ataques de negação de serviço.
Embora a linguagem Move tenha um mecanismo para verificar o número de variáveis locais, não considera o número de parâmetros. Esta omissão levou à criação de vulnerabilidades.
Para explorar esta vulnerabilidade, o atacante pode construir um bloco de código em loop, utilizando um estouro para alterar o estado do bloco. Quando executado novamente, devido a informações de estado incorretas, o acesso a variáveis inexistentes pode causar a falha do programa.
Esta vulnerabilidade demonstra novamente que, mesmo em linguagens cuidadosamente projetadas, podem existir riscos de segurança. Isso nos lembra da importância da auditoria de código e da necessidade de considerações de segurança mais abrangentes no design de linguagens. Para a linguagem Move, adicionar mais verificações em tempo de execução pode ser uma direção de melhoria.
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.
Vulnerabilidade de overflow de inteiros na linguagem Move exposta, referência à verificação de segurança apresenta riscos.
Reproduzindo a vulnerabilidade de estouro de inteiros na linguagem Move
Recentemente, uma grave vulnerabilidade de estouro de inteiro foi descoberta na linguagem Move. Esta vulnerabilidade ocorre durante a verificação de segurança das referências e pode levar a ataques de negação de serviço. Ao analisar essa vulnerabilidade em profundidade, podemos ter uma compreensão mais profunda da linguagem Move.
A linguagem Move realiza a verificação de código antes de executar o bytecode, dividindo-se em quatro etapas. Esta vulnerabilidade surge na etapa reference_safety. O módulo reference_safety é responsável por validar a legalidade das operações de referência, incluindo a verificação da existência de referências pendentes e se o acesso a referências mutáveis é seguro.
O processo de verificação é feito por unidade de função. Para cada função, primeiro são identificados os blocos básicos. Um bloco básico é uma sequência de código contínua, onde apenas nas entradas e saídas podem existir ramificações. Em seguida, cada bloco básico é analisado, gerando os estados antes e depois da execução, e propagando os estados para os blocos subsequentes.
O estado contém informações sobre locals e o gráfico de empréstimos. Locals registra informações sobre variáveis locais, enquanto o gráfico de empréstimos representa as relações de referência entre variáveis. O processo de análise irá atualizar continuamente essas informações de estado.
A vulnerabilidade ocorre durante o processo de mesclagem de estados. Quando o número total de parâmetros de função e variáveis locais excede 256, ocorre um estouro de inteiro devido ao uso do tipo u8 para representar o índice. Isso leva a erros nas informações do estado mesclado, o que pode resultar em ataques de negação de serviço.
Embora a linguagem Move tenha um mecanismo para verificar o número de variáveis locais, não considera o número de parâmetros. Esta omissão levou à criação de vulnerabilidades.
Para explorar esta vulnerabilidade, o atacante pode construir um bloco de código em loop, utilizando um estouro para alterar o estado do bloco. Quando executado novamente, devido a informações de estado incorretas, o acesso a variáveis inexistentes pode causar a falha do programa.
Esta vulnerabilidade demonstra novamente que, mesmo em linguagens cuidadosamente projetadas, podem existir riscos de segurança. Isso nos lembra da importância da auditoria de código e da necessidade de considerações de segurança mais abrangentes no design de linguagens. Para a linguagem Move, adicionar mais verificações em tempo de execução pode ser uma direção de melhoria.