Kiedy komuś wycieka hasło, wyobraża sobie to jako pojedynczy wypadek: jakiś serwis miał zły dzień, była o tym wzmianka w prasie, zmieniłeś hasło i po sprawie. Nie po sprawie. Dzień wycieku nie jest końcem niczego: to pierwszy dzień taśmy produkcyjnej, która potrwa lata i na której ty nigdy nie wystąpisz z imienia i nazwiska. Warto opowiedzieć to do końca, bo prawie nikt tego nie widzi.
Krok pierwszy: ktoś wyciąga bazę danych
Początek nie ma w sobie nic widowiskowego. Ktoś znajduje wstrzyknięcie SQL, otwartą kopię zapasową, panel administracyjny z domyślnymi danymi logowania. I zabiera jedną tabelę.
Ta tabela, jeśli masz szczęście, zawiera twój adres e-mail i skrót twojego hasła. Jeśli masz mniej szczęścia, zawiera twój adres e-mail i twoje hasło. Tekstem. Dokładnie tak, jak je wpisałeś.
2009 trzydzieści dwa miliony haseł czystym tekstem
W grudniu 2009 roku firma RockYou, produkująca widżety do serwisów społecznościowych, padła ofiarą wstrzyknięcia SQL. Wyniesiono z niej około 32 milionów haseł — i nie było czego łamać: przechowywała je czystym tekstem.
Dla RockYou była to katastrofa, dla całej reszty prezent. Po raz pierwszy istniał ogromny zbiór prawdziwych haseł, wpisanych przez ludzi, którzy nie wiedzieli, że ktoś je kiedyś przeczyta. Nie badanie ankietowe: sama rzecz.
Plik stał się rockyou.txt i do dziś pozostaje słownikiem referencyjnym, na którym testuje się ataki. Jego wartość nie polega na tym, że zawiera twoje hasło. Polega na tym, że zawiera sposób, w jaki ludzie wymyślają hasła. Imię i rok, słowo i 123, ! na końcu. RockYou nie wypuściło 32 milionów sekretów. Wypuściło wzorzec. A wzorzec się nie przeterminowuje.
Krok drugi: łamie się to, co się da, bez żadnego pośpiechu
W tym miejscu intuicja zawodzi. Kiedy ktoś próbuje zgadnąć twoje hasło na ekranie logowania, serwis go ucina: trzy próby, CAPTCHA, blokada. Przeciwko serwerowi zgadywanie jest wolne i hałaśliwe.
Przeciwko plikowi ze skrótami, który leży już na twoim dysku, nie ma żadnego serwera. Nie ma nikogo po drugiej stronie, kto powiedziałby „nie”. Próbuje się lokalnie, na kartach graficznych, bez limitu prób i z całym czasem świata. Jeśli serwis zahaszował hasła źle — szybki algorytm, bez soli — różnica względem czystego tekstu jest kwestią wygody, a nie bezpieczeństwa.
I nie próbuje się na chybił trafił: najpierw rockyou.txt, a potem reguły z niego wyprowadzone. Zamień a na @. Dopisz rok na końcu. Każda sztuczka, która wydała ci się sprytna, od ponad dekady jest zapisana w pliku konfiguracyjnym.
W ten sposób część zrzutu zamienia się w czytelne hasła. Reszta — to, co długie, losowe, czego nie ma w żadnym słowniku — pozostaje szumem. To jest linia, którą wyznacza narzędzie do sprawdzania haseł: nie robi ci wykładu, tylko mówi, po której stronie tej linii lądujesz.
Krok trzeci: zestawianie — i tu zaczynasz być wart pieniędzy
Pojedynczy zrzut jest niewiele wart. Wartościowa jest agregacja: wziąć dziesięć wycieków z różnych serwisów, zestawić je po adresie e-mail i zostawić sobie pary e-mail:hasło już w czytelnej postaci. Wynik nazywa się combolistą i nie jest już niczyją bazą danych. Jest listą ludzi.
2013 inwentarz wychodzi na światło dzienne
W grudniu 2013 roku Troy Hunt uruchomił Have I Been Pwned: publiczną bazę adresów e-mail, które pojawiły się w wyciekach, żeby każdy mógł sprawdzić, czy jest w środku. Myśl przewodnia jest prosta i niewygodna: jeśli atakujący mają już ten inwentarz, odmawianie go ofiarom nikogo nie chroni. Lata później doszło Pwned Passwords, które robi to samo z hasłami i pozwala je sprawdzać bez wysyłania: wysyła się fragment skrótu, a serwer odsyła paczkę kandydatów, nie wiedząc, który był twój.
2017 NIST przestaje wymagać symboli i zaczyna wymagać list
Kiedy NIST opublikował SP 800-63B, wyrzucił za burtę niemal całą ortodoksję formularzy rejestracyjnych, a w jej miejsce postawił wymóg, którego mało kto się spodziewał: przy ustawianiu hasła system musi porównać je z listą znanych skompromitowanych wartości i odrzucić, jeśli się na niej znajduje.
To zmiana teorii, a nie szczegółu. Pytanie nie brzmi już, czy twoje hasło wygląda na mocne, tylko czy jest już opublikowane. Dlatego generator robi jedyną rozsądną rzecz: wyciąga je z miejsca, w którym nigdy go nie było.
2019 wyciek, który już był odgrzewanym kotletem z innych wycieków
W styczniu 2019 roku krążyła paczka, która zasłynęła jako Collection #1. Hunt ją przeanalizował i policzył, co jest w środku: około 773 milionów unikatowych adresów e-mail i około 21 milionów unikatowych haseł czystym tekstem, zagregowanych z tysięcy źródeł.
Najważniejszy nie był rozmiar. Najważniejsze było pochodzenie: w dużej części był to odgrzewany kotlet z wcześniejszych wycieków, już złamanych i podanych w wygodnym formacie — choć Hunt znalazł tam również materiał, którego wcześniej nie miał w kartotece. Produktem nie było włamanie. Produktem był inwentarz. A taki inwentarz ma tylko jedno zastosowanie.
Credential stuffing: nikt nie atakuje ciebie
Ciebie nikt nie atakuje. To ta część, którą najtrudniej przyjąć do wiadomości.
Nikt nie siada i nie myśli o twoim koncie. Ktoś bierze combolistę na kilkaset milionów linii, wrzuca ją do narzędzia, które testuje je na formularzu logowania banku albo poczty, rozkłada próby na wiele adresów IP, żeby nie wywołać blokad, i czeka. Ogromna większość nie zadziała. To bez znaczenia: kosztują prawie nic.
To jest credential stuffing i to nie jest zgadywanie. To sprawdzanie. Hasło już mają; jedyne, czego się dowiadują, to gdzie jeszcze je wpisałeś.
Twoje hasło z tamtego forum nie było ważne. Forum też nie. Ważne jest to, że ten sam ciąg znaków otwiera twoją pocztę, a twoja poczta otwiera całą resztę przez „nie pamiętam hasła”. Grzechem pierworodnym nie jest to, że było słabe: jest to, że było to samo. Trzydziestoznakowe hasło, losowe i doskonałe, użyte w dwóch miejscach, jest tyle warte, co gorsze z tych dwóch miejsc. A tego, jak haszuje to gorsze, nie kontrolujesz.
Co z tego wszystkiego wynika
- Zmiana hasła, które wyciekło, nie wystarczy, jeśli je powtarzałeś. Pilny nie jest serwis, o którym mówią w wiadomościach. Pilne są te pozostałe.
- Jedno hasło na jeden serwis — i takie, że możesz je spokojnie zapomnieć. Jeśli pamiętasz wszystkie swoje hasła, masz ich bardzo mało albo są bardzo złe.
- Drugi składnik przerywa łańcuch. Credential stuffing testuje
e-mail:hasło. Jeśli to nie wystarczy, żeby wejść, inwentarz przestaje być coś wart.
Twoje hasło, które wyciekło, nie leży w rękach wroga. Leży w jednym wierszu pliku, wśród kilkuset milionów innych, i czeka, aż komuś zacznie się opłacać sprawdzić je w jeszcze jednym miejscu. A jedyne, co decyduje, czy to zadziała, rozstrzygnąłeś ty sam lata temu, kiedy po raz drugi wpisałeś to samo słowo.
Źródła: wyciek z RockYou (grudzień 2009) i późniejsze użycie rockyou.txt jako słownika ataku · Have I Been Pwned i Pwned Passwords Troya Hunta · NIST SP 800-63B, o sprawdzaniu haseł względem list skompromitowanych wartości · analiza Collection #1 autorstwa Troya Hunta (styczeń 2019) i opublikowane przez niego liczby · definicja credential stuffingu według OWASP.