Descoberta de nova vulnerabilidade de estouro de inteiro no mecanismo de segurança de referência da linguagem Move
Recentemente, ao realizar um estudo aprofundado sobre a linguagem Move, descobrimos uma nova vulnerabilidade de estouro de inteiro. Esta vulnerabilidade ocorre durante o processo de verificação de segurança das referências, envolvendo alguns mecanismos centrais da linguagem Move. Ao analisar essa vulnerabilidade, podemos entender mais profundamente o design e a implementação da linguagem Move.
O processo de validação da linguagem Move
A linguagem Move valida as unidades de código antes de executar o bytecode, e este processo é dividido em 4 etapas. A vulnerabilidade descoberta desta vez ocorreu na etapa reference_safety.
O módulo reference_safety define as funções principais para verificar a segurança das referências. Ele verifica principalmente se existem referências pendentes, se o acesso a referências mutáveis é seguro, se o acesso a referências de armazenamento global é seguro, entre outros problemas.
A função de entrada do processo de verificação chamará analyze_function para analisar cada função. analyze_function validará cada bloco básico dentro da função. Um bloco básico refere-se a uma sequência de código sem instruções de ramificação, exceto a entrada e a saída.
Segurança de referências na linguagem Move
A linguagem Move suporta dois tipos de referências: referência imutável (&) e referência mutável (&mut). A referência imutável é usada para ler dados, enquanto a referência mutável é usada para modificar dados. Este design ajuda a melhorar a segurança e a legibilidade do código.
O módulo de verificação de segurança irá escanear as instruções de bytecode de cada bloco básico na função, avaliando se todas as operações de referência são legais. O processo de verificação inclui principalmente:
Executar o código do bloco básico
Estado antes e depois da execução da fusão
Atualizar o estado do bloco
Propagar as condições posteriores para os blocos subsequentes
Este processo é semelhante à ideia Sea of Nodes no V8 turbofan.
Análise de Vulnerabilidades
A vulnerabilidade ocorre no processo de execução do estado antes e depois da fusão. Quando o comprimento dos parâmetros da função mais o comprimento das variáveis locais excede 256, o uso do tipo u8 para representar o índice das variáveis locais pode causar um overflow de inteiro.
Embora a linguagem Move tenha um processo para verificar o número de variáveis locais, essa verificação não inclui o comprimento dos parâmetros. Os desenvolvedores parecem ter percebido a necessidade de verificar a soma dos parâmetros e variáveis locais, mas o código real apenas verifica o número de variáveis locais.
Esta sobrecarga de inteiro pode levar a um ataque de negação de serviço ( DoS ). O atacante pode construir um bloco de código em loop que usa a sobrecarga para alterar o estado do bloco. Quando o bloco básico é executado novamente, se o índice que a instrução precisa acessar não existir no novo estado, isso fará com que o programa falhe.
Exploração de Vulnerabilidades
Construímos uma prova de conceito (PoC) para demonstrar esta vulnerabilidade:
Criar um bloco básico que contém instruções de desvio incondicional, para que seja executado várias vezes.
Defina o número total de parâmetros e variáveis locais como 264, resultando em um estouro de comprimento de mapeamento de variáveis locais de 8.
Ao executar o bloco básico novamente, tentar acessar um índice de variável local que não existe provoca um pânico.
Conclusão
Esta vulnerabilidade prova novamente que não há código absolutamente seguro. Embora a linguagem Move tenha verificação estática antes da execução, ainda pode ser contornada por uma vulnerabilidade de estouro de inteiro.
Para o futuro desenvolvimento da linguagem Move, sugerimos:
Adicionar mais código de verificação em tempo de execução para evitar situações inesperadas.
Não deve depender apenas das verificações de segurança na fase de validação, mas também deve realizar o fortalecimento da segurança na fase de execução.
Como pioneiros na pesquisa de segurança da linguagem Move, continuaremos a aprofundar a investigação sobre as questões de segurança da Move, contribuindo para o seu desenvolvimento.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 gostos
Recompensa
16
3
Partilhar
Comentar
0/400
SnapshotLaborer
· 3h atrás
Depois de cinco minutos de estudo, já vais reportar um bug, certo?
Ver originalResponder0
RadioShackKnight
· 4h atrás
move lama não pode ser levantada na parede
Ver originalResponder0
LayerZeroHero
· 4h atrás
Há uma coisa a dizer, o move não é nada de especial.
Foi descoberta uma nova vulnerabilidade de estouro de inteiros na verificação de segurança de referências da linguagem Move.
Descoberta de nova vulnerabilidade de estouro de inteiro no mecanismo de segurança de referência da linguagem Move
Recentemente, ao realizar um estudo aprofundado sobre a linguagem Move, descobrimos uma nova vulnerabilidade de estouro de inteiro. Esta vulnerabilidade ocorre durante o processo de verificação de segurança das referências, envolvendo alguns mecanismos centrais da linguagem Move. Ao analisar essa vulnerabilidade, podemos entender mais profundamente o design e a implementação da linguagem Move.
O processo de validação da linguagem Move
A linguagem Move valida as unidades de código antes de executar o bytecode, e este processo é dividido em 4 etapas. A vulnerabilidade descoberta desta vez ocorreu na etapa reference_safety.
O módulo reference_safety define as funções principais para verificar a segurança das referências. Ele verifica principalmente se existem referências pendentes, se o acesso a referências mutáveis é seguro, se o acesso a referências de armazenamento global é seguro, entre outros problemas.
A função de entrada do processo de verificação chamará analyze_function para analisar cada função. analyze_function validará cada bloco básico dentro da função. Um bloco básico refere-se a uma sequência de código sem instruções de ramificação, exceto a entrada e a saída.
Segurança de referências na linguagem Move
A linguagem Move suporta dois tipos de referências: referência imutável (&) e referência mutável (&mut). A referência imutável é usada para ler dados, enquanto a referência mutável é usada para modificar dados. Este design ajuda a melhorar a segurança e a legibilidade do código.
O módulo de verificação de segurança irá escanear as instruções de bytecode de cada bloco básico na função, avaliando se todas as operações de referência são legais. O processo de verificação inclui principalmente:
Este processo é semelhante à ideia Sea of Nodes no V8 turbofan.
Análise de Vulnerabilidades
A vulnerabilidade ocorre no processo de execução do estado antes e depois da fusão. Quando o comprimento dos parâmetros da função mais o comprimento das variáveis locais excede 256, o uso do tipo u8 para representar o índice das variáveis locais pode causar um overflow de inteiro.
Embora a linguagem Move tenha um processo para verificar o número de variáveis locais, essa verificação não inclui o comprimento dos parâmetros. Os desenvolvedores parecem ter percebido a necessidade de verificar a soma dos parâmetros e variáveis locais, mas o código real apenas verifica o número de variáveis locais.
Esta sobrecarga de inteiro pode levar a um ataque de negação de serviço ( DoS ). O atacante pode construir um bloco de código em loop que usa a sobrecarga para alterar o estado do bloco. Quando o bloco básico é executado novamente, se o índice que a instrução precisa acessar não existir no novo estado, isso fará com que o programa falhe.
Exploração de Vulnerabilidades
Construímos uma prova de conceito (PoC) para demonstrar esta vulnerabilidade:
Conclusão
Esta vulnerabilidade prova novamente que não há código absolutamente seguro. Embora a linguagem Move tenha verificação estática antes da execução, ainda pode ser contornada por uma vulnerabilidade de estouro de inteiro.
Para o futuro desenvolvimento da linguagem Move, sugerimos:
Como pioneiros na pesquisa de segurança da linguagem Move, continuaremos a aprofundar a investigação sobre as questões de segurança da Move, contribuindo para o seu desenvolvimento.