[PL] Jak odnaleźć skradzionego iPhone’a przy użyciu Bluetooth?

Homepage:

https://www.youtube.com/watch?v=Oh2MtT_oiKE

Description:

Wprowadzenie

Często dzieci zamykają oczy myśląc, że są niewidzialne. Podobnie z dużą rzeszą Internautów, który twierdzą, że samo tylko uruchomienie trybu prywatnego w przeglądarce sprawia, że ich wypowiedzi na forach dyskusyjnych stają się anonimowe. Tak jednak nie jest. Wraz z rozwojem technologii nasza prywatność jest coraz bardziej zagrożona. Urządzenia stają się skomplikowane i większość z nas tak naprawdę nie wie jak szczegółowo działa WiFi czy też Bluetooth.

A okazuje się, że te protokoły mogą być wykorzystywane do śledzenia naszych poczynań. Dzisiaj o nowej funkcji, która już za jakiś czas znajdzie się w iPhone a w teorii ma pozwolić nam na odzyskanie naszego skradzionego telefonu nawet gdy atakujący usunie z niego kartę sim a także nie podłączy się do żadnej sieci wifi.

Całość tego podcastu oparłem na materiałach z bloga cryptographyengineering a także serwisu wired.com. Pragnę jednak zaznaczyć, że obecnie nie są znane wszystkie szczegóły na temat implementacji wykorzystanej przez firmę Apple.

Całość więc to bardziej gdybanie jak można by było coś takiego stworzyć, gdzie czyhają niebezpieczeństwa oraz jakie punkty należy wziąć pod rozwagę. Czy rozwiązanie sprawdzi się w rzeczywistości - o tym przekonamy się już za jakiś czas.

Jeżeli materiały tego rodzaju Ci się podobają zapraszam do dołączenia do grupy od 0 do pentestera na Facebooku. Podcast ten można również znaleźć na Spotify oraz Google i Apple Podcasts oraz Anchor. Zapraszam do słuchania.

Apple już od dłuższego czasu pozwala nam na próbę odnalezienia naszego zagubionego telefonu przy pomocy technologii „Find my phone”.

W wielkim skrócie: telefon co jakiś czas łączy się z serwerami firmy i sprawdza swój status. Jeżeli właściciel zgłosi jego zaginięcie, telefon sprawdza swoją bieżącą lokalizację i wysyła ją do chmury. W ten sposób możemy mniej więcej dowiedzieć się gdzie jest nasza zguba. Technologia ta ma jednak jeden minus: opiera się na Internecie.

Aby więc zadziałała telefon musi mieć do niego dostęp. Jest to wiedza powszechna więc nie jest odkrywczym fakt, że przestępcy usuwają karty sim z telefonów jak również nie podłączają ich do żadnych publicznych sieci Wifi. Przez to telefon nie może się skontaktować z serwerem i przesłać swojego statusu.

I tu do gry wchodzi nowy pomysł firmy z Cupertino. Na świecie na chwile obecną używanych jest miliony iPhone. Każdy z nich posiada moduł bluetooth. W standardowym użyciu pozwala on na bezprzewodową komunikacje ze słuchawkami czy też zestawami głośnomówiącymi.

Co więcej poprzez sprytne zmiany w interfejsie użytkownika większość z nas ma ten moduł włączony cały czas, nawet gdy nie jest on przez nas używany. A może by tak połączyć te dwie rzeczy ze sobą? To znaczy wykorzystać fakt, ze mamy dużo telefonów i każdy z nich posiada moduł bluetooth?

Ale możesz teraz pomyśleć? Ale jak to, przecież bluetooth ma zasięg liczony bardziej w metrach niż w kilometrach. Poniekąd właśnie to sprawia, że metoda poszukiwania zagubionych telefonów będzie bardzo dokładna. Załóżmy bowiem, że każdy telefon od teraz zacznie emitować w sposób ciągły co kilka sekund przy pomocy protokołu Bluetooth swój unikalny identyfikator. Nie ma to większego wpływu na baterię a także na użytkowanie telefonu. Inne urządzenia które znajdą się w zasięgu naszego smartfona będą mogły odczytać ten identyfikator.

Co nam to daje? Załóżmy, że telefon został skradziony i nie posiada dostępu do Internetu. Sam wiec nie może wysłać swojej pozycji do serwerów Apple. Ale mogą to za niego zrobić inne telefony będące w okolicy. Wystarczy bowiem, że każdy telefon będzie wysyłał do chmury identyfikatory odnalezione przez niego wraz ze swoją bieżącą pozycją GPS. Dzięki takiemu rozwiązaniu telefon nawet bez dostępu do sieci jest możliwy do zlokalizowania.

No ale tutaj pojawia się kilka problemów. Po pierwsze: prywatność. Jeżeli każdy telefon posiada swój unikalny identyfikator, który jest rozgłaszany co kilka sekund - można w prosty sposób lokalizować osoby korzystające z danego urządzenia. Wyobraźmy sobie włamywaczy, którzy chcą okraść nasze mieszkanie.

Wystarczy, że przez kilka chwil będą nasłuchiwali naszych identyfikatorów rozgłaszanych z naszego mieszkania. Dopóki identyfikatory te będą rozgłaszane - będą wiedzieli, że jesteśmy w mieszkaniu. W obecnych czasach bowiem mało kto opuszcza dom bez telefonu. Tą samą metodę można również wykorzystać w sklepach. Wchodząc do supermarketu na bramce odbiornik bluetooth poszukuje wszystkich rozgłaszanych pakietów.

Podobny odbiornik może być zlokalizowany w różnych miejscach sklepu a dodatkowo skorelowany z kamerami. Ponieważ nasz identyfikator nigdy się nie zmienia - po kilku chwilach będzie można stwierdzić z wysokim prawdopodobieństwem w której dokładnie alejce jesteśmy. Co więcej - będzie również wiadomo kiedy odwiedziliśmy sklep ponownie i jakimi ścieżkami podążaliśmy. Czyli ponownie nasza prywatność jest zagrożona.

Wiemy więc, że pomysł ze stałym identyfikatorem odpada. A może by tak wprowadzić listę wyrazów, którymi będzie się przedstawiał dany telefon? Podczas łączenia dwóch telefonów ze sobą (czyli inicjalizowania usługi - kiedy to potwierdzamy, że jesteśmy właścicielami obu urządzeń) każdy z telefonów generuje długą listę identyfikatorów. Każdy z telefonów posiada kopię takiej listy. Teraz to telefon za każdym razem nie wysyła tego samego identyfikatora, a wybiera jeden z listy. Wprowadziliśmy wiec pewną losowość ale kosztem przechowywania listy słów.

Co więcej trzeba sobie odpowiedzieć na pytanie jak często ma następować zmiana emitowanego słowa. Co w przypadku gdy zużyte zostaną wszystkie wygenerowane wcześniej identyfikatory? Czy możemy wtedy ponownie wykorzystywać te stare, już wcześniej użyte?

Gdy weźmiemy pod uwagę wszystkie te pytania nagle okaże się, że nasza lista rozrosła by się do gigantycznych rozmiarów. Czyli próbując zlokalizować swoją zgubę razem z nią musielibyśmy przesłać listę wszystkich potencjalnych identyfikatorów. A może da się to zrobić inaczej?

W informatyce często mamy do czynienia z funkcjami haszującymi, chociażby funkcją sha2. Zamieniają one dowolne dane na ciąg wyjściowy stałej długości. Jednocześnie posiadają pewną ciekawą właściwość. Operacja zamiany jest szybka i bezproblemowa, jednakże operacja odwrotna nie jest możliwa. To znaczy nie da się z wygenerowanego ciągu w prosty sposób odtworzyć ciągu wyjściowego.

Jedyna możliwość to skorzystanie z ataków siłowych - czyli generowania wyniku funkcji dla każdego wyrazu z osobną aż do momentu gdy uzyskamy ten sam wynik. Jednak dla dłuższych ciągów znaków taka operacja jest praktycznie niewykonalna. Ale dlaczego przywołuje tutaj funkcję skrótu? Dlatego ponieważ zmiana dowolnej litery w ciągu wejściowym zazwyczaj powoduje zmianę wszystkich znaków w ciągu wyjściowym.

Możemy to zatem wykorzystać w naszym przykładzie. Podczas inicjalizacji generujemy losowy, odpowiednio długi ciąg znaków. Następnie za każdym razem, gdy moduł Bluetooth chce wysłać nasz identyfikator oblicza go bazując na tym losowym ciągu znaków, dokładając do niego licznik na jego końcu. Czyli jeżeli nasz tajny ciąg to „kolorowe słońce” to pierwszy identyfikator będzie wynikiem funkcji haszującej „kolorowe słońce 1” a drugi „kolorowe słońce 2”.

Co to zmienia? Każdy identyfikator jest unikalny. Równocześnie podsłuchująca osoba nie jest w stanie wygenerować kolejnego identyfikatora bazując na poprzednich jeżeli nie zna naszego tajnego ciągu znaków. Dodatkowo, samo przeszukiwanie bazy jest dużo prostsze. Wystarczy tylko wysłać losowy identyfikator oraz obliczyć jaka wartość licznika była wykorzystywana przez dany telefon w interesującej nas porze. To również nie jest skomplikowana informacja. Jeżeli licznik wystartował z wartością 1 o konkretnej dacie i godzinie a jego wartość zmienia się o 1 co 30 sekund, możemy z dużą dokładnością określić jaką wartość wysyła telefon w danym momencie (oczywiście zakładając, że czas jest prawidłowy).

Dzięki temu rozwiązaliśmy pierwszy problem: to znaczy zapewniliśmy dostateczną anonimowość telefonom, które cyklicznie wysyłają informacje na swój temat. Ale to nie wszystko co musimy wziąć pod uwagę. Każdy telefon bowiem oprócz rozgłaszania informacji o sobie zbiera także informacje o innych telefonach w pobliżu i wysyła je do chmury wraz ze swoją pozycją GPS. Gdybyśmy zostawili to w takiej formie, Apple miało by dostęp do bieżącej lokalizacji wszystkich telefonów na całym świecie, ponieważ każdy z nich cyklicznie wraz z informacjami o identyfikatorach telefonów znajdujących się obok wysyłał by również swoje położenie.

W idealnej sytuacji natomiast, chcielibyśmy aby informacja o położeniu była dostępna jedynie dla osoby która szuka swojego telefonu. Nie chcemy aby ktokolwiek inny mógł tą informację odczytać. Rozwiązanie tego problemu znowu znajduje się w matematyce. Możemy tutaj wykorzystać kryptografię z wykorzystaniem klucza prywatnego i publicznego. Do tego celu używa się zestawu dwóch powiązanych ze sobą kluczy.

Klucz publiczny nie jest tajny i może być swobodnie dystrybuowany. Jeżeli ktoś chce nam wysłać jakąś sekretną wiadomość używa tego klucza do zakodowania informacji. Tak przygotowany przekaz może zostać odczytany jedynie przez osobę, która posiada klucz prywatny. W naszym przypadku chcemy, aby przesyłane przez nasz telefon informacje o lokalizacji mogły zostać odczytane jedynie przez osobę której telefon zginął i której to telefon znajduje się w naszym pobliżu.

Nie chcemy bowiem dopuścić do sytuacji gdy każdy użytkownik usługi może poprosić o lokalizację dowolnego innego użytkownika usługi. Aby tak się stało, zagubiony telefon zamiast swojego wyliczonego na podstawie funkcji skrótu identyfikatora musi wysyłać swój klucz publiczny. Nasz telefon odczytuje ten klucz publiczny i na jego podstawie szyfruje swoją bieżącą lokalizację GPS i dopiero tak wysłane informacje przesyła do chmury. Dzięki temu Apple nie może ich odczytać - może to zrobić jedynie osoba posiadająca klucz prywatna zagubionego telefonu.

Tym samym rozwiązujemy drugi problem całej tej układanki - sprawiamy, ze tylko uprawnione osoby są w stanie odczytać naszą lokalizację. W takim podejściu ta sama lokalizacja jest zapisywana na wiele różnych sposobów przy użyciu wielu różnych kluczy. Każdy bowiem telefon wysyła jako swój identyfikator inny klucz, który to jest wykorzystywany w szyfrowaniu.

Tylko, że naprawiając jedną rzecz - zepsuliśmy tą, o której mówiłem jeszcze parę chwil temu. Wysyłany bowiem przez każdy smartfon klucz publiczny jest stały i niezmienny. Nie różni się zatem niczym od stałego identyfikatora, którego minusy omawiałem parę chwil temu. Zastanówmy się więc czego potrzebujemy.

Telefon musi wysyłać swój kluczy publiczny, którym moglibyśmy zaszyfrować lokalizację. Ale równocześnie, musi on być za każdym razem inny aby nie dało się w łatwy sposób połączyć, że dwie wiadomości z modułu bluetooth pochodzą od tego samego telefonu. Na pierwszy rzut oka zadanie niewykonalne.

Ale - okazuje się, że istnieje już gotowe rozwiązanie zwane key randomization. Pozwala ono na tworzenie wielu różnych kluczy publicznych, których nie da się ze sobą powiązać a które równocześnie mogą być odszyfrowane przez jeden klucz prywatny.

I to już wszystko w tym odcinku. Jak widzisz tworzenie nowych funkcjonalności tak aby były bezpieczne i zapewniały odpowiednią dozę prywatności a równocześnie spełniały swoje zadanie - czyli w tym przypadku pozwalały na odzyskiwanie zagubionych telefonów nie jest takie proste jak mogło by się wydawać.

Tutaj rozpatrywaliśmy tylko najprostsze przypadki, pozostaje jeszcze wiele rzeczy na które należy zwrócić uwagę a które nie będą występowały tak często. Jak tą kwestię rozwiązało Apple - tego również nie wiemy. W tym podcaście omówiłem tylko potencjalne problemy i jak mogłoby wyglądać ich rozwiązanie.

Mam jednak nadzieje, że tym odcinek otworzyłem Ci trochę oczy drogi słuchaczu. Teraz powinieneś już rozumieć, że samo wyjęcie karty sim z telefonu nie sprawi, że staniemy się anonimowi.

Timeline: