Después de producirse el Merge, los mineros se salieron con la suya, crearon Ethereum proof of work (ETHW). Uno de lo cambios que han hecho es el de cambiar el Chain ID (identificador de la cadena)
¿Por qué debían cambiar el Chain ID?
A la hora de realizar una transacción en una blockchain que es compatible con la ethereum virtual machine (Binance smart chain, ethereum, avalanche…)
Necesitas especificar qué cadena quieres utilizar
Para poder hacer esto, antes debes añadir la red
Uno de los parámetros que debes rellenar es el «chain Id»
Cada blockchain de este tipo, tiene su propio identificador
Por ejemplo, el de Ethereum es el número 1
Entonces, al clonar la blockchain de Ethereum para crear la de ethereum proof of work
Estarías manteniendo el mismo Chain Id
Es decir, cuando realices una transacción, estarías dando la orden de ejecutarla en las dos blockchains
Esto es un problema. Por este motivo, quien gestiona $ETHW, modificó el «Chain Id» al número 10001
Esto ya causó problemas en un primer momento. Ya que este mismo identificador. Corresponde a la blockchain «Smart Bitcoin Cash Testnet»
Bueno, en realidad, el Chain Id no solo era 10001, también era 1. ¿Y esto por que?
Te recuerdo que EthereumPow $ETHW es un clon de Ethereum $ETH, por lo que todos los bloques minados hasta la clonación, se mantienen igual.
Pero estos bloques, contienen transacciones con otro Chain ID
Este Chain Id es el 1
Por lo que $ETHW, en realidad utiliza lo que se conoce como Chain Id dinámico
Para los bloques antes del merge el Chain Id es 1, para los bloques después del merge el Chain Id es 10001
¿Dónde está el problema?
El 16 de septiembre, la cartera 0x82faed2da812d2e5cced3c12b3baeb1a522dc677 envió 200 $WETH (270 mil dólares) al bridge Omni
En concreto, al Smart contract que gestiona el puente entre Gnosis Chain y Ethereum
Luego, repitió la transacción en la cadena de $ETHW
El resultado de esto:
Fueron 200 $Weth transferidos a su cartera en la red de ethereum proof of work, En resumen, realizó una transacción en la blockchain de Ethereum para luego poder repetirla en la blockchain de Ethereum Proof of work
De esta forma pudo robar 200 $WETH que no le correspondían
¿Cómo pudo repetir la transacción si no comparten el Chain Id?
El Smart contract de Omni, parece que tiene el código desactualizado.
Cuando alguien realiza una transacción, normalmente el contrato verifica el Chain Id para no meter la pata
Pero en este caso, el contrato tiene una función que lo que hace es «recordar» el Chain Id que ha utilizado hasta ahora
Es decir, no lo verifica para cada transacción
Esto provocó que a pesar de cambiar el Chain id, el atacante pudo replicar la transacción para llevarse los 200 $Weth
Peeeero, no todo es tan malo
El atacante ha robado 200 $Weth de la red proof of work
Eso son poco más de 1000 dólares
Si fueran de la red Proof of stake, serían más de 250 mil dólares
Dentro de lo malo
El atacante no se ha llevado mucho
Por cierto, la wallet que utilicé en un principio de ejemplo, era la del atacante
0x82faed2da812d2e5cced3c12b3baeb1a522dc677
Por aquí te dejo el enlace a las transacciones en ambas redes
En Ethereum Proof of stake: https://etherscan.io/tx/0x97bffc0dc8d94a7fdb756419da1d426f8713d193a7878a4a47e6098ce82fc57e
En Ethereum Proof of Work:
ETHW Block 0x9c07…861fb4 Height Block Time Fee | OKLink Blockchain Explorer
www.oklink.com
En realidad, esto no es un ataque de repetición «puro»
Ya que las transacciones NO son exactamente las mismas. El robo ha podido hacerse por un error del smart contract. Si somos más precisos, hablamos de un exploit aprovechando un error en la verificación del Chain ID. Además de cambiar el Chain id, existen otros métodos para protegerse de un ataque de repetición, incluso existen técnicas para protegerte a ti mismo de este tipo de ataques y que nadie te robe.