Dos errores diferentes en una bifurcación del protocolo de comercio apalancado de Gains Network podrían haber permitido a los operadores obtener una ganancia 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 luego se corrigió. El otro sólo se encontró en una bifurcación del protocolo.

Según Zellic, su personal informó a los desarrolladores de las bifurcaciones Gambit Trade, Holdstation Exchange y Krav Trade de Gains sobre la vulnerabilidad, y estos equipos de desarrollo se han asegurado de que sus protocolos no contengan esas dos fallas. Sin embargo, otras bifurcaciones de Gains pueden seguir siendo vulnerables, advirtió Zellic.

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 operaciones apalancadas es "gTrade". Ha facilitado más de 25 mil millones de dólares en volumen de derivados desde su creación en mayo de 2023, según la plataforma de análisis blockchain DefiLlama.

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

Zellic afirmó que varias aplicaciones populares de comercio DeFi se derivan del código base de Gains Network, incluidos Gambit Trade y Holdstation antes mencionados, así como muchos otros protocolos. Descubrieron el exploit mientras estudiaban una bifurcación en particular, pero se negaron a nombrar en cuál lo descubrieron.

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

Cuando un usuario solicita abrir una operación de impulso o reversión, el contrato inteligente registra una "orden" que contiene datos sobre el precio al que el usuario está dispuesto a operar. Una vez que se alcanza este precio, cualquier usuario puede llamar a la función ejecutarLimitOrder para ejecutar la orden. El usuario que llama a la ejecución no tiene que ser el mismo que realizó la orden. Los usuarios que llaman a la ejecución reciben una pequeña “tarifa de ejecución” por realizar esta función.

Esto permite a los usuarios colocar órdenes de límite (impulso) y límite de parada (reversión) de manera similar a como lo hacen en un intercambio centralizado, pero sin necesidad de una entidad centralizada para realizar el cumplimiento de la orden.

Cuando un usuario realiza una orden, puede establecer un precio de obtención de ganancias, un precio de límite de pérdidas o ambos. La intención de este diseño es permitir a los operadores salir automáticamente de una operación rentable en el punto de obtención de beneficios o de una operación perdedora en el punto de parada de pérdidas.

Un error en la bifurcación Gains permitió una ganancia del 900% en las órdenes de compra

En la bifurcación de ganancias que estudió, Zellic descubrió que cuando se abría una orden, el precio de límite de pérdidas se almacenaba en la variable "precio actual" utilizada para calcular ganancias y pérdidas. Esto significaba que si un usuario podía establecer el límite de pérdidas por encima del precio de apertura, automáticamente podía beneficiarse de cualquier operación.

Por ejemplo, considere un escenario en el que el precio de Bitcoin (BTC) era de $63 000 y el usuario ingresó $62 000 como precio de apertura y $64 000 como límite de pérdidas. En este caso, si el precio cayera a $62 000, la orden se ejecutaría. Pero el precio estaría inmediatamente por debajo de su límite de pérdidas, lo que provocaría 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 $2000, aunque la ganancia correcta debería haber sido aproximadamente $0. Esto podría haber permitido a un atacante beneficiarse de cada operación y, finalmente, agotar el protocolo de todos sus fondos.

Para evitar este exploit, el protocolo contenía una verificación que arrojaba un error "wrong_sl" si el usuario intentaba establecer su límite de pérdidas por encima de su precio de apertura en una orden de compra.

Obtiene una verificación de bifurcación de la red para evitar una toma de ganancias o un stop-loss incorrectos. Fuente: Zellic

Sin embargo, los investigadores descubrieron que este control podía eludirse en determinadas circunstancias.

Cuando un usuario abrió una orden por primera vez, estableció el precio al que quería abrir la operación, que luego se registró en la variable "openPrice". Fue en este punto cuando se realizó la verificación. Sin embargo, la función utilizada para ejecutar una orden cambió esta variable al valor de "a.Price", que era el precio actual más el impacto en el precio de la orden que se abrió.

Esto significaba que si el usuario ingresaba un precio de apertura extremadamente alto, un ejecutor podía evitar la verificación simplemente ejecutando la orden. Esto también permitió al ejecutor ejecutar la orden a un precio de apertura inferior al establecido originalmente.

Como ejemplo, Zellic consideró la idea de un atacante que realiza una orden para comprar un token por $100000e10 ($1 billón) y establece un límite de pérdidas en $1 menos que esto o $999,999999999999 billones. Una vez que se realiza la orden, el atacante ejecuta su propia orden, lo que hace que openPrice cambie de $100000e10 a cualquier precio actual después de tener en cuenta el impacto en el precio de la operación.

Luego, la operación se ejecuta y se abre. Siempre que el precio de apertura resultante esté por debajo del límite de pérdidas establecido originalmente, ahora se puede cerrar ejecutando el límite de pérdidas. Cuando el atacante ejecuta su propio stop-loss, se beneficia de la diferencia entre el precio de cierre y el precio del stop-loss.

El intercambio habría resultado en una ganancia del 900% para el atacante, afirmó Zellic.

Ejemplo de explotación de bifurcación de ganancias. Fuente: Zellic

Esta falla no estaba presente en Gains Network en el momento en que el equipo de Zellic la descubrió. Sólo existía en la versión bifurcada que estaba investigando. Sin embargo, en el proceso de estudiar este problema, se encontró con un segundo defecto que estaba presente en una versión anterior de Gains.

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

El segundo error permitió a los operadores obtener ganancias del 900% con las órdenes de venta, independientemente de la acción del precio.

Cuando se cerraba una operación en la bifurcación Gains, convertía el punto de stop-loss o take-profit del usuario en una variable llamada "int", que luego usaba para calcular la ganancia en términos porcentuales. Pero si un usuario ingresó 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 debió 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 comience de nuevo en cero y porque el cálculo agregó el precio de apertura a su total. En el lenguaje de programación Solidity, 2^256-1 también se conoce como "tipo(uint256).max".

Según Zellic, siempre que un atacante utilizara un apalancamiento superior a 9x, podría beneficiarse del 900 % de este exploit:

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

Había un control en el contrato que intentaba evitar que 2^256-1 se ingresara como obtención de ganancias. Sin embargo, esta verificación sólo se realizó en el momento en que se abrió la orden por primera vez. Si el usuario cambiaba su punto de obtención de beneficios después de abrir la orden, podía omitir la verificación e ingresar 2^256-1 como punto de obtención de beneficios, lo que le permitía obtener una ganancia automática del 900% cada vez que operaba.

Esta segunda falla existía en una versión anterior de Gains, pero fue corregida posteriormente. La versión actual no contiene este defecto, ya que realiza la verificación cuando se actualizan el take-profit y el stop-loss, así como cuando se configuran por primera vez.

Según se informa, Zellic informó a todas las bifurcaciones anteriores sobre estas dos fallas de seguridad y se comunicó con Crypto Security Alliance en un intento de encontrar otros protocolos que pudieran verse afectados por ellas. Sin embargo, advirtió que algunas bifurcaciones de Gains aún pueden contener estos errores, lo que pone en riesgo los fondos de los usuarios.

Cointelegraph se puso en contacto con Gains Network, Gambit Trade, Holdstation Exchange y Krav Trade para solicitar comentarios, pero no recibió respuesta al momento de la publicación.

Gains Network afirma que proporciona el "precio al contado real" de los activos cotizados, a diferencia de lo que considera precios menos precisos basados ​​en contratos perpetuos. También afirma ofrecer operaciones de cambio superiores en comparación con sus competidores.

Relacionado: La cadena de bloques Sui relacionada con Libra corrige un error crítico que pone en riesgo "miles de millones"