Am 18. Juli meldete unser DeFiRanger-System einige verdächtige Transaktionen. Nach manueller Analyse bestätigen wir, dass es sich bei diesen Transaktionen um Angriffe auf Array Finance handelt. Im Folgenden werden wir eine Angriffstransaktion verwenden, um den Angriffsprozess und die Grundursache der Schwachstelle zu veranschaulichen.
Angriffstransaktion
Die in diesem Blog verwendete Angriffstransaktion ist: 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa
Angriffsablauf

Wie in Abbildung 1 gezeigt, stellten wir fest, dass der Angreifer nach der Aufnahme eines Flash-Loans von AAVE einen Gewinn von 186,62 WETH erzielte (wir unterscheiden in diesem Blog nicht explizit zwischen WETH und ETH).

Der detaillierte Angriffsablauf ist in Abbildung 2 dargestellt.
- Zuerst rief der Angreifer die Funktion
buyvon Array Finance auf. Der Angreifer erhielt 430 ARRAY-Token, die von Array Finance geprägt wurden, unter Verwendung von 45,91 WETH. - Dann rief der Angreifer fünfmal die Funktion
joinPooleines Closed-Source-Vertrags (Array Collater - 0xa800cda5) auf. Er/sie hinterlegte 676.410,58 DAI + 679.080,46 USDC + 901,82 WETH + 20 WBTC + 20 renBTC und erhielt 726,38 aBPT-Token, die von Array Collater geprägt wurden. - Der Angreifer rief die Funktion
sellauf, um 430 ARRAY-Token zu verbrennen und erhielt 77,17 aBPT-Token. - Zuletzt rief der Angreifer die Funktion
exitPooldes Array Collater auf. Er/sie verbrannte die in den vorherigen beiden Schritten erhaltenen 804,55 aBPT-Token und erhielt 748.271,55 DAI + 751.225,08 USDC + 997,62 WETH + 22,63 WBTC + 22,74 renBTC.
Aus Abbildung 2 geht hervor, dass der Angreifer im Schritt 5 (Abbildung 2: Aufruf der Funktion sell) Gewinne erzielt. Das liegt daran, dass die erhaltenen 77,17 aBPT-Token wertvoller sind als die im Schritt 3 (Abbildung 2: Aufruf der Funktion buy) eingezahlten 49,9142 WETH. Im Folgenden werden wir den Code analysieren, um zu verstehen, warum dieser Angriff möglich war.
Code-Schwachstelle
Der folgende Code zeigt die Funktion sell von Array Finance. In dieser Funktion verwendet Array Finance den Saldo des ARRAY-Tokens, der dem Angreifer gehört, und ruft die interne Funktion _sell auf, um die Anzahl der aBPT-Token zu berechnen, die durch den Verkauf des ARRAY-Tokens erhalten werden können.

Im Folgenden ist die Implementierung der Funktion _sell aufgeführt. Sie ruft calculateLPtokensGivenArrayTokens auf, um die Anzahl der aBPT-Token zu ermitteln, die für eine bestimmte Anzahl von ARRAY-Token erhalten werden können. Dann verbrennt diese Funktion ARRAY-Token und gibt das aBPT-Token zurück.

Das Folgende zeigt die Implementierung der Funktion calculateLPtokensGivenArrayTokens.

Beachten Sie, dass es vier Argumente gibt, die die Berechnung von amountLPToken beeinflussen können. Nach dem Lesen des saleTargetAmount leiten wir die Formel wie folgt ab:
arraySmartPool.totalSupply() * (1 - (1 - amount / ARRAY.totalSupply()) ^ (1000000 / reseveRatio))
Das arraySmartPool ist die Smart-Contract-Adresse des Array Collater (0xa800cda5f3416a6fb64ef93d84d6298a685d190d). Der Wert von arraySmartPool.totalSupply() erhöht sich, wenn der Angreifer die über den Flash-Loan geliehenen Mittel in den Array Collater einzahlt (siehe folgende Tabelle).
TxnIndex: 64 arraySmartPool.totalSupply(): 110162296218708026400
TxnIndex: 107 arraySmartPool.totalSupply(): 165243444328062039600
TxnIndex: 150 arraySmartPool.totalSupply(): 247865166492093059400
TxnIndex: 193 arraySmartPool.totalSupply(): 371797749738139589100
TxnIndex: 236 arraySmartPool.totalSupply(): 557696624607209383650
TxnIndex: 280 arraySmartPool.totalSupply(): 836544936910814075475
Diese Logik können wir nach dem Lesen des Codes des arraySmartPool bestätigen. Das Folgende zeigt die Funktion joinPool des arraySmartPool.

Diese Funktion ruft zuerst die Funktion joinPool von SmartPoolManager auf, um die Anzahl der Token (actualAmountsIn) zu berechnen, die vom msg.sender erhalten werden müssen. Dann ruft sie für jedes Token die Funktion _pullUnderlying auf, um das Token in arraySmartPool einzuzahlen. Schließlich ruft sie _mintPoolShare und _pushPoolShare auf, um aBPT-Token zu prägen und die geprägten aBPT-Token an msg.sender zu übertragen.
Beachten Sie, dass arraySmartPool von PCToken erbt. Die Funktion _mintPoolShare ruft die Funktion _mint auf, die im Folgenden dargestellt ist.
Die Funktion _mint erhöht die Variable varTotalSupply, die direkt von totalSupply() zurückgegeben wird. Somit wird dieser Wert bei jeder Ausführung von joinPool erhöht.
Gewinnabschätzung
| Angreiferadresse | Angriffstransaktion | Gewinn (ETH) |
|---|---|---|
| 0x1337 | 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa | 186,62073907323577 |
| 0x1b4fb735b51a25b280499710d02f50e4f772949664f9eb088e9d968b41ca2a1c | 59,338842936817095 | |
| 0x356ae8a278754551d9d2ae7dc0ea876b37c342ff2d010bee14aa253bb0b6030b | 18,827787420260467 | |
| 0x388fd59eab65b6034c96c01a21197eb2889d6507f84ff07e553749c541563962 | 5,880854505948256 | |
| 0xf4227ca3c8e8b5c8a0b10f034c6dee6556788c618e4cd289dc343b3247e85add | 0,4327422187881 | |
| Gesamt | 271,1009661550497 | |
| 0x80d2 | 0xf061f8fc19c894ec37310ff59977ec97de55fd1494f1b1e66ae89188552d5c60 | 1,8414029470248867 |
| Gesamt | 1,8414029470248867 | |
| Gesamt | 272,9423691020746 |
Zusammenfassung
Zusammenfassend lässt sich sagen, dass der Angreifer die Schwachstelle ausnutzt, dass der Preismechanismus von Array Finance vom totalSupply des aBPT-Tokens abhängt, was manipulierbar ist. Die Schwachstelle wurde in unserem Forschungsbericht DeFiRanger: Detecting Price Manipulation Attacks on DeFi Applications diskutiert.
Danksagung
Junjie Fei, Yufeng Hu, Ziling Lin, Siwei Wu, Lei Wu, Yajin Zhou @BlockSec
(In alphabetischer Reihenfolge nach Nachnamen)
Über BlockSec
BlockSec ist ein Pionierunternehmen im Bereich der Blockchain-Sicherheit, das 2021 von einer Gruppe weltweit anerkannter Sicherheitsexperten gegründet wurde. Das Unternehmen hat sich zum Ziel gesetzt, die Sicherheit und Benutzerfreundlichkeit der aufkommenden Web3-Welt zu verbessern, um deren breite Akzeptanz zu fördern. Zu diesem Zweck bietet BlockSec Audits von Smart Contracts und EVM-Chains, die Phalcon-Plattform für die sichere Entwicklung und proaktive Bedrohungsabwehr, die MetaSleuth-Plattform für die Nachverfolgung von Geldern und Ermittlungen sowie die MetaDock-Erweiterung für Web3-Entwickler, die effizient im Kryptobereich surfen.
Bis heute hat das Unternehmen über 300 angesehene Kunden wie MetaMask, Uniswap Foundation, Compound, Forta und PancakeSwap betreut und in zwei Finanzierungsrunden von namhaften Investoren wie Matrix Partners, Vitalbridge Capital und Fenbushi Capital Millionen von US-Dollar erhalten.
Offizielle Website: https://blocksec.com/
Offizieller Twitter-Account: https://twitter.com/BlockSecTeam



