Rizika podpisu v peněžence: co potvrzujete, když podepisujete

Pokaždé, když peněženka ukáže žádost o podpis, dělá většina lidí totéž: mrknou na to, tak úplně tomu nerozumí, chtějí ten krok prostě dokončit, kliknou na souhlas. A přesně v tom je problém — samotné podepisování se v závažnosti liší jako nebe a dudy. Některé podpisy jen dokazují „jsem majitel téhle peněženky" a jsou neškodné. Jiné se rovnají tomu, že dáte pryč právo nakládat se svým majetkem; podepsat je není nic jiného než nechat trezor dokořán. Ve vyskakovacím okně někdy vypadají velmi podobně — obojí nestojí gas, obojí vás nechá kliknout na souhlas — ale následky leží míle od sebe.
V tomto článku rozeberu běžné druhy podpisů jeden po druhém: které jen dokazují vaši totožnost, které se opravdu dostávají k vašim penězům, proč je offline podpis jako permit prohnanější než běžný approve, proč máte slepý podpis eth_sign hned zaklapnout, a nejpraktičtější ze všeho — jak před kliknutím přečíst ten jeden řádek, který vám říká, co se vlastně stane. Technika sedí, ale všechno převádím do běžné řeči. Nemusíte se po přečtení stát vývojářem, ale u vyskakovacího okna byste měli umět zastavit a rozlišit, zda je to „dokázat, že jsem to já", nebo „dát pryč nějaké právo". K úplnému postupu okolo schválení samotných čtěte tento text spolu s Zrušením schválení peněženky.
Běžné druhy podpisů v peněžence
Nejdřív si postavte hrubou mapu. Žádosti, na které v peněžence narazíte, spadají zhruba do dvou velkých kategorií, a pochopit ten rozdíl je základ pro všechno další.
- Transakce (transaction). Opravdu mění on-chain stav, stojí gas, musí být zpracována v bloku. Běžné převody, approve schválení a interakce s kontrakty (swapování, mintování apod.) sem patří. Poznávací znak: jsou tu transakční poplatky a peněženka většinou ukáže, co tato transakce dělá a kolik se hýbe.
- Podpis (signature / podpis zprávy). Privátním klíčem uděláte kryptografický podpis na kus dat, a to nemusí jít nutně on-chain a většinou nestojí gas. Může jen dokázat vaši totožnost (třeba přihlášení do DApp), ale může být i „zmocněním", které druhá strana použije on-chain (jako permit), nebo surovými daty, jejichž význam nevidíte (slepý podpis eth_sign).
Nebezpečný omyl mnoha lidí leží v té druhé kategorii — „vždyť to nestojí gas a není to převod, co se na podpisu může pokazit". Přesně naopak: nejzákeřnější on-chain phishing se opírá o to, že podepíšete zdánlivě neškodnou zprávu. Ke kryptografickému základu podpisů a vztahu transakcí a podpisů na Ethereu dává systematický obraz dokumentace o transakcích nadace Ethereum, chcete-li položit základ.
Jednoduchý, ale důležitý předpoklad: stát gas se nerovná být nebezpečný. Co riziko doopravdy určuje, je „jaké právo nebo majetek tento podpis či transakce dává pryč". Následující sekce posuzují běžné druhy přesně podle tohoto měřítka.
Běžná transakce: směr je peníze, které odtékají
Nejsnáz pochopitelný je běžný převod. Chcete poslat pár mincí ze své adresy na jinou, peněženka ukáže transakci, v níž potvrdíte přijímací adresu, částku a hrubý gas. Podepíšete-li, transakce jde on-chain a mince jsou pryč.
Rizikové body jsou tu docela přímé a jsou hlavně dva: za prvé, že je přijímací adresa špatná nebo vyměněná — při vkládání ji nahradí software unášející schránku adresou útočníka, nebo jste pár znaků opsali špatně; za druhé, že pošlete špatnou částku. Na rozdíl od schválení nedáváte pryč žádné „dlouhodobé právo". Ztráta je většinou jednorázová a omezená na to, co tentokrát posíláte. Ale protože posíláte peníze přímo, je chyba nevratná, takže zkontrolovat adresu před převodem je obzvlášť důležité. Náš nástroj kontrola adresy vám pomůže potvrdit, že formát adresy sedí a nebyla špatně opsána; a návyk „před převodem porovnat první a poslední znaky přijímací adresy" má také cenu zlata.
Zapamatujte si jeden znak této kategorie: směr je „peníze, které od vás odtékají", a částka i strana stojí jasně ve vyskakovacím okně. To ji činí relativně průhlednou — vidíte, co se stane. Doopravdy prohnané jsou podpisy následující, které „nevypadají, že by se hýbaly peníze".
Interakce s kontraktem: voláte funkci
Když v DApp něco děláte — na DEX swapujete mince, přidáváte peníze do likviditního poolu, mintujete NFT — ve skutečnosti spouštíte transakci, která „volá určitou funkci určitého kontraktu". Peněženka ji ukáže k potvrzení, a i tohle spadá pod transakce, které stojí gas.
Riziko u těchto podpisů je, že nemusíte vidět, co voláte. Slušná peněženka se snaží transakci co nejvíc „dekódovat" do běžné řeči a řekne vám, s jakým kontraktem interagujete, co zhruba dělá a jaké tokeny může pohnout; ale když kontrakt není ověřený nebo je interakce složitá, ukáže peněženka někdy jen řadu nesrozumitelných dat. Co je chytrý kontrakt a proč před interakcí nejlépe potvrdit, že je kontrakt důvěryhodný, je základně vysvětleno v dokumentaci o chytrých kontraktech nadace Ethereum.
Před interakcí s kontraktem potvrďte, že adresa kontraktu je ta oficiálně zveřejněná projektem, a ne adresa, kterou vám podstrčí stránka ze soukromé zprávy nebo reklamy. Tentýž úkon (třeba swap) volá ze skutečného webu úplně jiný kontrakt než z napodobeného — ten druhý je phishing. Otevřít oficiální web přes záložku je nejlevnější ochrana.
Uvnitř interakcí s kontrakty si jeden zaslouží zvláštní zacházení: approve schválení, protože to je forma, kterou phishing zneužívá nejčastěji. Další sekce je o něm zvlášť.
approve podpis: dáváte pryč právo pohybovat tokeny
approve je zvláštní interakce s kontraktem: nehýbete mincemi, ale říkáte tokenovému kontraktu „dovoluji, aby určitá adresa (spender) odebrala pod mým jménem nejvýš N kusů tohoto tokenu". Tomu N se říká allowance. Po schválení, dokud allowance nedojde, nemusí ten schválený kontrakt nechávat znovu podepisovat, aby tenhle druh tokenu pokaždé zase odebral. To je mechanismus, na kterém DeFi automaticky běží, a sám o sobě není problém.
Nebezpečí má dvě vrstvy. Za prvé, mnoho DApp ve výchozím stavu žádá N, které je téměř nekonečně velké (neomezené schválení), z pohodlnosti, což znamená, že ten kontrakt — jakmile je škodlivý nebo bude později prolomen — může váš token celý odebrat. Za druhé, phishingová stránka zabalí „claim airdropu" jako approve na vlastní kontrakt — vy si myslíte, že claimujete tokeny, zatímco dáváte adrese podvodníka dlouhodobé právo vybílit vám určitý token.
O celém mechanismu approve, nebezpečí neomezeného schválení a o tom, jak si prohlédnout a zrušit už udělená schválení, je podrobně Zrušení schválení peněženky. Tady zdůrazním jeden úsudek: když po vás úkon „claim" chce approve, chce, abyste dali pryč právo pohybovat tokeny, pak je směr obrácený. Normální claim je: mince tečou k vám, gas na claim platíte vy. Phishing přes schválení je: právo teče k nim. Špatný směr je červená. Ke zrušení už udělených schválení použijte oficiální nástroj revoke.cash.
Proč je offline podpis permit (EIP-2612) nebezpečný
Teď ten nejdůležitější druh z celého článku — permit. Je nebezpečný právě proto, že „vypadá až moc neškodně".
Nejdřív záměr. Ethereum má návrh na vylepšení jménem EIP-2612, který dává ERC-20 funkci permit, díky čemuž lze schválení vyřídit offline podpisem místo samostatné approve transakce, která stojí gas. Jinak řečeno: podepíšete strukturovanou zprávu (ne on-chain, nestojí gas) a druhá strana s tím podpisem může on-chain udělat něco, co se rovná approve. Cílem je ušetřit transakci, ušetřit gas a udělat používání hladší. Formát tohoto strukturovaného podpisu vychází z jiného návrhu, EIP-712, který nechá obsah podpisu zobrazit v relativně čitelných polích. Původní návrhy jsou v EIP-2612 a EIP-712.
Nebezpečí je v tomto: pro běžného uživatele vypadá podepsání zprávy permit a podepsání běžné přihlašovací zprávy ve vyskakovacím okně zhruba stejně — obojí nestojí gas, obojí „stačí kliknout na souhlas". Podvodníci napíšou phishingovou stránku jako „podepiš pro ověření nároku na airdrop" nebo „podepiš pro přihlášení". Vy si myslíte, že jen dokazujete, že jste majitel peněženky, ale ve skutečnosti podepisujete permit — souhlas, aby druhá strana pohnula určitým vaším tokenem. Po podpisu se stránka možná vůbec nezmění, a než vám to dojde, druhá strana s vaším podpisem on-chain schválení dokončí a majetek vám odnese.
permit je prohnanější než běžný phishing přes approve, ze tří důvodů: nestojí gas, čímž mizí psychologická překážka „zaplatit a ještě jednou potvrdit"; nejde (ve chvíli, kdy podepisujete) on-chain, takže ve vlastní historii transakcí po něm chvíli není stopa; a když peněženka vyskakovací okno dobře nerozparsuje, snadno se plete s běžným podpisem. Proto řada on-chain krádeží u jednotlivců v posledních letech běží přes podpis místo přímého vylákání privátního klíče.
Vidíte-li v „podpisu" pole jako Permit, spender (schválená strana), value (allowance) nebo deadline (platnost), buďte krajně ve střehu — tohle je velmi pravděpodobně offline podpis rovný schválení, ne prosté přihlašovací potvrzení. Zvlášť když se to objeví v kontextu „claim airdropu / ověření nároku": zastavte.
Slepý podpis eth_sign: okno, kterého se bát nejvíc
Je tu ještě primitivnější a nebezpečnější žádost: eth_sign. Tím podepisujete kus surových dat, jejichž význam není vidět (obvykle řadu hexadecimálního hashe), a peněženka je neumí přeložit do běžné řeči, aby vám řekla, co přesně podepisujete. Lidově se tomu říká „slepý podpis" (blind signing).
Problém: ta nesrozumitelná data mohou být teoreticky cokoli — schválení, převod, permit. Podepíšete-li, je to jako dát razítko na dokument, který je prázdný, ale právně platný; co druhá strana doplní, platí. Legitimní DApp žádají eth_sign málokdy, právě protože je moc nebezpečný, a hlavní peněženky (jako MetaMask) u takové žádosti ve výchozím stavu ukážou nápadné varování a někdy ho mají ve výchozím stavu vypnutý. K riziku jednotlivých metod podpisu a k tomu, jak si s ním peněženka poradí: držte se oficiální dokumentace své peněženky, třeba centra podpory MetaMask, které o tom má zvláštní výklad.
Vidíte-li, že vás peněženka varuje „tohle je žádost eth_sign", „nerozparsovatelný surový podpis" nebo „obsah podpisu nelze zobrazit", hned to zaklapněte a nepodepisujte. Pokud stoprocentně nevíte, co děláte, není jediný důvod jít do slepého podpisu. Stránka, která vás nechá podepsat naslepo, je sama o sobě podezřelá.
Předchozí druhy vedle sebe, ať u vyskakovacího okna rychle odhadnete:
| Typ | Co v jádru dělá | Stojí gas? | Riziko |
|---|---|---|---|
| Běžný převod | Poslat mince na adresu | Ano | Střední: zkontrolovat adresu a částku |
| Interakce s kontraktem | Zavolat funkci kontraktu | Ano | Podle obsahu; kontrakt musí být důvěryhodný |
| approve schválení | Dát adrese allowance | Ano | Vysoké: zvláště neomezené + neznámá strana |
| permit offline podpis | Podpisem rovnocenně schválit | Ne | Vysoké: vypadá jako přihlášení, je to schválení |
| eth_sign slepý podpis | Podepsat nesrozumitelná surová data | Ne | Extrémně vysoké: obsah neviditelný, výchozí odmítnout |
Jak číst žádost o podpis
Vraťte výše uvedené znalosti do těch pár vteřin před vyskakovacím oknem. Tohle je myšlenkový postup, který si sám před každým podpisem projdu. Nezaručí, že vše prokouknete, ale drtivou většinu zastaví.
- Zeptejte se nejdřív: „co jsem si myslel, že tady dělám". Bylo na tlačítku, které jste klikli, „přihlásit / připojit / claim / swap"? Podržte si své očekávání a za chvíli ho položte vedle obsahu vyskakovacího okna.
- Podívejte se, zda je to transakce, nebo podpis. S gasem a textem „potvrdit transakci" je to transakce; bez gasu a jen „podepsat" je to podpis zprávy. U toho druhého čtěte obsah obzvlášť pozorně, nepolevujte jen proto, že to nic nestojí.
- Přečtěte klíčová pole. Projdou-li kolem
Permit,spender,value,approvenebosetApprovalForAll, dáváte pryč nějaké právo, ne prosté potvrzení totožnosti. Vidíte-lieth_sign/ „surová data" / „obsah nelze zobrazit", odmítněte. - Položte směr vedle sebe. Vy jste mysleli „claim / přihlášení", ale okno říká „approve / permit" — očekávání a obsah nesedí, a to je signál nebezpečí.
- Zkontrolujte schválenou stranu. Jde-li opravdu o schválení, podívejte se, zda je spender kontrakt, kterému věříte, a adresu si případně dohledejte v block exploreru (jako Etherscan), abyste prověřili původ.
- Nesedí-li to, odmítněte. Odmítnout nestojí skoro nic — nanejvýš tenhle úkon neuděláte. Kliknout na souhlas je to nevratné. Raději párkrát navíc odmítněte, než jednou vsaďte.
Jádro je vlastně jedna věta: podepisujte až tehdy, když vám peněženka umí v běžné řeči jasně říct „dáváte právo X straně Y" a je to přesně to, co jste chtěli; je-li obsah mlhavý nebo nesedí s tím, co jste chtěli udělat, odmítněte. Slušná peněženka se snaží obsah za vás rozparsovat, takže dobře udržovaná, silně parsující hlavní peněženka je sama o sobě ochranná vrstva — k bezpečnostním nastavením se držte oficiální dokumentace (třeba centra podpory MetaMask).
I když jste omylem podepsali permit nebo otevřeli approve, není to beznadějné — dokud vám neunikl privátní klíč a seed fráze, dostane se druhá strana jen k tokenu, který jste schválili, a schválení můžete zrušit, abyste škodu omezili. Úplné kroky zrušení jsou v Zrušení schválení peněženky. Ale slepý podpis a uniklá seed fráze jsou jiný příběh — ta situace je mnohem vážnější.
Bezpečné návyky, které si vybudujete
Abyste ty jednotlivé úsudky proměnili ve svalovou paměť, níže pár věcí, které sám neustále používám.
Před podpisem se na tři vteřiny zastavte a řekněte „co po mně chce pohnout"
Skoro každý podvod se opírá o časový tlak, abyste nestihli přemýšlet. Otočte to: přinuťte se před každým kliknutím na souhlas na tři vteřiny zastavit a klíčová pole ve vyskakovacím okně nahlas pojmenovat — je tohle přihlášení, nebo approve? Sedí směr? To malé gesto zastaví většinu nehod „kliknuto bez přemýšlení".
Oddělte peněženky: nechte experimentální peněženku brát rány
Dejte dlouhodobý majetek do „trezorové peněženky", která skoro žádnou DApp nepřipojuje (nejlépe s hardwarovou peněženkou), a otevřete zvlášť „experimentální peněženku" s pouhou malou částkou, speciálně na připojování nových webů, claim airdropů a podepisování všeho možného. Podepíše-li experimentální peněženka někdy něco špatně, zůstane ztráta omezená na tu malou částku. To je nejnákladově efektivnější obranná linie. K souvisejícímu uchování privátního klíče a seed fráze viz Bezpečnost seed fráze.
Na oficiální web přes záložku, nehledejte na místě
Zdrojem mnoha nebezpečných podpisů je napodobený web. Uložte si oficiální weby projektů, které často používáte, a své stálé nástroje do záložek a choďte na ně pokaždé přes ně, abyste napodobené weby obešli už na vstupu. Víc triků, jak rozpoznat falešné airdropy a falešné claim stránky, je v Ověření oficiálních kanálů. A chcete-li si nejdřív srovnat základ Web3 peněženky, přečtěte si Co je Web3 peněženka.
Pravidelně rušit a stahovat udělená práva
Podpisy (zvlášť schválení, která nabydou účinnosti po approve nebo permit) se hromadí. Udělejte si návyk pravidelně nástrojem revoke.cash kontrolovat a rušit nepoužívaná schválení a stahovat dávno zapomenutá stará práva. Chcete-li zároveň projít riziko, použijte jako oporu náš seznam Rizika schválení.
Později jsme si dali tvrdé pravidlo: cokoli, co se objeví u „claim airdropu / ověření nároku" a chce podpis, bereme ve výchozím stavu jako permit, jako schválení, v nejhorším případě — nejdřív si dobře prohlédnout pole, teprve pak rozhodnout. To pravidlo nás nechalo odmítnout pěknou řádku podpisů, a dodatečně se ukázalo: s těmi odmítnutými bylo většinou opravdu něco špatně.
Nakonec. Podpis v peněžence není jeden úkon, ale kategorie úkonů, od „dokázat, že jsem to já" po „dát pryč klíč od trezoru". Držte je od sebe — u převodu zkontrolovat adresu a částku, u schválení zkontrolovat stranu a allowance, permit brát jako neviditelné schválení a slepý podpis eth_sign bez výjimky odmítnout — a spojte to s návyky tří vteřin pauzy, oddělení peněženek, chození přes záložku a pravidelného rušení. Pak u toho zdánlivě lhostejného „kliknutí na souhlas" opravdu víte, co podepisujete.