Dziś opowiem o eksperymencie, który mi nie wyszedł. Do jego przeprowadzenia zainspirowało mnie opracowanie Side-Channel Leaks in Web Applications: a Reality Today, a Challenge Tomorrow. O temacie side-channel wspominałem również podczas mojej prezentacji dotyczącej cloud computing. Konkretnie zainteresował mnie jeden z aspektów, który dobrze oddaje ten fragment:
Song et al showed that because SSH is an interactive remote shell service and typing different keystroke-combinations naturally produces slight timing characteristics, a network eavesdropper can build a Hidden Markov Model (HMM) to infer the keystrokes. When applied to guess a password, the attack achieves a 50-time speedup compared to a brute-force guessing attack, i.e., more than 6-bit reduction of the password’s entropy.
Na temat tych konkretnych badań można przeczytać więcej tu: Timing Analysis of Keystrokes and Timing Attacks on SSH.
Co chciałem sprawdzić
Koncepcja opisana i zbadana we wspomnianym dokumencie wydawała mi się dość oczywista. Pamiętam to jeszcze z bardzo dawnych czasów, gdy przyszło mi badać ruch sieciowy w poszukiwaniu śladów włamania. Śladów nie znalazłem, ale za to dowiedziałem się dość sporo na temat umiejętności pisania na klawiaturze kilku użytkowników. W tym konkretnym przypadku miałem do czynienia z protokołami typu telnet lub ftp, więc nie było warstwy szyfrowania. W przypadku protokołu telnet każde przyciśnięcie klawisza generowało pakiet, który był wysyłany do serwera. Na podstawie czasu wysłania poszczególnych pakietów, oraz odległości między poszczególnymi pakietami można było ustalić jak szybko użytkownik pisze na klawiaturze.
W swoim eksperymencie chciałem sprawdzić, czy różnice w czasie między naciśnięciem konkretnej kombinacji klawiszy są na tyle istotne i charakterystyczne, by móc odtworzyć (z pewną dozą prawdopodobieństwa) wpisany tekst.
Co zrobiłem
W pierwszym etapie postanowiłem zebrać trochę danych testowych. Napisałem prosty skrypt, który rejestrował czas naciśnięcia poszczególnych klawiszy, a następnie zająłem się przepisywaniem różnych tekstów. Po zakończeniu tego etapu dysponowałem zbiorem "występujących w naturze" (czyli w przepisywanych tekstach) kombinacji znaków wraz z czasem naciśnięcia poszczególnych klawiszy.
Etap drugi polegał na zidentyfikowaniu ciągów dwuelementowych, dla których z zebranych danych określony został czas między naciśnięciem pierwszej i kolejnej litery. Właśnie na podstawie tej wartości chciałem "zgadywać" jaka kombinacja znaków została wciśnięta.
I jaki był wynik
Chyba chciałem przeprowadzić eksperyment zbyt małym kosztem. W szczególności bez sięgania po bardziej zaawansowane mechanizmy statystyczne niż średnia arytmetyczna. Efekty okazały się dość kiepskie. Gdy na podstawie czasu upływającego między naciśnięciem dwóch klawiszy chciałem ustalić jakie klawisze mogły zostać wciśnięte, lista "prawdopodobnych kombinacji znaków" nie zawierała tych znaków, które rzeczywiście wpisałem. Owszem, gdy powiększałem "margines" między wyliczoną średnią a "dopuszczalnymi wartościami" na liście w końcu oczekiwana kombinacja znaków się pojawiała, ale jednocześnie pojawiały się prawie wszystkie kombinacje, które miałem w zebranych danych...
Dlaczego wyszło tak źle
Nie spodziewałem się rewolucyjnych wyników, chodziło mi o szybki PoC, który miał mi wypełnić czas do rozpoczęcia właściwego zadania, związanego oczywiście z zupełnie czymś innym. Skala niepowodzenia jednak trochę mnie rozczarowała. Zastanawiam się, co było jej głównym powodem.
Pierwszym czynnik, który prawdopodobnie miał swój wkład w zaistniałą sytuację, to zbyt małe użycie matematyki. Średnia arytmetyczna nie jest najlepszym narzędziem, zwłaszcza, gdy jest ona wyliczana ze stosunkowo niewielkiej próbki. Nie przepisywałem dziesiątków tekstów w celu dostarczenia danych o moim konkretnym stylu pisania. Nie przepisywałem, bo po pierwsze aż tyle wolnego czasu nie miałem, a po drugie przydatność ewentualnego ataku gwałtownie maleje jeśli do jego przeprowadzenia istniej potrzeba wcześniejszego zebrania dużej ilości danych "kalibrujących". Przy okazji zakładam, że taka charakterystyka będzie różna dla różnych ludzi, w końcu były nawet pomysły, by uwierzytelniać użytkownika nie tylko po haśle, ale również po sposobie jego wpisania.
Drugim czynnikiem może być mój sposób piania na klawiaturze. Być może piszę na tyle szybko i sprawnie, że różnice w czasie między wpisaniem poszczególnych kombinacji klawiszy są na tyle małe, że wykorzystanie ich do określenia jakie kombinacje właśnie wpisuję, jest nieefektywne.
I co z tego wynika
Z tego, czyli z faktu, że mój eksperyment się nie powiódł. Nic nie wynika. Są badania, które wykazują, że analiza sposobu pisania jednak poprawia proces łamania hasła. Atak wykorzystujący zebrane w ten sposób informacje dodatkowe może być nawet 50 razy szybszy, niż zwykły bruteforce. Czasami 50 razy robi różnicę. Czasami, bo praktyczna różnica między 50000 a 1000 lat jest niewielka, ale już między 50 lat i rok albo 50 dni i jeden dzień ma znaczenie praktyczne.
No i na koniec oczywiście nieśmiertelne stwierdzenie - ataki nigdy nie stają się gorsze, stają się tylko lepsze.
Jakby komuś się chciało...
Może ktoś dysponujący większą ilością czasu będzie w stanie ten eksperyment powtórzyć i rozwinąć? Ciekawe mogłoby być zbadanie tego, czy:
- charakterystyka pisania jest cechą osobnika, czy języka,
- jak szybko osobnik musi pisać, by atak był nieopłacalny,
- jak przedstawia się skuteczność takiego ataku w zależności od rodzaju hasła (skomplikowane, proste, długi passphrase, ...),
Wydaje mi się, że dwa ostatnie zagadnienia są dość jasne. W pierwszym punkcie chodzi mi o to, by stwierdzić, czy istnieją stałe proporcje dla poszczególnych kombinacji znaków dla badanej populacji, czy jest to raczej cecha osobnika (badanego), mocno zależna na przykład od jego techniki pisania na klawiaturze. Jeśli okazałoby się, że można znaleźć pewien ogólny wzorzec, to ciekawa mogłaby być weryfikacja, czy nie rożni się on w zależności od języka, którym posługuje się badana populacja. Innymi słowy, czy na przykład dla nas wpisanie th jest równie niewygodne, jak dla anglików którzy z takim zestawieniem znaków spotykają się zdecydowanie częściej, niż my.
Ciekawy wpis.