📆 10. 2. 2017 📂 2FA, SMS, TOTP

Ověřování přihlášení pomocí SMS se nedá moc považovat za „two-factor authentication“ (2FA), protože k získání kódu nepotřebuji konkrétní telefon, ani konkrétní SIM kartu. Na pozadí jedné diskuze popíšu proč a jaké jsou jiné varianty. Něco z toho byste měli používat, pokud to vámi používané služby nabízí, a je celkem jedno jestli tomu budeme říkat 2FA nebo ověřování přihlášení.

Nedávno jsem byl zatažen do debaty o dvou-faktorové autentizaci (2FA). Začalo to příspěvkem od Nikolaje, ve kterém napsal, ať popřemýšlíme o TOTP. Jen pro vysvětlení, Time-based One-time Password je algoritmus, který pro dvou-faktorové přihlašování používá třeba Google Authenticator nebo Authy, jsou to taková ta číslíčka, která se mění obvykle každých 30 vteřin. Generátory číselných kombinací založené na TOTP jsou také v mobilních aplikacích Twitteru i Facebooku.

Login code generator v Twitteru na iOS

TOTP v Twitteru na iOS

Po pěti minutách se pod příspěvkem objevil komentář, ve kterém Martin tvrdil, že TOTP není bezpečné a že „two-factor je zatím stále nejbezpečnější“. Po jeho dalším komentáři, kterým reagoval na mou námitku, že v řadě případů je 2FA implementována právě pomocí TOTP, jsem teprve pochopil, že pro Martina představuje dvou-faktorovou autentizaci jen kód zaslaný esemeskou.

Martin namítal, že pro TOTP je potřeba mít v mobilní aplikaci tajný neměnný klíč, zatímco kód v SMS je pokaždé jiný. Navíc prý lze ten tajný klíč získat ze dvou různých míst, z mobilního zařízení a ze serveru, který kód vygenerovaný v aplikaci ověřuje.

Modelování hrozeb

Následuje můj mírně upravený komentář z té Facebookové debaty.

Ano, to je pravda, algoritmus TOTP potřebuje tajný sdílený klíč, který je stejný na serveru i v mobilní aplikaci. Pro přenos se tajný klíč obvykle zakóduje do QR kódu, jeho oskenováním ho dostanete i do mobilu. Při použití ověřování pomocí SMS se ten vygenerovaný kód dá taky získat z více zařízení: ze serveru, z mobilu, ze systémů operátora. Navíc jen málokdy tušíme, jak dlouho vlastně platí.

Na zjištění co je kdy bezpečnější a co ve kterých případech použít je dobré vyrobit jednoduchý model hrozeb (anglicky „threat modelling“): útočník může sdílený klíč pro TOTP získat buď z mého mobilu, nebo ze serveru. Když mi vezme mobil, tak to většinou brzy poznám a mám možnost sdílený klíč na serveru přegenerovat a útočník má smůlu. Mobil si navíc mohu chránit šifrováním a přístupovým heslem. Ostatní aplikace na mobilu většinou k datům TOTP generátoru nemají přístup, tedy nemohou získat ani ty sdílené klíče, ale to se může lišit systém od systému. Pro získání klíče ze serveru je nutné se dostat k databázi a k šifrovacím klíčům (sdílené TOTP klíče by neměly být v databázi uložené v čitelné podobě). To znamená dostat se poměrně hluboko do infrastruktury a ačkoliv to není nemožné, tak v tu chvíli sdílené TOTP klíče útočníkovi budou nejspíš k ničemu, protože bude mít přístup k chráněným datům jako takovým.

Poznámka na okraj: v dalším textu nepoužívám výraz „two-factor authentication“ pro kódy zasílané esemeskou, ve své podstatě to totiž není 2FA, ačkoliv se to tak často označuje – pro získání onoho kódu není potřeba ani můj mobil, ani má SIM karta, viz dále.

V případě ověřování přihlášení pomocí SMS útočník také může získat data ze serveru, čili v tomto zas není takový rozdíl. Kód sice bude v databázi uložen kratší dobu, ale nevíme jak dlouho, takže ověřování přihlášení pomocí SMS je z tohoto úhlu pohledu jen nepatrně lepší. Co se týká zařízení, tak stačí uživatele donutit, aby si nainstaloval nějakou zákeřnou aplikaci. Jak se ukazuje, tak to zas není tak složité („nainstalujte si tuto aplikaci pro lepší bankovnictví“, „pro starej vzhled Facebooku“ apod.), taková aplikace pak může číst SMS z telefonu, za předpokladu, že jí uživatel dá právo. To opět vyřeší trocha sociálního inženýrství, stačí uživateli napsat, že to prostě musí povolit. Získat ověřovací kód z esemesky je tedy poměrně nenápadná záležitost a uživatel si toho nejspíš ani nevšimne.

Tweet od @jirihelmich o výměně SIM karty, aniž by na pobočce O2 chtěli viděl starou SIM nebo občanku

K čemu je 2FA by mohl vyprávět Jirka Helmich

V případě použití ověřování pomocí SMS je ale největší slabinou mobilní operátor. Ten jde opět pomocí sociálního inženýrství až příliš často donutit, aby číslo „portoval“ na jinou SIM kartu. Tohle je právě ten důvod, proč se ověřování přihlášení pomocí SMS nedá považovat za „two-factor authentication“. Pro získání toho ověřovacího kódu stačí mít totiž pouze a jen telefonní číslo, ne zařízení, ne konkrétní SIM kartu, ale jen konkrétní telefonní číslo. Technicky tedy stačí v databázi operátora přehodit jeden záznam, který říká, že tohle telefonní číslo už nepatří k týhle SIM kartě, ale k jiný.

Problém ověřování pomocí SMS je také v tom, že poskytovatelé služeb telefonní číslo používají pro obnovení účtu, například při zapomenutí hesla apod. A v tom se skrývá obrovské nebezpečí a proto se moc nedoporučuje službám telefonní čísla dávat. Naprostá většina (baj voko) totiž telefonní číslo nějakým způsobem k obnovení účtu použije, protože je to prostě jednodušší pro uživatele. Bohužel pokročilejším uživatelům, kteří by chtěli lepší zabezpečení, nenabízí možnost obnovení účtu pomocí telefonního čísla zakázat, pokud po nich telefonní číslo vyžadují z nějakého jiného důvodu. Nejlepší by bylo, kdyby šlo obnovení zapomenutého hesla zakázat úplně, nehledě na způsob. Někteří uživatelé by takovou možnost rádi využili, hesla mají uložená v password manageru a nemohou je tedy zapomenout. Možnost vypnutí resetu hesel by ale musela být dobře schovaná, aby ji nenašli zas úplně všichni, to by se pak uživatelská podpora zlomila pod tíhou stížností typu „zapomněl jsem heslo a nemohu ho obnovit“.

Je to víc user-friendly

Martin i Nikolaj shodně tvrdili, že algoritmus TOTP je pro uživatele více user-friendly. To bohužel není pravda, kdyby tomu tak bylo, používalo by se to mnohem víc. Ověřování pomocí SMS je pro naprostou většinu uživatelů použitelnější než TOTP, protože pro SMS není potřeba žádnou extra aplikaci, stačí mobil, který umí přijímat SMS. Takže pokud je SMS použitelnější než TOTP, tak přináší určitý kompromis – zjednodušeně: buď se to dá používat, nebo je to bezpečný. Do použitelnosti tu musíme započítat celý proces, včetně instalaci aplikace, ne jen samotné používání.

V diskuzi jsem se dále dozvěděl, že existují články (odkazy jsem nedostal), které tvrdí, že ověřování přihlášení pomocí SMS je bezpečnější než TOTP, ale takovým článkům bych moc nevěnoval pozornost. Je to spíš obráceně, od ověřování (nejen přihlášení) pomocí SMS se upouští. Viz například směrnice amerického úřadu NIST, o kterých ještě tento rok uslyšíme:

Note: Out-of-band authentication using the PSTN (SMS or voice) is discouraged and is being considered for removal in future editions of this guideline.

Za zmínku také stojí články (a důvody) uvedené na slajdech 26–30 mé prezentace o medvědích službách:

A to se nechci pouštět do takových věci, jako že SMS nejsou šifrované a na jejich odposlech stačí mít zařízení za pár set dolarů a být na správném místě, nebo na to, že při přeposílání SMS z mobilu do počítače se zprávy potulují i u dalších, třetích (čtvrtých, pátých) stran a tak dále. Nebudu rozebírat ani rozdíly mezi 2FA (two-factor authentication) a 2SV (two-step verification). Pojďme to pro jednoduchost vynechat.

Takže proč se používá ověřování pomocí SMS? Protože je to pro lidi jednodušší než TOTP, takže je větší pravděpodobnost, že to budou používat, podobně jako třeba otisky prstů pro odemčení telefonu. Zabezpečení účtu jim to tedy zlepší, ale útočníkům lépe odolá TOTP, zvlášť pokud jde o cílené útoky. TOTP je pro většinu lidí méně použitelné, protože si musí něco instalovat, ale to už se opakuju. Naštěstí i v tomto ohledu jsou nějaký pokroky a třeba Google umožňuje ověřování pomocí jednoduchého „tapnutí“, viz třeba Google Prompt, ale uživatel musí mít něco od Googlu a spárovanej telefon. Podobnou službu nabízí i Duo Security. (Threat model je tu podobný jako u TOTP, jen je to víc použitelné.)

Když nemáte TOTP, tak tam dejte SMS

Kde to jde, tak používám TOTP nebo speciální aplikace pro ověřování čehokoliv. SMS nepoužívám (obecně) a snažím se službám nedávat telefonní čísla, pokud ho nepotřebují. To je obzvlášť důležité, pokud služby používají telefonní čísla pro obnovení účtů nebo zapomenutých hesel.

Ověřování přihlášení pomocí SMS je podstatně lepší a bezpečnější než přihlašování jen pomocí hesla, ale ověřování pomocí TOTP je podstatně lepší a bezpečnější než ověřování pomocí SMS.

Pojem „dvou-faktorová autentizace“ je poměrně zaběhnutý a často se používá (a to nejen v marketingových materiálech), ačkoliv já mám možná trochu raději o něco obecnější „ověření přihlášení“ (login verification), „přihlašovací kód“ (login code) apod. Toto pojmenování trochu přesněji vyjadřuje výhodu, kterou uživatel získá. Twitter i Facebook na podobné pojmenování pomalu také přechází, Google používá termín „2-Step Verification“:

Teď když už víte, jak to s těmi SMS zprávami je, tak vás určitě zajímá, jak dopadla diskuze, že? No, skončila tak nějak klasicky, po obvinění, že můj text obsahuje minimálně 5 alternativních faktů jsem Martinovi poslal odkazy na konference (nejen) o autentizaci jako jsou PasswordsCon, DEF CON a Chaos Communication Congress, které s díky přijal, a dodal: „Budu se od nich držet co nejdál“.

Podstatná část článku původně vyšla 4. ledna 2016 jako komentář na Facebooku.


Mohlo by vás také zajímat

Michal Špaček

Vyvíjím webové aplikace, zajímá mě jejich bezpečnost. Nebojím se o tom mluvit veřejně, hledám hranice tak, že je posouvám. Chci naučit webové vývojáře stavět bezpečnější a výkonnější weby a aplikace.

Veřejná školení

Zvu vás na následující školení, která pořádám a vedu:

Úvod do PHP
(12. 6. 2017 Praha)

Třídy a objekty v PHP
(13. 6. 2017 Praha)

Bezpečnost PHP aplikací
(14. 6. 2017 Praha)

Výkonnost webových aplikací
(15. 6. 2017 Praha)

English