Ne vždy je šifrování prospěšné, existuje malé množství případů, kdy je tomu přesně naopak. Takovým je třeba zabezpečení elektronických výpisů z účtu od české pobočky Raiffeisenbank. Začátek příběhu je už poměrně dávný:
Vrchol mé lenosti: Přišel mi výpis z banky, chráněný PINem. Než abych ho hledal, radši jsem bruteforcem uhádl heslo a nezvedl zadek z křesla pic.twitter.com/UQCvg8LNaq
— (@denikembecka) April 22, 2017
Tento status proslavil Michal Špaček ve úvodu své přednášky o rizicích sdílení kódů, kterým nerozumíme. V tomto případě Tomáš Heřmanský, autor statusu, na snímku obrazovky sice rozmazal výsledné heslo, ale ponechal záhadné hexadecimální mezivýsledky, které, jak se později ukázalo, je možné použít k vypočítání hesla.
Na příběh jsem si vzpomněl v úterý, když mi poprvé přišel podobný výpis od téže banky. Vyzkoušel jsem tedy také nástroj pdfcrack, který čtyřmístné číselné heslo PDF souboru uhodl za desetinu sekundy. Co mě ale zarazilo, byl výběr číslic, které se banka rozhodla použít jako heslo.
Tím heslem totiž nejsou poslední čtyři číslice čísla karty, které se na mnoha místech zobrazují otevřeně za účelem určení konkrétní karty, ale naopak čtyři z šesti tajných číslic, které jsou v naprosté většině míst nahrazeny hvězdičkami či jinak. Jejich použití vypadá na první pohled logicky – zabezpečují, aby si výpis přečetl jen oprávněný držitel karty. Vezmeme-li ale v potaz fakt, že takto omezený prostor hesel je možné projít hrubou silou za desetinu sekundy, znamená to, že každý, kdo se takto šifrovanému PDF souboru dostane, okamžitě zjistí čtyři z šesti tajných číslic. Jak špatné to může být?
Co vytěžit z výpisu
Výpis ke kreditní kartě obsahuje všechny běžné náležitosti, mimo jiné:
- datum výpisu
- jméno držitele karty
- jeho adresu
- číslo karty bez šesti tajných číslic
- přehled transakcí
- stav konta bonusů za používání karty
- předepsanou minimální splátku
- číslo účtu a variabilní symbol, pod kterým lze úvěr splatit
- úrokovou sazbu
Vžijeme-li se do role útočníka, který bude chtít nabyté údaje zneužít, musí znát minimálně číslo karty a datum konce platnosti. Většina obchodníků dnes také požaduje bezpečnostní kód z podpisového proužku karty či dodatečné ověření systémem 3-D Secure, ale stále je možné najít takové, kteří jej nepožadují.
Začněme datem konce platnosti karty. To na výpisu sice není uvedeno, nicméně máme jako útočník několik možností, jak se k němu dobrat. Tou první může být už samotný způsob, jak jsme se k PDF souborům dostali. Pokud to bylo nabouráním se do něčí e-mailové schránky, pak zřejmě máme i informaci o tom, kdy byl doručen první výpis z účtu. Takový výpis také poznáme tak, že dluh z předchozího období bude nulový a nulový bude i stav bonusů, které se používáním kreditní karty sbírají. K vypočtení data konce platností tak stačí zjistit, na jak dlouho daná banka obvykle vydává platební karty, což je obvykle celistvý počet roků. Tato informace není nijak tajná a její zjištění nestojí velké úsilí.
Ze stovky na deset s Hansem Peterem Luhnem
Z šestnácti číslic čísla karty jich najdeme deset přímo na výpise, další čtyři jsou tvořeny uhodnutým heslem PDF souboru. K odhalení celého čísla karty tedy zbývá uhodnout dvě číslice, což dává prostor jedné stovky různých kombinací. Jako útočník ale máme velké štěstí – čísla karet jsou totiž zabezpečena Luhnovým algoritmem. Ten zajišťuje odolnost proti překlepům při opisování čísla karty přidáním kontrolní číslice tak, aby ciferný součet čísla karty (po určité transformaci sudých číslic zprava) byl beze zbytku dělitelný deseti.
Můžeme tedy jednoduše vytipovat, které dvojice hledaných čísel splňují podmínku Luhnova algoritmu, například tímto jednoduchým programem v Pythonu:
In [1]: import luhn In [2]: for n in range(100): ...: ccnum = "531533{:02d}34567890".format(n) ...: if luhn.verify(ccnum): ...: print(ccnum) ...: 5315330134567890 5315331934567890 5315332734567890 5315333534567890 5315334334567890 5315335034567890 5315336834567890 5315337634567890 5315338434567890 5315339234567890
Máme tedy pouhých deset kandidátů na číslo karty, které můžeme postupně nebo lépe současně v různých obchodech vyzkoušet. Nepotřebovali jsme přitom nic jiného, než přístup k e-mailové schránce s výpisy z kreditní karty. Paradoxem je, že kdyby banka výpisy nešifrovala, nemá útočník jak zjistit čtyři tajné číslice a kandidátů by měl sto tisíc.
Zabezpečení čtyřmi číslicemi nedává smysl
Tohle je jeden z mála případů, kdy nějaké šifrování je prokazatelně horší než žádné šifrování. Použití čtyřmístného číselného hesla na místě, kde je možné provádět off-line neomezené množství pokusů o uhodnutí, je absolutní nesmysl, který odradí tak maximálně bankovního úředníka; ale jen takového, který se v práci nenudí natolik, aby všech deset tisíc kombinací vyzkoušel ručně. V kombinaci s použitím přísně tajného čísla v roli hesla pak jde o zbytečné hazardování s bezpečností.
Uvedený útok je naštěstí možné provést jen tam, kde obchodník nepožaduje zadání bezpečnostního kódu karty a/nebo potvrzení v systému 3-D Secure. Tím by mělo být pro případnou oběť snazší domoci se svých peněz zpět, neboť v případě nepoužití těchto doplňkových zabezpečení se zvyšuje obchodníkova odpovědnost za škody způsobené zneužitím platební karty. To ostatně ve své reakci (1, 2) tvrdí i přímo Raiffeisenbank:
Tato forma zabezpečení výpisu slouží především jako základní ochrana proti náhodnému přečtení. Velká většina obchodníků chrání transakce kartou na internetu pomocí CVC2 a 3DS kódu. Ano, existují i obchodníci, kde nakoupíte bez kódu, pokud by zde ke zneužití došlo, tak transakci vyreklamujeme zpět. Pokud hledáte jiný způsob zasílání výpisů, nabízíme možnost jeho stahování v rámci IB, které máte plně zabezpečené. K tomuto způsobu chceme do budoucna směřovat všechny klienty.
I tak je však na místě obezřetnost a rozumně nastavené limity. Stojí také za zvážení, zda nepožádat banku o nezasílání výpisů e-mailem; je možné je stáhnout nešifrované ze zabezpečeného webového bankovnictví.
Post scriptum: výpis obsahuje celé číslo karty
Líný hacker si navíc všimne, že na první stránce výpisu je desetimístní variabilní symbol, který se nápadně shoduje s heslem výpisu (předposlední čtyřčíslí) a s posledním čtyřčíslím (obsaženým ve výpisu), takže ani nemusí nic hádat. https://t.co/9dwhfe6VGo
— Andrei Badea (@0xabadea) February 21, 2018
Po napsání tohoto textu se ukázalo, že se zabezpečením čísla karty je to ještě horší a velká část předchozího textu přistupuje k problému až zbytečně složitě. V tomto konkrétním případě totiž všech šest tajných číslic z čísla karty je součástí variabilního symbolu, pod kterým je úvěr splácen. Hádat zbylé číslice tedy vlastně vůbec není nutné a vyzrazení čtyř číslic uhodnutím hesla je tedy vlastně jen podružný problém.