O dwóch takich, co chcieli odblokować laptopa Security PWNing Conference 2017
whois Sergiusz Bazański Michał Kowalczyk W dzień DevOps, w nocy hardware hacker. Współzałożyciel Warszawskiego Hackerspace u. Freelancer, Ex-Google. Wicekapitan @ Dragon Sector Researcher @ Invisible Things Lab Współautor Praktycznej Inżynierii Wstecznej Twitter: @q3k IRC: q3k @ freenode.net Twitter: @dsredford IRC: Redford @ freenode.net
Toshiba Portégé R100 Intel Pentium M 1 GHz 256MB RAM
Mały problem...
Większy problem? Reset zworką? Nie ma żadnej. Wyciągnięcie baterii? Nic to nie daje. Szuranie kluczem po wszystkich kościach pamięci w nikłej nadziei na błąd checksumy? Punkty za styl. Niestety nie.
Aha!
Analiza BIOS-u
Jak zdobyć kod BIOS-u? Pamięć fizyczna? Nie z zablokowanym laptopem. Dump kości Flasha? Ech. Rozpakowanie aktualizacji? Spróbujmy!
Rozpakowanie aktualizacji https://support.toshiba.com/
7-Zip
+ 254 KB skompresowanych danych
Dekompresja Nieznany format Domyślny updater to 16-bit EXE Jest alternatywny, 32-bit!
Dekompresja BuIsFileCompressed BuGetFileSize BuDecodeFile
Dekompresja 50 linii C i mamy dekompresor!... BuIsFileCompressed(compressed, &is_compressed); if (is_compressed) { BuDecodeFile(compressed, fsize, decompressed); }...
Rezultat
Dump flasha BIOS-u
Gdzie szukać?
Identyfikowanie układów na szybko Model WLPPZ2137 ST 1308 Datecode RAM Flash uc / wszystko inne
Interfejsowanie In-circuit: układ pozostaje na oryginalnym PCB. Out-of-circuit (?): wylutowanie układu, wlutowanie do breakoutu.
Breakout board et al. Projekt w KiCAD (lub czymkolwiek innym). Wykonanie PCB metodą chałupniczą (termotransfer). Wylutowanie hot-airem, wlutowanie grotem.
Narzędzia ~200zł ~10zł ~300zł
Hackerspace 100zł/msc. + piwo
FPGA (Spartan 3E) Masa drutów Flash xd
Setup PC Serial (2 linie) FPGA Devboard A/A Mux (~30 linii) Flash Breakout Board Pobierz blok X X * 1024 Słowo X * 1024 + 4 Słowo X * 1024 + 1k danych Słowo
Pomieszane linie adresu Problemy PC Serial (2 linie) FPGA Devboard A/A Mux (~30 linii) Flash Breakout Board Pobierz blok X X * 1024 Słowo X * 1024 + 4 Słowo X * 1024 + Brak checksum 1k danych Słowo
FPGA? FPGA było niepotrzebne - użyte tylko dla ilości pinów. Względnie trudne do debugowania i rozwijania. Trzeba było użyć uc z większą ilością I/O albo multiplexera. Ale nauczyliśmy się czegoś po drodze, więc \_(ツ)_/.
Analiza kodu BIOS-u
Jak zacząć? Tryb procesora? Entry point? Mapa pamięci?
Start procesora A hardware reset sets each processor s registers to a known state and places the processor in real-address mode. Intel 64 and IA-32 Architectures Software Developer s Manual Volume 3
Start procesora Startujemy pod adresem CS:EIP = CS.Base + EIP = 0xFFFFFFF0 Real Mode adres fizyczny. A20 włączone. Tylko co tam jest?
Mapowanie pamięci Northbridge: Intel Odem MCH-M Brak informacji o tym rejonie sprawdźmy southbridge
Mapowanie pamięci Southbridge: Intel ICH4-M FWH = Firmware Hub = BIOS flash Nasz dump ma dokładnie 0x80000 bajtów!
Więcej mapowań...
Entry point FFFFFFF0: jmp far FC00:3FA0 000FFFA0: jmp far FC00:00A2 000FC0A2: 000FC0A3: 000FC0A4: 000FC0A6: cli cld mov al, 2 out 92h, al ; Włączenie A20...
RE BIOS-u: Inicjalizacja Brak stosu! (i w ogóle RAM-u) 16-bit Protected Mode + Unreal Mode Sumy kontrolne Inicjalizacja RAM-u Skopiowanie się do RAM-u
RE BIOS-u: Inicjalizacja 16-bit Protected Mode segmenty! Musimy sparsować GDT Dopiero po tym możemy analizować kod
RE BIOS-u: Sprawdzanie hasła
RE BIOS-u: Sprawdzanie hasła Wszystko trafia do jednej funkcji f(in_buf) out_buf Po długiej analizie: wszystko trafia na porty 62h i 66h
RE BIOS-u: Sprawdzanie hasła Manual southbridge a: Table 6-2. Fixed I/O Ranges Decoded by Intel ICH4
Microcontroller???
EC/KBC GPU Trident XP4 PSC CPU Intel Pentium M HDD Ethernet Northbridge Intel Odem MCH-M Southbridge Intel ICH4-M RAM Audio BIOS LPC Battery EC/KBC Renesas M306K9FC LRP Keyboard Touchpad
EC: Dump Skąd wziąć kod? Aktualizacje!
EC: Dump Brak aktualizacji do pobrania Changelog BIOS-u: też nic o EC Może podobny model? Portégé S100!
EC: Aktualizacje W środku 3 bloby z aktualizacjami (w różnych wersjach)
EC: Instalator aktualizacji Używa portów 62h i 66h Wysyła część 1. (~2,5KB) Wysyła część 2. (~100KB)
EC: Blob aktualizacji Dekodowane w środku EC - nie mamy kodu :( Spróbujmy jego analizy!
EC: Blob aktualizacji - analiza Wysoka entropia szyfrowanie lub kompresja Brak regularności w trigramach szyfrowanie Rozmiar zawsze podzielny przez 8 szyfrowanie Krótkie najdłuższe powtórzone podsłowo jeśli szyfrowanie, to nie ECB
EC: Blob aktualizacji - analiza Wygląda to na ślepy zaułek...
Sergiusz, wylutowałbyś mi jeszcze jedną rzecz?
EC..?
Jeden breakout później...
No to dumpujemy?
EC: Protokół SCLK RXD Programator TXD Busy M16C
EC: Protokół
EC: Protokół M16C Programator Flash Page X? Flash Page X
A jednak nie tak łatwo.
EC: Protokół M16C Programator ID Check (K0...K6) Status? Status (Unlocked/locked) Flash Page X? Flash Page X
Sidechannel
Możliwe ataki sidechannel Analiza zużycia prądu Analiza elektromagnetyczna Glitching (VCC, CLK,...)
Ale może najpierw...
Możliwe ataki side channel - prościej O tutaj.
EC: Podatność Analiza statystyczna czasu między wysłaniem ostatniego bajtu PINu a opadnięciem linii Busy.
EC: Podatność Pomiar czasu odpowiedzi Programator M16C ID Check - 00 FF FF FF FF FF FF ID Check - 01 FF FF FF FF FF FF Średni czas +3ms ID Check - 02 FF FF FF FF FF FF ID Check -.. FF FF FF FF FF FF ID Check - FE FF FF FF FF FF FF ID Check - FF FF FF FF FF FF FF Klucz:???????
EC: Podatność Pomiar czasu odpowiedzi Programator M16C ID Check - 00 FF FF FF FF FF FF ID Check - 01 FF FF FF FF FF FF Średni czas +3ms ID Check - 02 FF FF FF FF FF FF ID Check -.. FF FF FF FF FF FF ID Check - FE FF FF FF FF FF FF ID Check - FF FF FF FF FF FF FF Klucz: 02??????
EC: Podatność Pomiar czasu odpowiedzi Programator M16C ID Check - 02 00 FF FF FF FF FF ID Check - 02 01 FF FF FF FF FF ID Check - 02 03 FF FF FF FF FF ID Check - 02.. FF FF FF FF FF Średni czas +3ms ID Check - 02 FE FF FF FF FF FF ID Check - 02 FF FF FF FF FF FF Klucz: 02 FE?????
EC: Podatność FPGA (ice40) (EC) M16C
EC: Podatność PoC GTFO https://github.com/q3k/m16c-interface/
EC: RE Dane Kod (~700 funkcji) Kryptografia Bootloader
EC: RE Znacznie prostszy kod niż BIOS Brak stringów Szukamy komunikacji po LPC oraz tabeli BIOS-calli
EC: RE Znalezienie tabeli jest łatwe ~100 różnych wywołań Znamy numery, które nas interesują analiza handlerów Brzmi prosto?
EC: RE handlerów Ręczny context-switching Brak spójnej konwencji wywołań Brak podziału handlerów na funkcje Skoki w środki funkcji
Sprawdzenie hasła: BIOS out_buf = call_ec( func=0x24, in_buf=md5(input)[:8] + pwd_type ) out_buf[0] == 0 sukces
Sprawdzenie hasła: EC Spójrzmy na handler po stronie EC... 6 poziomów w głąb: BMGEU/C BSET JSR.W JSR.W p6_4, p6 pd6_4, pd6 set_p6_5 clear_p6_5 I/O na pinach 40 i 41
Sprawdzenie hasła: EC No ile można? :(
Sprawdzenie hasła: EC Tym razem to tylko EEPROM :) EC czyta jeden blok, deszyfruje i porównuje z otrzymanym MD5
Challenge/Response Szukamy uniwersalnego ataku Pora na analizę challenge/response!
Challenge: BIOS out_buf = call_ec( func=0x1a, in_buf=rdtsc() + MD5(pc_serial)[:8] ) challenge = bytes_to_string(out_buf)
Challenge: EC RDTSC PC_SERIAL_MD5 Entropy pool 7 random bytes Checksum DEC CHALL 1 CHALL 2 ENC
Response: BIOS out_buf = call_ec( func=0x1b, in_buf=string_to_bytes(user_input) ) out_buf[0] sukces/porażka
RESP 1 RESP 2 7 bytes == 0? CHALL 2 DEC ENC CHK Verify checksum DEC PC_SERIAL_MD5
EC: Szyfrowanie ENC? DEC?
EC: Szyfrowanie 64-bitowy szyfr blokowy INPUT (8B) KEY A (256B) ENC OUTPUT (8B) KEY B (128B)
Challenge/Response Wystarczy przepisać do Pythona i...
DEMO!
EC: System aktualizacji Rozszyfrujmy aktualizacje!
EC: System aktualizacji Podpis symetryczny? Możemy generować własne!
Ciekawe, jak to wygląda w nowych laptopach?
Po co zmieniać kod, który działa? :)
No i klucze w sumie też :)))
Impact Odblokowanie dowolnego (biznesowego) laptopa. Permanent rootkit w EC. Możliwość atakowania hosta z EC.
Rootkit w EC? DMA do hosta via LPC (ale nie na M16C). Keylogging & storage. USB-Rubber-Ducky-like (wstrzykiwanie klawiszy / myszy). Exploitowanie BIOS-u.
Oficjalne stanowisko Toshiby Toshiba is working on a temporary BIOS update that can be used to prevent the security issue that has been raised and expects to release this update on its website within the next 2 weeks. Toshiba plans to start the release of a permanent fix for some models from January, 2018 and will complete the releases of permanent fix for all applicable models by the end of March 2018.