Предыстория
17 марта 2023 года платформа для кредитования NFT Paraspace (ныне Parallel Finance) подверглась критической атаке из-за уязвимости в ценовом оракуле. Paraspace позволяет пользователям вносить NFT и токены стандарта ERC-20 в качестве залога для получения займов в токенах ERC-20, что дает возможность получать доход от NFT без их продажи.

Ключевой функцией ParaSpace является ApeStaking, который автоматически реинвестирует вознаграждения в APE. Пользователи, размещающие (стейкающие) APE, получают cAPE — cToken, представляющий APE, который можно использовать в качестве залога для займа таких активов, как USDC и WETH. Внесение токенов cAPE дает доли pcAPE, стоимость залога которых рассчитывается путем умножения количества pcAPE на значение rebasingIndex.
Значение rebasingIndex вычисляется на основе общего баланса объединенных (pooled) 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. В частности, функция depositApeCoin() в контракте ApeCoinStaking увеличивает 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();
}
Этот проектный недочет позволяет злоумышленнику завышать стоимость залога путем внесения токенов APE через depositApeCoin(), указав cAPE в качестве получателя.
Анализ атаки
Злоумышленник использовал эту уязвимость с помощью флэш-кредита (flash loan), совершив атаку в пять ключевых этапов:
- Получил флэш-кредит на сумму около 47 352 wstETH и предоставил примерно 46 018 wstETH для займа cAPE через несколько контрактов.
- Внес около 12 880 000 токенов cAPE в качестве залога.
- Обменял примерно 1 205 wstETH на 492 124 токена APE и вывел 1 839 999 cAPE в токены APE.
- Внес 2 332 214 токенов APE в позицию cAPE путем вызова
ApeCoinStaking.depositApeCoin(), увеличив параметрstakedAmountпротокола с 851 662 до 3 183 876 (рост на 373%). - Использовал завышенную стоимость залога для получения займов в больших объемах таких активов, как USDC и WETH, для извлечения прибыли.
Манипуляция ценой pcAPE через флэш-кредиты стала возможной из-за использования спотовых цен при расчете оракула.
Резюме
Инцидент с ParaSpace подчеркивает риски манипуляций с оракулами и атак с использованием флэш-кредитов в протоколах DeFi. Он указывает на критическую необходимость внедрения надежных, устойчивых к манипуляциям ценовых оракулов и непрерывного мониторинга безопасности после проведения предзапускового аудита.
Система Phalcon Security от BlockSec продемонстрировала эффективность активного обнаружения и предотвращения угроз, автоматически заблокировав атаку и защитив активы пользователей. Этот случай служит напоминанием для DeFi-протоколов о необходимости реализации комплексных мер безопасности, включая аудит смарт-контрактов, аудит инфраструктуры и мониторинг в режиме реального времени.
Чтобы узнать больше об инцидентах безопасности в DeFi и лучших практиках, изучите нашу Библиотеку инцидентов безопасности и рассмотрите наши услуги по Аудиту смарт-контрактов и Аудиту инфраструктуры.
Читайте другие статьи из этой серии:
- Вступление: Десять самых громких инцидентов безопасности 2023 года
- #1: Как опустошили MEV-ботов, воспользовавшись уязвимостями в Flashbots Relay
- #2: Инцидент с Euler Finance: Крупнейший взлом 2023 года
- #3: Инцидент с KyberSwap: Мастерская эксплуатация ошибок округления
- #4: Инцидент с Curve: Ошибка компилятора привела к созданию дефектного байт-кода
- #5: Platypus Finance: Как пережить три атаки подряд
- #6: Инцидент с Hundred Finance: Эксплойты, связанные с точностью вычислений
- #8: Инцидент с SushiSwap: Неуклюжая попытка спасения, приведшая к серии атак подражателей
- #9: MEV-бот 0xd61492: Из хищника в добычу
- #10: Инцидент с ThirdWeb: Несовместимость между доверенными модулями открывает уязвимость
Лучший аудитор безопасности для Web3
Проверьте дизайн, код и бизнес-логику перед запуском



