Volver al blog

#7: Incidente ParaSpace: Una Carrera Contra el Tiempo para Frustrar el Ataque Más Crítico de la Industria

Code Auditing
17 de febrero de 2024
5 min de lectura
Ideas clave
  • Causa raíz: el rebasingIndex de cAPE utilizaba el total de APE agrupado (stakedAmount + recompensas pendientes + buffer), que los atacantes podían inflar a través de ApeCoinStaking.depositApeCoin() para aumentar el valor del colateral.

  • Ruta del ataque: obtener unos 47.352 wstETH mediante un préstamo flash, pedir prestado cAPE y depositarlo como garantía, inflar su valor mediante un depósito de APE y después pedir prestados otros activos contra esa garantía.

Antecedentes

El 17 de marzo de 2023, Paraspace (ahora Parallel Finance), una plataforma de préstamos de NFT, sufrió un ataque crítico debido a una vulnerabilidad en su oráculo de precios. Paraspace permite a los usuarios depositar NFTs y tokens ERC-20 como garantía para tomar prestados tokens ERC-20, lo que permite obtener rendimientos sobre los NFTs sin venderlos.

Haz clic aquí para leer el tuit
Haz clic aquí para leer el tuit

Una característica clave de ParaSpace es ApeStaking, que capitaliza automáticamente las recompensas de APE. Los usuarios que hacen staking de APE reciben tokens cAPE, una representación cToken de APE, que puede usarse como garantía para tomar prestados activos como USDC y WETH. Depositar tokens cAPE otorga participaciones pcAPE, cuyo valor de garantía se calcula multiplicando la cantidad de pcAPE por su rebasingIndex.

El rebasingIndex se deriva del saldo total de APE agrupado y el total de participaciones, como se muestra en los siguientes fragmentos de código:

function _scaledBalanceOf(address user, uint256 rebasingIndex)
    internal
    view
    returns (uint256)
{
    return super.scaledBalanceOf(user).rayMul(rebasingIndex);
}

function lastRebasingIndex() internal view override returns (uint256) {
  return ICApe(_underlyingAsset).getPooledApeByShares(WadRayMath.RAY);
}

function getPooledApeByShares(uint256 sharesAmount)
    public
    view
    returns (uint256)
{
    uint256 totalShares = _getTotalShares();
    if (totalShares == 0) {
        return 0;
    } else {
        return
            sharesAmount.mul(_getTotalPooledApeBalance()).div(totalShares);
    }
}

function _getTotalPooledApeBalance()
    internal
    view
    override
    returns (uint256)
{
    (uint256 stakedAmount, ) = apeStaking.addressPosition(address(this));
    uint256 rewardAmount = apeStaking.pendingRewards(
        APE_COIN_POOL_ID,
        address(this),
        0
    );
    return stakedAmount + rewardAmount + bufferBalance;
}

La función _getTotalPooledApeBalance() suma los tokens APE en staking, las recompensas pendientes y un saldo de reserva del contrato ApeCoinStaking.

Análisis de la Vulnerabilidad

La vulnerabilidad reside en la manipulación del rebasingIndex, que infla artificialmente el valor de garantía de los tokens cAPE. Específicamente, la función depositApeCoin() en el contrato ApeCoinStaking incrementa el stakedAmount de una posición. Un atacante puede explotar esto depositando tokens APE en la posición cAPE, inflando la salida de _getTotalPooledApeBalance() y, por tanto, el rebasingIndex.

function depositApeCoin(uint256 _amount, address _recipient) public {
    if (_amount < MIN_DEPOSIT) revert DepositMoreThanOneAPE();
    updatePool(APECOIN_POOL_ID);

    Position storage position = addressPosition[_recipient];
    _deposit(APECOIN_POOL_ID, position, _amount);

    apeCoin.transferFrom(msg.sender, address(this), _amount);

    emit Deposit(msg.sender, _amount, _recipient);
}

function _deposit(uint256 _poolId, Position storage _position, uint256 _amount) private {
  Pool storage pool = pools[_poolId];
  _position.stakedAmount += _amount;
  pool.stakedAmount += _amount.toUint96();
  _position.rewardsDebt += (_amount * pool.accumulatedRewardsPerShare).toInt256();
}

Este fallo de diseño permite al atacante inflar el valor de garantía depositando tokens APE a través de depositApeCoin() con cAPE como destinatario.

Análisis del Ataque

El atacante explotó esta vulnerabilidad mediante un ataque de préstamo flash en cinco pasos clave:

  1. Obtuvo un préstamo flash de aproximadamente 47,352 wstETH y suministró alrededor de 46,018 wstETH para tomar prestado cAPE a través de múltiples contratos.
  2. Depositó aproximadamente 12,880,000 tokens cAPE como garantía.
  3. Intercambió aproximadamente 1,205 wstETH por unos 492,124 tokens APE y retiró 1,839,999 cAPE en tokens APE.
  4. Depositó 2,332,214 tokens APE en la posición cAPE llamando a ApeCoinStaking.depositApeCoin(), aumentando el stakedAmount del protocolo de 851,662 a 3,183,876 (un incremento del 373%).
  5. Aprovechó la garantía inflada para tomar prestadas grandes cantidades de activos como USDC y WETH con fines de lucro.

Esta manipulación del precio de pcAPE mediante préstamos flash explotó el uso de precios spot en el cálculo del oráculo.

Comienza con Phalcon Security

Detecta cada amenaza, alerta sobre lo que importa y bloquea ataques.

Pruébalo gratis ahora

Resumen

El incidente de ParaSpace subraya los riesgos de la manipulación de oráculos y los ataques de préstamos flash en los protocolos DeFi. Destaca la necesidad crítica de oráculos de precios robustos y resistentes a la manipulación, así como de una monitorización de seguridad continua más allá de las auditorías previas al lanzamiento.

El sistema Phalcon Security de BlockSec demostró el valor de la detección y prevención activa de amenazas al bloquear automáticamente el ataque y proteger los activos de los usuarios. Este incidente sirve como recordatorio para que los protocolos DeFi implementen medidas de seguridad integrales, incluyendo auditorías de contratos inteligentes, auditorías de infraestructura y monitorización en tiempo real.

Para obtener más información sobre incidentes de seguridad en DeFi y mejores prácticas, explora nuestra Biblioteca de Incidentes de Seguridad y considera nuestros servicios de Auditoría de Contratos Inteligentes y Auditoría de Infraestructura.

Explora la Investigación con MetaSleuth

Rastrea flujos y construye evidencias para investigaciones

Pruébalo gratis ahora

Lee otros artículos de esta serie:

El Mejor Auditor de Seguridad para Web3

Valida el diseño, el código y la lógica de negocio antes del lanzamiento

Apúntate para recibir las novedades
Pérdidas de ~5,57 millones USD: exploits de X100 Freezer y NEM | Resumen semanal de BlockSec
Security Insights

Pérdidas de ~5,57 millones USD: exploits de X100 Freezer y NEM | Resumen semanal de BlockSec

Este informe semanal cubre dos incidentes de seguridad ocurridos en Ethereum y BNB Chain durante el período 19/10/2026–25/10/2026. Examina una toma de control de la gobernanza de X100 Freezer financiada mediante un préstamo flash y un fallo en la liquidación de impuestos que afectó a un pool de liquidez de un token NEM en BNB Chain. Las pérdidas estimadas dentro del alcance del informe suman aproximadamente 5,57 millones USD: ~4,75 millones USD de la transacción representativa de X100 y ~820 mil USD del incidente del pool de NEM. El total excluye las extracciones posteriores de X100 reportadas por separado.

Pérdidas de aproximadamente 3,87 millones USD: hackeos de Autheo Network y UNCX | Resumen semanal de BlockSec
Security Insights

Pérdidas de aproximadamente 3,87 millones USD: hackeos de Autheo Network y UNCX | Resumen semanal de BlockSec

Este informe semanal cubre 3 incidentes de seguridad correspondientes al período 12/10/2026–18/10/2026, con pérdidas totales estimadas en aproximadamente 3,87 millones USD. Autheo Network sufrió una vulneración de clave privada con pérdidas de aproximadamente 1,76 millones USD; Qubic Wallet perdió aproximadamente 1,30 millones USD debido a la generación de una semilla débil; y los contratos Smart Token Vesting V2 de UNCX Network sufrieron un error contable con pérdidas de aproximadamente 807 mil USD en Ethereum, BNB Chain, Base y Robinhood Chain. El análisis destacado de UNCX explica cómo un cálculo agregado de participaciones defectuoso mezcló tramos de adquisición de derechos creados con distintas proporciones entre tokens y participaciones, lo que permitió retiros excesivos de pools compartidos.

Pérdidas de ~542.000 dólares: explotación de MakerDaoBot | Resumen semanal de BlockSec
Security Insights

Pérdidas de ~542.000 dólares: explotación de MakerDaoBot | Resumen semanal de BlockSec

Ethereum (05–11/10/2026): 1 incidente; pérdida estimada de $542 mil. MakerDaoBot, sin control de acceso, dio a un adaptador malicioso acceso a sus saldos MakerDAO. Este cerró 4 subastas ETH-A y convirtió 200 ETH-A en WETH; el atacante los cambió por 200 ETH y se los envió.

El mejor auditor de seguridad para Web3

Valida el diseño, el código y la lógica de negocio antes del lanzamiento, siguiendo los estándares de seguridad más exigentes del sector.

Auditoría de BlockSec