Poly Network - REKT



Ha llegado, queridos lectores; el gran robo.

$611 millones de dólares robados.

Eso es más que el hack de Mt Gox. Más que el PIB de varios países pequeños. Más que el total completo del rekt.news leaderboard.

El hack más grande de criptomonedas… nunca visto.

Poly Network = rekt.

Pero, ¿cómo?

Crédito: breadcrumbs.app, slowmist, blocksec

Dirección ETH del agresor: 0xc8a65fadf0e0ddaf421f28feab69bf6e2e589963

Dirección BSC del agresor: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71

Esto no fue el usual flash loan/arbitraje de un smart contract.

El hacker explotó los contratos Proxy Lock de Poly Network en tres chains distintas.

Ethereum: 0x250e76987d838a75310c34bf422ea9f1ac4cc906

BSC: 0x05f0fDD0E49A5225011fff92aD85cC68e1D1F08e

Polygon: 0x28FF66a1B95d7CAcf8eDED2e658f768F44841212

Crédito: @kelvinfichter

“Poly tiene un contrato llamado “EthCrossChainManager”. Es un contrato con el privilegio de poder ejecutar mensajes provenientes de otras chains. Es una cosa estándar para los proyectos cross-chain.

Contiene una función verifyHeaderAndExecuteTx que cualquier persona puede llamar para ejecutar una transacción cross-chain.

La función (1°) comprueba firmas para verificar que la cabecera del block es correcta (parece que la otra chain fue una sidechain poa) y luego (2°) comprueba que la transacción fue incluida dentro de aquel block con una Merkle proof. Aquí está el código.

Una de las últimas cosas que hace la función es llamar executeCrossChainTx, lo que llama al contrato objetivo. Aquí es donde se encuentra la falla crítica. Poly comprueba que el objetivo es un contrato, pero olvidaron prevenir a los usuarios de llamar a otro objetivo muy importante… el contrato EthCrossChainData.

Al enviar este mensaje cross-chain, el usuario puede engañar al EthCrossChainManager para llamar el contrato EthCrossChainData, pasando el control de onlyOwner. Ahora el usuario solamente tiene que configurar los datos correctos para poder ejecutar la función que cambia las claves públicas...

El único desafío restante era averiguar cómo hacer al EthCrossChainManager llamar a la función correcta. Ahora viene un poco de complejidad sobre cómo Solidity decide cuál función estás intentando llamar.

Los primeros cuatro bytes del input data de una transacción son conocidos como el “signature hash” o “sighash”. Es un dato corto que informa a un contrato de Solidity lo que estás intentando hacer.

El sighash de una función se calcula al tomar los primeros cuatro bytes del hash de "<function name>(<function input types>)". Por ejemplo, el sighash de la función ERC20 transfer se conforma con los primeros cuatro bytes del hash de "transfer(address,uint256)".

El contrato de Poly era capaz de llamar a cualquier contrato. No obstante, solamente llamaría a la función correspondiente al siguiente sighash:

Pero… “_method” en este caso es input del usuario. Lo único que tenía que hacer el hacker para llamar la función correcta era averiguar algún valor para “_method” que, al combinarlo con esos otros valores y convertido en un hash, tuviera los mismos primeros cuatro bytes que el sighash de nuestra función objetivo.

Con solamente un poco de trabajo monótono, se puede fácilmente encontrar algún input que produzca el sighash correcto. No hace falta encontrar un hash completo que corresponda, la revisión solo es de los primeros cuatro bytes. Entonces, ¿esta teoría es correcta?

Bueno… aquí está el sighash real de la función objetivo:

http://ethers.utils.id ('putCurEpochConPubKeyBytes(bytes)').slice(0, 10)

'0x41973cd9'

Y el sighash que manufacturó el agresor...

http://ethers.utils.id ('f1121318093(bytes,bytes,uint64)').slice(0, 10)

'0x41973cd9'

Genial. ¡No se requiere una clave privada comprometida! Solamente hay que generar los datos adecuados y pum... ¡el contrato se hackea a sí mismo!

Una de las lecciones importantes sobre el diseño que la gente necesita aprender de esto es: si tiene contratos de reenvío cross-chain como estos, ASEGURA QUE NO SE PUEDEN UTILIZAR PARA LLAMAR CONTRATOS ESPECIALES. El contrato EthCrossDomainData no debía de haber pertenecido al EthCrossDomainManager.

Asuntos separados. Si un contrato realmente necesita tener privilegios especiales como estos, asegura que los usuarios no pueden utilizar mensajes cross-chain para llamar estos contratos especiales.”

En la blockchain Ethereum, el hacker robó:

USDC - 96,389,444

WBTC - 1,032

DAI - 673,227

UNI - 43,023

SHIBA - 259,737,345,149

renBTC - 14.47

USDT - 33,431,197

wETH - 26,109

FEI USD - 616,082

En BSC, el hacker robó:

BNB - 6,613.44

USDC - 87,603 373

ETH - 299

BTCB - 26,629

BUSD - 1,023

En la blockchain Polygon, el hacker robó:

USDC - 85,089,610

VALOR TOTAL PERDIDO - ~$611,000,000

Al momento de redactar este artículo, los fondos robados se encuentran en las siguientes wallets:

ETH: 0xC8a65Fadf0e0dDAf421F28FEAb69Bf6E2E589963

BSC: 0x0D6e286A7cfD25E0c01fEe9756765D8033B32C71

Polygon: 0x5dc3603C9D42Ff184153a8a9094a73d461663214

Las tramas en DeFi raramente son sencillas y esta no es ninguna excepción.

Incluso a los actores anónimos les encanta la atención.

Poco después del exploit, apareció un protagonista inesperado, conocido como hanashiro.eth.

hanashiro.eth ganó atención por primera vez al enviar al hacker un consejo sobre cómo manejar el USDT, por lo que recibió 13.37 Ether del hacker como recompensa.

Muchos más enviaron mensajes al hacker después, pero ninguno fue tan exitoso como hanshiro.eth.

Con un nivel de fanfarronería filantrópica verdaderamente cripto-nativo, hanashiro.eth luego decidió donar su dinero robado a algunas de las organizaciones fundacionales que apoyan a nuestra industria, como Infura, Etherscan, y rekt.news.

Pero no todo el botín fue tan abiertamente accesible.

Tether congeló todos los 33M USDT que fueron robados en la chain Ethereum.

Su moneda - su elección… Algo para recordar al usar USDT.

A este punto todo se había ido a la mierda; y todos los ojos estaban en Poly Network, que recurrió a publicar una carta abierta al agresor suplicándole devolver los fondos.

Un simple tweet pidiendo a un criminal devolver seiscientos millones de dólares… Tal vez Gensler tenía razón al decir que estamos en la fase “Wild West” de las criptomonedas.

Considera la mentalidad del agresor en este punto de la historia. ¿Qué crees que sentían más; euforia o terror?

Robar 600 millones de dólares mientras estás sentado en frente de tu ordenador debe de ser una experiencia surreal.

La experiencia de luego intentar blanquear ese dinero debe de ser igual de intensa.

Aparte de los JPEGs, tornado.cash sería el lugar más obvio para comenzar y ahí es exactamente a donde fue nuestro hacker.

Se envió a sí mismo una transacción que contenía el mensaje;

Pero, ¿por qué Tornado? ¿Los miners me detendrán? Enséñenme por favor

¿Fue eso psicología o estupidez? En crypto nunca es muy claro...

A la fuga con 600 millones y publicando mensajes a un público de miles.

El hacker estaba ganando demasiada confianza.

Cuando @WardBradt tuiteó lo siguiente:

¿El Exploiter de PolyNetwork utilizó una dirección equivocada para esta transacción 0xb12681d9e sin querer? La dirección está vinculada a cuentas de FTC, Binance, Okex.

De repente la actitud del agresor cambió.

Seguramente, un hacker que tiene suficiente confianza para intentar un ataque de esta escala no cometería un error tan básico de seguridad, ¿o sí? O quizás utilizó documentos falsos para el KYC...

De todos modos, empezamos a ver señales del miedo del agresor.

El hacker empezó a sugerir que iba a devolver “algunos tokens” o incluso abandonarlos, diciendo que estaba “no muy interesado en el dinero”.

Luego consideró la idea de crear una DAO para distribuir los fondos robados.

Al final, la presión se volvió demasiado y el hacker anunció que estaba “LISTO PARA RENDIRSE”.

En una jugada inesperada y sin precedentes, el agresor ahora está devolviendo los fondos a Poly Network.

Anunció que estaba “LISTO PARA DEVOLVER LOS FONDOS!” en una transacción en Ethereum que fue enviada de la misma wallet utilizada para el ataque.

Antes de enviar la primera transacción de devolución, el hacker creó un token con el nombre “El hacker está listo para rendirse” y envió este token a Poly Network quien anunció que había establecido una wallet multisig controlada por “direcciones de Poly conocidas”.

Un resumen de las comunicaciones entre el hacker y Poly Network se encuentran aquí.

Al momento de la redacción, el hacker había devuelto lo siguiente:

En la blockchain Ethereum: $2.6M

En BSC: $1.1M

En la blockchain Polygon: $1M

¿El hacker continuará devolviendo los fondos o todo esto es solo otra farsa?

Realmente, ¿puede solo devolver el dinero y ser perdonado?

Poly Network. 611 millones.

Y pensabas que conocías todos los grandes protocolos de DeFi.

Esta industria ha crecido más de con lo que nuestra cámara de ecos puede lidiar.

Este podrá ser el primero, pero no será el último hack de este tamaño que veremos en los próximos años. Aun así, el mercado permanece impávido, y con razón.

Para bien o para mal, crypto provocará titulares y el mundo tendrá que prestar atención conforme nuestra industria se vuelva lo normal.

Esta es solamente otra parte inevitable del progreso.


compartir artículo

REKT sirve como plataforma pública para autores anónimos, nos deslindamos de la responsabilidad por las opiniones y contenidos alojados en REKT.

dona (ETH / ERC20): 0x3C5c2F4bCeC51a36494682f91Dbc6cA7c63B514C

aviso legal:

REKT no es responsable ni culpable de ninguna manera por cualquier Contenido publicado en nuestro Sitio Web o en conexión con nuestros Servicios, sin importar si fueron publicados o causados por Autores ANÓN de nuestro Sitio Web, o por REKT. Aunque determinamos reglas para la conducta y publicaciones de los Autores ANÓN, no controlamos y no somos responsables por cualquier contenido ofensivo, inapropiado, obsceno, ilegal o de cualquier forma objetable, que se pudiera encontrar en nuestro Sitio Web o Servicios. REKT no es responsable por la conducta, en línea o fuera de línea, de cualquier usuario de nuestro Sitio Web o Servicios.