Kontynuuje ten interesujący chyba tylko dla mnie temat odzyskiwania sekretu z jego kawałków. Korzystając z poprawionej wersji skryptu, postanowiłem przeprowadzić prosty eksperyment, który pozwoli z grubsza oszacować ilość próbek, które należy przechwycić, by ustalenie sekretu było możliwe. To tak z ciekawości jak będzie się to miało do liczby prób uwierzytelnienia, które malware musi podpatrzeć (wie, o które znaki system pyta!), by odgadnąć całe hasło. Pisałem na ten temat wiele razy, ostatnio (chyba) tutaj: Hasła maskowane. Znowu.
Całość z kawałków II
Na wejściu dysponuję autentyczną listą masek wygenerowanych w pewnym systemie. Na podstawie tej listy uzyskuję zbiór możliwych do uzyskania z pewnego sekretu haseł jednorazowych. Z tego zbioru wybieram losowe próbki składające się z określonej liczby haseł jednorazowych i próbuję odzyskać sekret. Całość powtarzam określoną ilość razy (w tym przypadku - 10), oraz dla różnych sekretów (trzy różne).
Na początek rezultat skryptu dla próbek składających się z 5 elementów. W kolejnych kolumnach podana jest ilość kroków (wykorzystanych haseł jednorazowych), ilość możliwych sekretów, czas wykonania oraz dane wejściowe.
Secret: JavSyffiapDybji 5 1433 1.97 ['yiapb', 'avyaj', 'Sfpy', 'JaSfiaDbji', 'avfiybi'] 5 18825 4.86 ['vSaj', 'afipyji', 'Sfpy', 'aSyfiapbji', 'vSffibj'] 5 3 1.31 ['vSffibj', 'Javyfiapji', 'JvfpDyji', 'avSfiaD', 'Sfiybj'] 5 3593 55.57 ['JaSfi', 'fiaDy', 'SffaDyb', 'yiybi', 'SyfapDj'] 5 2022 2.14 ['aSaji', 'aSfi', 'JaSb', 'JffiDi', 'aSyfiapybj'] 5 6177 34.16 ['yiapyb', 'aSyfipyb', 'vSyfiybi', 'avfipDyj', 'avfpb'] 5 5717 3.76 ['JffiDy', 'ayDb', 'vSfiapybi', 'JSyfapDi', 'vSfy'] 5 246043 123.31 ['aSfipyb', 'Jvipb', 'vSfy', 'aSyfayj', 'Jyfii'] 5 550 2.33 ['JffaDji', 'JffiDi', 'JvSyfiaDbj', 'afapDbj', 'vSfy'] 5 254020 48.19 ['vSaj', 'SypD', 'JffiDi', 'aapDji', 'aSyfipDj'] Secret: 6OgAdyeOkamousk 5 298 7.94 ['gAeo', 'OgeOouk', 'Adykams', 'dOkau', '6gOau'] 5 16 1.63 ['6OAdeOkmok', '6OAdyOkouk', 'OAdyOams', 'gkous', '6gAdeOkmus'] 5 834 31.88 ['Okamuk', 'OgyeOos', 'OAeOaou', 'OAyOkaous', 'gdykaou'] 5 3131 3.92 ['gAeOao', 'Oyauk', 'Aams', 'gAdeOkmouk', 'gAyeOus'] 5 40 1.02 ['6yekmsk', 'dykamk', 'OAdeOaok', 'gdyOkmusk', 'gAkok'] 5 1312100 538.78 ['Odmu', 'OOaos', '6dyOk', 'eOkmo', 'yeamu'] 5 1034 13.34 ['6yeOmk', 'Oekamus', 'OAyOamok', 'OAdyOamosk', 'OAdekos'] 5 24 0.33 ['6gdyekamuk', 'demk', '6OAeO', '6OAdeOkmok', 'Odeask'] 5 6209 13.23 ['yekamu', '6OyeOmo', 'gAeo', '6gAdekou', 'OgAyOkm'] 5 704 38.63 ['6geamosk', '6OAok', 'gekmuk', 'Odeams', 'gyeOau'] Secret: 1234567890abcde 5 384 8.53 ['356abce', '15670bc', '245790bc', '235670bcd', '58bce'] 5 15 0.26 ['2389acde', '246890bcd', '2680bde', '135670abde', '245680ad'] 5 977 6.16 ['2346780abd', '245680ad', '670ac', '389ce', '2358bce'] 5 4904 24.39 ['2390bd', '124c', '24680abe', '379ace', '2478'] 5 2635 1.17 ['249de', '290ade', '25ac', '1356790ace', '46780de'] 5 155075 187.19 ['3560b', '378ab', '5679', '124c', '245780bc'] 5 90 0.53 ['246abd', '1356790ace', '2570ad', '235690a', '245680ad'] 5 10 4.18 ['145690ae', '245780be', '4679abc', '578d', '235690cde'] 5 1624 4.31 ['235690ac', '2450ad', '46780abe', '290ace', '245780bc'] 5 13803 3.75 ['24680abe', '470b', '235670bcd', '356abce', '2680ade']
Jak widać w żadnym przypadku nie udało się ustalić sekretu. Zwykle ilość możliwych sekretów jest na tyle duża, że wyniki są praktycznie nieprzydatne. Można zaryzykować więc stwierdzenie, że próbka 5 haseł jest zbyt mała by na ich podstawie z powodzeniem odtworzyć wykorzystany sekret.
Sytuacja zmienia się nieco w przypadku próbki złożonej z 10 haseł jednorazowych. W tym wypadku większość prób zakończyła się znalezieniem ilości możliwych sekretów nieprzekraczających 50. Jeśli jednak uwzględnić fakt, że w przypadku hasła zwykle użytkownik (a więc i atakujący) dysponuje kilkoma próbami zanim konto zostanie zablokowane, taka ilość możliwych sekretów może już umożliwić uwierzytelnienie się w systemie.
Secret: JavSyffiapDybji 10 18 0.37 ['yiapyb', 'avSfay', 'vSyfiaDybi', 'vyfapyb', 'aSfDyj', 'vfaDbi', 'ayfpDj', 'JSyfapDi', 'vyfipDyj', 'avSffipDyj'] 10 38 2.32 ['yfij', 'JvyfiDbji', 'JaSb', 'aSfipDyi', 'ypDi', 'viabi', 'SffaDyb', 'vyfDybi', 'vyfipDyj', 'afipDji'] 10 18 2.03 ['vaybj', 'vSaj', 'JSffiDyb', 'vSyfiDyi', 'yiapb', 'viabi', 'vypy', 'JSfipj', 'avyffpybj', 'vffipb'] 10 4 0.28 ['JvSffaDyj', 'avyiybi', 'aSyfiapbji', 'yiybi', 'afipDji', 'yiapb', 'SffaDyb', 'vfiDy', 'ffpDb', 'avffiyj'] 10 18 2.82 ['vfaDbi', 'avSfapDji', 'JaSfiaDbji', 'yiybi', 'vSaj', 'avSfpDbi', 'yiapyb', 'JSibi', 'vffipb', 'yffa'] 10 2 3.91 ['aviaDbji', 'avyfiDyb', 'vffipb', 'ffpDb', 'avyfapD', 'yfij', 'avyffpybj', 'vSyfipDj', 'vyfpy', 'JvfpDyji'] 10 2 2.70 ['avfiaDyji', 'JaSfi', 'afpyb', 'vSffibj', 'JffiDi', 'vSfiapybi', 'aSypDj', 'avSfpDbi', 'Sfiapj', 'vyfiaDbji'] 10 20 1.92 ['aSfi', 'JaSyfiaDyi', 'viabi', 'yiapyb', 'JffiDi', 'avyfapD', 'afapDbj', 'ayfpDj', 'JaSb', 'vyfipy'] 10 14 13.67 ['afipDji', 'Sfiybj', 'avSfiaD', 'JfpDbj', 'JvfpDyji', 'aSaji', 'fpDb', 'ayDb', 'yiapb', 'JvyffpDyji'] 10 12 4.86 ['aSypDj', 'avSffipybi', 'JSffiDyb', 'aSfipDyi', 'vSffibj', 'aSyfapyb', 'ayDb', 'yiapb', 'avyiaD', 'ypDy'] Secret: 6OgAdyeOkamousk 10 722 28.68 ['geOmo', 'gAdeOouk', 'yeamu', 'damk', 'OAdeOaou', 'OAyOamok', 'dyek', '6yeOmk', '6Aks', 'gaous'] 10 181 0.56 ['6dyOk', 'Okamuk', 'OyOamsk', 'OgdOouk', '6AOuk', 'OyOaosk', 'OAdya', '6OgdyOkask', 'OAdyOamosk', 'OAdyOkausk'] 10 42 22.35 ['OAksk', 'gAdekamu', 'damk', 'OAdekos', '6dyOk', 'geOmo', '6OAeO', 'dykamk', 'gOkuk', 'gAdeOmok'] 10 2884 96.03 ['yekamu', 'Odmu', 'gOkuk', 'Oyaou', 'Aams', 'gkous', 'Adam', 'dykamk', 'OgAekamu', 'gdykaou'] 10 2 1.35 ['gAdeOams', 'OgeOkmosk', 'Ogyau', 'OgyOamos', 'AyOous', 'OyOaosk', 'Odyms', 'OgAekamu', 'yamu', '6gAyekmos'] 10 6 24.26 ['6eamus', 'OgyOamos', 'OAksk', 'gAeOou', 'OgAyamuk', 'gOkuk', 'OgyeOos', 'OgOkmusk', 'gdymouk', 'gAdekamu'] 10 4 0.52 ['gdykaou', 'OOaos', 'OgeOkmosk', 'OgAOkk', 'OAeOaou', '6OAok', 'Odeask', 'AyeO', '6OAeO', '6OAdyOkouk'] 10 5 0.88 ['Aeao', 'OAyOkaous', 'OgAyeOaouk', 'OgAaus', 'OAdyOamosk', 'Okamsk', '6yeOmo', 'OdOmo', 'OAdyOams', 'dOouk'] 10 1 3.98 ['OAdeOaok', 'Ogdyeaous', '6OAeOks', 'yekamu', 'gAyeOamos', 'OAeOaou', 'OgAyeOamos', '6yekmsk', 'gAyeOus', 'OgAyeOaouk'] 10 4 0.63 ['demk', 'OAyOkaous', 'gAks', 'OdOmo', 'OyOaosk', '6gdyOmusk', 'OgyeOos', 'Okamuk', 'eOkmo', 'Odyeamok'] Secret: 1234567890abcde 10 8 0.75 ['290ade', '30bcd', '149d', '345789abce', '450a', '3468e', '256ad', '350b', '345790ac', '135780bcd'] 10 2 0.38 ['1245789abe', '23589a', '1678ae', '2359d', '1567ac', '356abce', '24560', '1370abde', '346780abd', '2390bd'] 10 16 1.33 ['234790ac', '58bce', '135780bcd', '347b', '2680ade', '46890d', '578d', '5890c', '2570ad', '1568e'] 10 4 1.45 ['25ac', '23589a', '234690b', '347b', '1246780bcd', '2478', '58bce', '2570de', '1568e', '50ae'] 10 2 0.44 ['245790bc', '50ab', '2790acd', '2340cd', '14780d', '124c', '13568acde', '234690b', '1246780bcd', '2358bce'] 10 4 19.47 ['24579bd', '25670abe', '789cd', '1348', '149d', '24680abe', '234689a', '15670bc', '137cde', '1370abde'] 10 48 4.91 ['170acd', '378ab', '290ace', '389ce', '356abce', '346780abd', '260ce', '46780de', '670ac', '346890bce'] 6 1 0.37 ['1245789abe', '148ce', '135670abde', '24780bc', '24579bd', '245680abde', '35689acde', '1348', '50ae', '234790ac'] 10 4 0.44 ['135780bcd', '789cd', '234790ac', '24560', '2456890bcd', '23789abde', '349be', '137cde', '148ce', '34780b'] 10 173 0.41 ['356abce', '290ace', '5890bc', '3478bc', '246890bcd', '346780abd', '23680abd', '35680abd', '369abce', '345789abce']
Ostatni test na próbkach o rozmiarze 15 haseł jednorazowych daje już zwykle ilość możliwych sekretów poniżej 5. W części przypadków udaje się nawet ustalić konkretny sekret (we wcześniejszej próbie również się to udało, dwukrotnie). Warto przy tym zauważyć, że tam, gdzie udało się ustalić konkretne hasło, wymaganych było mniej prób, niż rozmiar próbki. Czasami wystarczyło 5 lub 6 haseł jednorazowych, tylko musiały to być właściwe hasła (próbka w pierwszym kroku była sortowana).
Secret: JavSyffiapDybji 15 3 0.48 ['Javyfiapji', 'avyiybi', 'avSffipDyj', 'Jafapybj', 'JvyfiDbji', 'avSfiaD', 'JSffiDyb', 'JSaj', 'JSfp', 'JaSffipybj', 'avSfpDbi', 'aapDbi', 'ayfDj', 'aSfipDyi', 'JvfpDyji'] 15 4 5.87 ['vSyfiaDybi', 'vSfy', 'SypD', 'aSyfapyb', 'SffaDyb', 'aSyfipyb', 'Sffipji', 'ayiDy', 'aSfipDyi', 'vfiDy', 'vpybj', 'JvfpDyji', 'JaSfy', 'JaSfiaj', 'yiybi'] 15 2 1.58 ['Jafapybj', 'JSfp', 'afipDji', 'SpDj', 'JyffDb', 'vSyfiDyi', 'avSfapy', 'JvyffapDbi', 'fiaDy', 'afpyb', 'aSyfayj', 'aSaji', 'aviaDbji', 'vaybj', 'SypD'] 15 3 0.70 ['vSfipy', 'vSfiapybi', 'aSfipDyi', 'JvfpDyji', 'aSyfiapbji', 'afapDbj', 'aSyfapyb', 'JaSfiaDbji', 'Jyffpyb', 'JvSyfayb', 'aSfi', 'SpDj', 'avDyj', 'aSfipyb', 'JaSyfaDbi'] 15 2 0.35 ['avSffipybi', 'SyfapDj', 'avSfpDy', 'yfij', 'JvSyfiaDbj', 'afpyb', 'aSypDj', 'ayfpDj', 'yfDi', 'JSaj', 'avyiybi', 'avfipDyj', 'Jayfiapbj', 'JvfpDyji', 'JSibi'] 15 4 0.48 ['Jyffpyb', 'aSyfp', 'ffpDb', 'vpybj', 'vyfiaDbji', 'yiapb', 'aSyfiapbji', 'avSfapDb', 'avSffipDyj', 'SypD', 'ypDi', 'avSffipybi', 'aSfipDyi', 'aSaji', 'yiapyb'] 8 1 0.29 ['yfij', 'avSffipybi', 'vyfiaDbji', 'JSaj', 'avSiai', 'JvSyfayb', 'avyiybi', 'aSyfipyb', 'JaSyfaDbi', 'aSfiapybj', 'ayffpDyi', 'JaSyfiaDyi', 'vyfapyb', 'aviaDbji', 'JSyfapDi'] 15 8 4.44 ['JaSb', 'ffpDb', 'vSyfiybi', 'JfpDbj', 'vSfii', 'SypD', 'avyfapDb', 'yiapyb', 'JaSyfapyb', 'aapDbi', 'JSfipj', 'avSfay', 'JSyfapDi', 'JvfpDyji', 'avfiybi'] 15 2 0.38 ['yiapyb', 'avyaj', 'avSfapy', 'avyiaD', 'aSfDyj', 'SffipDyi', 'aSaji', 'JffiDy', 'JvSffaDyj', 'JaSffipybj', 'vSffibj', 'JvfpDyji', 'vffipb', 'JvyffapDbi', 'avfiybi'] 15 4 0.69 ['JvSi', 'avfpb', 'JvyfiDbji', 'ayiDy', 'SffipDyi', 'Jvyfipybj', 'vSffipDyj', 'JffaDji', 'vfaDbi', 'vSffibj', 'aSypDj', 'yfapDi', 'afipDji', 'aSfi', 'aSyfiapbji'] Secret: 6OgAdyeOkamousk 11 1 0.37 ['yeamu', '6OdeOamo', 'eOkus', 'dykamk', 'OgyOamos', 'Okamsk', 'gAdeOkmouk', 'Oekamus', '6OAdyOkouk', 'OAeO', 'OgAyamo', 'Odmu', '6OAok', 'OgAyOkm', 'gykmouk'] 15 8 1.36 ['Okamsk', '6geusk', 'OAdyOams', 'dykamk', 'Ogdykausk', 'AyeOamok', 'OAdeOaok', 'gAdekamu', 'OdOmo', 'OAyOamok', 'OAdyOamosk', 'damo', 'gAeOao', 'yamu', 'AyeOask'] 15 2 5.76 ['dOkaou', 'Okamsk', '6OAeO', 'Oekamus', 'geOmo', 'Odeams', '6OdeOamo', '6gAdekou', 'yamu', '6AeOas', 'yekamu', 'OAdeOaou', 'OAdeOaok', 'OAymos', '6OdyOkaus'] 15 4 0.66 ['yekamu', 'gAyeOamos', 'OAyOamok', '6yekmsk', '6geamosk', 'gAeo', 'gyeOau', 'gdao', '6OAdykmuk', 'OgdOouk', 'yamu', '6OAeo', 'deOs', 'OgyeOos', 'gAdekamu'] 15 2 2.08 ['OAeOaou', 'geOmo', 'OAdeOaou', '6gAO', 'Odyeamok', 'gAdekamu', '6OAok', 'AyOous', '6yekmsk', 'Oyauk', '6OAdyOkouk', 'eOkmo', 'gAeOou', 'OAdekaou', 'gdyao'] 6 1 0.63 ['dOkaou', 'Aams', '6OAdeOkmok', 'OAdyOkaous', 'damo', 'dOouk', 'gAks', '6gdyOmusk', 'gyeOau', '6geusk', 'eOkmo', 'gdao', '6gOau', 'OgAyamuk', 'Oyaou'] 6 1 0.39 ['gAeOou', 'Ogdykausk', 'gAeOao', 'OgdyOmou', 'OyOaosk', '6gAyekmos', 'Odyms', 'Odyeamok', 'yekamu', 'OAyOkaous', 'Oyaou', '6OAdeOkmok', 'Oyauk', '6dyeaou', '6Oekaous'] 15 2 0.78 ['OAdekaou', 'OAdekos', 'gykmouk', '6Adykamk', 'Odeams', 'Okamuk', 'Odmu', 'gAyOkaouk', 'Oekamus', '6eamus', 'Odeask', '6gdyekamuk', '6gAyekmos', 'OgeOkmosk', 'gAyOk'] 11 1 1.37 ['OdOmo', 'gAeOao', 'dyek', '6OdyOkaus', '6OAeo', 'gdykaou', 'Oyaou', 'Okamsk', '6Aks', '6gdeOaous', 'OgOkmusk', '6OAyeOaous', 'Adykams', 'OAdyOams', 'OyOamsk'] 15 4 0.22 ['yamu', 'AyOous', '6AOuk', 'Oekamus', 'Ogdykam', 'dOouk', 'dykamk', 'Ogmos', 'demk', 'OAdyOkausk', '6gdyeamosk', 'damo', 'Odyms', '6yeOmk', '6gdyekamuk'] Secret: 1234567890abcde 15 2 0.40 ['246abd', '235690ac', '170acd', '1245790bc', '1356790ace', '260bc', '5890bc', '235690a', '36780c', '3468e', '5890c', '470b', '15670bc', '23568abc', '1245689bce'] 15 2 0.39 ['137cde', '2456890cde', '60ac', '2346780abd', '1345789acd', '235670bcd', '290ade', '350b', '134679abd', '23789abde', '30bcd', '2790acd', '1348', '15670bc', '470b'] 9 1 0.30 ['450a', '23680abd', '135670abde', '124789d', '235690a', '35690bc', '23460ace', '2450ad', '2680ade', '280bd', '124569ace', '148ce', '124789acde', '124c', '25670abe'] 9 1 0.21 ['235690cde', '2360c', '235670bcd', '23789abde', '23469b', '135670abde', '135780bcd', '350b', '280bd', '1380c', '170acd', '2456890cde', '246abd', '2680bde', '12356890de'] 15 2 0.37 ['235670bcd', '1345789acd', '35680abd', '46890d', '23678bd', '170acd', '12478', '345790ac', '245680ad', '134579bc', '148ce', '260bc', '346890bce', '12678ab', '57ae'] 15 2 1.43 ['14780d', '1380c', '2790acd', '148ce', '350b', '789ab', '134679abd', '235670bcd', '2346780abd', '34578abe', '245680ad', '35680abd', '5679', '1370abde', '245780bc'] 15 4 0.83 ['2456890cde', '1567ac', '50ae', '2360c', '30bcd', '137cde', '5690ae', '245680ad', '235670bcd', '1470', '246abd', '2390bd', '260bc', '1380c', '46780de'] 5 1 0.32 ['35689acde', '1245789abe', '12478', '2346780abd', '345789abce', '5690ae', '46780abe', '349be', '1678ae', '137cde', '245680ad', '2378bce', '1245790bc', '4678', '134579bc'] 15 2 0.40 ['2570de', '1246780bcd', '1345789acd', '23489e', '35689acde', '234690b', '2456890cde', '2478', '3468e', '23678bd', '134679abd', '124789d', '34780b', '135780bcd', '2456890bcd'] 15 3 0.23 ['137cde', '2456890cde', '1356790ace', '5890c', '45690ad', '134679abd', '46780de', '369abce', '149d', '249de', '60ac', '46780abe', '1380c', '1567ac', '345780ad']
Prawdopodobnie wyniki te różniłyby się w zależności od zbioru masek i początkowego sekretu. Na razie chyba jednak zakończę ten temat, bo:
- haseł maskowanych i tak nie lubię,
- w innych schematach hasło jednorazowe powinno być tworzone w oparciu o losowe znaki z sekretu,
Jeśli ktoś korzysta z usługi, w której jest uwierzytelniany przy pomocy określonych cyfr/znaków z jakiegoś współdzielonego sekretu, może zwrócić uwagę, czy uwierzytelnienie odbywa się w oparciu o "uporządkowane" znaki, czy pytania odnoszą się do losowych znaków w sekrecie. Jeśli zachodzi ten pierwszy przypadek, w ramach eksperymentu może sobie policzyć ile razy ktoś musi podsłuchać (dosłownie, jeśli jest to są to usługi jakiegoś call-center) taką operację (uwierzytelnienia), by móc się pod niego podszyć.
Do tematu jeszcze może kiedyś wrócę, w nieco innym kontekście. W przypadku pewnej aplikacji mobilnej spotkałem się z wykorzystaniem "hasła maskowanego" do... autoryzacji transakcji. Jeśli wykreślimy z obrazka malware, może to mieć sens. A i w przypadku ponownego wprowadzenia malware, wcale nie jest wykluczone, że koszt zrobienia tego lepiej (szeroko rozumiany, z akcentem na koszt w postaci wygody użytkownika), może być dość wysoki.