1. Antecedentes
Wormhole, también conocido como puente Einstein-Rosen, es una estructura especulativa que conecta puntos dispares en el espacio-tiempo. En el mundo de la cadena de bloques, wormhole se utiliza como puente entre diferentes cadenas (por ejemplo, Solana y Ethereum). Los usuarios pueden transferir activos tokenizados entre blockchains con wormhole.
El 2 de febrero de 2022, Wormhole fue hackeado y el atacante logró acuñar 120,000 Ether envueltos por un valor de $320 millones, lo que representa la segunda mayor pérdida después de Poly Network en la historia de DeFi.

2. Cómo funciona Wormhole
Wormhole funciona monitoreando los mensajes emitidos en cada cadena. El mensaje monitoreado se reenvía a la cadena de destino para que se pueda construir un protocolo de comunicación entre cadenas.
La pregunta intuitiva es cómo garantizar que el mensaje monitoreado sea confiable. Para resolver este problema, Wormhole introduce 19 nodos adicionales, llamados guardianes. El conjunto actual de guardianes se puede verificar en Wormhole Explorer. Cada guardián puede verificar el mensaje monitoreado de forma independiente y firmarlo.
En Wormhole, el mensaje se organiza en formato VAA. El VAA consta de dos partes. Una es el encabezado, que recopila las firmas de los guardianes. La otra es el cuerpo, que contiene la información de la cadena de destino, la carga útil del mensaje, etc.
Una vez que las firmas de los guardianes alcanzan un umbral de consenso, el VAA puede publicarse en la cadena.
En resumen, los guardianes son responsables de la integridad del mensaje transferido.
3. Puente de Tokens
Tras introducir cómo se transfiere el mensaje entre diferentes cadenas, no será difícil entender cómo funciona el puente de tokens, que es la aplicación principal en wormhole.
Para transferir tokens de la cadena A a la cadena B, Wormhole bloquea los tokens en A y los acuña en B. Esta es la idea general. En la práctica, esto se puede dividir en tres pasos. Primero, los tokens en la cadena A se bloquean. Segundo, se transmite el mensaje de que los tokens en la cadena A deben transferirse a la cadena B. Tercero, la cadena B recibe el mensaje y se acuñan los tokens correspondientes. Todo está hecho.
4. Instrucciones de Solana
En Solana, una transacción consiste en múltiples instrucciones. Cada instrucción contiene un ID de programa, cuentas y datos. El ID de programa representa el programa (un contrato inteligente) que procesará la instrucción. El programa interpretará los datos y operará sobre las cuentas proporcionadas.
5. El Ataque a Wormhole
En resumen, el atacante acuñó 120,000 ETH en Solana sin bloquear ningún activo en Ethereum. La transacción se encuentra aquí.
Por lo tanto, la pregunta es cómo el atacante pudo acuñar los 120,000 ETH en Solana. Detallemos los pasos. Para acuñar el token, se invoca la instrucción complete_wrapped. Esta instrucción recibe varias direcciones, y la tercera es la dirección que almacena el mensaje firmado. Antes de acuñar los 120,000 ETH, la cadena B (es decir, Solana) debe recibir el mensaje firmado (es decir, VAA) que indica que 120,000 ETH fueron bloqueados en la cadena A (es decir, Ethereum).
Para publicar el mensaje, se invoca post_vaa definido en post_vaa.rs. En consecuencia, se creará una cuenta para almacenar el mensaje. Sin embargo, post_vaa no verifica las firmas de los guardianes. En cambio, verify_signatures definido en veryify_signatures.rs verifica las firmas.

La cuarta cuenta proporcionada a verify_signatures es la cuenta de instrucciones del sistema. Ahora exploremos cómo funciona verify_signatures.

En la línea 103, se invoca la función load_instruction_at para cargar la instrucción ejecutada anteriormente secp_ix. secp_ix invocará la función de verificación de firma Secp256k1. Por lo tanto, verify_signatures verifica las firmas comprobando la instrucción ejecutada anteriormente secp_ix. ¿Ya lo entendiste todo? ¡La función load_instruction_at no verifica desde dónde cargar las instrucciones! Se espera que cargues la instrucción desde Sysvar:Instructions.
Sin embargo, la cuarta cuenta de la transacción del ataque es 2tHS1cXX2h1KBEaadprqELJ6sV9wLoaSdX68FqsrrZRd en lugar de Sysvar:Instructions. En este caso, el atacante logró eludir el proceso de verificación de firmas. Wormhole creyó que la verificación fue exitosa y el mensaje fue publicado en la cadena, lo que resultó en la acuñación de 120K ETH sin bloquear nada.

Veamos una instrucción de verificación legítima. Esta transacción consta de dos instrucciones. La primera invoca la función de verificación Secp256k1 mientras que la segunda invoca la instrucción verify_signatures. Nótese que la cuarta cuenta aquí es Sysvar:Instructions.

Tras acuñar los 120K ETH, el atacante pudo retirarlos de vuelta a Ethereum y convertirlos en otros tokens para obtener ganancias.
6. Parche
Como se menciona en el repositorio, desde la versión 1.8.0, load_instruction_at no es seguro y la dirección de las cuentas Sysvar no se verifica. En su lugar, se recomienda usar load_instruction_at_checked.
7. Nuestra Reflexión
- Los desarrolladores deben estar muy familiarizados con las funciones externas que utilizan.
- Mantenerse al tanto de cualquier cambio importante en las bibliotecas utilizadas. Si la biblioteca cambia, es posible que el código que la usa también deba modificarse.
- El mantenedor de la biblioteca debe ser consciente de los riesgos potenciales de ciertos cambios y notificar a toda la comunidad a tiempo. Simplemente agregar anotaciones puede no ser suficiente.
- El código de tu contrato debe ser auditado si cambian las versiones de la biblioteca y el código.
Acerca de BlockSec
BlockSec es una empresa pionera en seguridad blockchain fundada en 2021 por un grupo de expertos en seguridad de renombre mundial. La empresa está comprometida con mejorar la seguridad y la usabilidad para el emergente mundo Web3 con el fin de facilitar su adopción masiva. Con este fin, BlockSec ofrece servicios de auditoría de seguridad de contratos inteligentes y cadenas EVM, la plataforma Phalcon para el desarrollo de seguridad y el bloqueo proactivo de amenazas, la plataforma MetaSleuth para el rastreo e investigación de fondos, y la extensión MetaSuites para que los constructores de web3 naveguen eficientemente en el mundo cripto.
Hasta la fecha, la empresa ha atendido a más de 300 distinguidos clientes como MetaMask, Uniswap Foundation, Compound, Forta y PancakeSwap, y ha recibido decenas de millones de dólares estadounidenses en dos rondas de financiamiento de inversores prominentes, incluyendo Matrix Partners, Vitalbridge Capital y Fenbushi Capital.
Sitio web oficial: https://blocksec.com/
Cuenta oficial de Twitter: https://twitter.com/BlockSecTeam



