Post-mortem: Actualización del enrutador ETH. El error de reentrada del ERC-777, el comercio… de THORChain THORChain Julio de 2021

El error de reentrada del ERC-777, la interrupción del comercio, la actualización del enrutador, el rescate de USDT, el regreso a la solvencia y las mejoras operativas

El 9 de julio de 2021, un sombrero blanco descubrió una vulnerabilidad en el enrutador THORChain cuando se trataba de tokens ERC-777 y trabajó con el equipo para rescatar los fondos a la cuenta del implementador de THORStarter. El enrutador fue parcheado e implementado en testnet, pero durante la prueba se encontró un problema al tratar con ERC-20 no estándar, específicamente USDT. Se propuso un plan de recuperación a la comunidad, que consistía en rescatar al USDT de vuelta al tesoro (después de un aviso de 24 horas) y el resto de los tokens migraron a través de la ruta normal de actualización del enrutador. Surgieron complicaciones ya que simultáneamente se descubrió que Testnet no estaba operativo, por lo que se tuvo que establecer uno nuevo. Finalmente, se actualizó el enrutador y se reanudó el comercio.

ERC-777 reentrada

Un error simple, pero no uno contemplado en el momento en que la comunidad de THORChain implementó o revisó el enrutador para el lanzamiento de MCCN. TrailOfBits programó una auditoría del enrutador para julio, que seguirá adelante, pero ahora en el enrutador V3.

La causa principal es que ERC-777 permite que se invoquen hooks en transferencias. Esto es lo mismo que enviar ETH a un contrato (se puede llamar a un gancho). El gancho solicitó un depósito secundario en el enrutador, lo que provocó que los fondos fueran parcialmente "dobles" y el miembro acreditara más asignación de la que debería. El miembro llamó depósitos recursivos hasta que su "asignación" fuera el saldo total del enrutador. Luego transfirieron esto.

La solución fue agregar un simple protector de reentrada.

https://gitlab.com/thorchain/ethereum/eth-router/-/blob/master/contracts/THORChain_Router.sol

Arreglo: agregue un guardia de reentrada

Interrumpir el comercio

Luego se estableció una suspensión comercial a través de mimir, ya que los usuarios inconscientes podían depositar XRUNE (para vender) y hacer que los imitadores los robaran de inmediato.

Una mejora obvia de esto es tener paradas específicas de la cadena en lugar de paradas globales. Esto era obvio, ya que toda la red no estaba operativa cuando era solo una cadena la que era problemática.

Esto ya se ha preparado y debe publicarse:

Resolver "ADD: interrupción del comercio específico de la cadena"

Problemas de Testnet

Los desarrolladores principales de THORChain no ejecutan ningún nodo de red principal o de red de prueba vinculado. Solo ejecutan nodos completos que hacen que los servicios estén disponibles para la comunidad (como thornode.thorchain.info).

Los operadores de redes de prueba de cadenas múltiples lo utilizan para practicar el batido. Existe un problema conocido de que los nodos son ligeramente insolventes en ETH (debido a problemas de gas) y no se pueden deshacer. Se sabe que esto causa fricción para los operadores de nodos (tal vez necesiten mejores herramientas), lo que hace que algunos de ellos se rindan y abandonen sus nodos en lugar de solucionar el problema y salir con gracia. Debido a un momento desafortunado, más de 1/3 de la red estaba fuera de línea / abandonada y no se pudo usar para realizar pruebas.

Es poco probable que esto suceda en la red principal: ningún operador en su sano juicio abandonaría un bono de más de $ 3 millones.

El restablecimiento de una nueva red de pruebas le costó al equipo un día.

Problemas con el enrutador

Mientras probaba el enrutador, surgió otro problema: el activo USDT no se pudo migrar porque no era compatible con el estándar ERC-20.

USDT no devuelve un bool

La solución fue eliminar la interfaz ERC-20, codificarla directamente en la función y simplemente requerir éxito; esto omite la búsqueda de datos devueltos.

La solución en el Router V2

Recuperación del USDT

Dado que USDT no era compatible con la ruta de migración preferida, se presentaron tres opciones a la comunidad:

Ragnarok todos los LP de USDT y migrar sin USDTR recuperar el USDT a una dirección de tesorería, migrar manualmente Recuperar el USDT a un contrato inteligente, migrar sin confianza (cualquiera podría llamar al depósito posterior)

La comunidad finalmente se decidió por (2) como la forma más segura y rápida de lograr la recuperación, ya que la intención era restablecer los intercambios y no una prueba de descentralización.

Coordinadora de migraciones

Normalmente, las actualizaciones de enrutadores están diseñadas para ser autónomas y sin confianza. Tan pronto como se agregue un nuevo enrutador a la red, los nodos se moverán hacia él utilizando la lógica de rotación existente. Pasan el enrutador a sus datos de llamadas y el contrato inteligente * en sí mismo * migrará hacia adelante; vea el código a continuación.

Si es un enrutador nuevo, migre

Sin embargo, esta actualización era urgente y requería pasos adicionales, como rescatar USDT y volver a depositar USDT y XRUNE nuevamente. Como tal, se agregó una lógica especial para permitir que mimir orquestara el proceso. Los 11 pasos exactos de la siguiente manera:

1. Mimir configuró `StopFundYggdrasil` en` 1`, esto dejará de financiar las bóvedas de yggdrasil
2. Mimir configuró `MimirRecallFund` en` 1`, esta red le pedirá a yggdrasil que envíe todos sus fondos a asgard en la cadena ETH
3. Verifique que todas las bóvedas de yggdrasil devuelvan sus tokens erc20, si a todas las bóvedas de yggdrasil solo le queda polvo ETH, vaya al paso 4)
4. Mimir configuró `MimirWithdrawUSDT` en` 1` para extraer USDT, esto activará el USDT saliente, asegúrese de que el saliente haya enviado todos los USDT para designar la dirección
5. Mimir configuró `MimirUpgradeContract` en` 1`, esto activará la red para actualizar el contrato a uno nuevo
6.Asegúrese de que todo el contrato de yggdrasil se haya actualizado a la nueva dirección del contrato.
7. Mimir volvió a establecer `ChurnInterval` en 43200 para que se pueda iniciar la rotación de nodos.
8. Una vez que se inició la rotación, asegúrese de que el nuevo asgard tenga el nuevo contrato y migrate es migrar el fondo al nuevo contrato.
9. Cuando finalice la rotación, acredite USDT y XRUNE de nuevo al nuevo asgard, nuevo contrato usando el memo `noop`
10. Mimir estableció `StopFundYggdrasil` en 0, la red seguirá adelante para financiar las bóvedas de yggdrasil
11. Una vez financiado ygg, Mimir configuró "HaltTrading" en 0, la red estará disponible para intercambios.

Regresar a Operaciones

El equipo y la comunidad trabajaron juntos para orquestar esto:
1) Sincroniza la actualización con la propina
2) Libere la actualización y espere a que el 100% de los nodos adopten
3) Coordinar la migración del enrutador
4) restablecer el comercio

Esto finalmente se terminó el 14 de julio, cinco días después de la interrupción.

La lista de mejoras:

El RouterV2 tiene un protector de reentrada, compatible con los ERC-20 que no son estándar, y tiene una nueva función solicitada por la comunidad para caducar los depósitos. La comunidad THORChain ha validado la lógica de actualización del enrutador y estará preparada para migrar más fácilmente al enrutador V3 ( con una lógica más avanzada) .THORNode tendrá una lógica de interrupción comercial específica de la cadena, que habría mantenido la red en su mayor parte operativa, restablezca Testnet e interactúe con operadores de nodos de alta calidad para ejecutar la red de prueba.

Además, el RouterV3 será auditado por Halborn y TrailOfBits pronto.