Por BlockSec
El 8 de noviembre de 2022, detectamos que algunos ataques drenaron con éxito activos de grupos creados sobre el contrato oficial KashiPairMediumRiskV1 de Sushi (o algunos contratos que se bifurcan a partir de él). Después de la investigación, descubrimos que la causa raíz se debe a un error lógico que provoca el cálculo erróneo de los precios de los tokens.
Inmediatamente nos comunicamos con el equipo de seguridad de Sushi y ellos confirmaron nuestros hallazgos. Lo bueno es que estaban tomando medidas para proteger algunos grupos valiosos pero vulnerables de ser atacados. Además, también proporcionaron procedimientos para compensar a quienes perdieron fondos por el exploit. Como tal, ahora creemos que es seguro revelar los detalles sobre la vulnerabilidad y los ataques. En este informe, nos gustaría proporcionar un análisis detallado.
Análisis de vulnerabilidad
Después de analizar el código fuente del contrato KashiPairMediumRiskV1, llegamos a la conclusión de que este error radica en la función de préstamo, que utiliza el tipo de cambio obsoleto para verificar la participación prestada en el modificador de solvente. Específicamente, la verificación se realizará en función del valor actual de exchangeRate en la función _isSolvent .


Mientras está en la función liquidar , la función updateExchangeRate se invoca desde el principio. Por lo tanto, la verificación y el cálculo se realizarán en función del valor actualizado.

Obviamente, este error podría aprovecharse para generar una (enorme) diferencia de precio.
Análisis de ataques
Observamos dos ataques:
https://etherscan.io/tx/0xcf8f242ea83100b6d43e659f7f53a698d304fc6ac2ca6fe79e3e07ee05fefe58: la víctima utiliza el contrato KashiPairMediumRiskV1 y la pérdida ronda los 9.466 USDC.
https://etherscan.io/tx/0x3d163bfbec5686d428a6d43e45e2626a220cc4fcfac7620c620b82c1f2537c78: la víctima es un contrato de estrategia que utiliza CauldronMediumRiskV1 (la bifurcación de KashiPairMediumRiskV1), y la pérdida es de alrededor de 110,911 M IM.
Tenga en cuenta que la primera transacción de ataque fue lanzada por un bot que ejecuta la transacción de ataque original: https://etherscan.io/tx/0x7a845d8d2af7919f5b9e22dd5571305cb5347d17986a8402715c1463d515fc18, y la dirección del atacante original es 0xb7ea0f0f8c6df7a61. bf024db21bbe85ac5688005.
Aquí tomamos la primera transacción de ataque como ejemplo, que consta de los siguientes pasos:
Pedir prestado un préstamo rápido de 40,900 BADGER y 121,904 USDC de Balancer.
Depositando 40,900 BADGER y 113,599 USDC en BentoBox.
Invocando la función addCollateral de kmBADGER/USDC-LINK para depositar 40,900,000,000,000,000,000,000 acciones de BADGER.
Invocando la función addAsset de kmBADGER/USDC-LINK para depositar 112.529.000.000 de acciones de USDC.
Invocando la función de préstamo para pedir prestado 120.755.095.093 acciones de USDC.
Invocando la función UpdateExchangeRate .
Invocando la función liquidar para liquidarse.
Retira 40,899 BADGER y 123,006 USDC de BentoBox.
Pagar el préstamo flash y obtener una ganancia de aproximadamente 9466 USDC.
Tenga en cuenta que el paso 6 no es necesario porque la función de préstamo invocará la función UpdateExchangeRate.
Los pasos clave son los siguientes:
No es difícil darse cuenta de que el valor del tipo de cambio utilizado en la función de préstamo se desvía del valor utilizado en la función de liquidación:
En la función de préstamo: 250.997.938.545.109.237.740.214.705.193
En la función liquidar: 328.266.883.541.864.569.505.752.156.794
El impacto
Hay docenas de grupos (tanto en Ethereum como en BSC) que podrían verse afectados por este error. Un método temporal para mitigar este problema es reducir o eliminar la desviación invocando la función UpdateExchangeRate de vez en cuando (o periódicamente). Este método ya ha sido adoptado por muchos proyectos afectados y las transacciones correspondientes se pueden observar en la naturaleza.
