Cargando precios…

Cómo revocar aprobaciones de contratos inteligentes (y por qué deberías hacerlo)

Las aprobaciones de tokens inactivas son uno de los principales vectores de ataque. Aquí tienes una rutina mensual para encontrar, clasificar y revocar los permisos arriesgados en Ethereum y las L2.

Cómo revocar aprobaciones de contratos inteligentes (y por qué deberías hacerlo)

Qué es realmente una aprobación de tokens y por qué sobrevive a la operación

Cuando intercambias un token en un exchange descentralizado, prestas activos en un mercado monetario o haces staking a través de un panel de DeFi, no entregas tus tokens a una persona. Lo que haces es firmar un mensaje que pide al contrato inteligente del token que permita a otro contrato inteligente mover una cantidad concreta de tus tokens en tu nombre. Ese mensaje firmado es la aprobación, y vive en la cadena de forma indefinida hasta que tú o alguien la cancela explícitamente.

Esta es la parte que la mayoría de los principiantes no entiende. La aprobación no está vinculada a una sola operación. Es un permiso permanente. El DEX o el protocolo de préstamos con el que interactuaste en 2023 puede, en principio, seguir moviendo tokens desde tu monedero hoy, porque el propio contrato del token registró que tiene autorización para hacerlo.

Hay dos modalidades que verás en una herramienta como Etherscan. Una aprobación "limitada" establece un tope, por ejemplo 100 USDC, tras el cual el contrato tiene que pedirte que vuelvas a firmar. Una aprobación "infinita" (técnicamente el valor máximo representable en un uint256, que es un entero sin signo de 256 bits, o un número tan grande que viene a ser ilimitado) no establece ningún tope. La mayoría de los front-ends de DeFi eligen la opción infinita por defecto porque ahorra al usuario una firma extra en cada operación futura, y porque pagar gas dos veces por la misma dapp parece un desperdicio.

La compensación es real: una aprobación infinita te resulta cómoda a ti, y también le resulta cómoda a cualquiera que tome el control de ese contrato más adelante.

El riesgo: cómo una aprobación olvidada se convierte en un vaciado

El modo de fallo rara vez es un nuevo hack ingenioso. Casi siempre responde a uno de tres patrones ya conocidos, y todos se agravan con aprobaciones que llevan meses acumulándose en la cadena.

1. El propio contrato se ve comprometido. Suplantan la identidad de una clave de desarrollador, secuestran un monedero multifirma o el protocolo sufre un ataque de gobernanza en el que los atacantes aprueban una propuesta que actualiza los contratos a una versión maliciosa. Una vez que el contrato se vuelve hostil, cada aprobación aún activa que posea es un arma cargada apuntando al monedero del usuario. El usuario no necesita interactuar con nada nuevo. El contrato simplemente ejecuta transferFrom por su cuenta.

2. El protocolo se abandona, pero el contrato no se pausa. Muchos proyectos de DeFi se lanzan, recaudan dinero, pierden interés y cierran silenciosamente. Los contratos siguen funcionando. Si más adelante se descubre una vulnerabilidad y no hay equipo que la parchee, los atacantes pueden vaciar todos los monederos que aprobaron esa dirección. Esto ha ocurrido repetidamente con contratos antiguos de staking y agregadores de rendimiento del ciclo 2020-2021.

3. Apruebas un sitio de phishing que parecía una dapp real. Una interfaz falsa de Uniswap o Aave hace que firmes una aprobación para un contrato controlado por el atacante. El usuario cree que está operando, pero en realidad ha dado a un desconocido permiso para vaciar un token concreto. En este caso, revocar es urgente, y además es la única solución, porque la aprobación firmada ya está en la cadena.

Fíjate en lo que falta en esta lista: no hace falta que te "hackeen de nuevo" para que se produzca el vaciado. La vulnerabilidad es la propia aprobación, guardada en frío en la blockchain, esperando a que un evento futuro la active.

Cómo ver lo que ya has aprobado

El primer paso es inventariar. Conecta tu monedero a una de las tres herramientas, todas las cuales leen los mismos datos de blockchain subyacentes y los presentan de formas ligeramente diferentes.

Revoke.cash es la más amigable para principiantes. Entras en el sitio, conectas tu monedero y muestra cada aprobación que has firmado en las cadenas compatibles, que hoy incluyen Ethereum, Arbitrum, Optimism, Base, Polygon, BNB Chain y la mayoría de las demás redes EVM (Ethereum Virtual Machine) importantes. Cada fila muestra el token, el gastador (el contrato que puede mover el token), la asignación (cuánto puede mover) y un botón 'Revocar'. También marca como potencialmente inactivos los contratos que no se han usado en mucho tiempo.

La herramienta de aprobación de tokens de Etherscan se encuentra en etherscan.io/tokenapprovalchecker. Es más tosca que Revoke.cash, pero la gestiona un equipo con un largo historial público y a veces detecta casos límite que Revoke.cash no ve. El flujo de trabajo es el mismo: conectar, revisar, revocar.

El gestor de aprobaciones integrado de Rabby es la única opción on-chain que no requiere visitar un sitio de terceros. Rabby es un monedero (una extensión de navegador y una app móvil) que lee tus aprobaciones y muestra una lista de 'aprobaciones peligrosas' dentro de la interfaz del monedero. Si ya usas Rabby, esta es la opción con menos fricción. Los datos son los mismos; la interfaz simplemente vive en un lugar en el que ya confías.

Sigas la herramienta que sigas, usa solo una por sesión. El riesgo de alternar entre varias pestañas de comprobadores de aprobaciones es que pierdes de vista qué sitio está conectado a tu monedero, lo que en sí mismo es un leve riesgo de phishing.

Cómo saber qué aprobaciones son realmente peligrosas

Una vez tengas la lista, no necesitas revocarlo todo. Un buen primer repaso prioriza las entradas más arriesgadas.

Las aprobaciones infinitas van primero. Ordena o filtra la lista buscando cualquier fila que muestre un número enorme, a menudo en notación científica como 1.15792e+59, que es la forma codificada del máximo uint256. Estas son las limpiezas con más impacto. Cada una es un contrato que puede mover el 100 por ciento de ese token desde tu monedero sin volver a preguntar.

Las aprobaciones limitadas a contratos que ya no usas van después. Si aprobaste un contrato de staking por exactamente 500 tokens hace dos años y ya no lo usas, esa aprobación sigue activa. Tiene un radio de impacto menor que una infinita, pero sigue siendo un arma cargada apuntando a un contrato que no supervisas.

Los contratos inactivos merecen escrutinio. La mayoría de las herramientas de aprobación muestran una marca de tiempo de 'último uso' o señalan los contratos que no han realizado transacciones en más de un año. Estas son las aprobaciones con más probabilidades de pertenecer a proyectos abandonados, y los proyectos abandonados son las aprobaciones con más probabilidades de ser explotadas más adelante. Revócalas.

Los contratos activos que todavía usas pueden esperar. Si operas activamente en Uniswap y prestas en Aave, puedes mantener esas aprobaciones abiertas. Revocar y volver a aprobar en cada operación desperdicia gas y añade fatiga de firmas, que es su propio riesgo de seguridad. El objetivo de una limpieza mensual no es tener cero aprobaciones; es tener cero aprobaciones obsoletas.

La mecánica de revocar y lo que cuesta realmente

Revocar es en sí mismo una transacción on-chain. Estás llamando a la función approve en el contrato del token y estableciendo tu asignación para ese gastador a cero. El contrato del token registra la nueva asignación y, a partir de ese bloque, el gastador ya no puede mover tus tokens.

En la mainnet de Ethereum, una sola revocación suele costar entre uno y cinco dólares en gas según la congestión. Si tienes veinte aprobaciones obsoletas, eso es una factura nada trivial. En redes de capa 2 (L2) como Base, Arbitrum u Optimism, la misma llamada cuesta céntimos, a veces fracciones de céntimo, porque las L2 agrupan transacciones y heredan la seguridad de Ethereum a la vez que cobran comisiones mucho más bajas. Si estás eligiendo dónde hacer tu limpieza mensual, hacerla en la L2 que realmente usas es casi siempre la opción correcta.

Hay un pequeño pero real escollo. Cuando envías una transacción de revocación, el monedero tiene que pagar gas, y el gas debe proceder del activo nativo de esa cadena, es decir, ETH en Ethereum y Arbitrum, MATIC en Polygon, BNB en BNB Chain. Si tu monedero solo tiene stablecoins y el saldo del activo nativo es cero, la revocación fallará. Mantén una pequeña cantidad del token nativo en cualquier monedero que vayas a limpiar, del orden de unos pocos dólares.

Otro escollo: revocar es irreversible en el sentido de que no recuperas el gas, pero también es trivialmente reversible en el sentido de que puedes volver a aprobar el mismo contrato al día siguiente. No hay penalización por revocar un contrato que luego decides usar de nuevo; simplemente tendrás que firmar una nueva aprobación, pagar su gas y seguir adelante.

Lo que revocar no hace

Revocar impide vaciados futuros desde el contrato que has revocado. No impide, ni puede impedir, un vaciado que ya haya ocurrido. Si tu monedero fue vaciado en marzo y tú revoques en mayo, los tokens de marzo están perdidos y la transacción de revocación no tiene relación alguna con el robo en ningún sentido legal, forense o recuperable.

Revocar tampoco te protege de una nueva aprobación que firmes mañana. Si visitas un sitio de phishing, firmas una aprobación a un contrato malicioso y luego intentas limpiar, la nueva aprobación es el problema, y revocar tu antigua asignación a Uniswap no hace nada para solucionarlo.

Revocar no mueve tus tokens. No requiere un swap, una firma de un tercero ni ninguna interacción con el contrato del gastador. Es una única llamada a la función del propio contrato del token, diciéndole que ponga a cero una fila de su libro de asignaciones.

Una rutina mensual que realmente puedes mantener

El mayor motivo por el que la gente nunca revoca es que parece una tarea puntual, lo que garantiza que nunca se haga. La solución más fiable es anclarla a un evento del calendario. El primer domingo del mes es una opción muy elegida porque los fines de semana son más tranquilos y es menos probable que estés a mitad de una operación; algunas personas eligen el día en que se cierra el extracto de su tarjeta de crédito por la misma razón. El día concreto no importa. Lo que importa es la repetición.

El día de la limpieza, el flujo de trabajo es breve. Abre Revoke.cash, Etherscan o el gestor de aprobaciones de Rabby. Conecta el monedero que uses de forma activa. Filtra primero las aprobaciones infinitas y revócalas. Después revisa los contratos inactivos, que la herramienta suele marcar, y revócalos también. Deja en paz los contratos activos que sigas utilizando. Confirma cada transacción, espera a que se asiente y cierra la pestaña.

Coste de tiempo en una L2: entre cinco y diez minutos, aproximadamente. Coste de tiempo en mainnet: similar, además de unos pocos dólares en gas. El hábito, una vez instaurado, te lleva menos tiempo que revisar el extracto bancario y se amortiza la primera vez que bloquea un drenaje.

Cómo seguir las noticias de seguridad de monederos de forma inteligente

Los incidentes de seguridad en monederos se mueven rápido, y la diferencia entre un «hackeo manejable» y una «pérdida total» casi siempre está en la rapidez con la que el usuario se entera de un contrato vulnerable y revoca su aprobación antes de que un atacante la explote. Seguir a mano el foro de gobernanza, los informes de auditoría y los análisis post-mortem de cada protocolo es una batalla perdida. Zippfeed muestra titulares sobre seguridad de monederos y exploits de DeFi con puntuación de sentimiento (bullish, neutral o bearish) y una valoración de importancia, para que puedas revocar las aprobaciones correctas antes del próximo drenaje, y no después.

Preguntas frecuentes

¿Es seguro usar Revoke.cash?
Revoke.cash es una de las herramientas de gestión de aprobaciones más utilizadas y, por defecto, es de solo lectura: al conectar tu monedero, el sitio puede leer tus aprobaciones, pero no puede mover fondos sin una transacción que tú firmes. Aun así, se aplican los riesgos habituales de cualquier dapp, así que comprueba siempre la URL, guárdala en marcadores en lugar de buscarla y nunca firmes una transacción que no entiendas. Educación, no consejo financiero: usar una herramienta de buena reputación es un buen hábito, pero ninguna herramienta elimina la necesidad de leer lo que estás firmando.
¿Cómo funciona realmente una aprobación ERC-20?
Cuando firmas una aprobación, estás llamando a la función approve del contrato inteligente de un token, indicándole que permita a una dirección de gastador concreta mover hasta una cantidad determinada de tus tokens. El contrato del token registra esa asignación y el gastador puede llamar a transferFrom en tu nombre hasta ese límite. La aprobación permanece en la cadena hasta que la vuelves a poner a cero. Por eso una aprobación a un contrato desaparecido hace tiempo sigue siendo un riesgo activo años después.
¿Debería revocar todas las aprobaciones que tengo?
No necesitas revocar todo, e intentarlo suele desperdiciar gas y añadir fatiga de firmas. Prioriza las aprobaciones infinitas a contratos que ya no usas, después las de contratos inactivos y luego las aprobaciones limitadas a protocolos antiguos. Mantén abiertas las aprobaciones de los protocolos que usas de forma activa, porque revocar y volver a aprobar en cada operación cuesta dinero y no aporta una seguridad real. El objetivo de una limpieza es dejar cero aprobaciones obsoletas, no cero aprobaciones.
¿Revocar una aprobación me reembolsará si ya me han vaciado el monedero?
No. Revocar una aprobación es una acción a futuro: impide que el contrato revocado mueva tus tokens en el futuro, pero no puede revertir, reembolsar ni recuperar tokens que ya hayan sido robados. Si te han vaciado, tu camino es la respuesta a incidentes, no la limpieza de aprobaciones: mueve los fondos restantes a un monedero nuevo, documenta las transacciones y denuncia al proyecto afectado y a firmas de análisis blockchain. La higiene de aprobaciones es prevención, no un mecanismo de reembolso.