To je druh chyby, která drží protokolární týmy vzhůru po nocích. Exploit za 5 milionů dolarů na ZKSwap, umožněný jediným příkazem ponechaným na špatném místě. Zde je hluboký ponor do toho, jak se to stalo a jak to mohlo monitorování onchain zastavit. 🧵
1/ 9. července byla GMX hacknuta za 42 milionů dolarů. Ten den se však stalo něco jiného a sotva si toho někdo všiml: most ZKSwap byl v tichosti vyčerpán za 5 milionů dolarů. Zajímavá část? Nejednalo se o žádné fantastické využití. Jen kritická funkce, která udělala... nic.
2/ ZKSwap je zk-rollup postavený na Ethereu. Stejně jako mnoho jiných rollupů používá most k přesunu aktiv mezi L1 a L2. Jako bezpečnostní opatření most obsahuje "režim Exodus", způsob, jak mohou uživatelé získat zpět finanční prostředky bez potřeby operátora. Teoreticky je to skvělý nápad. V praxi...
3/ Režim Exodus umožňuje uživatelům ručně prokázat, že vlastnili tokeny v posledním ověřeném stavu L2. Je to záložní mechanismus: nedůvěryhodný, sebeopatrovní, neinteraktivní. Implementace ZKSwap však měla jednu fatální chybu: Funkce zodpovědná za ověřování důkazů nic neověřovala. Doslova.
4/ Zde je kód, který měl útok 👇 zastavit Na první pohled to vypadá jako skutečný zk-proof verifikátor. Ale podívejte se pozorně na první řádek: return true; A je to. Nic jiného neběží.
5/ Výsledek? Každý "důkaz" o odstoupení (bez ohledu na to, jak falešný) prošel validací. Smlouva akceptovala svévolné nároky na zůstatky tokenů... a připisoval jsem jim zásluhy, jako by byly skutečné. Změnil nedůvěryhodný záložní mechanismus na nehlídaný faucet.
6/ Útočník nepotřeboval vymyšlené exploity - jen opakovaná volání exit() s vymyšlenými daty. Obcházeli kontroly zůstatku, vybírali přes více tokenů a zneužívali slabou logiku nullifikátoru, aby se vyhnuli detekci. To vše za předpokladu, že smlouva říká: ✅
7/ Tohle nebyl nějaký obskurní okrajový případ. To byla základní logika pro obnovu aktiv, která zůstala zcela otevřená. A protože se režim Exodus spouští jen zřídka, přerušená cesta zůstala bez povšimnutí... měsíce.
8/ Zde je to, co mělo spustit alarmy: • Režim Exodus se spouští po dlouhém klidu • Desítky výběrových hovorů probíhajících najednou • Náhlý nárůst zůstatkůToWithdraw změny To vše bylo viditelné a mohlo to být zastaveno monitorováním v reálném čase.
9/ Z čeho si tedy vzít? • Nouzový kód je stále produkční kód • Záložní cesty nepomohou, pokud nefungují • Monitorování v reálném čase není volitelné, je kritické pro přežití
34,11K