Jednorazové kódy môžu byť v telefóne úplne správne a server ich v tej istej sekunde odmietne. Obe strany počítajú rovnakú funkciu zo spoločného tajomstva a aktuálneho časového kroku, takže nezhoda v čase vedie k nezhode v kóde. Preto je posun hodín závadou významnou pre bezpečnosť, nie len obťažovaním.

Záleží tu na dvojích hodinách a oprava tých viditeľných je to, čo ľudia robia ako prvé. Tie, ktoré zvyčajne potrebujú pozornosť, sú tie druhé.

Kód je funkciou času, nie heslom

TOTP vezme spoločné tajomstvo a počítadlo odvodené z aktuálneho času, preženie oboje hashom s kľúčom a výsledok skráti na krátky desatinný reťazec, ako určuje RFC 6238. Počítadlo sa posúva pri každom časovom kroku, zvyčajne tridsať sekúnd, takže rovnaké tajomstvo vytvorí novú hodnotu, keď sa krok zmení. Overovateľ prepočíta očakávanú hodnotu pre aktuálny krok a porovná, čo vyžaduje rovnaké tajomstvo a predstavu o teraz. Heslo zostáva znovupoužiteľné, kým sa nezmení, zatiaľ čo táto hodnota vyprší na hranici, ktorú klient nevidí.

Preto jeden kód funguje a ďalší zlyhá o pár okamihov. Vysvetľuje to aj to, prečo je kopírovanie kódu z chatovej správy taký nespoľahlivý zvyk.

Dvoje hodiny sa musia zhodnúť, nie jedny

Zapisovací materiál je prvá spoločná vec a čas je druhá. Ak je tajomstvo správne, kým sa hodiny líšia viac ako tolerované okno, každá vygenerovaná hodnota skončí v nesprávnom kroku a je odmietnutá. Ak sa hodiny zhodujú, kým je tajomstvo nesprávne, každá hodnota je tiež odmietnutá, a obe zlyhania vyzerajú na prihlasovacej obrazovke rovnako. Oddeliť ich znamená skontrolovať záznam účtu a čas nezávisle, v tomto poradí.

Hodiny overovateľa si zaslúžia rovnaké skúmanie ako hodiny zariadenia. Server s pokazeným zdrojom času odmietne správne kódy všetkých používateľov naraz a správy budú opisovať náhly výpadok, nie posun. Ten vzorec stojí za to rozpoznať, pretože jeho oprava patrí na server, nie na sto telefónov.

Čo stojí rozšírenie okna

Implementácie môžu prijať kód zo susedného kroku, aby pohltili malé rozdiely, a táto tolerancia je rozhodnutie o dizajne, nie bezplatná úprava. Každý ďalší krok násobí počet hodnôt platných v ktoromkoľvek okamihu, čo je presne to, čo útočník hádajúci kódy uprednostňuje. Pravidlo proti opakovaniu má význam z rovnakého dôvodu, keďže kód prijatý dvakrát je kód, ktorý užitočne unikol. Správca, ktorý rozšíri okno, aby umlčal sťažnosti, vymení skutočnú vlastnosť za kozmetické zlepšenie.

Oprava hodín je opravou, zatiaľ čo rozšírenie okna je sedatívum. Prvé odstraňuje príčinu a druhé ju skrýva.

Skontrolujte oboje hodiny, než to skúsite znova

Prečítajte čas v zariadení a na serveri a porovnajte posuny, nie zobrazené miestne časy. Nižšie uvedené príkazy ukazujú stav synchronizácie a surový okamih UTC na hostiteľovi alebo serveri Linux. Spustite ich na oboch stranách, než zmeníte akékoľvek nastavenie overovania.

timedatectl
date -u +'%Y-%m-%dT%H:%M:%SZ'
chronyc tracking
timedatectl timesync-status

Posun meraný v sekundách je neškodný, posun v minútach vysvetľuje odmietnutie a systém, ktorý nehlási žiadny zdroj synchronizácie, je kandidátom na oboje. Porovnajte dva časové údaje UTC priamo, pretože miestny čas obsahuje časové pásmo, ktoré algoritmus nikdy nevidí. Ak sú posuny malé a kódy stále zlyhávajú, prestaňte nastavovať hodiny a radšej preskúmajte zápis. Opakované pokusy proti uzamknutému účtu sťažujú pozorovanie pôvodnej závady.

Zaznamenajte čas odmietnutia, posun a text chyby a spoločné tajomstvo do toho nezahŕňajte. Podpora si vystačí s prvými tromi a štvrté by nikdy nemala vidieť.

Súvisiace články