Image: Sascha Kohlmann , CC BY-SA 2.0
istnieją systemy, do których zwykli śmiertelnicy domyślnie nie mają dostępu. A twórcy takich systemów naiwnie wierzą, że są one chronione przed penetracją i bystre oczy naukowców.
weź co najmniej Bankomaty (ATM). Nierzadko zdarza się, że nieznani ludzie podchodzą do bankomatów, podłączają laptopa, biorą pieniądze i wychodzą bez pozostawiania logów w systemie. A ostatnie historie z „kotletami” (złośliwym oprogramowaniem zwanym Cutlet Maker ) jeszcze bardziej potwierdzają, że nie ma niezniszczalnych systemów – są one niedostatecznie zbadane.
rozpocznij badania
istnieje opinia, że jedynym sposobem na kradzież pieniędzy z bankomatu jest przyjazd na wywrotkę, podniesienie bankomatu za pomocą haka i wyrwanie go podrobami, a następnie użycie szlifierki, złomu i spawarki gazowej. Ale jest inna metoda.
po krótkich poszukiwaniach na eBayu miałem na biurku chusteczkę do dozownika NCR USB S1 z firmware. Celem było:
- znajdź obejście szyfrowania poleceń wysyłanych przez komputer przez USB do samego dozownika, w szczególności do emisji banknotów
- dowiedz się, jak ominąć potrzebę fizycznego dostępu do sejfu do uwierzytelniania (żonglowanie kasetą) w celu wygenerowania kluczy szyfrowania poleceń z poprzedniego akapitu.
Firmware
firmware jest plikiem ELF dla procesora NXP ColdFire ( Motorola 68040 , mój ulubiony procesor), działającego na VxWorks v5.5.1 .
w pliku ELF interesujące są dwie główne sekcje -.tekst i .dane :
- jeden z nich zawiera kod, który włącza cały główny czas (nazwijmy to głównym firmware), gdy dozownik jest podłączony do jednostki systemowej w górnej części bankomatu.
- w drugim, kod bootloadera jest pakowany za pomocą zlib (jego lokalna nazwa to USB Secure Bootloader ), który jest odpowiedzialny za przesyłanie oprogramowania układowego i uruchamianie głównego kodu.
a najlepsze jest to, że w pliku są niecięte znaki – weź go i poszukaj czegoś ciekawego.
wewnętrzne urządzenie głównego oprogramowania sprzętowego
jeśli podzielisz kod na główne komponenty, otrzymasz następujący schemat (w kolejności składania):
- strumień, który zajmuje się odbieraniem pakietów USB i dystrybucją ich wśród usług.
- usługi są podstawowymi jednostkami wykonawczymi, każda z nich ma swoją rolę i każda ma swoje własne zadania (klasy).
- klasy – tutaj są to zadania, które usługa może wykonać za pomocą kontrolerów.
- kontrolerzy są w rzeczywistości „pracownikami” ( workers), którzy zajmują się walidacją wysyłanych do nich zadań, ich wykonywaniem i tworzeniem pakietów odpowiedzi.
ponieważ w firmware jest dużo kodu, zdecydowano się zacząć od Wyszukiwania wszystkich możliwych usług, a następnie sprawdzić, gdzie zadania są przenoszone.
w rezultacie znaleziono następujące usługi, które po prostu muszą robić to, czego szukam:
1) DispTranService (Dispenser Transaction Service) : praca z zaszyfrowanymi poleceniami, generowanie pakietów banknotów, uwierzytelnianie. Można powiedzieć, że najbardziej interesujące-tutaj.
2) securityService: po uwierzytelnieniu po stronie dozownika generowany jest klucz sesji, który jest wysyłany do komputera w postaci zaszyfrowanej na żądanie komputera. Za pomocą tego klucza zostaną zaszyfrowane wszystkie ważne polecenia-emitujące, tworząc stos banknotów.
kolejny serwis wpadł mi w oko: UsbDownloadService. Jego zadaniem jest podłączenie dozownika do komputera i wersji oprogramowania układowego dozownika, która jest przechowywana na komputerze ATM, aby przejść do bootloadera w celu przesłania oprogramowania układowego, z którym powinien pracować SYSTEM OPERACYJNY (znajduje się w folderze z oprogramowaniem dostawcy na komputerze). Ta usługa jest również w stanie podać informacje o wersji oprogramowania układowego.
uwierzytelnianie fizyczne
uwierzytelnianie fizyczne jest zaimplementowane na najwyższym poziomie i chroni bankomat przed wysłaniem poleceń USB do wydania bez autoryzacji. W tym przypadku polega na tym, że tylko w otwartym sejfie z pieniędzmi musisz wykonać jedną z następujących czynności:
- wyjąć i włożyć dolną kasetę,
- przełączyć przełącznik z tyłu regału z dozownikiem.
ale wszystko to jest wymagane tylko wtedy, gdy poziom dostępu jest ustawiony na maksimum, czyli fizyczny. Są trzy z nich: USB (0), logiczne (1) i fizyczne (2). Pozostałe dwa są używane przez dostawców usług i programistów do debugowania i testowania oprogramowania układowego. Cóż, fizyczny jest wysoce zalecany przez Sprzedawcę do użytku domyślnie.
Luka
Poniżej opisano krytyczną lukę (już naprawioną przez dostawcę w momencie publikacji artykułu), która, jeśli istnieje dostęp do obszaru usług, ale bez dostępu do sejfu (na przykład przez otwór wykonany w panelu przednim bankomatu), wykonuje dowolne polecenia dozownika, w tym gotówkę.
jak się okazało, UsbDownloadService akceptuje polecenia, które nie wymagają szyfrowania. Brzmi kusząco. Ale wtedy wszystko jest dalej chronione, a nazwa Secure Bootloader się uzasadni?
(Spoiler: nie usprawiedliwiaj!)
musimy wejść głębiej
jak już wspomniano, wsekcja danych jest spakowany kod bootloadera, który przez długi czas nie wzbudzał mojego zainteresowania, a moi koledzy, gdy badali firmware, nie zwracali na to uwagi.
chociaż obecność bootloadera była tajna, pytanie pozostało otwarte: w jaki sposób oprogramowanie na komputerze wypełniło firmware? W końcu nic nie znaleziono w głównym oprogramowaniu.
tak więc, bootloader jest rozpakowany, załadowany do IDA z przesunięciem 0x100000 – teraz możesz eksplorować … Tylko żadnych postaci!
to nie ma znaczenia: porównywanie głównego firmware ’ u z kodem bootloadera, czytanie arkusza danych kontrolera – i pojawia się pewien obraz.
okazało się, że przesyłanie oprogramowania układowego, chociaż wydaje się być chronione, w rzeczywistości nie jest. Po prostu trzeba wiedzieć, jak wypełnić go poprawnie.
sporo wysiłku i czasu poświęcono na pełne zrozumienie tego procesu (więcej szczegółów w raporcie ” Blackbox is dead-Long live Blackbox!”Na konferencji Black Hat 2018 w Las Vegas). Jaki jest koszt lutowania pamięci NVRAM, wgrywania do niej kopii zapasowej w celu „posypania” całego kontrolera … Podziękowania dla kolegi Aleksieja za cierpliwość!
rezultatem był następujący algorytm przesyłania oprogramowania układowego do dozownika:
1) Wygeneruj parę kluczy RSA i wlej klucz publiczny do kontrolera.
2) Pisz sukcesywnie .Dane i .tekst sekcji od ELF do ich adresów fizycznych z nagłówków sekcji.
3) Oblicz SHA-1 z zarejestrowanych danych, Zaszyfruj hash kluczem prywatnym, Wyślij do kontrolera.
4) Policz i wyślij sumę wszystkich zapisanych słów firmware.
następnie, jeśli wszystko zostanie obliczone i zarejestrowane pomyślnie, zostanie pobrane główne oprogramowanie sprzętowe.
okazało się, że przy pisaniu firmware jest tylko jedno ograniczenie: wersja firmware nie powinna być niższa od obecnej. Ale przecież nikt nie przeszkadza nam, aby zastąpić wersję firmware w samych danych.
w rezultacie, mój specjalny firmware z antisecurity-fixes został zalany i pomyślnie uruchomiony!
w tym momencie dobrze zbadano kod głównego firmware ’ u, znaleziono polecenia do emisji banknotów. Teraz mogą być wysyłane niezaszyfrowane, a dozownik chętnie je wykona.
ekstradycja
po tym wszystkim, co zostało doświadczone podczas badań (na przykład prawdziwy ATM zakirpicheny ), wynik był tak przyjemny i rekompensujący wysiłki, że algorytm chciał powtórzyć z innym głównym sprzedawcą.
prawdziwy bankomat zaczął wirować i chętnie dzielił się z nami świeżymi, chrupiącymi notatkami(w tym przypadku sprzedawca „cukierków”). Nie zastosowano żadnej magii: tylko laptop, mózg i przewód USB.
ustalenia
po raz kolejny byliśmy przekonani, że kierując się zasadą bezpieczeństwa poprzez zapomnienie , niemożliwe jest zapewnienie odpowiedniej ochrony. Właściwość kodu lub oprogramowania układowego nie oznacza wcale, że atakujący nie będzie miał do niego dostępu w jednym momencie i nie wykorzysta znalezionych luk. Wszystkie niezbędne do realizacji egoistycznych celów można uzyskać w obecności pewnej kwoty pieniędzy.
programiści powinni zająć się kodem, a specjaliści od bezpieczeństwa powinni go chronić . Dlatego najbardziej produktywnym podejściem wydaje się współpraca z firmami zajmującymi się bezpieczeństwem informacji, posiadającymi wystarczające doświadczenie w zapewnianiu bezpieczeństwa różnych systemów, które pomogą zbudować odpowiednią ochronę w każdym konkretnym przypadku.
PS Vendor potwierdził lukę (naruszenie zostało znalezione również w innym modelu – S2), który został uznany za zmieniony w lutym poprawki 2018 roku.
lista CVE:
- CVE-2017-17668 (dozownik NCR S1),
- CVE-2018-5717 (Dozownik NCR S2).
dzięki
przede mną moi koledzy, Dima Sklyarov i Misha Tsvetkov, już pracowali nad firmware (choć bez płyty dozownika). Ich osiągnięcia bardzo mi pomogły w badaniu, za co bardzo im dziękuję! Ze strony „żelaza” Aleksiej Stennikow bardzo mi pomógł .