On-line lámání hesel I.

Aleš Padrta
Computerworld, 12. srpna 2011

V  předchozích dílech tohoto seriálu bylo zatím vždy předpokládáno off-line lámání hesel jako nejhorší možná varianta. Důvodem takovéhoto hodnocení je rychlost, s jakou se útočník může dostat ke svému cíli, protože se potýká pouze s výpočetním výkonem. Pokud je však příslušný systém dobře zabezpečen a uložená hesla není možné získat, je nutné přejít k on-line lámání hesel, tj. do živého systému zadat jméno a heslo a vyhodnotit příslušnou reakci. On-line lámání hesel však může být velmi znepříjemněno řadou ochranných opatření, kterým je věnován tento díl seriálu.

Správné zadávání credentials

V kontextu autentizace je pojmem credentials označována dvojice uživatelské jméno a příslušné heslo. Pro úspěšné přihlášení je potřeba znalost obojího, tj. jména i hesla. Pro útočníka, který o dané organizaci nemá žádné informace je situace složitější, protože musí uhodnout nejenom heslo, ale také uživatelské jméno. Při správném nastavení systému tak bude potřeba mnohem větší počet pokusů než při off-line lámání hesel.

Předpokládejme, že útočník nemá žádné informace o uživatelských jménech a stačí mu získat libovolný účet. Pokud jsou uživatelská jména předpokládána v délce bu bitů a hesla v délce bp bitů, je velikost prostoru, který musí být prohledán, vyjádřena vztahem

2bu+bp (1).

Tj. pokud uživatelská jména nejsou veřejně známá – např. jako součást e-mailové adresy – lze teoreticky také uvažovat o silnějších uživatelských jménech místo silnějších hesel. Praktickým důsledkem výše uvedeného je, že se (nejen) na webových stránkách objevuje hlášení „Zadali jste špatné jméno nebo heslo“ místo „Zadali jste špatné jméno“ nebo „Zadali jste špatné heslo“. Útočník tak musí uhodnout oboje najednou, což je výrazně složitější než získat seznam uživatelských jmen a potom k nim teprve hledat hesla, protože prohledávaný prostor by má velikost dle vztahu (1) namísto výrazně menšího

2bu+N∙2bp (2),

kde N je počet uživatelských kont.

Postranní kanály

Optimální systém neposkytuje žádné postranní kanály, které by mohly vést k úniku útočníkem využitelných informací. Prakticky je autentizace prováděna ve dvou krocích – nejprve je otestována existence uživatelského jména a poté je ověřena platnost hesla. Velkou chybou je vynechání druhého kroku v případech, kdy zadaný uživatel neexistuje. Z časové odezvy pak totiž lze určit, zda použité uživatelské jméno je v systému zavedeno a zda má tedy pro něj smysl zkoušet jiná hesla.

Uzamykání účtu

Další často používanou možností ochrany proti lámání hesel je snaha znemožnit útočníkovi realizovat větší počet pokusů. Vhodně omezený počet pokusů umožňuje používat kratší heslo, protože útočník dostane možnost prohledat pouze omezenou část prostoru hesel. Proto je například čtyřmístný PIN (10000 možností) při třech povolených pokusech relativně bezpečný, pravděpodobnost uhodnutí je pouze 0,0003.

Nejstarší metodou je automatické zablokování (uzamčení) účtu, u kterého byl detekován nadměrný počet neúspěšných přihlášení a existuje tedy důvodné podezření, že se někdo pokouší heslo uhodnout. Útočník tak nedostane možnost vyzkoušet všechna hesla, ale pouze fixně nastavený počet. Tento přístup má však řadu nepříjemných aspektů, které je nutno vzít v potaz.

V první řadě může být problém jak definovat nadměrný počet přihlášení. Čím menší hodnota, tím lepší ochrana, ale na druhou stranu snížený uživatelský komfort. Praktické zkušenosti totiž ukazují, že uživatelé se při zadávání hesla často přepíší, omylem zadají své předchozí heslo apod., takže je potřeba povolit alespoň jednotky pokusů (tři jako minimum, 15-20 se ukazuje jako naprosto dostačující).

Také je třeba vyřešit následky uzamčení účtu. Pokud se útočník pustí do hromadného lámání hesel hrubou silou, pak snadno zablokuje větší počet účtů, čímž ve finále způsobí nedostupnost služby pro oprávněné uživatele. Částečně lze tento problém vyřešit využitím informace o IP adrese, ze které je pokus o autentizaci prováděn. Princip je založen na myšlence, že uživatel přistupuje k systému z jiné IP adresy než útočník. Tj. pro každou IP adresu mohou být pokusy o přihlášení načítány samostatně. Nicméně tento přístup neřeší hromadné útoky s pomocí botnetů, které mají větší množství zdrojových IP adres, ani problém s NAT (Network Address Translation), kdy útočník i uživatel mohou používat stejnou vnější IP adresu.

Dalším zásadním problémem je způsob odemykání účtu. Nutit uživatele navštěvovat pracoviště uživatelské podpory při každém uzamčení účtu je nereálné, takže je nutné používat vhodnou formu automatického odblokování. Nejčastěji jde o automatické odemčení účtu po definované době, např. po 24 hodinách. Dále pak může být definována výjimka pro IP adresu, ze které proběhlo poslední správné zadání hesla, tj. pokusy z této IP adresy budou vždy akceptovány a po úspěšném přihlášení bude účet opět odemčen. Opět je zde problém s NATem, kdy útočník může být ve stejné lokální síti s uživatelem a nebude tak nijak limitován.

Opožděná odezva

Další skupina metod vychází z myšlenky, že není potřeba útočníka úplně odříznout, ale stačí jej dostatečně zpomalit. Tím se dá elegantně vyhnout problémům, které jsou spojeny s automatickým zablokováním účtu.

Jak už samotný název napovídá, ochrana je založena na vynucení časové prodlevy mezi jednotlivými pokusy, jež výrazně zpomalí útočníka, který potřebuje vyzkoušet co nejvíce hesel co nejrychleji, zatímco oprávněné uživatele neomezí, protože jim stačí pouze jeden nebo několik málo pokusů k úspěšnému přihlášení a prodleva je jen minimální diskomfort. Určení optimální délky prodlevy souvisí s požadavky na bezpečnost hesla a pravděpodobnost jeho odolávání v čase.

Základní implementace používá konstantní časové intervaly mezi jednotlivými pokusy (např. 60 sekund). Tento způsob je efektivní, protože je lámání hesla výrazně zpomaleno – při srovnání s nulovým intervalem jde až o několik řádů – a zároveň není nutné komunikovat s uživatelem napadaného účtu. Dále jsou používány zvyšující se časové intervaly (např. geometrická řada), kdy větší počet pokusů rychle ztrácí smysl, nicméně pokud bude útočník vytrvalý, uživatel pak může čekat velmi dlouhou dobu na své přihlášení. Proto je vhodné zkombinovat geometrickou řadu s konstantními intervaly, kdy pro několik prvních pokusů se bude interval zvyšovat a od určitého počtu pokusů bude konstantní.

V současnosti se lze místo striktně definovaného časového intervalu také setkat s přidělením výpočetně náročného úkolu, jehož vyřešení je nutná podmínka k pokusu o přihlášení. Tento způsob ztěžuje útok, protože je útočníkovi odčerpáváno více zdrojů než při pouhém čekání na další pokus.

Uzamykání účtu a opožděnou odezvu lze úspěšně kombinovat se strategií zamykání účtu, například teprve po určitém počtu neúspěšných pokusů je aplikováno časové zpoždění apod.

Individuální vs. hromadný útok

Klasický útok na jeden konkrétní účet (brute-force attack on individual account) je snadno odhalitelný prostým čítačem neúspěšných pokusů. Proto se mu lze relativně efektivně bránit – omezením počtu pokusů, které může útočník provést a tím výrazně snížit objem prohledaného prostoru hesel. Např. často používané zablokování účtu po určitém počtu špatně zadaných hesel a vynucené časové intervaly mezi jednotlivými pokusy.

Většinou však útočník nepotřebuje získat heslo k jednomu konkrétnímu účtu, ale stačí mu přístupové údaje k libovolnému účtu. Nemusí se tak soustředit na jeden účet, ale může provádět hromadný útok na hesla všech jemu známých účtů (bulk guessing attack on all accounts). Detekce tohoto typu útoku je výrazně obtížnější, ne-li nemožná, chytrý útočník bude testovat různá hesla pro různé účty, využívat různé IP adresy (např. botnety jsou pro tento úkol jako stvořené) a útok rozloží v čase.

Původní článek

O autorovi

Aleš Padrta
Autor je řešitelem aktivity Cesnet CSIRT sdružení Cesnet.

další weby:fond rozvojemetacentrumCzechLightpřenosyvideoservereduroameduID.cz