Bitcoin po letech: bezpečnost a kryptografické lahůdky

15. 8. 2013
Doba čtení: 12 minut

Sdílet

V celém ekosystému Bitcoinu se dnes točí už slušných pár milionů dolarů. Jakmile máte síť, která přenáší desítky milionů korun denně, začnou se objevovat různé útoky – obzvláště, pokud se dá s ukradenými penězi anonymně utéct tak snadno jako v Bitcoinu. Dnes si řekneme, jak se útočí a jak se bránit.

Útoky na počítače

Když vám někdo vyhackuje počítač, prostě si vaše Bitcoiny převede. Ani zaheslovaná peněženka v tom pochopitelně nezabrání, prostě si heslo při nejbližší příležitosti poslechne. Malware kradoucí Bitcoiny se stává běžným a Metasploit má modul Bitcoin Jacker.

Populární je též malware těžící Bitcoiny: 12

Útoky na webové peněženky a pooly

Webová peněženka je rozhraní podobné internet bankingu. Uživatel se přihlásí a může posílat a přijímat peníze. Bohužel server má nad nimi plnou kontrolu. I když je provozovatel peněženky důvěryhodný a neuteče sám, peněženka poutá pozornost crackerů – a ti bohužel kvůli současnému zoufalému stavu počítačové bezpečnosti často uspějí.

Pool většinou nevyplácí vytěžené peníze hned (generovalo by to spoustu malých převodů), ale až ve větších částkách. Pokud má pool 1000 uživatelů a vyplácí po 1 BTC, znamená to, že průměrně drží 500 BTC – tedy při současném kurzu asi milión korun. Útočník je opět motivován si těchto 500 BTC odklonit k sobě.

Nějaké významné krádeže z poslední doby:

  • Linode.com kompromitován – hackli VPS hosting, na kterém měl pool peněženku, možná šlo o insider-job. Pak okradli i burzu, která tam běžela. Škoda 45000 BTC.
  • OVH has been compromised – opět pool a směnárna. Někdo cracknul webový administrační systém OVH, nabootoval na serveru Live distribuci a zkopíroval si data. Škoda stovky BTC.
  • Instawallet po útoku zavřela a teď vyplácí zbytky Bitcoinů.
  • OzCoin pool byl hacknut, škoda 923 BTC.

Webové peněženky s kryptografií na klientovi

Reakcí na ownování serverů s peněženkami bylo přesunutí kryptografie na klienta. Na serveru je klíč uložen zašifrovaný a ke klientovi se pošle tento zašifrovaný klíč + JavaScript. Klient zadá heslo, klíč se JavaScriptem rozšifruje a podepíše se s ním transakce, která se pošle serveru. Rozšifrovaný klíč na klientovi se zničí.

Zní to hezky, ale problém je podobný, jako třeba u Komerční banky, u které uživatel podepisuje transakci v appletu, který si právě stáhl od Komerční banky: server vám může podstrčit backdoor. Normálně prostě přidá do JavaScriptu pár řádků, které místo zničení rozšifrovaného klíče tento pošlou na server. Myslíte si, že je toto pouze nějaký teoretický útok v hlavách paranoidních nerdů? Nikoli.

Praktický útok na peněženky s kryptografií na klientovi

K útoku došlo v dubnu 2013. Události šly asi takto: Neznámý hacker ukradl z poolu OzCoin 923 BTC. Po nějaké době skončila podstatná část těchto peněz (568 BTC) na účtu ve webové peněžence Strongcoin. Správce Strongcoinu použil výše popsaný útok, uživateli peníze ukradl a poslal mu e-mail s žádostí o vysvětlení a dal mu ultimatum, že když nepodá přesvědčivé vysvětlení, peníze pošle OzCoinu. Uživatel odpověděl, že za tyto Bitcoiny prodal auto a že má NDA na to, komu. Správce Strongcoinu toto nepovažoval za dostatečné vysvětlení a ukradené peníze poslal OzCoinu.

Celou událost provází lži ze strany Strongcoinu, který tvrdí, že se k penězům uživatelů nedokáže dostat, a hned po tom popisuje tuto událost. Uživatelé na fórech vítají krádež s nadšením a ti, kteří se dovolí vzepřít chování „samozvaného světového policajta“, jsou zesměšňováni a je na ně útočeno ad-hominem.

Webová peněženka se Split keys

U webu ještě chvíli zůstaneme. Problémem (nebo tedy spíše vlastností) Bitcoinu je, že kdo má klíč, může všechno. Z banky jsme ale zvyklí na dvoufaktorovou autorizaci – musíme pro kontrolu opsat kód ze SMS. Jak tohle implementovat do Bitcoinu? Jak jsme si ukázali, určitě ne tak, že SMS bude vyřizovat a peníze posílat pouze server – stal by se lákadlem na crackery. Lze ale použít techniku zvanou Split keys. K provedení transakce je potřeba klíč na klientovi i na serveru. Server tak nemůže sám o sobě zneužít naše Bitcoiny a i když někdo vyhackuje náš počítač, chybí mu serverová část.

Pochopitelně musíte doufat, že server vaše Bitcoiny neztratí. Naštěstí chytří lidé vymysleli způsob, jak rozdělit tajemství mezi víc serverů a na složení pak stačí třeba libovolné dva ze tří. Nevím ale o tom, že by to někdo implementoval.

Trezor – hardwarový podepisovač

Problémy s vyhackováním počítače, platbu v nedůvěryhodném prostředí a podobné řeší projekt Bitcoin Trezor. Jedná se o hardwarovou klíčenku s displejem a tlačítky, uvnitř které se nachází hardware dostatečně výkonný na podepsání bitcoinové transakce. Na displeji se zobrazí adresa, na kterou se Bitcoiny posílají, a uživatel potvrdí tlačítkem. Podpis se provede klíčem, který nikdy neopouští zařízení. Při prvním zapnutí se navíc zobrazí seed – hodnota, ze které se derivují klíče – a uživatel si ji může opsat na papír a někam schovat. Díky ní dokáže obnovit Bitcoiny i v případě zničení nebo ztráty zařízení.

Trezor: pokladnička pro Bitcoiny

Takové zařízení mi přijde jako velmi dobrý nápad a hned bych si jedno koupil, bohužel jsem narazil na zásadní blocker: je jím politika, kterou autoři kolem zařízení dělají. Je prezentováno jako open-source, ale má zamčený bootloader a umožňuje nahrávání pouze firmware podepsaného výrobcem. DRM jako vyšité. Osobně hardwarové DRM považuji za snad největší hřích, kterého se může designér dopustit. Ze zařízení dělá nehackovatelné (v původním smyslu slova hacker) těžítko, plýtvá financemi i materiálem. Chtěl bych ho použít pro odemykání šifrovaného disku v počítači? Mám smůlu. Chtěl bych ho použít na Litecoin, PPCoin, Jendacoin? Mám smůlu. Dojde k nějaké změně protokolu Bitcoinu a bude potřeba update, aby šlo zařízení dále používat? Jsem odkázaný na autory, že se milostivě uvolí vydat aktualizaci pro tou dobou již třeba mnoho let staré a nepodporované zařízení, které by ale ještě mohlo v pořádku sloužit. A pokud autoři update nevydají, můžu tu elektroniku zahodit.

Aktualizace: Autoři Trezoru omezení odstranili a ve finální verzi je tak možné nahrát si do zařízení libovolný firmware.

Autoři tvrdí, že DRM implementují pro bezpečnost uživatelů – na internetu by se prý mohly objevit neoficiální děravé či backdoornuté firmwary, které si uživatelé stáhnou a pak budou na zařízení nadávat. Osobně mi taková argumentace přijde komická a ponižující, neb mě mají za nesvéprávného, který si neumí rozhodnout, jaký kód si bude na svém zařízení spouštět. Trezor si nekoupím ze stejného důvodu, ze kterého si nekoupím iPhone nebo iPad.

Myslím, že je fér, když jsem se teď do Trezoru tak opřel, nechat zaznít i názor protistrany. Autorům Trezoru jsem ukázal draft tohoto článku a umožnil jim vyjádřit se:

Čo sa týka PPCoin, JendaCoin atd., nemalo by byť potrebné akokoľvek meniť firmware. TREZOR by mal vedieť podpísať akýkoľvek altcoin bez úpravy (za predpokladu, že altcoin mení tzv. „address version“, čo momentálne všetky altcoiny robia).

Dizajn je open-source, ktokoľvek si môze vytvoriť svoj vlastný hackovateľný token a nahrať si tam čokoľvek. My predávame a distribuujeme zariadenie, u ktorého sa predpokladá kvalita a hlavne bezpečnosť. Ak distribútor prepíše firmware svojim, u koho sa budú sťažovať užívatelia, že im miznú bitcoiny? Ďalší z faktorov, kvôli ktorému sme pristúpili k tomuto nepopulárnemu kroku je, že vývoj nás stojí nemalé prostriedky, robíme ho dvaja a bez akéhokoľvek investora. Predpokladáme, že ak projekt bude úspešný, objavia sa z Číny lacné kópie, ktoré tam budú môcť jednoducho vytvoriť práve kvôli otvorenému dizajnu. Takto dúfame, že potenciálny zákazník radšej siahne po verzii od nás, pretože sme v komunite dlho známi a dôverihodní a navyše vieme garantovať, že po ceste k nim nikto firmware nezamenil.

TREZOR, ktorý predávame nemá byť „hackovateľný“, keďže cieľová skupina sú prevážne ľudia, ktorí si nevedia zabezpečiť počítač a napriek tomu chcú Bitcoin používať. Pre hackerov zanedlho spúšťame separátny e-shop, kde budú k dispozícii Raspberry Pi shieldy, ktoré sa dokážu tváriť presne ako TREZOR a software je napísaný v Pythone, čo ho robí ešte viac prístupný. Druhým produktom tohto e-shopu bude čistá doska bez bootloaderu pre embedded expertov, tzn. že bude možné na neho nahrať akýkoľvek firmware (či už oficiálny náš alebo vlastný).

Máme token. Kde získat adresu?

Ani s hardwarovým tokenem ale nemusí být třeba placení v e-shopu úplně bezpečné. Jak může takové placení vypadat? E-shop vám většinou na webové stránce ukáže svoji adresu, na kterou máte Bitcoiny za zboží poslat. Pokud už ale předpokládáme vyhackovaný počítač, musíme předpokládat i schopnost útočníka měnit nám písmenka ve webovém prohlížeči (třeba nám nainstaluje rozšíření typu GreaseMonkey, které umožňuje manipulovat s obsahem stránky, nebo rovnou udělá Man-in-the-middle útok) a pak samozřejmě změní i tu adresu. Útok snad ale není tak hrozný, protože ztratíme maximálně cenu jednoho nákupu a neukradne nám všechno.

BTC Guild

Pool BTC Guild je největší pool na světě. Na jaře 2013 mu to poněkud začalo přerůstat přes hlavu – začal se blížit k 50 % výkonu sítě. A jak víme, ten, kdo má nadpoloviční výkon, kontroluje blockchain. Dosažení takového stavu by mohlo způsobit paniku a destabilizovat Bitcoin. Správce poolu na to reagoval oznámením, že omezí zakládání nových účtů a zvedne poplatky.

Fork v březnu 2013

V březnu 2013 došlo k velkému forku blockchainu. Výkon sítě se rozdělil v poměru asi 2:3 a bylo vytěženo 32 duplicitních bloků (výška 225430 – 225461). Vinou byla softwarová chyba. Starší verze klienta (0.7) měla problémy se zpracováním větších bloků. Tento problém byl odstraněn v beta verzi 0.8. Po té, co asi polovina sítě upgradovala na 0.8, se to stalo – Slushův pool vytěžil blok dostatečně velký na to, aby ho starší verze klienta neuměla zpracovat. Polovina sítě tedy tento velký blok odmítla a po necelé hodině našla jiný blok, na kterém začala stavět. Po osmi hodinách se velké pooly dohodly, že downgradují na verzi 0.7 a budou pokračovat ve větvi bez velkého bloku. O incidentu byl napsán BIP.

Během forku se povedlo uskutečnit double-spend útok. Jeden uživatel poslal 212 Bitcoinů obchodníkovi. Tato platba byla začleněna pouze do chainu verze 0.8, který byl později opuštěn. Po půl hodině už byla platba šest bloků hluboko a obchodník ji proto přijal. Tři hodiny po přijetí platby (tři a půl hodiny po začlenění do prvního bloku) uživatel publikoval do sítě druhou transakci, která kolidovala s tou první. Tato druhá transakce byla začleněna do chainu verze 0.7, u kterého nakonec síť zůstala. Útočník, který by toto dělal se zlým úmyslem, by tedy měl více než tři hodiny na útěk.

Nutno podotknout, že správně by i při forku měla být první transakce začleněna do obou chainů. Toto se nestalo kvůli dalšímu bugu: když je klient restartován, zapomene transakce, které si držel v paměti. Protože při organizovaném downgrade na 0.7 bylo restartováno mnoho nodů, velká část sítě čekající transakci efektivně „zapomněla“.

Problém s náhodnými čísly u ECDSA

Bitcoin používá pro asymetrickou kryptografii algoritmus ECDSA. Při podepisování pomocí ECDSA je potřeba unikátní hodnota, která se u žádných dvou podpisů nesmí opakovat. Pokud se opakuje, lze ze dvou podpisů odvodit klíč. Mimochodem takto byla hacknuta konzole od Sony (popis útoku je na straně 123). V blockchainu je několik transakcí, které tímto trpí, ale na postižených adresách není žádné jmění. Nicméně i tak stojí za to na toto pamatovat. Dle mého laického názoru (pozor, kryptografii nerozumím) by mělo stačit ke vstupní náhodné hodnotě přimixovat hash podepisované transakce.

Zerocoin

Bitcoin není anonymní, ale jen pseudonymní, a anonymizovat Bitcoiny není úplně triviální. Pračkám se nedá věřit že nelogují nebo že s Bitcoiny neutečou. Existuje distribuovaná pračka, ale nikdo ji neimplementuje. (funguje tak, že lidi Bitcoiny někam nasypou a pak se provede distribuovaná permutace; pokoušel jsem se to zkoumat podrobněji a musím konstatovat, že je to komplikované).

Další koncept je Zerocoin. Umožní do blockchainu uložit minci a někdy později ji vybrat. Používá ale zero-knowledge proof takovým způsobem, že když vybíráte minci, všichni si mohou ověřit, že jste nějakou vybrali, ale nevědí, kterou.

Contracts

Stránka Contracts na Bitcoin Wiki popisuje, jak bezpečně řešit různé problémy skutečného světa. Jako nejjednodušší příklad uvedu poskytnutí finanční zálohy:

Majitel webového fóra chce zamezit spamu, který mu na fórum posílají spameři z hromadně registrovaných účtů. Napadne ho, že by po uživatelích mohl chtít finanční zálohy: při registraci mu musí uživatel poslat stovku a tím dostane právo přispívat do diskuze. Po půl roce „zkušební doby“ mu majitel pošle stovku zpátky. Spamer si zaregistruje pár účtů, majitel mu je kvůli spamu zablokuje a spamerovi dojdou peníze, takže už nemůže zakládat další účty.

Celý tento princip má jeden problém: co když majitel po půl roce peníze uživatelům nevrátí, ale nechá si je? A zde nastupuje síla Bitcoinu – transakce jsou totiž skriptovatelné. Uživatel tak může snadno vytvořit zprávu „1. srpna 2013 převádím na tento účet 0,1 BTC, ale tato transakce platí jen do 1. února 2014, pak se mi Bitcoiny vrátí“. Majitel fóra teď má zajištěno, že uživatel vložil zálohu, ale nemůže si peníze nechat.

Dalším využitím může být třeba sbírka na dětské hřiště: vytvoří se podmínka „když se do konce roku vysbírá na tento účet alespoň 5000 BTC, pošlou se stavební firmě, v opačném případě se pošlou lidem zpátky“.

Kdysi jsem psal na svém blogu o tom, jak je možné tímto způsobem eliminovat podvodníky prodávající přes internet.

Podobným způsobem lze řešit kde co od pronájmu WiFi připojení v hotelu až po elektronické volby.

Colored Bitcoins

Barevné Bitcoiny jsou způsob, jak navázat Bitcoiny na předměty ve skutečném světě. Blockchain se pak používá pro zaznamenávání, komu věc zrovna teď patří. Představte si, že chci pronajímat dům:

ict ve školství 24

  1. Vytvořím novou adresu, pošlu na ni 1 Satoshi (nejmenší jednotka, která lze v současné verzi protokolu poslat – 0,00000001 BTC) a prohlásím, že tento 1 Satoshi je „obarvený“ a jeho vlastnictví opravňuje ke vstupu do domu (toto oprávnění může být vynucováno čistě administrativně nebo i technologií – dům může mít elektronický zámek a pro vstup je potřeba se prokázat privátním klíčem, který patří k adrese, na které je zrovna zmíněný barevný Satoshi).
  2. Když si ode mě chce někdo dům pronajmout, pošlu mu tento 1 Satoshi na účet. Tím získal právo do domu vstoupit (prokáže se svým klíčem elektronickému zámku). Pomocí principu popsaného v předchozí kapitole můžu kryptograficky bezpečně provést „pronájem na tři měsíce“. Nebo si můžu dokonce naskriptovat „nájemce má oprávnění vstupovat tak dlouho, dokud mi bude každý měsíc posílat na účet peníze za nájem“ – v transakčním skriptu není problém se odkazovat na jiné účty a definovat „jednou měsíčně tato částka“.
  3. Až nájemce bude chtít vztah ukončit, Satoshi mi pošle zpátky. Pomocí též již zmíněného escrow systému lze třeba vynucovat náhradu za vybavení, které poškodil.

Určitě vymyslíte nějaká další možná využití. Fantazii se meze nekladou, jste omezeni pouze matematickými zákony.

Agents

Rozloučíme se textem, který, když jsem jej četl, mi připadal jako vystřižený z nějakého sci-fi. Princip je rozvedený na stránce Agents. Představte si, že vytvoříte a spustíte autonomní systém, který bude vypadat jako nějaká běžná internetová služba – třeba sdílení obrázků. Tento systém bude mít příjmy z reklamy a z placených uživatelských účtů v Bitcoinech. Současně si sám bude platit těmito Bitcoiny svůj hosting. Je autonomní, takže se může třeba „rozhodnout“, že vytvoří svoji odnož na sdílení videí – „rodič“ jí za své Bitcoiny pronajme server a nějakou dobu bude sponzorovat. Systém si ale může kupovat i práci od lidí – třeba když usoudí, že potřebuje dodělat nějaký modul, ale sám na to nestačí (AI jsou v programování dost mizerné), může zadat poptávku na nějaký server typu Jobs nebo Elance nebo si – opět levně a za Bitcoiny – najmout armádu Indů.

Autor článku

Vystudoval informatiku na MFF UK, dělal linuxového admina, vyvíjel elektroniku a nyní vyvíjí meteorologický radar ve společnosti Meteopress.