Am 17. März 2023 wurde Paraspace aufgrund einer Schwachstelle im Preis-Oracle zum Ziel eines Hackerangriffs. Nachdem der Hacker drei fehlgeschlagene Versuche unternommen hatte, griff das BlockSec Phalcon-System rechtzeitig ein und rettete durch eine Rettungsaktion ETH im Wert von über 5 Millionen Dollar. Details und Anekdoten zur Rettung finden Sie unter diesem Link.

Hintergrund
ParaSpace (jetzt bekannt als Parallel Finance) ist eine NFT-Kreditplattform, die es Ihnen ermöglicht, NFTs und ERC-20-Token als Sicherheit zu verwenden. Durch die Hinterlegung dieser Vermögenswerte bei ParaSpace können Benutzer ERC-20-Token leihen, was die Möglichkeit bietet, Renditen auf NFTs zu erzielen, ohne diese verkaufen zu müssen.
Eine der interessanten Funktionen von ParaSpace ist ApeStaking, das die automatische Aufzinsung von APE-Belohnungen ermöglicht. Benutzer, die ApeStaking auf der ParaSpace-Plattform betreiben, erhalten cAPE – eine cToken-Darstellung von APE –, die sie dann dem Kreditpool zur Verfügung stellen können.
Insbesondere erlaubt ParaSpace die Verwendung von cAPE als Sicherheit für die Aufnahme von Vermögenswerten wie USDC und WETH. Benutzer können cAPE-Token einzahlen, um pcAPE-Anteile zu erhalten. Der Beleihungswert wird berechnet, indem die Menge an pcAPE mit dem rebasingIndex des pcAPE-Tokens multipliziert wird, wie folgt:
function _scaledBalanceOf(address user, uint256 rebasingIndex)
internal
view
returns (uint256)
{
return super.scaledBalanceOf(user).rayMul(rebasingIndex);
}
Der rebasingIndex des pcAPE-Tokens wird durch die Funktion lastRebasingIndex bestimmt, die wiederum die Funktion getPooledApeByShares() aufruft. Letztere berechnet den Index anhand der Formel sharesAmount.mul(_getTotalPooledApeBalance()).div(totalShares). Die Funktion _getTotalPooledApeBalance() repräsentiert den Gesamtwert der APE-Token in den Pools, während sich totalShares auf das gesamte Angebot an cAPE-Token bezieht.
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);
}
}
Die Funktion _getTotalPooledApeBalance() ist darauf ausgelegt, die Gesamtsumme von stakeAmount, rewardAmount und bufferBalance zu ermitteln, die aus dem ApeCoinStaking-Vertrag stammen. Genauer gesagt bezieht sich stakeAmount auf die Anzahl der APE-Token, die in der cAPE-Position innerhalb des ApeCoinStaking-Vertrags gestaked wurden.
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;
Schwachstellenanalyse
Leider ist der zuvor erwähnte rebasingIndex anfällig für Manipulationen, die den Beleihungswert des cAPE-Tokens künstlich aufblähen können.
Insbesondere im ApeCoinStaking-Vertrag ist die Funktion depositApeCoin() dafür konzipiert, den stakedAmount für eine bestimmte Position zu erhöhen. Ein Exploit kann auftreten, wenn APE-Token über die Funktion depositApeCoin() in die cAPE-Position eingezahlt werden, da diese Aktion zu einer überhöhten Ausgabe der Funktion _getTotalPooledApeBalance() führen und somit einen verzerrten rebasingIndex zur Folge haben kann.
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();
}
Angriffsanalyse
Mit der identifizierten Schwachstelle ist die Mechanik des Angriffs relativ einfach. Der Angreifer blähte den Beleihungswert auf, indem er APE-Token über die Funktion depositApeCoin einzahlte, cAPE als Empfänger festlegte und dann weitere Token lieh.
Nehmen wir die blockierende Transaktion von BlockSec als Beispiel. Es gibt fünf Hauptschritte:
- Beschaffung eines Flash-Loans von etwa 47.352 wstETH. Bereitstellung von etwa 46.018 wstETH zur Aufnahme von cAPE durch die Erstellung mehrerer Verträge.
- Hinterlegung von etwa 12.880.000 cAPE als Sicherheit beim Protokoll.
- Handel von etwa 1.205 wstETH gegen rund 492.124 APE und Abhebung von 1.839.999 cAPE in APE-Token.
- Einzahlung von 2.332.214 APE-Token in die cAPE-Position durch Aufruf von ApeCoinStaking.depositApeCoin(), wodurch der APE-StakedAmount des Protokolls von 851.662 auf 3.183.876 erhöht wird, eine Steigerung von etwa 373 %.
- Nutzung der aufgeblähten Sicherheit, um erhebliche Mengen verschiedener Vermögenswerte (d.h. USDC, WETH) gewinnbringend zu leihen.
Zusammenfassung
Bei dem ParaSpace-Vorfall wurde der Preis von pcAPE vom Angreifer mithilfe eines Flash-Loans manipuliert, wobei die Verwendung von Spotpreisen für die Berechnung ausgenutzt wurde. Dieser Vorfall unterstreicht die kritische Notwendigkeit von Wachsamkeit bei der Integration von Preis-Oracles in DeFi-Protokolle und betont die Notwendigkeit, sicherzustellen, dass das Preis-Oracle eines Protokolls manipulationsresistent ist.
Darüber hinaus ist angesichts der zunehmenden Verbreitung von Sicherheitslücken in Web3 von entscheidender Bedeutung, dass Protokolle Bedrohungsüberwachungs- und -präventionssysteme einrichten, die während ihrer gesamten Betriebsphase aktiv sind, und sich nicht nur auf Code-Audits vor dem Start verlassen. Wie der ParaSpace-Vorfall gezeigt hat, konnte BlockSecs Phalcon, das in der Lage ist, Krypto-Hacks automatisch zu blockieren, eingreifen, bevor der Angreifer dies tat, und Benutzervermögen erfolgreich sichern.
Lesen Sie weitere Artikel dieser Serie:
- Einleitung: Top Ten „Awesome“ Sicherheitsvorfälle im Jahr 2023
- #1: MEV-Bots durch Ausnutzung von Schwachstellen im Flashbots Relay ernten
- #2: Euler Finance Vorfall: Der größte Hack des Jahres 2023
- #3: KyberSwap Vorfall: Meisterhafte Ausnutzung von Rundungsfehlern mit extrem subtilen Berechnungen
- #4: Curve Vorfall: Compilerfehler erzeugt fehlerhaften Bytecode aus unbedenklichem Quellcode
- #5: Platypus Finance: Dreimaligem Angriff mit Glück entkommen
- #6: Hundred Finance Vorfall: Katalysator für die Welle von präzisionsbezogenen Exploits in anfälligen Forked-Protokollen
- #8: SushiSwap Vorfall: Ein ungeschickter Rettungsversuch führt zu einer Reihe von Nachahmungsangriffen
- #9: MEV Bot 0xd61492: Vom Jäger zum Gejagten in einem genialen Exploit
- #10: ThirdWeb Vorfall: Inkompatibilität zwischen vertrauenswürdigen Modulen legt Schwachstelle offen



