Análisis del ataque de reentrada de Flash Loans en Jarvis Network
Recientemente, un proyecto llamado Jarvis_Network sufrió un ataque de reentrada de Flash Loans, lo que resultó en la pérdida de aproximadamente 663,000 tokens MATIC. Este incidente ocurrió en la noche del 15 de enero de 2023.
A través de un análisis profundo de la pila de llamadas de transacciones, descubrimos que el atacante aprovechó una vulnerabilidad de reingreso. Durante el proceso de reingreso, se realizaron múltiples llamadas a la misma función del mismo contrato, pero el valor de retorno de cada llamada presentaba una gran diferencia. Esta diferencia se manifiesta principalmente en la función remove_liquidity.
Los ataques de reentrada ocurren durante el proceso de eliminación de liquidez. Dado que Polygon y EVM son cadenas homomorfas, cuando se transfiere MATIC al contrato, se activa la lógica de reentrada del contrato. A través de un análisis detallado de la pila de llamadas, encontramos que el problema radica en la función getUnderlyingPrice.
Una investigación más profunda reveló que los atacantes aprovecharon una vulnerabilidad en el momento de actualización de la variable self.D al eliminar la liquidez. Normalmente, el flujo del método remove_liquidity debería ser: 1) destruir el LP del usuario; 2) enviar los fondos apostados al usuario; 3) actualizar self.D. Sin embargo, los atacantes realizaron una operación de reentrada en el segundo paso, lo que provocó un error grave en el cálculo de precios.
A pesar de que la función remove_liquidity utiliza el decorador @nonreentrant('lock') para prevenir la reentrada, este bloqueo de reentrada no funcionó debido a que el atacante reentró en otros contratos para tomar prestados fondos.
Este ataque expuso principalmente dos problemas:
La lógica de modificación de variables se encuentra después de la llamada externa, lo que provoca una anomalía en la obtención del precio.
La reinserción entre contratos hace que el bloqueo de reinserción sea ineficaz.
Para prevenir ataques similares, se recomienda que los desarrolladores del proyecto tomen las siguientes medidas:
Asegúrate de que el código haya pasado por una auditoría de seguridad rigurosa.
Coloca la modificación de variables antes de la llamada externa.
Utilizar múltiples fuentes de datos para obtener precios.
Seguir la norma de codificación "primero juzgar, luego escribir en la variable, y después realizar la llamada externa" (Checks-Effects-Interactions).
Al adoptar estas medidas, el proyecto puede mejorar significativamente su seguridad y estabilidad, proporcionando a los usuarios un servicio más confiable.
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
9 me gusta
Recompensa
9
2
Compartir
Comentar
0/400
WalletAnxietyPatient
· 08-04 20:55
El inversor minorista que es malo en el juego y le gusta jugar, recuerda hacer una copia de seguridad de la llave privada a tiempo.
Idioma del contenido: chino
Comentario dado:
No hacer auditoría de contratos y sufrir por esto es una pena~
Ver originalesResponder0
LiquidatedNotStirred
· 08-04 20:48
Otra vez reentrada jaja, ya era hora de bloquearlo.
Jarvis Network sufrió un ataque de reentrada por Flash Loans, con una pérdida de 66.3 mil MATIC
Análisis del ataque de reentrada de Flash Loans en Jarvis Network
Recientemente, un proyecto llamado Jarvis_Network sufrió un ataque de reentrada de Flash Loans, lo que resultó en la pérdida de aproximadamente 663,000 tokens MATIC. Este incidente ocurrió en la noche del 15 de enero de 2023.
A través de un análisis profundo de la pila de llamadas de transacciones, descubrimos que el atacante aprovechó una vulnerabilidad de reingreso. Durante el proceso de reingreso, se realizaron múltiples llamadas a la misma función del mismo contrato, pero el valor de retorno de cada llamada presentaba una gran diferencia. Esta diferencia se manifiesta principalmente en la función remove_liquidity.
Los ataques de reentrada ocurren durante el proceso de eliminación de liquidez. Dado que Polygon y EVM son cadenas homomorfas, cuando se transfiere MATIC al contrato, se activa la lógica de reentrada del contrato. A través de un análisis detallado de la pila de llamadas, encontramos que el problema radica en la función getUnderlyingPrice.
Una investigación más profunda reveló que los atacantes aprovecharon una vulnerabilidad en el momento de actualización de la variable self.D al eliminar la liquidez. Normalmente, el flujo del método remove_liquidity debería ser: 1) destruir el LP del usuario; 2) enviar los fondos apostados al usuario; 3) actualizar self.D. Sin embargo, los atacantes realizaron una operación de reentrada en el segundo paso, lo que provocó un error grave en el cálculo de precios.
A pesar de que la función remove_liquidity utiliza el decorador @nonreentrant('lock') para prevenir la reentrada, este bloqueo de reentrada no funcionó debido a que el atacante reentró en otros contratos para tomar prestados fondos.
Este ataque expuso principalmente dos problemas:
Para prevenir ataques similares, se recomienda que los desarrolladores del proyecto tomen las siguientes medidas:
Al adoptar estas medidas, el proyecto puede mejorar significativamente su seguridad y estabilidad, proporcionando a los usuarios un servicio más confiable.
Idioma del contenido: chino
Comentario dado:
No hacer auditoría de contratos y sufrir por esto es una pena~