Análise do ataque de reentrada de Empréstimos Flash ao projeto Jarvis Network
No dia 15 de janeiro de 2023, o projeto Jarvis_Network sofreu um ataque na rede Polygon, resultando em uma perda de aproximadamente 663 mil MATIC. A análise mostra que os atacantes aproveitaram empréstimos flash e uma vulnerabilidade de reentrada para realizar o ataque.
A análise da pilha de chamadas de transação de ataque mostra que, durante o reentrância, ao chamar a mesma função do mesmo contrato, os parâmetros de entrada são os mesmos, mas os valores de retorno apresentam diferenças significativas. Os valores de retorno antes e depois da reentrância são, respectivamente:
Reentrada: 1002157321772769944
Reentrada: 10091002696492234934
A reentrada ocorre na função remove_liquidity. Esta função devolve os tokens adicionados pelo usuário ao remover a liquidez. Devido à compatibilidade do Polygon com o EVM, a reentrada foi acionada quando o MATIC foi transferido para o contrato.
Uma análise aprofundada revelou que o problema está na implementação da função getUnderlyingPrice. Esta função envolve uma série de cálculos internos e chamadas externas, sendo que a chave é o valor de retorno da função get_virtual_price. O valor de retorno desta função é influenciado pela variável self.D, e a atualização de self.D ocorre após a transferência de tokens.
O atacante, ao remover a liquidez, transferiu MATIC para o contrato de ataque e, através de um callback, consultou primeiro o preço do token. Como self.D ainda não havia sido atualizado, isso resultou em um erro na obtenção do preço. O atacante aproveitou essa diferença de tempo e, durante a reentrada, aumentou o preço do empréstimo em cerca de 10 vezes.
Embora a função remove_liquidity use o decorador @nonreentrant('lock') para prevenir reentradas, os atacantes conseguiram contornar este mecanismo de proteção através de reentradas entre contratos.
Este ataque expôs várias questões-chave:
A lógica de modificação da variável está localizada após a chamada externa, o que leva a uma anomalia na obtenção do preço.
A reentrada entre contratos torna o bloqueio de reentrada ineficaz.
Não seguir o padrão "Verificação-Efeitos-Interações" (Checks-Effects-Interactions).
Para evitar ataques semelhantes, recomenda-se que a equipe do projeto:
Realizar auditorias de segurança rigorosas
Mova a modificação da variável para antes da chamada externa
Utilizar múltiplas fontes de dados para obter preços
Seguir a norma de codificação "Verificar-Ativar-Interagir"
Com estas medidas, é possível aumentar significativamente a segurança e a estabilidade do projeto.
https://img-cdn.gateio.im/webp-social/moments-9b2de9b00c52d3ff96d5a361df65769a.webp(
![Análise do Evento de Ataque de Reentrada do Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-88f9283ee0923cff2a22405715721cd2.webp(
![Análise do incidente de ataque de reentrada do Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-d41ac025ee561569cce3b941d7e07967.webp(
![Análise do evento de ataque de reentrada de Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-2c4474781d661306bc8c432dad3942c0.webp(
Ver original
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.
Jarvis Network sofreu um ataque de reentrada por Empréstimos Flash, perdendo 66.3 mil MATIC
Análise do ataque de reentrada de Empréstimos Flash ao projeto Jarvis Network
No dia 15 de janeiro de 2023, o projeto Jarvis_Network sofreu um ataque na rede Polygon, resultando em uma perda de aproximadamente 663 mil MATIC. A análise mostra que os atacantes aproveitaram empréstimos flash e uma vulnerabilidade de reentrada para realizar o ataque.
A análise da pilha de chamadas de transação de ataque mostra que, durante o reentrância, ao chamar a mesma função do mesmo contrato, os parâmetros de entrada são os mesmos, mas os valores de retorno apresentam diferenças significativas. Os valores de retorno antes e depois da reentrância são, respectivamente:
A reentrada ocorre na função remove_liquidity. Esta função devolve os tokens adicionados pelo usuário ao remover a liquidez. Devido à compatibilidade do Polygon com o EVM, a reentrada foi acionada quando o MATIC foi transferido para o contrato.
Uma análise aprofundada revelou que o problema está na implementação da função getUnderlyingPrice. Esta função envolve uma série de cálculos internos e chamadas externas, sendo que a chave é o valor de retorno da função get_virtual_price. O valor de retorno desta função é influenciado pela variável self.D, e a atualização de self.D ocorre após a transferência de tokens.
O atacante, ao remover a liquidez, transferiu MATIC para o contrato de ataque e, através de um callback, consultou primeiro o preço do token. Como self.D ainda não havia sido atualizado, isso resultou em um erro na obtenção do preço. O atacante aproveitou essa diferença de tempo e, durante a reentrada, aumentou o preço do empréstimo em cerca de 10 vezes.
Embora a função remove_liquidity use o decorador @nonreentrant('lock') para prevenir reentradas, os atacantes conseguiram contornar este mecanismo de proteção através de reentradas entre contratos.
Este ataque expôs várias questões-chave:
Para evitar ataques semelhantes, recomenda-se que a equipe do projeto:
Com estas medidas, é possível aumentar significativamente a segurança e a estabilidade do projeto.
https://img-cdn.gateio.im/webp-social/moments-9b2de9b00c52d3ff96d5a361df65769a.webp(
![Análise do Evento de Ataque de Reentrada do Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-88f9283ee0923cff2a22405715721cd2.webp(
![Análise do incidente de ataque de reentrada do Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-d41ac025ee561569cce3b941d7e07967.webp(
![Análise do evento de ataque de reentrada de Empréstimos Flash Jarvis Network])https://img-cdn.gateio.im/webp-social/moments-2c4474781d661306bc8c432dad3942c0.webp(