Level Finance Referral Double-Claim
Level Finance auf BNB Chain verlor 1,1 Mio. $: LevelReferralControllerV2 zahlte Referral-Rewards aus, ohne die Epoch als geclaimt zu markieren — wiederholbar.
- Datum
- Opfer
- Level Finance
- Chain(s)
- Status
- Mittel entwendet
Am 1. Mai 2023 verlor das BNB-Chain-Perpetuals-Protokoll Level Finance rund 1,1 Millionen $ (214.000 LVL-Tokens) durch einen Double-Claim-Bug in seinem LevelReferralControllerV2-Contract. Die Referral-Reward-Claim-Funktion zahlte aus, bevor sie die Epoch als geclaimt markierte, und ließ einen Angreifer die Rewards derselben Epoch wiederholt in einer Schleife claimen.
Was geschah
Level Finance betrieb ein Referral-Programm: Nutzer verdienten LVL-Token-Rewards basierend auf vermitteltem Trading-Volumen, claimbar pro Epoch. Die claimMultiple-Funktion in LevelReferralControllerV2 verarbeitete diese Claims.
Der Bug war eine lehrbuchhafte Checks-Effects-Interactions-Verletzung spezifisch für Claim-Accounting:
- Die Claim-Funktion berechnete die dem Nutzer geschuldeten Rewards für eine Epoch.
- Transferierte die LVL-Tokens an den Nutzer.
- Dann updatete die Buchhaltung, um diese Epoch als geclaimt zu markieren.
Da der „mark as claimed"-Schritt nach der Auszahlung passierte — und weil die Funktion wiederholt innerhalb desselben Transaktions-Kontexts aufgerufen werden konnte, bevor State sich setzte — konnte der Angreifer die Rewards derselben Epoch viele Male claimen, bevor der Contract irgendeinen davon als geclaimt erfasste.
Der Angreifer loopte den Claim und extrahierte 214.000 LVL (rund 1,1 Mio. $) gegen die legitime Anspruchssumme einer einzigen Epoch und dumpte das LVL dann in die Liquidität.
Folgen
- Level Finance bestätigte den Exploit und identifizierte die fehlerhafte Claim-Reihenfolge als einzige Ursache.
- Das Team pausierte den Referral-Contract und shippte eine gefixte Version mit Claim-State-Update vor Auszahlung.
- Der LVL-Token bekam einen Preis-Hit durch den Dump; das Protokoll lief mit dem gepatchten Contract weiter.
Warum es wichtig ist
Level Finance ist eine Small-Dollar-, aber pädagogisch perfekte Instanz der ältesten Regel in Smart-Contract-Sicherheit: Checks-Effects-Interactions — State aktualisieren bevor der externe Call/die Auszahlung erfolgt, nie danach.
Die DAO lehrte das 2016. Es ist die erste Regel in jedem Solidity-Security-Guide. Und doch shippt es weiter — hier in einer Reward-Claim-Funktion statt einer Withdrawal-Funktion, was genau der Grund ist, warum es durchrutschte: Entwickler verinnerlichen „CEI auf Withdrawals anwenden", erkennen aber nicht immer, dass ein Referral-Reward-Claim strukturell ein Withdrawal ist und dieselbe Disziplin braucht.
Der Katalog ist voll dieses Generalisierungs-Versagens — die Kern-Bug-Klasse ist gut bekannt, aber sie taucht jedes Mal wieder auf, wenn sie leicht andere Kleider trägt:
- Reentrancy in Deposits (Grim), nicht nur Withdrawals.
- Solvenz-Checks fehlen in Emergency-Funktionen (Platypus), nicht nur Normal-Pfad-Funktionen.
- CEI verletzt in Reward-Claims (Level Finance), nicht nur Token-Transfers.
Die Lektion, die Level Finance kristallisiert: Eine Schwachstellen-Klasse ist nicht „behandelt", weil die offensichtlichen Instanzen behandelt sind. Jede Funktion, die Wert bewegt, unterliegt denselben Regeln, und die Bugs clustern genau in den Funktionen, die Entwickler nicht als wertbewegend denken — Peripherie, Rewards, Migration, Emergency, Claim. Das sind die Funktionen, die am schnellsten geschrieben und am wenigsten geprüft werden, und der Katalog zeigt immer wieder, dass dort die nächste Instanz der ältesten Bugs auftauchen wird.
Quellen & On-Chain-Belege
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-level-finance-hack-may-2023
- [02]beincrypto.comhttps://beincrypto.com/decentralized-perpetual-market-level-finance-hacked-1-1m/
- [03]rekt.newshttps://rekt.news/level-finance-rekt