Back to Blog

#2 Incidente Bybit: Una Brecha Web2 Permite el Mayor Hackeo Cripto de la Historia

Code Auditing
February 9, 2026
6 min read

El 21 de febrero de 2025, Bybit perdió aproximadamente $1.5 mil millones después de que un atacante comprometiera la máquina de un desarrollador de Safe{Wallet} mediante ingeniería social. El atacante inyectó JavaScript malicioso en el bucket AWS S3 de Safe{Wallet}, apuntando específicamente a las transacciones de Bybit. El código inyectado alteró el contenido de las transacciones durante el proceso de firma: la interfaz de Safe{Wallet} mostraba una transacción legítima, mientras que el payload real enviado a los dispositivos Ledger de los firmantes actualizaba el contrato Safe de Bybit a una implementación maliciosa, otorgándole al atacante control total. Una vez firmado y ejecutado, el atacante drenó todos los activos del contrato. Un análisis técnico detallado está disponible en nuestro informe anterior [1].

Antecedentes

Safe{Wallet} (también conocido como GnosisSafe) es una infraestructura de billetera multifirma que utiliza un modelo n-de-m: ejecutar una transacción requiere al menos n firmas de m firmantes en total.

Cada billetera Safe se despliega como un contrato proxy. Dos variables de almacenamiento son fundamentales en este incidente:

  • masterCopy (slot 0): la dirección del contrato de implementación. Este contrato contiene toda la lógica de ejecución, incluyendo la verificación de firmas y los mecanismos de actualización. El proxy delega todas las llamadas a masterCopy mediante delegatecall.
  • threshold (slot 4): el número mínimo de firmas (n) requeridas. Para el Safe de Bybit, este valor era 3.

Debido a que el proxy usa delegatecall, cualquier función llamada en masterCopy se ejecuta en el contexto de almacenamiento del proxy. Esto significa que un objetivo de delegatecall puede sobrescribir directamente masterCopy en el slot 0, reemplazando toda la implementación en una sola transacción.

Análisis de Vulnerabilidades

La ruta de ataque atravesó tres capas del sistema, cada una de las cuales presentaba una condición estructural que el atacante aprovechó:

Modelo de servicio del frontend. El JavaScript del frontend de Safe{Wallet} se servía desde un bucket AWS S3. En esta arquitectura, cualquier persona con acceso de escritura al bucket puede modificar el código que construye las transacciones para los firmantes. Los mecanismos de verificación de integridad, como los hashes de integridad de subrecursos (SRI) o la firma de código, pueden mitigar este riesgo, pero aún no son una práctica estándar en la mayoría de los frontends de dApps. El atacante obtuvo acceso de escritura a través de la máquina del desarrollador comprometida y modificó silenciosamente el JavaScript servido.

Brecha entre la visualización en la interfaz y el payload de firma. El JavaScript inyectado mostraba una transacción de apariencia legítima en la interfaz de Safe{Wallet} mientras enviaba un payload diferente a las billeteras hardware Ledger. Los detalles de la transacción mostrados en la pantalla del Ledger habrían diferido de los de la interfaz, pero interpretar datos de transacciones en bruto en la pantalla de una billetera hardware no es sencillo, especialmente para operaciones multifirma complejas. Esta brecha permitió al atacante recopilar tres firmas válidas para el payload malicioso.

Modelo de actualización del proxy. Como se describe en los Antecedentes, delegatecall ejecuta el código del objetivo en el contexto de almacenamiento del proxy. La arquitectura del proxy Safe enruta todas las llamadas a través de un único puntero masterCopy en el slot 0. Sobrescribir este puntero redirige el proxy a una implementación completamente diferente, incluida su lógica de verificación de firmas, en una sola transacción. El modelo n-de-m rige quién puede iniciar una transacción, pero una vez que una transacción es aprobada y ejecutada, puede alterar la implementación en sí misma. Si la nueva implementación elimina la verificación de firmas, la protección multifirma desaparece efectivamente para todas las transacciones posteriores.

Análisis del Ataque

El ataque se desarrolló en tres pasos: Inyección de Código Malicioso, Reemplazo de Implementación y Robo de Activos.

Paso 1: Inyección de Código Malicioso

El atacante comprometió la máquina de un desarrollador de Safe{Wallet} e inyectó JavaScript malicioso en el bucket AWS S3 que servía el frontend. El código inyectado apuntaba específicamente a las transacciones provenientes de la dirección Safe de Bybit. Según el CEO de Bybit, Ben Zhou [2], la interfaz de Safe{Wallet} mostraba una transacción legítima, mientras que se enviaba un payload diferente a los dispositivos Ledger de los firmantes. Los firmantes aprobaron la transacción tal como se presentó en la interfaz, otorgando al atacante tres firmas válidas para el payload malicioso.

Paso 2: Reemplazo de Implementación

El atacante envió la transacción maliciosa con las tres firmas recopiladas. El proxy Safe delegó la llamada a masterCopy, cuya función execTransaction() validó las firmas y luego ejecutó el payload de la transacción: un delegatecall al contrato del atacante (0x962214...5c7242). Debido a que este delegatecall se ejecuta en el contexto de almacenamiento del proxy, la función transfer() del atacante sobrescribió el valor de masterCopy en el slot 0 con una dirección de implementación maliciosa (0xbDd077...9516). A partir de ese momento, todas las llamadas al contrato Safe fueron delegadas al código del atacante.

Paso 3: Robo de Activos

Con masterCopy apuntando ahora a la implementación del atacante, el requisito de multifirma ya no aplicaba. El atacante llamó directamente a SweepERC20() y SweepETH() en el contrato Safe. Estas funciones, definidas en el contrato de implementación del atacante, transfirieron todos los activos almacenados sin ninguna verificación de firmas. Se ejecutaron cinco transacciones de drenaje, con pérdidas totales de aproximadamente $1.5 mil millones.

Contratos y Transacciones Relacionados

Tipo Descripción Dirección / Hash
Contrato Contrato Safe de Bybit 0x1Db92e2EeBC8E0c075a02BeA49a2935BcD2dFCF4
Contrato El contrato masterCopy original 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F
Contrato El contrato masterCopy malicioso 0xbDd077f651EBe7f7b3cE16fe5F2b025BE2969516
Contrato El contrato del atacante (es decir, transfer()) 0x96221423681A6d52E184D440a8eFCEbB105C7242
Transacción Tx que reemplazó el contrato masterCopy 0x46deef0f52e3a983b67abf4714448a41dd7ffd6d32d32da69d62081c68ad7882
Transacción Tx que drenó 15,000 cmETH 0x847b8403e8a4816a4de1e63db321705cdb6f998fb01ab58f653b863fda988647
Transacción Tx que drenó 90,375 stETH 0xa284a1bc4c7e0379c924c73fcea1067068635507254b03ebbbd3f4e222c1fae0
Transacción Tx que drenó 8,000 mETH 0xbcf316f5835362b7f1586215173cc8b294f5499c60c029a3de6318bf25ca7b20
Transacción Tx que drenó 401,346 ETH 0xb61413c495fdad6114a7aa863a00b2e3c28945979a10885b12b30316ea9f072c
Transacción Tx que drenó 90 USDT 0x25800d105db4f21908d646a7a3db849343737c5fba0bc5701f782bf0e75217c9

Resumen

Este incidente demostró cómo el compromiso de una infraestructura fuera de la cadena puede derivar en pérdidas catastróficas dentro de la cadena. El atacante encadenó una brecha Web2, una manipulación del frontend y una actualización del proxy en una única ruta de ataque que eludió la protección multifirma sin explotar ninguna vulnerabilidad en la cadena.

Lecciones clave:

  • La integridad del frontend merece la misma atención que la seguridad en la cadena. La cadena de ataque comenzó en la capa de servicio del frontend. A medida que las dApps median cada vez más transacciones de alto valor, proteger el código del frontend con verificación de integridad (SRI, firma de código, compilaciones reproducibles) y monitorear cambios no autorizados se convierte en un requisito básico.
  • La verificación en billeteras hardware sigue siendo difícil en la práctica. Las billeteras hardware pueden mostrar el payload de firma real, pero interpretar datos complejos de transacciones multifirma en una pantalla pequeña es un conocido desafío de usabilidad. Mejorar la legibilidad de los resúmenes de transacciones en el dispositivo es un problema abierto para el ecosistema de billeteras.
  • Los mecanismos de actualización de proxy son objetivos de alto impacto. La arquitectura del proxy Safe enruta toda la lógica a través de un único puntero actualizable. Cualquier mecanismo que permita el reemplazo de la implementación en un solo paso concentra el riesgo. Añadir un timelock, un paso de confirmación secundario o un guardián independiente para las actualizaciones puede reducir el impacto de una única transacción comprometida.

Referencias

  1. BlockSec: Análisis en profundidad del hackeo de $1.5B a Bybit

  2. Transmisión en X del CEO de Bybit, Ben Zhou


Acerca de BlockSec

BlockSec es un proveedor integral de seguridad blockchain y cumplimiento cripto. Desarrollamos productos y servicios que ayudan a los clientes a realizar auditorías de código (incluyendo contratos inteligentes, blockchain y billeteras), interceptar ataques en tiempo real, analizar incidentes, rastrear fondos ilícitos y cumplir con las obligaciones AML/CFT, a lo largo de todo el ciclo de vida de protocolos y plataformas.

BlockSec ha publicado múltiples artículos de seguridad blockchain en conferencias de prestigio, reportado varios ataques de día cero en aplicaciones DeFi, bloqueado múltiples hackeos para rescatar más de 20 millones de dólares y asegurado miles de millones en criptomonedas.

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit