Back to Blog

№7: Инцидент в ParaSpace: гонка со временем для предотвращения самой критической атаки в индустрии

Code Auditing
17 февраля 2024 г.
5 min read
Key Insights
  • Первопричина: rebasingIndex в cAPE использовал общий pooled APE (stakedAmount + ожидаемые награды + буфер), который злоумышленники могли раздуть через ApeCoinStaking.depositApeCoin() для увеличения стоимости залога.

  • Путь атаки: флэш-кредит ~47 352 wstETH, заимствование/внесение депозита

Предыстория

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), совершив атаку в пять ключевых этапов:

  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. Внес 2 332 214 токенов APE в позицию cAPE путем вызова ApeCoinStaking.depositApeCoin(), увеличив параметр stakedAmount протокола с 851 662 до 3 183 876 (рост на 373%).
  5. Использовал завышенную стоимость залога для получения займов в больших объемах таких активов, как USDC и WETH, для извлечения прибыли.

Манипуляция ценой pcAPE через флэш-кредиты стала возможной из-за использования спотовых цен при расчете оракула.

Начните работу с Phalcon Security

Обнаруживайте любую угрозу, отслеживайте важное и блокируйте атаки.

Попробуйте бесплатно

Резюме

Инцидент с ParaSpace подчеркивает риски манипуляций с оракулами и атак с использованием флэш-кредитов в протоколах DeFi. Он указывает на критическую необходимость внедрения надежных, устойчивых к манипуляциям ценовых оракулов и непрерывного мониторинга безопасности после проведения предзапускового аудита.

Система Phalcon Security от BlockSec продемонстрировала эффективность активного обнаружения и предотвращения угроз, автоматически заблокировав атаку и защитив активы пользователей. Этот случай служит напоминанием для DeFi-протоколов о необходимости реализации комплексных мер безопасности, включая аудит смарт-контрактов, аудит инфраструктуры и мониторинг в режиме реального времени.

Чтобы узнать больше об инцидентах безопасности в DeFi и лучших практиках, изучите нашу Библиотеку инцидентов безопасности и рассмотрите наши услуги по Аудиту смарт-контрактов и Аудиту инфраструктуры.

Исследуйте MetaSleuth

Отслеживайте потоки средств и собирайте доказательства для расследований

Попробуйте бесплатно

Читайте другие статьи из этой серии:

Лучший аудитор безопасности для Web3

Проверьте дизайн, код и бизнес-логику перед запуском

Sign up for the latest updates
Потери на сумму около 3,87 млн USD: взломы Autheo Network и UNCX | Еженедельный обзор BlockSec
Security Insights

Потери на сумму около 3,87 млн USD: взломы Autheo Network и UNCX | Еженедельный обзор BlockSec

В этом еженедельном отчёте рассматриваются 3 инцидента безопасности за период 12.10.2026–18.10.2026. Общий оценочный ущерб составил около 3,87 млн USD. Ущерб Autheo Network от компрометации закрытого ключа составил примерно 1,76 млн USD, Qubic Wallet потерял примерно 1,30 млн USD из-за ненадёжной генерации seed, а ошибка учёта в контрактах Smart Token Vesting V2 сети UNCX Network на Ethereum, BNB Chain, Base и Robinhood Chain привела к ущербу примерно в 807 тыс. USD. В подробном анализе инцидента UNCX объясняется, как некорректный расчёт совокупного количества долей смешивал транши вестинга, созданные при разных соотношениях токенов и долей, и позволял выводить из общих пулов больше положенного.

Потеряно около $542 тыс.: эксплуатация уязвимости MakerDaoBot | Еженедельный обзор BlockSec
Security Insights

Потеряно около $542 тыс.: эксплуатация уязвимости MakerDaoBot | Еженедельный обзор BlockSec

В Ethereum за 05–11.10.2026 произошёл 1 инцидент; ущерб — около $542 тыс. Атакующий передал вредоносный адаптер функции MakerDaoBot без контроля доступа. Получив права на балансы MakerDAO, адаптер закрыл 4 аукциона ETH-A, конвертировал 200 ETH-A в WETH; атакующий вывел 200 ETH.

~418 млн $ потеряно: эксплойты Bitget и NEAR Intents | BlockSec Weekly
Security Insights

~418 млн $ потеряно: эксплойты Bitget и NEAR Intents | BlockSec Weekly

Этот отчёт за две недели фиксирует 8 инцидентов с 21 сентября по 4 октября 2026 г., убытки ≈$418,4М в Ethereum, BNB Chain, Solana, Bitcoin, TRON, XRP Ledger, Zcash, Avalanche, NEAR. Разбор: уязвимость продукта безопасности Bitget ($387,5М) и ошибка NEAR Intents ($3,87М).

Best Security Auditor for Web3

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

BlockSec Audit
№7: Инцидент в ParaSpace: гонка со временем для предотвращения самой критической атаки в индустрии