🇨🇿 Jak tým WingRiders zachránil MinSwap před hackerským útokem

V polovině září 2021 došlo k hard forku Alonzo. V březnu 2022 mohlo dojít k prvnímu velkému hacknutí decentralizované burzy MinSwap, ale díky ostražitosti a profesionalitě týmu WingRiders se tak nestalo.

Co se stalo

MinSwap je decentralizovaná burza AMM běžící na platformě Cardano. Dne 21. ledna 2021 tým oznámil, že chytré kontrakty projdou bezpečnostním auditem společnosti Tweag. Tweag je softwarová laboratoř specializující se na vývoj v jazyce Haskell pro fintech aplikace a platformy. Auditoři našli celkem 13 chyb, z toho 3 se závažností Critical a dvě se závažností High.

Tým MinSwap vydal 21. února 2022 na serveru Medium článek, ve kterém uvádí, že audit je dokončen a všechny chyby byly odstraněny. Následně byla burza 9. března spuštěna na mainnetu Cardano. V relativně krátké době dosáhla celková uzamčená hodnota (TVL) téměř 200 milionů dolarů.

Dne 19. března tým oznámil, že smart kontrakty i zpráva o auditu jsou otevřeně dostupné na GitHubu. Všichni zájemci se tak mohli podívat na zdrojový kód chytrých kontraktů a na scénu vstupuje tým WingRiders.

Tým WingRiders si při zkoumání smart kontrakt; všiml několika chyb. Několik z nich bylo kritických. Tým WingRiders se večer 21. března pokusil kontaktovat tým MinSwap a upozornil ho na kritické chyby, které by někomu umožnily odčerpat veškerou likviditu v ze smart kontraktů.

Tým na oznámení WingRiders reagoval ráno. Přestože tým MinSwap věděl, že v kódu je kritická zranitelnost, nechal burzu několik hodin běžet. Dne 22. března večer tým oznámil, že burza MinSwap přejde do režimu údržby. Zveřejněným důvodem bylo, že bylo nalezeno několik problémů, které je třeba opravit. Uživatelé nemohli směňovat, vybírat a sklízet odměny za farmaření výnosů. Tým uživatele ujistil, že prostředky jsou SAFU!

Dodejme, že 22. března byla o zranitelnosti informována také společnost Tweag.
Dne 24. března tým informoval uživatele, že funkčnost burzy MinSwap byla převedena na vylepšený a bezpečnější chytrý kontrakt. Žádní uživatelé nepřišli o finanční prostředky, tokeny LP ani pozice. Týmu se podařilo obnovit funkčnost burzy MinSwap.

O den později, 25. března, tým oznámil, že byl informován o zranitelnostech, které byly vyřešeny, a zveřejnil vysvětlující článek. Tým MinSwap přiznal, že jedna ze zranitelností byla kritická a umožňovala odčerpat veškerou likviditu v chytrém kontraktu.

MinSwap běžel v main-netu necelý měsíc, než musel být smart kontrakt upraven. Zranitelnost byla opravdu velmi kritická a zkušený tým ji dokázal poměrně rychle odhalit. Vklady uživatelů tak byly vystaveny značnému riziku ztráty.

Tým MinSwap poděkoval týmu WingRiders za pomoc a upozornění na zranitelnost.
Tým Tweag zranitelnost také prozkoumal a popsal ji na svých stránkách. Auditoři přiznali, že chybu přehlédli, a dodali, že právě toto přehlédnutí je důvodem, proč je třeba do auditu začlenit strojové učení a proces formálního ověřování.

Popis zranitelnosti

MinSwap je burza typu AMM. Pro pochopení zranitelnosti je třeba porozumět tomu, jak tento druh burzy funguje.

AMM burzy jsou non-custodial. To znamená, že uživatelé si ponechávají kontrolu nad svými aktivy tím, že dostávají LP tokeny výměnou za poskytnutí tokenů jako ADA a dalších do likvidity poolů. Likvidity pooly jsou spravovány pouze kódem a nejsou řízeny lidmi. LP tokeny představují právo na podíl na aktivech v daném poolu likvidity. Držení LP tokenů umožňuje uživatelům kompletní kontrolu nad tím, kdy si mohou aktiva z poolu vybrat zpět. Není k tomu zapotřebí žádného prostředníka. Uživatelé vracejí LP tokeny, za které dostanou zpět svůj vklad. Uživatelé si musí být vědomi, že musí platit poplatky, a navíc musí počítat s impermanent loss.

Všimněte si, že ten, kdo vlastní LP tokeny nebo nad nimi získá kontrolu, může si aktiva v dané výši vyzvednout zpět. V zájmu ochrany aktiv je třeba zajistit, aby nikdo nemohl vytisknout LP tokeny ze vzduchu. Dále musí být zajištěno, že LP tokeny lze použít pouze v rámci poolu s danými aktivy. Například tokeny LP, které obdržel uživatel v rámci poolu A za poskytnutí aktiv X/Y, nelze použít v rámci poolu B s aktivy M/N. Tento typ záruky musí být dobře implementován přímo ve zdrojovém kódu.

Pro vytvoření nového poolu likvidity na burze MinSwap je vymintován speciální pool NFT, který je uvnitř poolu uzamčen prvním poskytovatelem likvidity. Jakmile pool NFT existuje, mohou být mintovány LP tokeny, aby uživatelé mohli poskytovat likviditu do poolu. Pro mintování LP tokenů nebo jejich zpětné přijetí za účelem vrácení aktiv uzamčených v poolu likvidity je vždy nutné pracovat s daným pool NFT.

Předpokládá se, že každý jednotlivý pool bude vždy reprezentován jedinečným pool NFT. A to i v případě, že by existovalo více poolů obchodujících se stejným párem aktiv. Aby to platilo, musí zdrojový kód zaručit, že pro daný pár bude vždy existovat pouze jeden pool NFT. Tyto předpoklady se nepotvrdily.

Hlavní příčina zranitelnosti byla v politice mintování pool NFT. Útočník mohl vytvořit pool NFT, které se shodovaly s již existujícími pooly. První kontrola v kritické části zdrojového kódu věnované politice mintování kontrolovala, zda transakce razí přesně jeden pool NFT odpovídající referenci UTxO. Chyběla však kontrola, zda pro tuto politiku nebyl vymintován žádný jiný pool NFT. Zjednodušeně řečeno, útočník mohl duplikovat to, co má být unikátním tokenem.

Útočník si mohl ponechat vlastnictví pool NFT a vložit je do libovolného skriptu, který měl pod kontrolou. Pomocí podvodně vymintovaného a odemčeného pool NFT mohl útočník jednoduše vyrazit libovolný počet LP tokenů pro jakýkoli již existující pool likvidity. Po podvodném vymintování LP tokenů mohl útočník odčerpat likviditu ze všech existujících poolů.
Jinými slovy, prostřednictvím podvodně vyražených LP tokenů bylo možné z poolů likvidity vytěžit aktiva. útočník tak mohl vykrást aktiva, která do nich vložili poskytovatelé likvidity, a zcela vyprázdnit všechny existující pooly v podstatě zdarma.

Díky profesionálnímu přístupu týmu WingRiders se naštěstí zranitelnost nepodařilo zneužít. Tým udělal přesně to, co se od něj očekává. Kontaktovali tým a o zranitelnost informovali prostřednictvím zabezpečeného kanálu. Tým zranitelnost podrobně popsal na svém blogu.

K žádnému hacknutí nedošlo, uživatelé byli zachráněni, komunita vítězí

Je důležité říci, že ani MinSwap, ani nikdo jiný by nemohl manipulovat s aktivy v poolech, kdyby v kódu nebyla chyba. Skutečnost je taková, že kdokoli, kdo si zranitelnosti všiml, ji mohl zneužít. Jak jsme popsali výše, není možné takto manipulovat s aktivy bez vlastnictví LP tokenů. Tým implementoval do chytrého kontraktu ochranná opatření. Následně musel tým sám využít zranitelnosti k odčerpání likvidity a migraci aktiv do nových poolů likvidity. Tím tým získal no LP tokeny, které lze distribuovat původním vlastníkům. Zranitelnost byla opravena a všechny prostředky jsou snad v bezpečí. Stojí za zmínku, že záplata neprošla bezpečnostním auditem.

Cardano je platforma, která umožňuje psát chytré smlouvy. Pokud se v ní objeví chyba, je to vždy chyba týmu. Programovací jazyk je nástroj, který umožňuje psát konkrétní funkce. Samotný jazyk však nemůže ovlivnit, zda napsaný kus kódu bude fungovat podle očekávání autora.

Z bezpečnostních důvodů je nesmírně důležité, aby zdrojový kód byl veřejně dostupný a v ideálním případě kritické části prošly bezpečnostním auditem třetí strany. Všechny projekty, které si mají získat důvěru uživatelů, musí být open-source. To umožní odborníkům v dané oblasti najít zranitelnosti, podobně jako to udělal tým WingRiders v tomto případě. Uživatelé si mohou být jisti, že ve zdrojovém kódu nejsou žádná zadní vrátka a že služba je skutečně plně decentralizovaná.

Neexistuje zdrojový kód bez chyb. Chyby mohou být nalezeny během testování a bezpečnostního auditu, ale ani tato činnost nemůže zaručit absenci chyb. Jediné, co je v lidských silách, je dodržovat standardy správné praxe a maximalizovat úsilí při hledání chyb. Přesto ani s absolvovanými audity a veřejně dostupným zdrojovým kódem nebude nikdy stoprocentní jistota, že daný kus kódu je bezchybný.

Rozhodně nechceme nikoho očerňovat za to, že udělal chybu, ale ukazuje se, že mezi kvalitou týmů pracujících na decentralizovaných aplikacích existují určité rozdíly. Tým WingRiders si chyb v kódu MinSwap všiml poměrně rychle, protože pracuje na vlastním řešení. Tým WingRiders se musel nad návrhem vlastní burzy zamyslet a udělal to pečlivěji. Připomeňme, že zdrojový kód burzy WingRiders DEX také prošel auditem zdrojového kódu provedeným společností CERTIK, který nenašel žádné chyby se závažností Critical nebo High.

V tomto případě tedy vše dopadlo dobře. Vítězem je především komunita Cardano. Tým WingRiders je hrdinou okamžiku, protože ukázal, že dokáže pomoci konkurenčnímu projektu. Přitom v podstatě ochránili vklady uživatelů. Kéž by takového ducha měli všichni v blockchainovém odvětví.

Závěr

Nevíme, zda tým opravil všechny zranitelnosti, na které upozornil tým WingRides, a zda je nyní MinSwap plně bezpečný. Jejich blogový příspěvek hovoří o opravě pouze jedné zranitelnosti.

Pokud dojde k hacknutí, je důležitá transparentnost vůči uživatelům a snaha o záchranu vkladů. Tým by měl mít plán B a vědět, co dělat, když se někomu podaří ukrást prostředky uživatelů. Je rozumné počítat s tím, že k hackům dojde. Cardano je v době psaní tohoto článku platformou pro chytré smlouvy necelý rok. V této fázi se pravděpodobně dočkáme problémů podobného charakteru. Postupem času, jak se vývojáři budou lépe seznamovat s nástroji a prostředím Cardano, se situace zlepší. Učení trvá dlouho a je přirozené, že se u toho dělají chyby. Málokdo si plně uvědomuje, jak obtížné je napsat dobře fungující decentralizovanou aplikaci.