Back to Blog

#7: ParaSpace Olayı: Sektörün Şimdiye Kadarki En Kritik Saldırısını Engellemeye Karşı Zamana Karşı Yarış

Code Auditing
February 17, 2024
4 min read
Key Insights

Arka Plan

17 Mart 2023'te, bir NFT borç verme platformu olan Paraspace (şu anda Parallel Finance), fiyat oracle'ındaki bir güvenlik açığı nedeniyle kritik bir saldırıya uğradı. Paraspace, kullanıcıların NFT'leri ve ERC-20 tokenlarını teminat olarak yatırarak ERC-20 tokenları ödünç almasına olanak tanır; bu sayede NFT'leri satmadan getiri elde etmek mümkün olur.

Tweeti okumak için buraya tıklayın
Tweeti okumak için buraya tıklayın

ParaSpace'in önemli bir özelliği, APE ödüllerini otomatik olarak birleştiren ApeStaking'dir. APE stake eden kullanıcılar, APE'nin cToken temsili olan cAPE tokenları alır; bu tokenlar USDC ve WETH gibi varlıklar ödünç almak için teminat olarak kullanılabilir. cAPE tokenları yatırmak, teminat değeri pcAPE miktarının rebasingIndex ile çarpılmasıyla hesaplanan pcAPE payları kazandırır.

rebasingIndex, aşağıdaki kod parçacıklarında gösterildiği gibi toplam havuzlanmış APE bakiyesinden ve toplam paylardan türetilir:

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() fonksiyonu, ApeCoinStaking sözleşmesinden stake edilmiş APE tokenlarını, bekleyen ödülleri ve bir tampon bakiyeyi toplar.

Güvenlik Açığı Analizi

Güvenlik açığı, cAPE tokenlarının teminat değerini yapay olarak şişiren rebasingIndex'in manipülasyonunda yatmaktadır. Özellikle, ApeCoinStaking sözleşmesindeki depositApeCoin() fonksiyonu bir pozisyon için stakedAmount'u artırır. Bir saldırgan bunu, APE tokenlarını cAPE pozisyonuna yatırarak _getTotalPooledApeBalance() çıktısını ve dolayısıyla rebasingIndex'i şişirmek için istismar edebilir.

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();
}

Bu tasarım hatası, saldırganın cAPE'yi alıcı olarak belirleyerek depositApeCoin() aracılığıyla APE tokenları yatırıp teminat değerini şişirmesine olanak tanır.

Saldırı Analizi

Saldırgan, bu güvenlik açığını beş temel adımda bir flash loan saldırısı kullanarak istismar etti:

  1. Yaklaşık 47.352 wstETH flash loan aldı ve birden fazla sözleşme aracılığıyla cAPE ödünç almak için yaklaşık 46.018 wstETH sağladı.
  2. Teminat olarak yaklaşık 12.880.000 cAPE tokenı yatırdı.
  3. Yaklaşık 1.205 wstETH'yi yaklaşık 492.124 APE tokenına takas etti ve 1.839.999 cAPE'yi APE tokenlarına çekti.
  4. ApeCoinStaking.depositApeCoin() çağrısıyla 2.332.214 APE tokenını cAPE pozisyonuna yatırdı; bu sayede protokolün stakedAmount değerini 851.662'den 3.183.876'ya (%373 artış) yükseltti.
  5. Şişirilmiş teminatı kullanarak kâr amacıyla USDC ve WETH gibi varlıklardan büyük miktarlarda ödünç aldı.

Flash loan'lar aracılığıyla pcAPE fiyatının bu şekilde manipüle edilmesi, oracle hesaplamasında spot fiyatların kullanılmasını istismar etti.

Phalcon Security ile Başlayın

Her tehdidi tespit edin, önemli olanlar için uyarı alın ve saldırıları engelleyin.

Şimdi ücretsiz deneyin

Özet

ParaSpace olayı, DeFi protokollerinde oracle manipülasyonu ve flash loan saldırılarının risklerini gözler önüne sermektedir. Bu olay, sağlam ve manipülasyona dirençli fiyat oracle'larına ve lansman öncesi denetimlerinin ötesinde sürekli güvenlik izlemeye duyulan kritik ihtiyacı vurgulamaktadır.

BlockSec'in Phalcon Security sistemi, saldırıyı otomatik olarak engelleyerek ve kullanıcı varlıklarını koruyarak aktif tehdit tespiti ve önlemenin değerini ortaya koymuştur. Bu olay, DeFi protokollerine akıllı sözleşme denetimleri, altyapı denetimleri ve gerçek zamanlı izleme dahil kapsamlı güvenlik önlemleri uygulamaları için bir hatırlatma niteliğindedir.

DeFi güvenlik olayları ve en iyi uygulamalar hakkında daha fazla bilgi için Güvenlik Olayı Kütüphanemizi inceleyin ve Akıllı Sözleşme Denetimi ile Altyapı Denetimi hizmetlerimizi değerlendirin.

MetaSleuth Soruşturmasını Keşfedin

Akışları izleyin ve soruşturmalar için kanıt oluşturun

Şimdi ücretsiz deneyin

Bu serideki diğer makaleleri okuyun:

Web3 için En İyi Güvenlik Denetçisi

Lansman öncesinde tasarımı, kodu ve iş mantığını doğrulayın

Best Security Auditor for Web3

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

BlockSec Audit