Back to Blog

#7:ParaSpaceインシデント:業界史上最悪の攻撃を阻止するための時間との戦い

Code Auditing
2024年2月17日
5 min read
Key Insights
  • 根本原因: cAPEのrebasingIndexがプールされたAPEの合計(ステーキング額 + 未払い報酬 + バッファ)を使用していたため、攻撃者はApeCoinStaking.depositApeCoin()を通じてこれを膨らませ、担保価値を不当に高めることが可能でした。

  • 攻撃経路:約47,352 wstETHをフラッシュローンで調達し、cAPEを借り入れて担保として預け入れ、APEの預け入れによって担保価値を膨らませた後、その担保を使って他の資産を借り入れた。

背景

2023年3月17日、NFTレンディングプラットフォームであるParaspace(現在のParallel Finance)が、価格オラクルの脆弱性を突いた重大な攻撃を受けました。Paraspaceでは、ユーザーはNFTやERC-20トークンを担保として預け入れ、ERC-20トークンを借り入れることで、NFTを売却することなく収益を得ることができます。

ツイートを読むにはこちらをクリック
ツイートを読むにはこちらをクリック

ParaSpaceの主要機能の一つに、APE報酬を自動複利運用するApeStakingがあります。APEをステーキングしたユーザーは、APEをcToken化したcAPEトークンを受け取ります。このcAPEは、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()関数は、ステーキングされたAPEトークン、未払いの報酬、およびApeCoinStakingコントラクトからのバッファ残高を合計します。

脆弱性分析

この脆弱性はrebasingIndexの操作にあり、cAPEトークンの担保価値を人為的に膨らませることにあります。具体的には、ApeCoinStakingコントラクト内のdepositApeCoin()関数が、あるポジションに対するstakedAmountを増加させます。攻撃者はこれを利用し、自らのcAPEポジションに対してAPEトークンを預け入れることで、_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();
}

この設計上の欠陥により、攻撃者はdepositApeCoin()を介してcAPEを受取人としてAPEトークンを預け入れることで、担保価値を膨らませることが可能となります。

攻撃分析

攻撃者はフラッシュローン攻撃を用い、以下の5つの主要ステップでこの脆弱性を悪用しました。

  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向けのベストなセキュリティ監査

ローンチ前に設計、コード、ビジネスロジックを検証します

Sign up for the latest updates
損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly
Security Insights

損失約557万 USD:X100 FreezerとNEMへの攻撃 | BlockSec Weekly

本週次レポートでは、2026年10月19日–2026年10月25日にEthereumとBNB Chainで発生した2件のセキュリティインシデントを取り上げます。フラッシュローンを資金源としたX100 Freezerのガバナンス乗っ取りと、BNB Chain上のNEMトークンの流動性プールに影響を及ぼした税の精算処理の欠陥を検証します。本レポートの対象範囲における推定損失額は合計で約557万 USDです。内訳は、代表例として取り上げるX100のトランザクションによる損失が約475万 USD、NEMプールのインシデントによる損失が約82.0万 USDです。この合計には、別途報告された、その後のX100からの資金奪取は含まれません。

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー
Security Insights

約387万 USDの損失:Autheo NetworkとUNCXへのハッキング | BlockSecウィークリー

この週次レポートでは、2026年10月12日–2026年10月18日に発生した3件のセキュリティインシデントを取り上げます。推定損失額の合計は約387万 USDです。Autheo Networkでは秘密鍵の侵害により約176万 USD、Qubic Walletでは脆弱なシード生成により約130万 USDの損失が発生しました。また、Ethereum、BNB Chain、Base、Robinhood Chain上のUNCX NetworkのSmart Token Vesting V2コントラクトでは、会計処理上の誤りにより約80.7万 USDの損失が発生しました。重点的に取り上げるUNCXの分析では、シェア総数の計算に欠陥があり、異なるトークン対シェア比率で作成されたベスティングのトランシェが混同された結果、共通プールからの過剰な引き出しが可能になった仕組みを説明します。

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース
Security Insights

約54万2,000ドルの損失:MakerDaoBotへの攻撃 | BlockSec週間ニュース

本レポートは2026/10/05~10/11にEthereumで発生したセキュリティ事故1件を扱う。推定損失は約54.2万ドル。攻撃コントラクトは悪意あるアダプターを展開し、アクセス制御のないMakerDaoBot関数に渡して、ボット内部のMakerDAO残高への操作権限を付与させた。アダプターは旧ETH-Aオークション4件を決済し、ETH-A担保200単位をWETHに変換。攻撃コントラクトがWETHをETHに戻し、攻撃者へ200 ETHを送金した。

Best Security Auditor for Web3

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

BlockSec Audit