Back to Blog

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

Code Auditing
February 17, 2024
5 min read
Key Insights

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

Best Security Auditor for Web3

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

BlockSec Audit