🚨 ALERTA DE EXPLOIT: Se drenaron $35k de @DoinGudHQ
Un fallo clásico tipo reentrancy en la función acceptOffer. Aquí está la alfa:
La falla:
• La implementación 0x123aaf... transfiere $USDC a msg.sender, pero NUNCA elimina el registro de la oferta
• Comprobaciones faltantes: no hay guardia offerer != msg.sender, no hay requisito de offerAmount > 0
• ¿Resultado? La misma oferta se puede reproducir infinitamente con calldata idéntica
El daño:
• El atacante (0xb8c717...) drenó 70,973 $USDC en UNA sola tx mediante un flash loan
• Reprodujo acceptOffer dos veces y se fue con ~ $35k de ganancia
• Cero NFTs transferidos, cero principal en riesgo
Contrato víctima: 0xe3a161...
Atacante: 0xb8c717... / 0xe588834...
Lección: Siempre anula el estado después de las transferencias. La lógica swap-and-pop de cancelOffer brillaba por su ausencia aquí. Clásico tropiezo en DeFi.
SlowMist lo detectó. Mantente seguro ahí afuera.
Un fallo clásico tipo reentrancy en la función acceptOffer. Aquí está la alfa:
La falla:
• La implementación 0x123aaf... transfiere $USDC a msg.sender, pero NUNCA elimina el registro de la oferta
• Comprobaciones faltantes: no hay guardia offerer != msg.sender, no hay requisito de offerAmount > 0
• ¿Resultado? La misma oferta se puede reproducir infinitamente con calldata idéntica
El daño:
• El atacante (0xb8c717...) drenó 70,973 $USDC en UNA sola tx mediante un flash loan
• Reprodujo acceptOffer dos veces y se fue con ~ $35k de ganancia
• Cero NFTs transferidos, cero principal en riesgo
Contrato víctima: 0xe3a161...
Atacante: 0xb8c717... / 0xe588834...
Lección: Siempre anula el estado después de las transferencias. La lógica swap-and-pop de cancelOffer brillaba por su ausencia aquí. Clásico tropiezo en DeFi.
SlowMist lo detectó. Mantente seguro ahí afuera.