Back to Blog

Revisando el Incidente de Seguridad de CashioApp

Code Auditing
May 16, 2022
6 min read

A partir del 23 de marzo de 2022 a las 16:20:08 UTC+8, CashioApp fue explotado para vaciar la cuenta de tokens de garantía, con pérdidas de aproximadamente 52 millones de dólares. El ataque fue posible debido a la verificación insuficiente de las cuentas de entrada, lo que permite al atacante acuñar 20 mil millones de tokens $CASH sin ningún depósito. A continuación, mostramos los detalles técnicos.

Resumen

El incidente se debió a un error en el programa Brrr diseñado para gestionar la acuñación y quema de tokens $CASH con la garantía de Saber LP Arrows. Específicamente, los usuarios pueden imprimir $CASH, lo que significa acuñar CASH,depositandotokensLPdeArrow.Cabesen~alarqueeltokenLPdeArrowrecibeel[tokenLPdeSaber](https://app.saber.so/swap)comotokenssubyacentes.Lainstruccioˊnprintcash,quepuedeacun~arCASH, depositando tokens LP de `Arrow`. Cabe señalar que el token LP de Arrow recibe el [token LP de Saber](https://app.saber.so/swap) como tokens subyacentes. La instrucción `print_cash`, que puede acuñar `CASH, recibe una lista de cuentas que incluye la cuenta Banky la cuentaCollateral. Estas se utilizan para registrar y rastrear la garantía (es decir, los tokens LP de Arrow) que está autorizada para ser utilizada en la acuñación de CASH.Pordisen~o,estasdoscuentassolodebenserinicializadasyautorizadasporeladministrador.Sinembargo,elprogramanoverificalavalidezdelacuentaBank.Comoresultado,elatacantepuedecrearunaseriedecuentasfalsas(incluidalacuentaBank)paraintroducirlasenlainstruccioˊnprintcasheimprimirCASH`. Por diseño, estas dos cuentas solo deben ser inicializadas y autorizadas por el administrador. Sin embargo, el programa no verifica la validez de la cuenta `Bank`. Como resultado, el atacante puede crear una serie de cuentas falsas (incluida la cuenta `Bank`) para introducirlas en la instrucción `print_cash` e imprimir `CASH` casi gratuitamente (el único costo son las tarifas de transacción).

Detalles

Comencemos el análisis desde las cuentas utilizadas por la instrucción print_cash a continuación.

El atributo common (línea 75) es una estructura cuyo tipo es BrrrCommon en el programa. En BrrrCommon, la cuenta bank y la cuenta collateral son inicializadas y autorizadas por el administrador. El crate_token es la cuenta del token $CASH, que almacena información sobre $CASH, como la clave pública del crate_mint (línea 107), las claves públicas de los roles de administrador y más. El crate_collateral_tokens es una cuenta de bóveda que contiene los tokens de garantía transferidos por los usuarios. Dado que la garantía deben ser tokens LP de Arrow, que reciben los tokens LP de Saber, los usuarios deben ingresar las cuentas relacionadas con saber_swap. Los últimos dos atributos en la estructura BrrrCommon son los IDs de programa de los programas objetivo utilizados en la instrucción. Cabe señalar que los últimos cuatro atributos en la estructura PrintCash son la cuenta del sistema del usuario (también el firmante de la transacción), la cuenta de garantía del usuario, la cuenta del token $CASH del usuario que recibe los $CASH acuñados, y la clave pública de la cuenta que tiene la autoridad para acuñar los $CASH.

La Transacción del Ataque

Tras comprender la funcionalidad de las cuentas anteriores, procedemos a analizar la transacción del ataque: 0x4fgL…z2K5. Este ataque fue iniciado desde la dirección del atacante (ubicada en 0x6D7f) y la lista de cuentas de entrada en la instrucción PrintCash se muestra a continuación.

La Account #1 (0x5aha) anterior corresponde a la cuenta Bank. Observamos que es diferente de la dirección proporcionada en el sitio web oficial de CashioApp (0xEm1P), lo que significa que la validación de la cuenta Bank es insuficiente.

Validación

Analicemos más de cerca la validación de la estructura BrrrCommon en el código para entender cómo funciona la evasión.

La única verificación de la cuenta Bank de entrada es garantizar que la cuenta Collateral de entrada esté asociada con la cuenta Bank (línea 12). Sin embargo, esto puede eludirse fácilmente proporcionando también una cuenta Collateral falsa. Además, para evitar pagar activos de garantía reales, el atacante también proporcionó cuentas falsas de saber_swap. Cabe señalar que el atacante busca depositar activos de garantía sin valor para imprimir tokens $CASH valiosos, por lo que el crate_token y el crate_mint proporcionados por el atacante deben ser direcciones verdaderas. En otras palabras, la verificación insuficiente de la cuenta Bank permite al atacante crear una serie de cuentas falsas para imprimir $CASH con garantías sin valor.

La Solución

La solución consiste en agregar la instrucción assert_keys_eq!(self.bank.crate_mint, self.crate_mint). Esta instrucción garantiza que el crate_mint de la cuenta Bank sea el crate_mint correcto para $CASH. Sin embargo, ¿cómo garantiza que la cuenta Bank sea válida? Echemos un vistazo a la estructura NewBank (en el programa bankman) y a la estructura NewCrate (en el programa crate_token) para encontrar la respuesta.

De hecho, la cuenta Bank es una PDA cuyos seeds contienen la dirección del crate_token. Mientras tanto, el crate_token también es una PDA cuyos seeds contienen la dirección del crate_mint. Esto garantiza que la cuenta Bank sea válida si el crate_mint de entrada es válido. Sin un crate_mint correcto, los atacantes no pueden acuñar $CASH ni lanzar los ataques.

Acerca de BlockSec

BlockSec es una empresa pionera en seguridad de blockchain fundada en 2021 por un grupo de expertos en seguridad de renombre mundial. La empresa está comprometida con mejorar la seguridad y la usabilidad del emergente mundo Web3 para facilitar su adopción masiva. Con este fin, BlockSec ofrece servicios de auditoría de seguridad de contratos inteligentes y cadenas EVM, la plataforma Phalcon para el desarrollo de seguridad y el bloqueo proactivo de amenazas, la plataforma MetaSleuth para el rastreo e investigación de fondos, y la extensión MetaSuites para que los desarrolladores de web3 naveguen eficientemente en el mundo cripto.

Hasta la fecha, la empresa ha atendido a más de 300 clientes de prestigio, como MetaMask, Uniswap Foundation, Compound, Forta y PancakeSwap, y ha recibido decenas de millones de dólares estadounidenses en dos rondas de financiación de inversores prominentes, incluyendo Matrix Partners, Vitalbridge Capital y Fenbushi Capital.

Sitio web oficial: https://blocksec.com/

Cuenta oficial de Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

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

BlockSec Audit