Dos errores diferentes en un fork del protocolo de trading con apalancamiento de la Red de Gains podrían haber permitido a los traders obtener un beneficio del 900% en cada operación, independientemente del precio del token negociado, según un informe del 19 de abril de la firma de seguridad blockchain Zellic. Uno de los errores existía en una versión anterior de Gains pero fue parcheado posteriormente. El otro solo se encontró en un fork del protocolo.

Según Zellic, su personal informó a los desarrolladores de los forks de Gains Gambit Trade, Holdstation Exchange y Krav Trade sobre la vulnerabilidad, y estos equipos de desarrollo se han asegurado de que sus protocolos no contengan tales dos fallos. Sin embargo, Zellic advirtió que otros forks de Gains aún podrían ser vulnerables.

Según su sitio web oficial, Gains Network es un ecosistema de productos de finanzas descentralizadas (DeFi) en Polygon y Arbitrum. El nombre oficial de su aplicación de trading con apalancamiento es "gTrade". Ha facilitado más de USD 25 mil millones en volumen de derivados desde su creación en mayo de 2023, según la plataforma de análisis blockchain DefiLlama.

Interfaz de usuario de gTrade, la aplicación de comercio apalancado de Gains Network. Fuente: Gains Network

Zellic afirmó que varias aplicaciones de trading DeFi populares derivan del código base de Gains Network, incluidas las mencionadas anteriormente Gambit Trade y Holdstation, así como muchos otros protocolos. Descubrieron el exploit mientras estudiaban un fork en particular, pero declinaron nombrar en cuál lo descubrieron.

Según el informe, los contratos de Gains Network permiten a los usuarios abrir una orden de trading de mercado, de reversión o de momentum. Una orden de mercado compra o vende un activo de inmediato, independientemente del precio.

Cuando un usuario solicita abrir una operación de momentum o de reversión, el contrato inteligente registra una "orden" que contiene datos sobre a qué precio está dispuesto el usuario a negociar. Una vez que se alcanza este precio, cualquier usuario puede llamar a la función executeLimitOrder para llenar la orden. El usuario que llama a la ejecución no tiene que ser el mismo que colocó la orden. Los usuarios que llaman a la ejecución reciben una pequeña "tarifa de ejecución" por desempeñar este papel.

Esto permite a los usuarios colocar órdenes límite (momentum) y órdenes límite de parada (reversión) de manera similar a como lo harían en un exchange centralizado, pero sin necesidad de una entidad centralizada para realizar el llenado de órdenes.

Cuando un usuario coloca una orden, puede establecer un precio de toma de ganancias, un precio de stop-loss o ambos. La intención de este diseño es permitir a los traders salir automáticamente de una operación rentable en el punto de toma de ganancias o de una operación perdedora en el punto de stop-loss.

Un error en el fork de Gains permitía obtener una ganancia del 900% en las órdenes de compra

En el fork de Gains que estudió, Zellic descubrió que cuando se abría una orden, el precio de stop-loss se almacenaba en la variable "currentPrice" utilizada para calcular las ganancias y pérdidas. Esto significaba que si un usuario podía establecer el stop-loss por encima del precio de apertura, automáticamente podían obtener ganancias de cualquier operación.

Por ejemplo, consideremos un escenario en el que el precio de Bitcoin era de USD 63,000 y el usuario ingresaba USD 62,000 como precio de apertura y USD 64,000 como stop-loss. En este caso, si el precio caía a USD 62,000, la orden se llenaría. Pero el precio estaría inmediatamente por debajo de su stop-loss, desencadenando una salida automática.

Además, el stop-loss establecido por el usuario se registraría como el precio actual. Esto significaba que el usuario obtendría una ganancia de USD 2,000, aunque la ganancia correcta debería haber sido aproximadamente de USD 0. Esto podría haber permitido a un atacante obtener ganancias en cada operación y eventualmente agotar el protocolo de todos sus fondos.

Para prevenir este exploit, el protocolo contenía una verificación que lanzaba un error "wrong_sl" si el usuario intentaba establecer su stop-loss por encima de su precio de apertura en una orden de compra.

Verificación del fork de Gains Network para prevenir take-profits o stop-loss incorrectos. Fuente: Zellic

Sin embargo, los investigadores descubrieron que esta verificación podía ser eludida en ciertas circunstancias.

Cuando un usuario abría por primera vez una orden, establecía el precio al que deseaba abrir la operación, que luego se registraba en la variable "openPrice". En este punto se realizaba la verificación. Sin embargo, la función utilizada para ejecutar una orden cambiaba esta variable al valor de "a.Price", que era el precio actual más el impacto del precio debido a la orden abierta.

Esto significaba que si el usuario ingresaba un precio de apertura extremadamente alto, un ejecutor podía eludir la verificación simplemente ejecutando la orden. Esto también permitía al ejecutor llenar la orden a un precio de apertura por debajo del precio originalmente establecido.

Como ejemplo, Zellic consideró la idea de un atacante que coloca una orden para comprar un token a USD 100000e10 (USD 1 cuatrillón) y establece un stop-loss a USD 1 menos que esto o USD 999.999999999999 billones. Una vez realizada la orden, el atacante luego ejecuta su propia orden, lo que hace que openPrice cambie de USD 100000e10 a cualquiera que sea el precio actual después de tener en cuenta el impacto del precio de la operación.

La operación luego se ejecuta y se abre. Si el precio de apertura resultante está por debajo del stop-loss que se estableció originalmente, ahora se puede cerrar ejecutando el stop-loss. Cuando el atacante ejecuta su propio stop-loss, obtiene ganancias de la diferencia entre el precio de cierre y el precio del stop-loss.

La operación habría resultado en una ganancia del 900% para el atacante, afirmó Zellic.

Ejemplo del exploit en el fork deGains. Source: Zellic

Este defecto no estaba presente en Gains Network en el momento en que el equipo de Zellic lo descubrió. Solo existía en la versión bifurcada que estaban investigando. Sin embargo, en el proceso de estudiar este problema, se encontraron con un segundo error que estaba presente en una versión anterior de Gains en sí mismo.

El segundo error permitió una ganancia del 900% en órdenes de venta

El segundo error permitió a los traders obtener una ganancia del 900% en órdenes de venta, independientemente de la acción del precio.

Cuando se cerraba una operación en la bifurcación de Gains, convertía el punto de stop-loss o take-profit del usuario en una variable llamada "int", que luego se usaba para calcular la ganancia en términos porcentuales. Pero si un usuario ingresaba un valor de stop-loss o take-profit que fuera exactamente 2^256-1, los cálculos resultantes habrían hecho que "int" se volviera negativo.

Esto se debía a que 2^256-1 es el valor máximo para números positivos en Ethereum, lo que hace que cualquier valor por encima de él se "desborde" o vuelva a comenzar en cero y porque el cálculo sumaba el precio de apertura a su total. En el lenguaje de programación Solidity, 2^256-1 también se conoce como "type(uint256).max." 

Según Zellic, siempre que un atacante utilizara un apalancamiento superior a 9x, podrían obtener una ganancia del 900% con este exploit:

“Consideremos una orden de venta, con currentPrice como type(uint256).max. El valor resultante de diff sería openPrice + 1 (int(type(uint256).max) = -1 ), y por lo tanto, el porcentaje de ganancia sería casi igual a 100 * apalancamiento. Por lo tanto, si el apalancamiento es superior a 9, la función devolverá la ganancia como 900%.”

Había una verificación en el contrato que intentaba evitar que se ingresara 2^256-1 como take-profit. Sin embargo, esta verificación solo se realizaba en el momento en que se abría por primera vez la orden. Si el usuario cambiaba su punto de take-profit después de que se abriera la orden, podían eludir la verificación e ingresar 2^256-1 como el take-profit, lo que les permitía obtener una ganancia automática del 900% cada vez que operaban.

Este segundo defecto sí existía en una versión anterior de Gains pero posteriormente se parcheó. La versión actual no contiene este defecto, ya que realiza la verificación cuando se actualizan tanto el take-profit como el stop-loss, así como cuando se establecen por primera vez.

Según informes, Zellic informó a todas las bifurcaciones mencionadas anteriormente sobre estos dos fallos de seguridad y contactó a la Crypto Security Alliance en un intento de encontrar otros protocolos que puedan verse afectados por ellos. Sin embargo, advirtió que algunas bifurcaciones de Gains aún pueden contener estos errores, poniendo los fondos de los usuarios en riesgo de ser drenados.

Cointelegraph se puso en contacto con Gains Network, Gambit Trade, Holdstation Exchange y Krav Trade para obtener comentarios, pero no recibió respuesta al cierre de esta edición.

Gains Network afirma que proporciona el "precio real al contado" de los activos listados, en contraposición a lo que considera precios menos precisos basados en contratos perpetuos. También afirma ofrecer un trading de divisas superior en comparación con competidores.

Aclaración: La información y/u opiniones emitidas en este artículo no representan necesariamente los puntos de vista o la línea editorial de Cointelegraph. La información aquí expuesta no debe ser tomada como consejo financiero o recomendación de inversión. Toda inversión y movimiento comercial implican riesgos y es responsabilidad de cada persona hacer su debida investigación antes de tomar una decisión de inversión.