背景
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 代币,从而夸大抵押价值。
攻击分析
攻击者通过闪电贷攻击利用了该漏洞,主要步骤如下:
- 获得约 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 年十大“惊人”安全事件
- #1:利用 Flashbots Relay 中的漏洞进行 MEV 机器人收割
- #2:Euler Finance 事件:2023 年最大规模黑客攻击
- #3:KyberSwap 事件:对舍入错误的精妙利用
- #4:Curve 事件:编译器错误生成了错误的字节码
- #5:Platypus Finance:历经三次攻击后的存活
- #6:Hundred Finance 事件:与精度相关的漏洞利用
- #8:SushiSwap 事件:笨拙的救援尝试引发一系列模仿攻击
- #9:MEV Bot 0xd61492:从掠食者变为猎物
- #10:ThirdWeb 事件:受信任模块之间的不兼容性导致漏洞暴露
Web3 最佳安全审计专家
在上线前验证设计、代码和业务逻辑



