Explicacion de la vulnerabilidad del contrato de billetera Argent-X con cero clic
TL;DR
Hemos encontrado una vulnerabilidad critica en los contratos Argent implementados con la version 5.0.x de la aplicacion de billetera Argent-X, que permite a cualquiera obtener control total sobre una cuenta Argent. La vulnerabilidad se explota enviando una transaccion de cierta manera que pasa por alto la logica de verificacion de firma del Contrato Argent. Esto permitiria a un atacante enviar cualquier transaccion con una firma vacia o falsa que se ejecutaria y aceptaria en la cadena. Hemos demostrado la vulnerabilidad enviando una transaccion de transferencia con una firma vacia a un contrato de cuenta Argent y transfiriendo ETH a una billetera de nuestra eleccion. Comunicamos este problema a Argent y actuo rapidamente para solucionarlo.
Una historia de dos versiones
En el reciente StarkNet v0.10.0 lanzado hace aproximadamente un mes, el protocolo introdujo un nuevo nivel de version de transaccion (v1). Cambia la forma en que los contratos de cuentas de Starknet deben verificar las transacciones al separar la logica de validacion de transacciones de la logica de ejecucion de transacciones (la verificacion en si todavia se realiza como parte del contrato de cuenta, pero ahora el sistema operativo StarkNet la llama). Esto es beneficioso ya que permite que el sistema operativo StarkNet verifique la validez de la transaccion antes de ejecutarla, evitando asi ataques DDoS de un atacante que no puede producir una firma valida.
El soporte para transacciones que se ejecutan con la version anterior (v0) aun estaba intacto para permitir a los usuarios migrar gradualmente al nuevo esquema de verificacion de contrato de cuenta del sistema operativo.
Dado que el sistema operativo admite ambas versiones de transacciones (v0 y v1), el contrato de cuenta tambien debe admitir ambas.
El proceso de validacion de firma
El poder de las billeteras basadas en contratos inteligentes (tambien conocidas como Abstraccion de Cuenta) es que permiten, entre otras cosas, una logica de verificacion arbitraria. Pero como dicen, un gran poder conlleva una gran responsabilidad.
Permitir una logica de verificacion arbitraria significa que el contrato de la cuenta puede decidir que logica de verificacion ejecutar: puede ejecutar la verificacion del protocolo nativo o ejecutar una verificacion codificada de forma independiente.
(nuevamente, la diferencia entre la transaccion v0 y v1 es quien llama a esta funcion logica de verificacion (el contrato o el sistema operativo).
Sin embargo, en el estado actual de la red, una cuenta debe esperar obtener ambos tipos de transacciones, pero puede decidir que solo admite la version de transaccion mas nueva: v1.
La vulnerabilidad
En la última implementación del contrato Argent, que se implementó en la red el 4 de noviembre y estuvo disponible como parte de Argent-X v5.0.x a principios de esta semana, había una suposición implícita de que el contrato manejará solo transacciones v1. como se puede ver en el fragmento de código a continuación. Sin embargo, la afirmación se colocó en la función de verificación que, en el caso de la transacción v1, es llamada por el sistema operativo, pero en la transacción v0 debe ser llamada por la función __execute__ del contrato.
Por lo tanto, un contrato de cuenta que desee admitir transacciones v1 únicamente debe colocar la aserción de versión en la función __execute__ ya que el sistema operativo no llama a la función __validate__ .
Implicaciones
Dada la vulnerabilidad anterior, un atacante puede enviar cualquier transaccion v0 con una firma vacia (o un galimatias) y pasara sin problemas y se incluira como una transaccion valida en el bloque.
Es importante tener en cuenta que se trata de un ataque sin clic que no requiere ninguna acción o interacción del usuario.. Un atacante podria simplemente haber revisado todas las cuentas Argent nuevas y actualizadas implementadas y transferir todos los activos de todas y cada una de las cuentas a una cuenta de su eleccion.
Descubre el problema
En Braavos creemos firmemente y por eso damos gran importancia a las pruebas. Especialmente pruebas de contrato. Como parte de nuestros preparativos para lanzar nuestro soporte de billetera para v0.10.x, hemos creado un extenso conjunto de pruebas y durante este proceso, entro en juego esta sutil cuestion de donde verificar la version de la transaccion.
Como se trata de un problema bastante delicado que es dificil de reproducir con las herramientas estandar de Starknet Dev, pensamos que podria escaparse a otros desarrolladores de contratos de cuentas, por lo que tan pronto como terminamos nuestro conjunto de pruebas, cambiamos nuestro enfoque para verificar si se trata de un problema. problema real o simplemente una preocupacion falible.
Y de hecho, cuando comenzamos a verificar el contrato de la cuenta Argent, en poco tiempo, el problema se manifesto. Pudimos reproducir la vulnerabilidad muy rapidamente.
El siguiente es un ejemplo de una transaccion aceptada en cadena emitida directamente a la infraestructura de Starknet sin ninguna interaccion con la aplicacion Billetera. La firma de la transaccion es una firma vacia y transfirio ETH de una cuenta Argent vulnerable a una cuenta arbitraria.
https://starkscan.co/tx/0xe822d983f9c5d3ff320037812633435edcd71afa725e16d84af700973b0da
Divulgacion responsable
La noche del miercoles 16 de noviembre, una vez superada la primera transaccion sin firma, comprendimos de inmediato la gravedad del problema y el dano potencial a los usuarios. Para no causar estragos innecesarios, lo verificamos dos veces y lo reproducimos nuevamente.
En Braavos, estamos comprometidos con la divulgacion responsable, incluso hacia los «competidores», ya que creemos que es lo correcto.
Ademas, nuestra principal preocupacion es la prosperidad del ecosistema y la seguridad de los fondos de los usuarios.
Cronologia de eventos
- El 4 de noviembre de 2022 se implemento en la cadena un nuevo contrato de implementacion de Argent.
- El 14 de noviembre de 2022 se lanzo una nueva aplicacion de extension Argent-X que hace uso del nuevo contrato de implementacion para cuentas nuevas y actualizadas.
- El 16 de noviembre de 2022 a las 21:23 CET, el equipo de Braavos pudo emitir una transaccion con una firma vacia que transfirio fondos desde una cuenta Argent comprometida.
- A las 22:01 CET, el equipo de Braavos informo la vulnerabilidad al equipo de Argent a traves de Slack, proporcionando todos los detalles sobre el problema, como reproducirlo y el ejemplo en cadena de transaccion maliciosa, asi como que se debe hacer para solucionarlo.
- A las 22:11 CET, el equipo de Braavos tambien alerto al equipo de Starkware sobre Slack, para asegurarse de que Argent viera el mensaje a una hora tan tardia.
- A las 22:35 CET el equipo de Starkware respondio e intento localizar a Argent
- A las 22:43: CET el equipo Argent reconocio que vieron el mensaje y estaban en el tema
- A las 23:53 CET, el equipo de Braavos sugirio a Starkware que tomara una medida temporal y limitara dichas transacciones para evitar la perdida de fondos hasta que se implementara una solucion*
- El 17 de noviembre a las 1:03 CET Argent actualizo y presento una nueva version para su aprobacion en las tiendas. La version se hizo publica poco tiempo despues
- El 17 de noviembre, alrededor de las 14:00 CET, Starkware publico una actualizacion del sistema operativo StarkNet, implementando la medida temporal sugerida por Braavos que comenzo a bloquear dichas transacciones afectadas.
Urgencia
(*) – Sabiamos que incluso si Argent lanzara una solucion en unas pocas horas (como de hecho sucedio!), podria pasar tiempo hasta que la version parcheada sea aprobada en la tienda de Chrome y aun mas tiempo hasta que los usuarios actualicen al nuevo contrato. Por lo tanto, continuamos trabajando con el equipo de Starkware para intentar parchear una solucion a nivel de protocolo. Luego sugerimos bloquear las transacciones v0 para esta implementacion especifica del contrato Argent y asi garantizar que un atacante no pueda aprovechar la situacion en los pocos dias que les tomara a todos los usuarios relevantes actualizar su contrato de billetera + cuenta Argent a la version fija.
Apreciamos la ejecucion rapida y concisa del equipo de Argent al abordar el problema y enviar una solucion a las tiendas dentro de las 3 breves horas posteriores al informe. Tambien apreciamos al equipo de Starkware que no considero este problema como un problema de dApp/billetera. Estaba totalmente comprometido a hacer todo lo que estuviera a su alcance para garantizar que los usuarios no estuvieran en peligro.
Gracias a la rápida acción de todas las partes, no se perdieron fondos.
Conclusion
Estamos seguros de que las billeteras basadas en contratos inteligentes son el futuro como flexibilidad. Permite abrir la puerta a una experiencia de usuario significativamente mejor sin comprometer la seguridad.
Permitira que las billeteras no comprometan la seguridad, al tiempo que brindara a los usuarios cotidianos la experiencia a la que estan acostumbrados con las soluciones clasicas de tradFi/web2.
El ecosistema StarkNet aun se encuentra en su etapa alfa y, como tal, se espera que avance rapidamente e introduzca cambios y actualizaciones que impulsaran la funcionalidad general de la red.
Depende de todos los desarrolladores que trabajan en la red tener mucho cuidado y ¡PRUEBA PRUEBA PRUEBA!