Tym razem to LeoExpress się przejechało - czyli o publicznym dostępie do biletów i danych osobowych ich użytkowników

in polish •  8 months ago

RODO nadjeżdża

Każdy z nas w ostatnim czasie zauważył mnóstwo wyskakujących powiadomień z prośbą o zaakceptowanie nowych regulaminów, właściciele systemów rozsyłających masowo emaile zapewne odnotowują niezły przychód w związku z powiadamianiem użytkowników o nowych przepisach tą drogą. Zapewne zadajecie sobie pytanie - po co tyle zachodu?
W skrócie: od 25 maja 2018, za wyciek bądź przetwarzanie waszych danych osobowych bez waszej zgody grożą kary rzędu 10-20 mln euro lub 2-4% rocznego światowego obrotu firmy.
A to duuuużo pieniędzy.

 Przystanek: Moje konto, powiat wyciekowo

W piątek (18 maja br.) otrzymałem od LeoExpress email w związku z akceptacją nowego regulaminu tak bym mógł nadal należeć do “Smile Club” i otrzymywać w przyszłości zniżki. Zgodę potwierdziłem, bo czasem podróżuję, więc uznałem, że może kiedyś się przydadzą.
Będąc już na stronie chciałem przy okazji sprawdzić, jakie dane mam wpisane w profilu, bo po prostu tego nie pamiętałem (rzadko odwiedza się ustawienia po raz drugi).
Przy okazji włączyłem sobie narzędzia deweloperskie w przeglądarce i chciałem zobaczyć, co się dzieje “w tle”.

Zapytań do serwera nie było wiele, przy czym dwa z nich od razu rzucały się w oczy (krótki adres url).
Jeden z nich zawierał JSONa z moimi danymi osobowymi, co mnie trochę zdziwiło, ponieważ strona za każdym razem się w pełni przeładowywała i nie widziałem sensu dociągania danych z jakiegoś API.

Sprawdziłem również jakie zapytanie jest wysyłane do serwera. Okazało się, że dane pobierane są z bazy GraphQL:

[POST] https://graph.leoexpress.com/le

Widzimy, że w zamazanych miejscach znajdował się mój adres email i token mojej sesji. W takim razie powinienem się czuć bezpieczny, bo unikalny token zapewnia mnie, że tylko ja widzę swoje dane, prawda?

Dobra dobra, wiem po co tutaj przyszliście ;)
Poszukałem w Google emaila powiązanego z jakąś opinią o LeoExpress. Zakładałem, że będzie to ich klient i będzie istniał w systemie. Znalazłem go!
Podmieniłem swój adres email na adres innej osoby i dostałem to czego (nie) chciałem:
Imię, nazwisko, adres zamieszkania, numer telefonu i dodatkowe informacje o podróżach pasażera.

To oznaczało, że token nie jest walidowany i mogę wyciągnąć dane osobowe dowolnego użytkownika.
Nie jest wesoło, ale ryzyko wycieku dużej ilości danych nie wygląda na wysokie. Musimy znać adres email innego podróżnego, a do tego nasz użytkownik musiałby posiadać wypełniony profil.

Natychmiast skontaktowałem się z LeoExpress informując ich o znalezionej luce + poinformowałem agencję SYMBIO AGENCY, która wykonała dla nich stronę.
Odpowiedzi otrzymałem tego samego dnia (a to był piątek wieczór!) i w sobotę rano.

Agencja przesłała mi emaile dwóch osób z działu IT, z którymi powinienem się skontaktować. Przesłałem im informację o znalezionej luce, ale chciałem też sprawdzić, z kim dokładnie będę rozmawiał. Wpisałem w Google adres email, który otrzymałem...

Przerwa na szybkie pytanie!

Tip: do odpowiedzi na te pytanie wymagane jest nielogiczne myślenie poparte złymi praktykami programistycznymi

Jeśli na serwerze produkcyjnym (czyli takim z którego korzystają użytkownicy LeoExpress) znajduje się baza danych produkcyjna, to na serwerze testowym (czyli takim, z którego korzystają ich programiści w celach sprawdzenia poprawnego działania aplikacji) znajduję się baza danych:

    a) produkcyjna
    b) produkcyjna
    c) produkcyjna
    d) produkcyjna

Odpowiedź poznacie już za chwilę!

Bileciki do kontroli!

Wracając do moich poszukiwań osoby, z którą się miałem skontaktować. Znalazłem ją, a raczej jej bilet, który był zaindexowany przez Google na serwerze testowym.

Bilet z przejazdu w marcu tego roku. Bilet zawiera imię, nazwisko oraz email osoby podróżującej.

Kiedyś podróżowałem z LeoExpress i swój stary bilet posiadam na poczcie, ponieważ LeoExpress przesyła informację o zamówieniu + bilet jako PDF. W nazwie PDFa jest podany identyfikator liczbowy, więc po prostu podmieniłem ID zamówienia na serwerze testowym na swoje i voilà, oto mój bilet z listopada 2017:

https://le.test.symbio.agency/download-pdf/[ID_ZAMÓWIENIA] Tak, to oznacza że dobrze odpowiedzieliście na poprzednie pytanie! Gratulacje!

Ci bardziej dociekliwi pewnie zadają sobie pytanie jakim cudem otworzyłem bilet innej osoby?
Odpowiedź na to pytanie będzie taka sama jak w poprzednim przypadku - brak walidacji dostępu.
Podłubałem też trochę w opcjach serwisu LeoExpress i znalazłem możliwość pobrania swoich biletów. Skopiowałem link do pobierania z produkcji

https://www.leoexpress.com/download-pdf/[ID_ZAMÓWIENIA]

i sprawdziłem kilka przypadkowych ID, a moje oczy zaczęły krwawić (w przenośni):

Zapnijcie pasy!

  • W momencie istnienia błędu LeoExpress posiadało ok. 800 000 użytkowników! (można sprawdzić w API jakie jest ID naszego nowego konta)
  • Spora ilość “początkowych” ID (czyli 1, 2, 3, 30000+, 40000+, itd.) prawie zawsze zwracała wynik do momentu kiedy zmieniono format ID, ponieważ w marcu ID miało wartość ~182000000000000. Nie zmienia to jednak faktu, że nadal można iterować po identyfikatorze (na przykład jakimś skryptem) ponieważ jest on liczbą.

Posiadając teraz pokaźną pulę (kilkudziesięciu/kilkuset tysięcy) PDFów z adresami email, mogę zacząć odpytywać API, o którym wspomniałem na początku artykułu i wyciągać dane osobowe.
Imię i nazwisko już posiadam z biletu ale numer telefonu i adres dostępne w API też potrafią być cenne. Do czego w ogóle mi to wszystko potrzebne?
Wiedziałbym jakimi klasami i z kim podróżujecie, kiedy Was nie ma w domu, no i z przyjemnością zaprosiłbym Was na prezentację garnków dzwoniąc do was z samego rana, a wasz numer zostałby oczywiście “wylosowany” :D

Powrotny do “Bezpieczeństwa” poproszę!

Błąd pozwalający iterować po identyfikatorach biletów został naprawiony kilka dni po zgłoszeniu (zmianę zauważyłem 23.05.2018). Adresy, z których można było pobrać bilety zostały zabezpieczone poprzez wymóg podania loginu i hasła (środowisko testowe) oraz unikalny ciąg znaków dołączony do linku pobrania PDFa (na produkcji).
API, z którego można było dodatkowo wyciągnąć adresy i telefony użytkowników już poprawnie waliduje token. Niestety ta zmiana trwała dość długo, bo została wprowadzona dopiero 14.06.2018.

Koniec trasy! Wysiadać!

Jak zakończyła się cała historia?
Po kolejnym mijającym tygodniu bez zmian w API, wysłałem email dopytując się o to, kiedy zostaną wprowadzone zmiany i jak to ma się do obowiązującego już RODO. Zostałem poproszony o podanie numeru telefonu, ponieważ Head of Finance z LeoExpress chciał ze mną porozmawiać. Z przyjemnością podesłałem swój numer kilka minut przed piątkową rozmową (15.06.2018). Podczas rozmowy otrzymałem podziękowania za znalezienie i zgłoszenie błędu, wyjaśnienie dlaczego wprowadzenie zmian zajęło tak długo oraz zaoferowano mi prezent w ramach podziękowań - vouchery na korzystanie z przewozów LeoExpress.

Przed opublikowaniem tego artykułu ponownie poinformowałem SYMBIO AGENCY na Facebooku o planowanym artykule. Na tę wiadomość kilka godzin później odpowiedział wspomniany wcześniej Head of Finance prosząc w emailu o nie wymienianie nazwy firmy LeoExpress w artykule, zasłaniając się prawnikami:

“please only make sure you do not mention the company name as this would be a huge red flag for our lawyers”

Pomijając tę wiadomośc, kontakt wspominam bardzo dobrze, ponieważ byłem informowany o statusie prac przez LeoExpress oraz SYMBIO AGENCY praktycznie na bieżąco poprzez FB oraz email :)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!