Průvodce nástroji pro zabezpečení chytrých kontraktů
Budeme používat tři různé techniky testování a analýzy programů:
- Statická analýza pomocí nástroje Slither. Všechny cesty programu jsou aproximovány a analyzovány současně prostřednictvím různých prezentací programu (např. graf řízení toku).
- Fuzzing s nástrojem Echidna. Kód se provádí s pseudonáhodným generováním transakcí. Fuzzer se pokusí najít sekvenci transakcí, která poruší danou vlastnost.
- Symbolické spuštění s nástrojem Manticore. Formální ověřovací technika, která převádí každou cestu spuštění na matematický vzorec, na němž lze kontrolovat omezení.
Každá technika má své výhody a nevýhody a bude užitečná ve specifických případech:
| Technika | Nástroj | Použití | Rychlost | Zmeškané chyby | Falešné poplachy |
|---|---|---|---|---|---|
| Statická analýza | Slither | CLI a skripty | sekund | střední | nízká |
| Fuzzing | Echidna | Vlastnosti Solidity | minut | nízká | žádná |
| Symbolické spuštění | Manticore | Vlastnosti a skripty Solidity | hodin | žádná* | žádná |
* pokud jsou všechny cesty prozkoumány bez vypršení časového limitu
Slither analyzuje kontrakty během několika sekund, nicméně statická analýza může vést k falešným poplachům a bude méně vhodná pro složité kontroly (např. aritmetické kontroly). Spusťte Slither prostřednictvím rozhraní API pro jednoduchý přístup k vestavěným detektorům nebo prostřednictvím rozhraní API pro uživatelem definované kontroly.
Echidna potřebuje běžet několik minut a bude produkovat pouze skutečné pozitivní nálezy. Echidna kontroluje uživatelem zadané bezpečnostní vlastnosti napsané v jazyce Solidity. Může přehlédnout chyby, protože je založena na náhodném prozkoumávání.
Manticore provádí analýzu s "největší váhou". Stejně jako Echidna, Manticore ověřuje vlastnosti zadané uživatelem. Bude potřebovat více času na spuštění, ale může prokázat platnost vlastnosti a nebude hlásit falešné poplachy.
Doporučený pracovní postup
Začněte s vestavěnými detektory nástroje Slither, abyste se ujistili, že v současné době neexistují žádné jednoduché chyby, ani nebudou zavedeny později. Použijte Slither ke kontrole vlastností souvisejících s dědičností, závislostmi proměnných a strukturálními problémy. Jak se kódová základna rozrůstá, použijte nástroj Echidna k testování složitějších vlastností stavového automatu. Vraťte se k nástroji Slither a vyviňte si vlastní kontroly ochrany, které nejsou v Solidity dostupné, například ochranu proti přepsání funkce. Nakonec použijte Manticore k provedení cíleného ověření kritických bezpečnostních vlastností, např. aritmetických operací.
- Použijte CLI nástroje Slither k zachycení běžných problémů
- Použijte Echidna k testování bezpečnostních vlastností vašeho kontraktu na vysoké úrovni
- Použijte Slither k psaní vlastních statických kontrol
- Použijte Manticore, jakmile budete chtít hloubkové ujištění o kritických bezpečnostních vlastnostech
Poznámka k jednotkovým testům. Jednotkové testy jsou nezbytné pro vytváření vysoce kvalitního softwaru. Tyto techniky však nejsou nejvhodnější k nalezení bezpečnostních chyb. Obvykle se používají k testování pozitivního chování kódu (tj. kód funguje podle očekávání v normálním kontextu), zatímco bezpečnostní chyby se obvykle vyskytují v okrajových případech, které vývojáři nezohlednili. V naší studii desítek bezpečnostních auditů chytrých kontraktů nemělo pokrytí jednotkovými testy žádný vliv na počet ani závažnost bezpečnostních chyb (opens in a new tab), které jsme našli v kódu našich klientů.
Určení bezpečnostních vlastností
Chcete-li efektivně testovat a ověřovat svůj kód, musíte identifikovat oblasti, které vyžadují pozornost. Vzhledem k tomu, že vaše zdroje vynaložené na bezpečnost jsou omezené, je důležité určit slabé nebo vysoce hodnotné části vaší kódové základny, abyste optimalizovali své úsilí. Pomoci může modelování hrozeb. Zvažte prostudování:
- Rychlé posouzení rizik (opens in a new tab) (náš preferovaný přístup, když je málo času)
- Průvodce modelováním hrozeb datově orientovaných systémů (opens in a new tab) (aka NIST 800-154)
- Modelování hrozeb podle Shostacka (opens in a new tab)
- STRIDE (opens in a new tab) / DREAD (opens in a new tab)
- PASTA (opens in a new tab)
- Použití tvrzení (opens in a new tab)
Komponenty
Vědět, co chcete kontrolovat, vám také pomůže vybrat správný nástroj.
Mezi široké oblasti, které jsou často relevantní pro chytré kontrakty, patří:
-
Stavový automat. Většinu kontraktů lze reprezentovat jako stavový automat. Zvažte kontrolu, že (1) nelze dosáhnout žádného neplatného stavu, (2) pokud je stav platný, lze ho dosáhnout a (3) žádný stav kontrakt nezablokuje.
- Echidna a Manticore jsou nástroje, které je třeba upřednostnit pro testování specifikací stavových automatů.
-
Řízení přístupu. Pokud má váš systém privilegované uživatele (např. vlastníka, správce, ...) musíte zajistit, že (1) každý uživatel může provádět pouze povolené akce a (2) žádný uživatel nemůže blokovat akce privilegovanějšího uživatele.
- Slither, Echidna a Manticore mohou kontrolovat správné řízení přístupu. Například Slither může zkontrolovat, že pouze funkce na bílé listině postrádají modifikátor onlyOwner. Echidna a Manticore jsou užitečné pro složitější řízení přístupu, jako je oprávnění udělené pouze v případě, že kontrakt dosáhne daného stavu.
-
Aritmetické operace. Kontrola správnosti aritmetických operací je kritická. Používání
SafeMathvšude je dobrým krokem k zabránění přetečení/podtečení, nicméně stále musíte zvážit další aritmetické chyby, včetně problémů se zaokrouhlováním a chyb, které kontrakt zablokují.- Manticore je zde nejlepší volbou. Echidna může být použita, pokud je aritmetika mimo rozsah SMT solveru.
-
Správnost dědičnosti. Kontrakty v jazyce Solidity se silně spoléhají na vícenásobnou dědičnost. Snadno se mohou vyskytnout chyby, jako je stínící funkce, které chybí volání
super, a nesprávně interpretované pořadí c3 linearizace.- Slither je nástroj, který zajistí odhalení těchto problémů.
-
Externí interakce. Kontrakty vzájemně interagují a některým externím kontraktům by se nemělo důvěřovat. Například, pokud váš kontrakt spoléhá na externí orákula, zůstane bezpečný, pokud bude polovina dostupných orákul kompromitována?
- Manticore a Echidna jsou nejlepší volbou pro testování externích interakcí s vašimi kontrakty. Manticore má vestavěný mechanismus pro stubování externích kontraktů.
-
Shoda se standardy. Standardy Etherea (např. ERC20) mají v historii svého návrhu chyby. Buďte si vědomi omezení standardu, na kterém stavíte.
- Slither, Echidna a Manticore vám pomohou odhalit odchylky od daného standardu.
Tahák pro výběr nástrojů
| Komponenta | Nástroje | Příklady |
|---|---|---|
| Stavový automat | Echidna, Manticore | |
| Řízení přístupu | Slither, Echidna, Manticore | Cvičení 2 nástroje Slither (opens in a new tab), Cvičení 2 nástroje Echidna (opens in a new tab) |
| Aritmetické operace | Manticore, Echidna | Cvičení 1 nástroje Echidna (opens in a new tab), Cvičení 1–3 nástroje Manticore (opens in a new tab) |
| Správnost dědičnosti | Slither | Cvičení 1 nástroje Slither (opens in a new tab) |
| Externí interakce | Manticore, Echidna | |
| Shoda se standardy | Slither, Echidna, Manticore | slither-erc (opens in a new tab) |
V závislosti na vašich cílech bude třeba zkontrolovat i další oblasti, ale tyto hrubozrnné oblasti zaměření jsou dobrým začátkem pro jakýkoli systém chytrých kontraktů.
Naše veřejné audity obsahují příklady ověřených nebo testovaných vlastností. Zvažte přečtení sekcí Automated Testing and Verification v následujících zprávách, abyste si prohlédli reálné bezpečnostní vlastnosti:
Stránka naposledy aktualizována: 22. října 2025