# zkLink Nova, una prueba forjada vacía su puente en Ethereum

> El puente de zkLink Nova perdió entre 779.000 y 786.000 dólares en una transacción. La criptografía aguantó; la contabilidad del estado, no.
> Por Covadonga Fernandez · DeFi · 2026-11-04

El puente de zkLink Nova hacia Ethereum se quedó vacío en una sola transacción. La noche del 28 de octubre, a las 22:21 UTC, un contrato creado por el atacante escribió su propia raíz de lote en el registro del puente y retiró 22,43 ETH más once tokens ERC-20 con pruebas que [él mismo había fabricado](https://x.com/zkLink_Official/status/2115792847098216545). Las pérdidas varían según el recuento: 786.000 dólares en el más alto y 779.000 en el más bajo, con 783.100 en medio. Nadie robó una clave privada ni falsificó una firma.

Conviene entender qué custodia un puente así. zkLink Nova es un rollup agregado de capa 3 que se apoya en Ethereum y en varias capas 2, y su contrato en la red principal guarda los fondos que los usuarios depositan desde otras redes. Para autorizar una retirada, ese contrato compara la prueba de Merkle del usuario con la raíz de lote que tiene guardada para ese número. Si la raíz es correcta, la prueba demuestra pertenencia; si la raíz la escribe un tercero, la prueba demuestra lo que ese tercero quiera.

Ahí está la lección, y no es criptográfica. El sistema de pruebas funcionó como estaba diseñado: verificó contra la raíz que encontró y aprobó doce retiros seguidos. El fallo estaba antes, en el camino por el que esa raíz llegaba al contrato, y en una comprobación que daba por buena una entrega ocurrida segundos antes dentro de la misma transacción. Nova detuvo la producción de bloques el 29 de octubre y sigue sin fecha de reapertura.

## Doce retiros dentro de un mismo bloque

La transacción entró en el bloque 26.294.188 y tocó dos contratos a la vez. Del escrow de ZkLink salieron 22,4313 ETH y del L1ERC20Bridge, el contrato que custodia los tokens, once saldos ERC-20. El reparto fue este.

Activo

Cantidad

ETH (escrow de ZkLink)

22,4313

pufETH

245,7379

USDC

18.113,45

ezETH

12,5693

rsETH

6,8665

USDT

3.360,90

WBTC

0,1736

Los doce movimientos apuntaron a la misma dirección, la del contrato que ejecutó el ataque, y cada uno llevaba cuatro nodos de Merkle hechos a medida. Horas después, esa cartera había vaciado casi todo y el saldo en ETH bajaba de 0,001.

Al día siguiente hubo más: Parapet Labs atribuye a un actor distinto una segunda oleada a las 07:16 UTC del 29 de octubre, con 24,76 ETH y tokens de las copias del puente en Optimism, Base y otras dos redes. La cifra importa menos que el patrón: el mismo camino seguía abierto nueve horas después del primer golpe.

## ¿Qué demuestra una prueba ZK?

Una prueba de validez demuestra, con una comprobación barata, que un lote de transacciones se ejecutó correctamente y que el estado resultante es el que dice ser, sin que quien verifica tenga que repetir el cálculo entero.

En Nova esa verificación ocurre en Linea, la cadena primaria que fija la [arquitectura de liquidación](https://docs.zklink.io/architecture/settlement-layer) del protocolo, y después la raíz del lote viaja al resto de redes para que cada una autorice retiradas contra ella.

El circuito responde a la pregunta de si el lote se calculó bien. No responde a la de quién puede afirmar cuál es la raíz de ese lote, y esa segunda pregunta es la que se llevó el dinero. Un puente puede tener pruebas impecables y, al mismo tiempo, un procedimiento de actualización de la raíz que acepte la palabra de un contrato con permisos especiales.

## Una raíz forjada que pasó todos los filtros

El puente no acepta raíces de cualquiera. En Ethereum hay una cadena de relevo: un relayer llama al contrato Arbitrator, el Arbitrator reclama un mensaje de la cadena de origen, el gateway de esa cadena avisa de vuelta y solo entonces el EthereumGateway puede escribir la raíz en ZkLink. Cada salto confía en el anterior por la dirección que llama, no por el contenido del mensaje.

El ataque cabalgó sobre esa confianza en cuatro pasos encadenados dentro de una misma transacción. Ninguno exigió romper un cifrado ni adivinar una clave: bastaba con que cada contrato reconociera al anterior por la dirección que llamaba.

*   El atacante llamó al relayer público SyncL2TxHashRelayer para reclamar un mensaje real y pendiente de Linea, que sincronizaba dos hashes de transacciones. El gateway de Linea verificó la prueba y avisó al Arbitrator, que guardó el resumen del mensaje en un hueco de almacenamiento transitorio.
*   En la misma transacción, el atacante volvió a llamar al relayer con el mismo gateway, el mismo valor y los mismos datos declarados, pero cambió el servicio de mensajes de origen por el EthereumGateway y metió dentro una llamada que envolvía la escritura de la raíz del lote 116409.
*   El gateway aceptó la llamada porque venía del Arbitrator, y ZkLink escribió la raíz elegida porque la llamada venía de su gateway. Nadie comprobó que el lote existiera ni que hubiera una prueba detrás de esa raíz.
*   Con la raíz ya en el registro, doce retiradas pasaron la verificación de pertenencia, porque el verificador comparaba contra el árbol que el atacante acababa de definir.

El detalle que une los pasos es un hash que nunca se borró. El Arbitrator guardaba el resumen de la entrega genuina en almacenamiento transitorio (EIP-1153), que dura lo que dura la transacción y no lo que dura la llamada. Al no ponerlo a cero después de usarlo, la comprobación dejó de preguntar si en esa llamada había llegado algo real y pasó a preguntar si alguna vez, en esa misma transacción, había llegado algo con esos mismos parámetros. El modificador nonReentrant no estorbaba, porque las dos llamadas eran secuenciales y no anidadas.

Parapet Labs reconstruyó esa traza y [recomendó a otros equipos](https://www.0xcert.com/advisory/0xCERT-2026-0294) borrar las banderas de autenticación guardadas en almacenamiento transitorio y no hacer llamadas externas elegidas por quien llama desde una identidad privilegiada. Las dos piezas del fallo son de manual: una función que ejecuta lo que le pidan y una comprobación que sobrevive a la llamada que la justificaba.

## La contabilidad del estado es lo que se pierde

Un puente es un libro de contabilidad con dos columnas. Una dice qué activos entraron y siguen en custodia; la otra dice qué mensajes llegaron de la red de origen. La criptografía protege la aritmética de ese libro, no la decisión de qué asientos se aceptan. Cuando la segunda columna admite una anotación sin respaldo, el saldo de la primera se puede reclamar entero.

Los robos más caros de los últimos meses no rompieron un cifrado. En el [robo a Binance](https://observatorioblockchain.com/ciberseguridad/robo-binance-prueba-sector-cripto/), la entrada fue el portátil comprometido de un ingeniero, en un desfalco valorado en unos 6.300 millones de dólares.

En el [exploit de Initia](https://observatorioblockchain.com/blockchain/initia-detiene-red-exploit-tokens/), el fallo permitió acuñar activos sin respaldo y la red se apagó el 23 de octubre, hace once días, para frenar más emisiones de un token que nunca entró en custodia.

Nova es la variante más limpia del patrón. Ninguna clave, ninguna firma, ninguna prueba criptográfica rota: un registro que aceptó una raíz ajena y un verificador que hizo bien su trabajo con un dato falso. La superficie de ataque no estaba en el circuito, estaba en el trámite que decidía qué raíz era la buena.

## Lo que zkLink apagó y lo que sigue sin respuesta

zkLink reconoció el ataque el 29 de octubre y enumeró tres medidas: suspender la producción de bloques, parchear los contratos afectados y cerrar el canal de retiradas. La empresa dijo que Nova solo volvería cuando hubiera confirmado que los riesgos habían desaparecido, y ofreció al atacante un 20% del botín si devolvía los fondos. No dio plazo ni causa.

Tampoco confirmó el relato de las firmas de seguridad, que reconstruyeron el mecanismo por su cuenta. Esa distancia es habitual en las primeras 48 horas de un incidente y recuerda que la versión oficial llega más tarde y con menos detalle que el rastro on-chain.

## Un puente sin confianza que confía en su portero

La etiqueta sin confianza describe el destino, no el camino. Un puente puede verificar cada retirada con pruebas y, al mismo tiempo, depender de que un contrato con permisos especiales no se equivoque al actualizar el registro. Ahí no hay matemáticas que auditar, hay un procedimiento que revisar línea por línea, y casi siempre es la parte que nadie mira porque no parece importante.

La cifra ayuda a medir la lección. 779.000 dólares es poco para un sector que ha visto robos de nueve cifras, pero el escrow de Nova tampoco era enorme, y el atacante se llevó todo lo que había detrás de esa ruta. Con más liquidez, el mismo fallo habría vaciado un contrato mucho mayor en el mismo bloque y sin tocar una sola clave.
