Entendiendo los Ataques de Reentrada & Cómo Prevenirlos 🔐

robot
Generación de resúmenes en curso

Los ataques de reentrancia parecen complicados al principio. Déjame desglosarlos en términos simples y mostrarte algunas maneras de mantener seguros tus contratos inteligentes 🛡️

¿Qué es un ataque de reentrancia? 🧐

Es cuando ContractB llama de vuelta a ContractA mientras ContractA todavía está en ejecución. Cosas desagradables. A los atacantes les encanta esta vulnerabilidad para drenar fondos de los contratos 💸

Imagina esto:

  • ContractA tiene 10 ETH
  • ContractB puso 1 ETH
  • ContractB luego roba todo

El Mecanismo de Ataque 🕵️‍♂️

Necesitas dos cosas clave:

  1. attack() función para comenzar todo
  2. fallback() función para la parte astuta

El flujo va así:

  1. ContractB inicia el ataque() que llama a withdraw() de ContractA
  2. ContractA verifica el saldo de ContractB
  3. ContractA envía ETH a ContractB
  4. Esto activa la función de recuperación de ContractB()
  5. El bucle continúa. Dinero perdido 🚨

Es algo sorprendente lo simple pero devastador que esto puede ser.

Ejemplo de Código Vulnerable 📝

Así es como se ve un contrato vulnerable: solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

(bool enviado, ) = msg.sender.call{value: bal}("");
require(sent, "Error al enviar Ether");

balances[msg.sender] = 0; // ¿Actualizar DESPUÉS de enviar? ¡Gran error!

}

El contrato de ataque hace esto: solidity fallback() externo pagable { if(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }

función attack() externo pagable { require(msg.value >= 1 ether); etherStore.deposit{value: 1 ether}(); etherStore.retirarTodo(); }

Tres maneras de detener estos ataques 🛡️

1. modificador nonReentrant 🔒

solidity bool privado bloqueado = false;

modificador nonReentrant() { require(!locked, "No reentrancy"); locked = true; _; locked = false; }

Agrégalo a funciones vulnerables. Simple pero efectivo.

2. Patrón de Comprobaciones-Efectos-Interacciones 📊

Esto es crucial:

solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

balances[msg.sender] = 0; // Actualizar PRIMERO

(bool sent, ) = msg.sender.call{value: bal}(""); // ENTONCES interactuar
require(sent, "Error al enviar Ether");

}

Actualiza tu estado primero. Interactúa después. Siempre.

3. Protección Global 🌐

Para proyectos más grandes:

solidity contrato GlobalReentrancyGuard { bool privado bloqueado = falso;

modificador globalNoReentrante() {
    require(!locked, "No reentrancy");
    locked = true;
    _;
    locked = false;
}

}

Haz que todos tus contratos hereden esto. Ecosistema más seguro.

Últimas tendencias 🔥

A partir de septiembre de 2025, estos ataques aún afectan a DeFi. No está del todo claro por qué los desarrolladores siguen cometiendo los mismos errores. Herramientas como Slither pueden detectar estos problemas. Echidna y Foundry ayudan a probarlos 🚀

La seguridad no se trata solo de agregar un modificador. Es una mentalidad.

¡Mantente alerta por ahí! 🛡️

ETH2.07%
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.
  • Recompensa
  • Comentar
  • Republicar
  • Compartir
Comentar
0/400
Sin comentarios
  • Anclado
Opera con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)