¿Qué es Reentrancy Attack?
Un Reentrancy Attack ocurre cuando un contrato cede el control a otro contrato durante una llamada y ese código externo vuelve a entrar en el primer contrato antes de que termine de actualizar sus registros. Ese truco de sincronización permite al atacante repetir acciones sensibles como retiros una y otra vez. Imagínate solicitar un reembolso y volver al mostrador antes de que el cajero cierre la caja.
“Solo el código antiguo puede ser víctima de un Reentrancy Attack.” No es cierto. Cualquier contrato que haga una llamada externa antes de fijar su propio estado puede ser vulnerable si la lógica es descuidada.
Cómo funciona Reentrancy Attack
Historia breve. Un contrato inteligente típico tiene una función de retiro que envía fondos al llamante. Si envía los fondos primero y borra el saldo después, un atacante puede colarse con una devolución de llamada y pedir más antes de que el saldo se ponga en cero.
- Inicio: El atacante deposita algunos fondos para parecer legítimo.
- Llamada: El atacante activa withdraw en el contrato objetivo.
- Fallback: El objetivo envía fondos, lo que ejecuta la función fallback del atacante.
- Repetir: Ese fallback llama a withdraw otra vez antes de que se actualice el saldo.
- Agotar: El bucle continúa hasta que el contrato se queda sin fondos o sin gas. Sí, ese es el truco.
Un pequeño error en el orden, gran problema.
Por qué importa Reentrancy Attack
Te interesa porque los fallos de sincronización mueven dinero real, y rápido. Además, es uno de esos exploits clásicos que todo desarrollador y usuario curioso debería reconocer a simple vista.
- Beneficio: Conocer el patrón te ayuda a detectar código riesgoso y proteger los fondos.
- Perspectiva: Se aprovecha de la transparencia pública ya que todo en una blockchain es visible y llamable.
- Relevancia: Lo verás en DeFi, puentes, tesorerías e incluso pagos de gobernanza para DAOs.
Sigue el orden: comprobaciones, luego efectos, luego interacciones. Actualiza los saldos primero y luego realiza llamadas externas. Añade un simple reentrancy guard para mayor seguridad.
Características clave de Reentrancy Attack
Esto es lo que lo hace funcionar:
- Recursión: Código externo llama de nuevo al mismo contrato antes de que termine.
- Orden: El fallo aparece cuando enviar fondos o llamar hacia afuera ocurre antes de las actualizaciones de estado.
- Cruce: Puede rebotar entre múltiples contratos, no solo en una función.
- Activos: Funciona con ETH, tokens e incluso créditos contables si están mal codificados.
Variaciones
Diferentes versiones, mismo dolor de cabeza para código descuidado:
- Simple: Reentrar la misma función repetidamente.
- Cruce: Reentrar mediante una función diferente dentro del mismo contrato.
- Multi: Reentrar a través de dos o más contratos en bucle.
- SoloLectura: Influir en vistas u oráculos de precios para engañar escrituras posteriores.
Arreglar un Reentrancy Attack no se reduce a una sola función. Revisa cada llamada externa, añade pruebas para cadenas de llamada extrañas y programa auditorías regulares.
Ejemplo
El exploit de The DAO en 2016 usó un bucle de reentrancia en withdraw antes de que los saldos se borraran, vaciando una enorme tesorería en minutos.
Dato curioso
La frase de la comunidad “comprobaciones, luego efectos, luego interacciones” vino de guías de seguridad tempranas y se quedó porque es corta, fácil de recordar y funciona.
Resumen
Versión corta para llevar: si código externo puede llamarte antes de que termines tu propia contabilidad, asume que lo hará y podrías regalar dinero. Eso es un Reentrancy Attack.
