背景
2023年3月17日、NFT貸付プラットフォームであるParaspace(現Parallel Finance)は、価格オラクルの脆弱性により、重大な攻撃を受けました。Paraspaceは、ユーザーがNFTやERC-20トークンを担保として預け入れ、ERC-20トークンを借り入れることを可能にし、NFTを売却せずに収益化できるようにしています。

ParaSpaceの主な機能の一つはApeStakingであり、APE報酬を自動的に複利運用します。APEをステーキングしたユーザーは、APEのcToken表現である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()関数は、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();
}
この設計上の欠陥により、攻撃者はdepositApeCoin()をcAPEを宛先として呼び出すことで、APEトークンを預け入れることにより、担保価値を膨張させることができます。
攻撃分析
攻撃者は、5つの主要なステップでフラッシュローン攻撃を使用してこの脆弱性を悪用しました。
- 約47,352 wstETHのフラッシュローンを取得し、約46,018 wstETHを供給して、複数のコントラクトを介してcAPEを借入しました。
- 約12,880,000 cAPEトークンを担保として預け入れました。
- 約1,205 wstETHを約492,124 APEトークンと交換し、1,839,999 cAPEをAPEトークンに引き出しました。
ApeCoinStaking.depositApeCoin()を呼び出すことにより、2,332,214 APEトークンをcAPEポジションに預け入れ、プロトコルのstakedAmountを851,662から3,183,876(373%増加)に増加させました。- 膨張した担保を活用して、USDCやWETHなどの大量の資産を利益のために借入しました。
フラッシュローンによるpcAPE価格の操作は、オラクル計算におけるスポット価格の使用を悪用したものです。
まとめ
ParaSpaceのインシデントは、DeFiプロトコルにおけるオラクル操作とフラッシュローン攻撃のリスクを浮き彫りにしました。これは、堅牢で操作に強い価格オラクルと、ローンチ前の監査を超えた継続的なセキュリティ監視の重要な必要性を強調しています。
BlockSecのPhalcon Securityシステムは、攻撃を自動的にブロックし、ユーザー資産を保護することにより、積極的な脅威検出と防止の価値を示しました。このインシデントは、DeFiプロトコルが、スマートコントラクト監査、インフラストラクチャ監査、リアルタイム監視を含む包括的なセキュリティ対策を実装するためのリマインダーとなります。
DeFiセキュリティインシデントとベストプラクティスに関する詳細については、当社のセキュリティインシデントライブラリをご覧いただくか、当社のスマートコントラクト監査およびインフラストラクチャ監査サービスをご検討ください。
このシリーズの他の記事を読む:
- リードイン:2023年のトップ10「驚くべき」セキュリティインシデント
- #1:Flashbots Relayの脆弱性を悪用したMEVボットの収奪
- #2:Euler Financeインシデント:2023年最大のハッキング
- #3:KyberSwapインシデント:丸め誤差の巧みな悪用
- #4:Curveインシデント:コンパイラエラーによる不正なバイトコード生成
- #5:Platypus Finance:3度の攻撃を生き延びる
- #6:Hundred Financeインシデント:精度関連の悪用
- #8:SushiSwapインシデント:不格好な救済の試み
- #9:MEVボット0xd61492:捕食者から獲物へ
- #10:ThirdWebインシデント:信頼されたモジュールの間の互換性
Web3の最高のセキュリティ監査人
ローンチ前に設計、コード、ビジネスロジックを検証する



