Back to Blog

#7:ParaSpace事件:与时间赛跑,挫败行业迄今最严重的攻击

Code Auditing
February 17, 2024
6 min read
Key Insights

背景

2023 年 3 月 17 日,NFT 借贷平台 Paraspace(现为 Parallel Finance)因其价格预言机存在漏洞而遭到严重攻击。Paraspace 允许用户存入 NFT 和 ERC-20 代币作为抵押品来借出 ERC-20 代币,从而在不卖出 NFT 的前提下获得收益。

点击这里阅读推文
点击这里阅读推文

ParaSpace 的一个核心功能是 ApeStaking,它可以自动复投 APE 奖励。质押 APE 的用户会收到 cAPE 代币(APE 的 cToken 表示形式),这些代币可用作抵押品来借入 USDC 和 WETH 等资产。存入 cAPE 代币会获得 pcAPE 份额,其抵押价值通过 pcAPE 金额乘以其 rebasingIndex(重定基数指数)计算得出。

rebasingIndex 是从总池化 APE 余额和总份额中推导出来的,如下面的代码片段所示:

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;
}

_getTotalPooledApeBalance() 函数汇总了 ApeCoinStaking 合约中的已质押 APE 代币、待领取奖励以及缓冲余额。

漏洞分析

漏洞在于对 rebasingIndex 的操纵,这人为地夸大了 cAPE 代币的抵押价值。具体来说,ApeCoinStaking 合约中的 depositApeCoin() 函数会增加仓位的 stakedAmount。攻击者可以通过将 APE 代币存入 cAPE 仓位来利用这一点,从而夸大 _getTotalPooledApeBalance() 的输出结果,进而影响 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();
}

这一设计缺陷允许攻击者通过以 cAPE 为接收方调用 depositApeCoin() 存入 APE 代币,从而夸大抵押价值。

攻击分析

攻击者通过闪电贷攻击利用了该漏洞,主要步骤如下:

  1. 获得约 47,352 枚 wstETH 的闪电贷,并供应了约 46,018 枚 wstETH,通过多个合约借出 cAPE。
  2. 存入约 12,880,000 枚 cAPE 代币作为抵押品。
  3. 将约 1,205 枚 wstETH 兑换为约 492,124 枚 APE 代币,并将 1,839,999 枚 cAPE 提取为 APE 代币。
  4. 调用 ApeCoinStaking.depositApeCoin() 将 2,332,214 枚 APE 代币存入 cAPE 仓位,使协议的 stakedAmount 从 851,662 增加到 3,183,876(增长了 373%)。
  5. 利用夸大的抵押价值大额借入 USDC 和 WETH 等资产以获利。

这种通过闪电贷操纵 pcAPE 价格的行为,利用了预言机计算中使用现货价格的缺陷。

开始使用 Phalcon Security

检测每一个威胁,预警关键风险,并拦截攻击。

立即免费试用

总结

ParaSpace 事件突显了 DeFi 协议中预言机操纵和闪电贷攻击的风险。这强调了迫切需要稳健、抗操纵的价格预言机,以及在预发布审计之外进行持续安全监控的重要性。

BlockSec 的 Phalcon Security 系统通过自动拦截攻击并保护用户资产,证明了主动威胁检测与预防的价值。此事件提醒 DeFi 协议必须实施全面的安全措施,包括智能合约审计、基础设施审计以及实时监控。

如需了解更多关于 DeFi 安全事件和最佳实践的见解,请访问我们的 安全事件库,并考虑我们的 智能合约审计基础设施审计 服务。

探索 MetaSleuth 调查

追踪资金流向并为调查建立证据

立即免费试用

阅读本系列其他文章:

Web3 最佳安全审计专家

在上线前验证设计、代码和业务逻辑

Best Security Auditor for Web3

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

BlockSec Audit