Los gemelos Winklevoss son conocidos por ser los supuestos padres fundadores de Facebook; de hecho, recibieron 65 millones de dólares a modo de compensación por parte de Mark Zuckerberg en el 2008. En el año 2013, invirtieron una gran cantidad en Bitcoin, comprando aproximadamente un 1 % de todas las monedas existentes a 120 dólares cada una.
Poco después los hermanos inauguraron la plataforma de intercambio de criptomonedas Gemini y en el 2018 lanzaron una stablecoin: el dólar Gemini (GUSD). Una stablecoin es una criptomoneda de interés fijo (1 GUSD siempre equivale a 1 dólar estadounidense). Este tipo de criptomonedas son útiles para la “digitalización” de dólares auténticos, ya que hacen que mover dólares de la cadena de bloques entre plataformas de intercambio sea rápido y sencillo. El aval de la conversión inversa a dólares es la compañía que te los expedía y vendía.
Gracias al servicio de revisión del código fuente del contrato inteligente, analizamos un contrato inteligente estipulado en GUSD y detectamos un error.
Descargo de responsabilidad
Cabe señalar que el contrato inteligente ya se había revisado, aunque no sabemos si en el informe se describieron los fallos del código.
De acuerdo con nuestra política de divulgación responsable, contactamos con el equipo de seguridad de Gemini para reportar el problema. Nos informaron que este asunto ya se había considerado durante la fase de diseño, pero que no presentaba ningún riesgo para los GUSD.
En este artículo de nuestro blog encontrarás una explicación sencilla sobre el funcionamiento de los contratos inteligentes, Ethereum e ICO.
Contratos inteligentes con el dólar Gemini
En términos generales, cuando alguien quiere crear nuevos tokens con la cadena de bloques Ethereum, escriben un contrato inteligente (un miniprograma) que especifica lo siguiente:
- Datos (“estos tokens están en estas direcciones).
- Métodos (“por favor, transfiere mis tokens a estas direcciones”, además de otros).
Los creadores del sistema del dólar Gemini implementaron también las siguientes mejoras:
- Separaron el contrato en tres componentes: “Proxy” (la interfaz permanente con la que los titulares de los tokens pueden interactuar y realizar operaciones), “Store” (la asignación de los titulares de tokens a sus saldos) e “Impl” (la lógica subyacente).
- El componente que describe la lógica puede actualizarse y complementarse con nuevas funciones como la habilidad de congelar fondos. Mientras tanto, los datos y la interfaz no muestran cambios, la actualización es visible para todos.
- Para la actualización y el control, se utiliza un contrato inteligente “de custodia” aislado que administran varias personas (custodios) para una protección adicional. Si un custodio propone una acción, los demás tendrán que confirmarla para que pueda llevarse a cabo.
Las mejoras son profundas y aumentan en general la seguridad y flexibilidad.
Pagos antispam
Para que cualquier otro que no sea el custodio principal introduzca una propuesta en un contrato de custodia, debe pagar una participación de 1 ETH (unos 200 dólares según la tasa de cambio actual). Como se señala en el mismo contrato, la medida antispam pretende evitar que los participantes creen muchas solicitudes.
Los pagos antispam van dirigidos a una persona: la que anuncia la aprobación de una propuesta/solicitud en concreto. Esta implementación no parece muy equitativa, pero los comentarios indican claramente que sus creadores lo han concebido de esta forma.
} else {
if (address(this).balance > 0) {
// reward sender with anti-spam payments
// ignore send success (assign to ʹsuccessʹ but this will be overwritten)
success = msg.sender.send(address(this).balance);
Por nuestra parte, recomendamos el uso de la estrategia Solidity Withdrawal Pattern.
Los atacantes pueden robar todos los pagos antispam
La persona que determina la aprobación de la solicitud también recibe todos los pagos antispam de ETH. Para ello, él o ella llama a la función de contrato inteligente completeUnlock y aprueba las firmas de dos custodios en los parámetros.
El problema es que Ethereum, como cualquier otra cadena de bloques, ejecuta solicitudes con retraso. Una transacción de cliente (transferir dinero o llamar a una función) debe esperar un tiempo en línea (unos 15 segundos o más). Durante este tiempo, absolutamente cualquier persona puede ver las transferencias programadas de otros usuarios de Ethereum, incluidas las cantidades, los destinatarios y los parámetros. Y el mirón podría usar esta información para crear su propia transacción y llevarla al frente pagando una comisión más alta al minero.
Cualquier ventaja conseguida mediante este método se considera un tipo de ataque conocido como front-running o inversión ventajista.
De investopedia.com:
La inversión ventajista se produce cuando un bróker u otra entidad realiza una operación porque tiene conocimiento previo de una gran transacción no publicada que influirá en el precio del activo, lo que resulta en una ganancia financiera probable para el bróker. También ocurre cuando un bróker o analista compra o vende acciones por su cuenta antes de la recomendación de compra o venta de su empresa a los clientes.
En nuestro caso, un completo extraño puede configurar un robot para monitorear el contrato de custodia. Si ve que alguien llamó a la función completeUnlock (es decir, un custodio está interactuando con el dólar Gemini), inmediatamente copia todos los parámetros y llama a la función para extraer el Ether que se ha acumulado allí.
Para contrarrestar tal ataque, nuevamente te recomendamos usar la famosa estrategia Solidity Withdrawal Pattern.
Además de eso, también te recomendamos que bloquees la opción de que desconocidos puedan llamar a una función destinada a custodios.
La implementación práctica de un ataque
Aunque sea peligrosa en teoría, la vulnerabilidad detectada también es benévola en la práctica. Te explicamos por qué:
- Los pagos antispam no preocupan a los custodios de una empresa de la magnitud del dólar Gemini. La capitalización de GUSD (el volumen total de tokens emitidos) en un punto superó los 100 millones de dólares y ahora supera los 5 millones de dólares.
- Los pagos antispam no han aparecido todavía en este contrato y puede que nunca lo hagan, ya que el custodio principal no está obligado a depositarlos (los demás sí).
- Conocer la vulnerabilidad permite a los usuarios evitar la función vulnerable o actualizar el contrato.
- Durante el análisis, no encontramos vulnerabilidades que amenazaran a los tokens de GUSD.
Gemini afirma: “Elegimos este diseño porque Gemini no tiene la intención de utilizar Ether en condiciones normales y, en conscuencia, tomamos una decisión basados en el riesgo de no expandir materialmente la complejidad de nuestra base de código únicamente para obtener el beneficio inmaterial de un mecanismo de recuperación más seguro para una inversión teórica y nominal contra el spam. Dar prioridad al código seguro y sencillo sigue siendo la mejor solución para el dólar Gemini y sus usuarios. En el futuro, podremos reconsiderar esta decisión si el riesgo cambia y optar por un contrato más costoso y complejo”.
Decidimos publicar este artículo en coordinación con Gemini, dado que las inversiones antispam están en riesgo solo a través de una combinación de circunstancias específicas e improbables, y GUSD no está en riesgo.
Nuevamente, recordamos a todos la necesidad de una estrategia de seguridad holística para las ICO y otras actividades relacionadas con las criptomonedas y las cadenas de bloques.