Die Analyse des Array Finance Sicherheitsvorfalls

Die Array-Finance-Exploitation untersuchen: Eine Schritt-für-Schritt-Angriffsanalyse – Eine detaillierte Aufschlüsselung der bösartigen Transaktionen, die Array Finance kompromittiert haben, und Einblicke in DeFi-Schwachstellen

Die Analyse des Array Finance Sicherheitsvorfalls

Am 18. Juli meldete unser DeFiRanger-System ein paar verdächtige Transaktionen. Nach manueller Analyse bestätigen wir, dass diese Transaktionen Angriffe auf Array Finance sind. Im Folgenden werden wir eine Angriffstransaktion verwenden, um den Angriffsprozess und die Kernursache der Schwachstelle zu veranschaulichen.

Angriffstransaktion

Die in diesem Blog verwendete Angriffstransaktion ist: 0xa17bbc7c9ab17aa88fdb5de83b41de982845e9c9c072efff6709dd29febf0daa

Angriffablauf

Abbildung 1

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).

Abbildung 2

Der detaillierte Angriffsprozess ist in Abbildung 2 dargestellt.

  • Zuerst rief der Angreifer die buy-Funktion von Array Finance auf. Der Angreifer erhielt 430 ARRAY-Token, die von Array Finance mit 45,91 WETH geprägt wurden.
  • Dann rief der Angreifer die joinPool-Funktion eines Closed-Source-Vertrags (Array Collater - 0xa800cda5) fünfmal 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 sell-Funktion auf, um 430 ARRAY-Token zu verbrennen und erhielt 77,17 aBPT-Token.
  • Zuletzt rief der Angreifer die exitPool-Funktion von Array Collater auf. Er/sie verbrannte 804,55 aBPT-Token, die in den vorherigen beiden Schritten erworben wurden, 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: Rufe die sell-Funktion auf) Gewinne erzielt. Das liegt daran, dass die erhaltenen 77,17 aBPT-Token wertvoller sind als die im Schritt 3 (Abbildung 2: Rufe die buy-Funktion auf) eingezahlten 49,9142 WETH. Im Folgenden werden wir den Code analysieren, um zu verstehen, warum dieser Angriff stattfinden konnte.

Code-Schwachstelle

Der folgende Code zeigt die sell-Funktion 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.

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

Das Folgende zeigt die Implementierung der calculateLPtokensGivenArrayTokens-Funktion.

Beachten Sie, dass vier Argumente die Berechnung von amountLPToken beeinflussen können. Nach dem Lesen von saleTargetAmount leiten wir die folgende Formel ab:

arraySmartPool.totalSupply() * (1 - (1 - amount / ARRAY.totalSupply()) ^ (1000000 / reseveRatio))
 

Der arraySmartPool ist die Smart-Contract-Adresse des Array Collater (0xa800cda5). Der Wert von arraySmartPool.totalSupply() erhöht sich, wenn der Angreifer die vom Flash-Loan geliehenen Mittel in den Array Collater einzahlt (siehe Tabelle unten).

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 joinPool-Funktion des arraySmartPool.

Diese Funktion ruft zuerst die SmartPoolManager.joinPool-Funktion auf, um die Anzahl der Token (actualAmountsIn) zu berechnen, die vom msg.sender erhalten werden müssen. Dann ruft sie für jeden Token die Funktion _pullUnderlying auf, um den Token im arraySmartPool einzuzahlen. Zuletzt 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 der arraySmartPool von PCToken erbt. Die Funktion _mintPoolShare ruft die Funktion _mint auf, die im Folgenden gezeigt wird.

Die Funktion _mint erhöht die Variable varTotalSupply, die direkt von totalSupply() zurückgegeben wird. Somit wird dieser Wert für jede Ausführung von joinPool erhöht.

Gewinnschätzung

Zusammenfassung

Zusammenfassend lässt sich sagen, dass der Angreifer die Schwachstelle ausnutzt, dass der Preismechanismus von Array Finance von der totalSupply des aBPT-Tokens abhängt, die manipulierbar ist. Die Schwachstelle wurde in unserer Forschungsarbeit DeFiRanger: Detecting Price Manipulation Attacks on DeFi Applications diskutiert.

Anerkennung

Junjie Fei, Yufeng Hu, Ziling Lin, Siwei Wu, Lei Wu, Yajin Zhou @BlockSec

(In alphabetischer Reihenfolge nach Nachnamen)

Über BlockSec

BlockSec ist ein führendes Unternehmen im Bereich 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 massenhafte Verbreitung zu fördern. Zu diesem Zweck bietet BlockSec Dienstleistungen für die Sicherheitsprüfung von Smart Contracts und EVM-Ketten, die Phalcon-Plattform für die sichere Entwicklung und proaktive Bedrohungsblockierung, die MetaSleuth-Plattform für die Verfolgung und Untersuchung von Geldern sowie die MetaDock-Erweiterung für Web3-Entwickler, die effizient im Krypto-Bereich agieren.

Bis heute hat das Unternehmen über 300 renommierte 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

Sign up for the latest updates