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ú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.
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.