Análise do ataque de reentrada de Empréstimos Flash na Jarvis Network
Recentemente, um projeto chamado Jarvis_Network sofreu um ataque de reentrada de Empréstimos Flash, resultando na perda de cerca de 663 mil tokens MATIC. Este incidente ocorreu na noite de 15 de janeiro de 2023.
Através de uma análise aprofundada da pilha de chamadas de transações, descobrimos que o atacante explorou uma vulnerabilidade de reentrada. Durante o processo de reentrada, a mesma função do mesmo contrato foi chamada várias vezes, mas os valores de retorno de cada chamada apresentaram grandes diferenças. Essa diferença manifesta-se principalmente na função remove_liquidity.
O ataque de reentrada ocorre durante o processo de remoção de liquidez. Como Polygon e EVM são cadeias homogêneas, quando MATIC é transferido para o contrato, a lógica de reentrada do contrato é ativada. Através de uma análise detalhada da pilha de chamadas, descobrimos que o problema está na função getUnderlyingPrice.
Uma investigação mais aprofundada revelou que o atacante explorou uma falha no momento da atualização da variável self.D ao remover a liquidez. Normalmente, o fluxo do método remove_liquidity deveria ser: 1) destruir o LP do usuário; 2) enviar os fundos de staking ao usuário; 3) atualizar self.D. No entanto, o atacante realizou uma operação de reentrada na segunda etapa, resultando em um erro grave no cálculo do preço.
Apesar de a função remove_liquidity usar o decorador @nonreentrant('lock') para prevenir reentrâncias, o bloqueio de reentrância não teve efeito, pois o atacante reentrou em outros contratos para pegar fundos emprestados.
Este ataque expôs principalmente dois problemas:
A lógica de modificação da variável está localizada após a chamada externa, levando a uma anomalia na obtenção do preço.
A reentrada entre contratos faz com que o bloqueio de reentrada fique ineficaz.
Para evitar ataques semelhantes, recomenda-se que as partes do projeto adotem as seguintes medidas:
Certifique-se de que o código passou por uma auditoria de segurança rigorosa.
Coloque a modificação da variável antes da chamada externa.
Utilizar múltiplas fontes de dados para obter preços.
Seguir a norma de codificação "primeiro verificar, depois escrever em variáveis, e então realizar chamadas externas" (Checks-Effects-Interactions).
Ao adotar essas medidas, o projeto pode aumentar significativamente sua segurança e estabilidade, proporcionando serviços mais confiáveis aos usuários.
Ver original
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.
9 gostos
Recompensa
9
2
Partilhar
Comentar
0/400
WalletAnxietyPatient
· 08-04 20:55
Um investidor de retalho que é inexperiente e gosta de brincar, lembre-se de fazer backup da sua Chave privada a tempo.
Idioma do conteúdo: Chinês
Comentários dados:
Não fazer auditorias de contratos e sofrer as consequências.
Ver originalResponder0
LiquidatedNotStirred
· 08-04 20:48
Outra vez reentrada haha já devia ter bloqueado isso.
A Jarvis Network sofreu um ataque de reentrada através de Empréstimos Flash, resultando em uma perda de 66,3 mil MATIC.
Análise do ataque de reentrada de Empréstimos Flash na Jarvis Network
Recentemente, um projeto chamado Jarvis_Network sofreu um ataque de reentrada de Empréstimos Flash, resultando na perda de cerca de 663 mil tokens MATIC. Este incidente ocorreu na noite de 15 de janeiro de 2023.
Através de uma análise aprofundada da pilha de chamadas de transações, descobrimos que o atacante explorou uma vulnerabilidade de reentrada. Durante o processo de reentrada, a mesma função do mesmo contrato foi chamada várias vezes, mas os valores de retorno de cada chamada apresentaram grandes diferenças. Essa diferença manifesta-se principalmente na função remove_liquidity.
O ataque de reentrada ocorre durante o processo de remoção de liquidez. Como Polygon e EVM são cadeias homogêneas, quando MATIC é transferido para o contrato, a lógica de reentrada do contrato é ativada. Através de uma análise detalhada da pilha de chamadas, descobrimos que o problema está na função getUnderlyingPrice.
Uma investigação mais aprofundada revelou que o atacante explorou uma falha no momento da atualização da variável self.D ao remover a liquidez. Normalmente, o fluxo do método remove_liquidity deveria ser: 1) destruir o LP do usuário; 2) enviar os fundos de staking ao usuário; 3) atualizar self.D. No entanto, o atacante realizou uma operação de reentrada na segunda etapa, resultando em um erro grave no cálculo do preço.
Apesar de a função remove_liquidity usar o decorador @nonreentrant('lock') para prevenir reentrâncias, o bloqueio de reentrância não teve efeito, pois o atacante reentrou em outros contratos para pegar fundos emprestados.
Este ataque expôs principalmente dois problemas:
Para evitar ataques semelhantes, recomenda-se que as partes do projeto adotem as seguintes medidas:
Ao adotar essas medidas, o projeto pode aumentar significativamente sua segurança e estabilidade, proporcionando serviços mais confiáveis aos usuários.
Idioma do conteúdo: Chinês
Comentários dados:
Não fazer auditorias de contratos e sofrer as consequências.