El exploit del puente Ronin de 10 millones de dólares del 6 de agosto fue causado por un script de implementación de actualización defectuoso, según un informe de la empresa de seguridad blockchain Verichains.
La actualización redujo el umbral de votación para los validadores a cero, lo que esencialmente permite que cualquier usuario se retire del puente “sin firma”, afirmó Verichains.
El propietario del bot luego devolvió la mayor parte de los fondos al equipo Ronin.
El análisis de Verichains deja al descubierto los riesgos que corren los usuarios cuando interactúan con contratos inteligentes actualizables. El protocolo podría haber perdido el monto total si el atacante hubiera pagado más en gas y, por lo tanto, hubiera evitado al líder.
Ronin es una red blockchain dedicada a alojar juegos Web3. Es más conocida por ser el hogar de Axie Infinity, un juego de cría de monstruos en el que se juega para ganar y que afirmó tener más de 2 millones de jugadores durante su apogeo en 2022. Los jugadores del juego Ronin usan el puente para transferir fondos entre Ethereum y Ronin.
Según el informe de Verichains, el puente se basa en la variable mimimumVoteWeight para evitar que los usuarios retiren fondos que no les pertenecen. Cada transacción debe ser autorizada por un número mínimo de validadores establecido por esta variable. Cuando se calcula minimumVoteWeight, se utiliza otra variable, totalWeight, como entrada.
En versiones anteriores del puente, totalWeight existía en un contrato independiente, llamado “MainchainBridgeManager”. Cuando los desarrolladores crearon la nueva actualización, querían mover esta variable al almacenamiento interno del puente, en lugar de dejarla en el otro contrato. Esto significaba que necesitaban inicializar la variable en el momento de la implementación, estableciendo TotalWeight en el valor que tenía en la versión anterior.
Lamentablemente, aquí es donde la actualización salió terriblemente mal. Según Verichains, los desarrolladores de Ronin escribieron varias funciones de “inicialización” diferentes que se suponía que debían ser llamadas en el momento de la implementación. Cada una de estas funciones tenía un número de versión diferente. La tercera versión contenía la crucial inicialización de totalWeight. Pero cuando los desarrolladores escribieron el script de implementación, llamaron solo a la versión 4, dejando totalWeight en su valor predeterminado cero.
Después de esta actualización, los usuarios ya no necesitaban enviar firmas a los validadores para demostrar su derecho a retirarse. Podían retirarse “sin firma”, ya que “cumplía la condición minimumVoteWeight (que era 0 debido a que no se había inicializado)”.
En una publicación del 7 de agosto en X, el auditor de contratos inteligentes de Composable Security, Damian Rusinek, brindó más detalles sobre lo que permitió que ocurriera el ataque. Según Rusinek, el atacante proporcionó una firma de una dirección que terminaba en B849f. Sin embargo, esta dirección "no estaba en la lista de operadores de puentes". No necesitaba estar en la lista de operadores de puentes porque "el mínimo de votos de los operadores era 0". Por lo tanto, "solo se requería UNA firma y podría [ser] CUALQUIER firma válida".
Aunque no entró en tantos detalles como Verichains o Rusinek, Ronin confirmó en una publicación de X del 6 de agosto que el exploit fue causado cuando la actualización “introdujo un problema que llevó al puente a malinterpretar el umbral de votación requerido por los operadores del puente para retirar fondos”.
Los datos de la cadena de bloques muestran que esta transacción de ataque fue realizada por un bot MEV llamado “Frontrunner Yoink”, que logró extraer más de 10 millones de dólares en criptomonedas del puente. Según Rusinek, lo más probable es que el bot “simuló cambiar la dirección y la cantidad y usar su propia firma”. Luego, envió la transacción una vez que esta simulación demostró que el exploit funcionaría.
Relacionado: Ronin Network fue explotada por $9.8 millones en ETH, se sospecha que es un hacker de sombrero blanco
El dueño del líder Yoink devolvió la mayor parte de los fondos el mismo día, y el equipo de Ronin anunció que se les permitiría quedarse con 500.000 dólares como recompensa por la detección de errores.
Los usuarios de Ronin estuvieron a punto de ser atacados por el exploit del 6 de agosto. Afortunadamente, el ataque fue liderado por un bot MEV cuyo propietario era un operador honesto de sombrero blanco. Sin embargo, el hecho de que el ataque haya estado tan cerca de tener éxito expone la naturaleza riesgosa de los puentes entre cadenas actualizables.
Algunas redes afirman que este problema se eliminará cuando las capas 2 de Ethereum alcancen la “etapa 2” y todas las actualizaciones se retrasen al menos siete días después del inicio. Sin embargo, los críticos afirman que el proceso para alcanzar esta etapa está tomando demasiado tiempo y es posible que nunca se complete.
Revista: Extraño hackeo de iVest con ‘dirección nula’, millones de PCs aún vulnerables al malware ‘Sinkclose’: Crypto-Sec