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 頭寸,使協議的質押總額從 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