Podręcznik Hardware Hackera

Dane oryginału

Copyright © 2022 by Colin O’Flynn and Jasper van Woudenberg. Title of English-language original: The Hardware Hacking Handbook: Breaking Embedded Security with Hardware Attacks, ISBN 9781593278748, published by No Starch Press Inc. 245 8th Street, San Francisco, California United States 94103.

The Polish-language edition copyright © 2023 by Polish Scientific Publishers PWN, Wydawnictwo Naukowe PWN S.A under license by No Starch Press Inc. All rights reserved.

Przekład: Piotr Fabijańczyk, Mariusz Rogulski, Magdalena Rogulska na zlecenie WITKOM Witold Sikorski

Projekt okładki polskiego wydania: INT-MEDIA Dawid Mazur

Wydawca: Wioleta Szczygielska-Dybciak, Dorota Siudowska-Mieszkowska

Redaktor prowadzący: Monika Zabrocka-Kutera

Redaktor: Diana Halida

Koordynator produkcji: Anna Bączkowska

Skład i łamanie: Marcin Szcześniak

Konsultacja merytoryczna: Sergiusz 'q3k' Bazański

Skład wersji elektronicznej na zlecenie Wydawnictwo Naukowe PWN S.A.: Michał Latusek

Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.

Książka, którą nabyłeś, jest dziełem twórcy i wydawcy. Prosimy, abyś przestrzegał praw,

jakie im przysługują. Jej zawartość możesz udostępnić nieodpłatnie osobom bliskim

lub osobiście znanym. Ale nie publikuj jej w internecie. Jeśli cytujesz jej fragmenty,

nie zmieniaj ich treści i koniecznie zaznacz, czyje to dzieło. A kopiując jej część, rób to

jedynie na użytek osobisty.

Szanujmy cudzą własność i prawo

Więcej na www.legalnakultura.pl

Polska Izba Książki

Copyright © for the Polish edition by Wydawnictwo Naukowe PWN S.A.

Warszawa 2023

ISBN 978-83-01-22816-3

eBook został przygotowany na podstawie wydania papierowego z 2023r. (Wydanie I)

Warszawa 2023

Wydawnictwo Naukowe PWN SA

02-460 Warszawa, ul. Gottlieba Daimlera 2

tel. 22 69 54 321, faks 22 69 54 288

infolinia 801 33 33 88

e-mail: pwn@pwn.com.pl, reklama@pwn.pl, www.pwn.pl

Dedykowana wszystkim dzieciom, które rozebrały urządzenia swoich rodziców – i poniosły konsekwencje.

Dedykowana Hilary i Kristy, które miały nieskończoną cierpliwość, by wspierać nas przez lata jej pisania. I Julesowi oraz Thijsowi, którzy (czasami) cierpliwie czekali.

Dedykowana naszym rodzicom, Johnowi i Eleanor, Pieterowi i Margriet, którzy znosili rozbieranie przez nas drogich urządzeń – i poradzili sobie z kosztami ich wymiany.

Fragment

Przedmowa

Podziękowania

Wprowadzenie

Jak wyglądają urządzenia wbudowane

Sposoby hakowania urządzeń wbudowanych

Co oznacza atak sprzętowy?

Kto powinien przeczytać tę książkę?

O książce

1. Higiena jamy ustnej. Wprowadzenie do zabezpieczeń wbudowanych

Komponenty sprzętu

Komponenty oprogramowania

Początkowy kod rozruchu

Program rozruchowy

Środowisko zaufanego uruchamiania systemu operacyjnego (TEE) i zaufane aplikacje

Obrazy oprogramowania układowego

Główne jądro systemu operacyjnego i aplikacje

Modelowanie zagrożeń sprzętowych

Czym jest bezpieczeństwo?

Drzewo ataków

Profilowanie atakujących

Typy ataków

Ataki programowe na sprzęt

Ataki na poziomie PCB

Ataki logiczne

Ataki nieinwazyjne

Ataki inwazyjne na chipy

Zasoby i cele bezpieczeństwa

Poufność i integralność kodu binarnego

Poufność i integralność kluczy

Zdalna atestacja rozruchu

Poufność i integralność danych osobowych

Integralność i poufność danych z sensorów

Ochrona poufności treści

Odpowiedzialność i odporność

Środki zapobiegawcze

Chronienie

Wykrywanie

Odpowiadanie

Przykładowe drzewo ataku

Identyfikacja vs. eksploatacja

Skalowalność

Analizowanie drzewa ataku

Ocenianie ścieżek ataków sprzętowych

Ujawnianie kwestii związanych z bezpieczeństwem

Podsumowanie

2. Nawiązywanie kontaktu, połącz się ze mną, połączę się z tobą. Sprzętowe interfejsy peryferyjne

Podstawy elektryki

Napięcie

Natężenie

Rezystancja

Prawo Ohma

AC/DC

Rozbieranie rezystancji

Moc

Interfejs z użyciem elektryczności

Poziomy logiczne

Wysoka impedancja, podciąganie i ściąganie

Push-pull vs. tristate vs. otwarty kolektor albo otwarty dren

Komunikacja asynchroniczna vs. synchroniczna vs. taktowanie wbudowane

Sygnały różnicowe

Interfejsy szeregowe o niskiej prędkości

Uniwersalna, asynchroniczna komunikacja szeregowa

Szeregowy interfejs urządzeń peryferyjnych

Interfejs IIC

Secure Digital Input/Output oraz Embedded Multimedia Cards

Magistrala CAN

JTAG i inne interfejsy debugowania

Interfejsy równoległe

Interfejsy pamięci

Szybkie interfejsy szeregowe

Uniwersalna Magistrala Szeregowa

PCI Express

Ethernet

Miernictwo

Multimetr: napięcie

Multimetr: ciągłość

Oscyloskop cyfrowy

Analizator stanów logicznych

Podsumowanie

3. Obserwowanie. Identyfikacja komponentów i zbieranie informacji

Zbieranie informacji

Zgłoszenia w Federalnej Komisji Łączności

Patenty

Karty katalogowe i schematy

Przykład wyszukiwania informacji: urządzenie USB Armory

Otwieranie obudowy

Identyfikowanie układów scalonych na płytce

Małe obudowy z wystającymi wyprowadzeniami: SOIC, SOP i QFP

Obudowy bez wystających wyprowadzeń: SO i QFN

Ball grid array

Chip scale packaging

DIP, przewlekane i inne

Przykładowe obudowy układów scalonych na PCB

Identyfikowanie innych komponentów na płycie

Mapowanie PCB

Użycie do mapowania skanowania ścieżką krawędziową JTAG

Odtwarzanie informacji z oprogramowania układowego

Uzyskiwanie obrazu oprogramowania układowego

Analizowanie obrazu oprogramowania układowego

Podsumowanie

4. Słoń w sklepie z porcelaną. Wprowadzenie do wstrzykiwania błędów

Wprowadzanie błędów do mechanizmów bezpieczeństwa

Obchodzenie weryfikacji podpisu oprogramowania układowego

Uzyskiwanie dostępu do zablokowanej funkcjonalności

Odtwarzanie kluczy kryptograficznych

Ćwiczenie z wstrzykiwaniem błędów do OpenSSH

Wstrzykiwanie błędów do kodu w C

Wstrzykiwanie błędów do kodu maszynowego

Słoń wstrzykiwania błędów

Urządzenie cel oraz rezultat błędu

Narzędzia do wstrzykiwania błędów

Przygotowanie i kontrola celu

Metody wyszukiwania błędów

Odkrywanie prymitywów błędów

Poszukiwanie skutecznych błędów

Strategie poszukiwań

Analizowanie rezultatów

Podsumowanie

5. Nie liż próbnika. Jak wstrzykiwać błędy

Wstrzykiwanie błędu zegara

Metastabilność

Analiza wrażliwości na błędy

Ograniczenia

Wymagany sprzęt

Parametry wstrzykiwania błędu zegara

Wstrzykiwanie błędu napięcia

Generowanie zakłóceń napięcia

Budowanie wstrzykiwacza wykorzystującego przełączanie

Wstrzykiwanie błędów typu crowbar

Atakowanie błędami Raspberry Pi z użyciem crowbara

Poszukiwanie parametrów wstrzykiwania błędu napięcia

Wstrzykiwanie błędów elektromagnetycznych

Generowanie błędów elektromagnetycznych

Architektury do wstrzykiwania błędów elektromagnetycznych

Kształty i szerokości impulsów EMFI

Poszukiwanie parametrów wstrzykiwania błędu elektromagnetycznego

Wstrzykiwanie błędów optycznych

Przygotowywanie chipa

Ataki z przodu i z tyłu

Źrodła światła

Konfiguracja wstrzykiwania błędów optycznych

Konfigurowalne parametry wstrzykiwania błędów optycznych

Wstrzykiwanie body biasing

Parametry dla wstrzykiwania body biasing

Wyzwalanie błędów w sprzęcie

Postępowanie z nieprzewidywalnymi czasami celu

Podsumowanie

6. Czas na badania. Laboratorium wstrzykiwania błędów

Akt 1: prosta pętla

Grillowa zapalniczka bólu

Akt 2: wstawianie przydatnych zakłóceń

Zakłócenie crowbar powodujące błąd w danych konfiguracyjnych

Wstrzykiwanie błędów multipleksacją

Akt 3: różnicowa analiza błędów

Nieco matematyki dotyczącej RSA

Zdobywanie prawidłowego podpisu z celu

Podsumowanie

7. To jest to miejsce. Zrzut pamięci portfela Trezor One

Wprowadzenie do ataku

Wewnętrzne elementy portfela Trezor One

Wprowadzanie błędu do żądania odczytu USB

Deasemblacja kodu

Budowanie oprogramowania układowego i walidowanie zakłócenia

Wyzwalanie i określanie odpowiedniego momentu

Zakłócanie przez obudowę

Konfigurowanie

Przegląd kodu do wstrzykiwania błędów

Uruchomienie kodu

Potwierdzanie zrzutu

Dostrajanie impulsu EM

Dostrajanie momentu błędu na podstawie komunikatów USB

Podsumowanie

8. Mam moc. Wprowadzenie do analizy mocy

Ataki czasowe

Atak czasowy na dysk twardy

Pomiary mocy dla ataków czasowych

Prosta analiza mocy

Zastosowanie SPA od RSA

Zastosowanie SPA do RSA, ponownie

SPA na ECDSA

Podsumowanie

9. Czas na badania. Prosta analiza mocy

Domowe laboratorium

Budowanie podstawowego środowiska sprzętowego

Kupowanie narzędzi

Przygotowywanie kodu celu

Budowanie konfiguracji

Zbieranie wszystkiego razem: atak SPA

Przygotowanie celu

Przygotowanie oscyloskopu

Analiza sygnału

Oskryptowanie komunikacji i analizy

Oskryptowanie ataku

Przykład z ChipWhisperer-Nano

Budowanie i ładowanie oprogramowania układowego

Pierwsze spojrzenie na komunikację

Przechwytywanie śladu

Od śladu do ataku

Podsumowanie

10. Dzielenie różnic. Różnicowa analiza mocy

Wewnątrz mikrokontrolera

Zmiana napięcia na kondensatorze

Od mocy do danych i na odwrót

Przykład seksownych XOR-ów

Atak z użyciem różnicowej analizy mocy

Przewidywanie poboru mocy na podstawie założenia dotyczącego wycieków

Atak DPA w Pythonie

Poznaj swojego wroga: standardowy kurs łamania zaawansowanego szyfrowania

Atakowanie AES-128 z użyciem DPA

Korelacja w ataku z analizą mocy

Współczynnik korelacji

Atakowanie AES-128 z użyciem CPA

Komunikacja z urządzeniem celem

Szybkość przechwytywania oscyloskopu

Podsumowanie

11. Skup się na tym. Zaawansowana analiza mocy

Główne przeszkody

Potężniejsze ataki

Mierzenie powodzenia

Metryki oparte na wskaźniku powodzenia

Metryki oparte na entropii

Progresja pików korelacji

Wysokość pików korelacji

Pomiary na rzeczywistych urządzeniach

Działanie urządzenia

Sonda pomiarowa

Określanie wrażliwych sieci zasilania

Automatyczne skanowanie z użyciem sondy

Konfiguracja oscyloskopu

Analiza i przetwarzanie zbiorów śladów

Techniki analizy

Techniki przetwarzania

Głębokie uczenie z wykorzystaniem splotowych sieci neuronowych

Podsumowanie

12. Czas na badania. Różnicowa analiza mocy

Środowisko programu rozruchowego

Protokół komunikacyjny programu rozruchowego

Szczegóły AES-256 CBC

Atakowanie AES-256

Pozyskanie i budowa kodu programu rozruchowego

Uruchamianie celu i przechwytywanie śladów

Obliczanie CRC

Komunikacja z programem rozruchowym

Przechwytywanie ogólnych śladów

Przechwytywanie szczegółowych śladów

Analiza

Klucz rundy 14

Klucz rundy 13

Odtwarzanie IV

Co należy przechwycić

Generowanie pierwszego śladu

Generowanie reszty śladów

Analiza

Atakowanie podpisu

Teoria ataku

Ślady mocy

Analiza

Wszystkie cztery bajty

Podglądanie kodu źródłowego programu rozruchowego

Moment sprawdzania podpisu

Podsumowanie

13. Bez żartów. Przykłady z życia

Ataki z wstrzykiwaniem błędów

Nadzorca w PlayStation 3

Xbox 360

Hakowanie z analizą mocy

Hakowanie żarówek Philips Hue

Podsumowanie

14. Pomyśl o dzieciach. Środki zapobiegawcze, certyfikaty i dalsze kroki

Środki zapobiegawcze

Wdrażanie środków zapobiegawczych

Weryfikacja środków zapobiegawczych

Certyfikaty branżowe

Zwiększanie umiejętności

Podsumowanie

A. Czas zakupów. Wyposażenie laboratorium testowego

Sprawdzanie połączeń i napięcia: od $50 do $500

Lutowanie precyzyjne: od 50$ do 1500$

Odlutowywanie: od 30$ do 500$

Lutowanie i odlutowywanie elementów montowanych powierzchniowo: od 100$ do 500$

Modyfikowanie PCB: od $5 do $700

Mikroskopy optyczne: od $200 do $2,000

Fotografowanie płyt: od $50 do $2,000

Zasilanie: od $10 do $1 000

Podgląd przebiegów analogowych (oscyloskopy): od $300 do $25 000

Głębokość pamięci

Częstotliwość próbkowania

Szerokość pasma

Inne parametry

Podgląd przebiegów logicznych: od $300 do $8000

Wyzwalanie w magistralach szeregowych: od $300 do $8000

Dekodowanie protokołów szeregowych: od $50 do $8000

Podsłuchiwanie i wyzwalanie magistrali CAN: od $50 do $5000

Podsłuchiwanie Ethernetu: $50

Interakcja przez JTAG: od $20 do $10,000

Ogólny JTAG i skanowanie granic

Debugowanie JTAG

Komunikacja PCIe: od $100 do $1,000

Podsłuchiwanie USB: od $100 do $6,000

Wyzwalanie USB: od $250 do $6,000

Emulacja USB: $100

Połączenia Flash SPI: od $25 do $1000

Pomiary w analizie mocy: od $300 do $50000

Wyzwalanie na podstawie przebiegów analogowych: powyżej $3800

Mierzenie pól magnetycznych: od $25 do $10,000

Wstrzykiwanie błędów zegara: od $100 do $30000

Wstrzykiwanie błędów napięcia: od $25 do $30000

Wstrzykiwanie błędów elektromagnetycznych: od $100 do $50000

Wstrzykiwanie błędów optycznych: od $1000 do $250000

Pozycjonowanie sond: od $100 do $50000

Urządzenia docelowe: od $10 do $10000

B. Cała twoja baza należy do nas. Popularne układy pinów

SPI Flash

Konektory 0,1 cala

Arm JTAG z 20 pinami

PowerPC JTAG z 14 pinami

Konektory 0,05 cala

Arm Cortex JTAG/SWD

Konektor Ember Packet Trace Port

Przypisy

Pozostałe rozdziały dostępne w pełnej wersji e-booka.

O autorach

Colin O’Flynn prowadzi firmę NewAE Technology, Inc., która projektuje narzędzia i sprzęt, aby uczyć inżynierów o wbudowanych zabezpieczeniach. W ramach swoich badań doktoranckich rozpoczął open-source’owy projekt ChipWhisperer, a wcześniej był adiunktem w Dalhousie University, gdzie nauczał o systemach wbudowanych i bezpieczeństwie. Mieszka w Halifax w Kanadzie. Wiele produktów opracowanych przez NewAE zawiera wizerunki jego psów.

Jasper van Woudenberg był zaangażowany w bezpieczeństwo układów wbudowanych w szerokim zakresie tematów: znajdowaniu – i pomocy w naprawianiu – błędów w kodzie, który działa na setkach milionów układów, używaniu wykonywania symbolicznego w celu odtwarzania kluczy z uszkodzonych kryptosystemów oraz używaniu algorytmów rozpoznawania mowy do przetwarzania śladów z ataków side-channel. Jasper jest ojcem dwójki dzieci, mężem tej jedynej i CTO w firmie Riscure North America. Mieszka w Kalifornii, gdzie lubi jeździć na rowerze po górach i szusować po śniegu. Rodzinny kot toleruje go, natomiast jest zbyt fajny dla Twittera.

O recenzencie technicznym

Patrick Schaumont jest profesorem inżynierii komputerowej w Worcester Polytechnic Institute. Wcześniej był pracownikiem naukowym w IMEC w Belgii i członkiem wydziału w Virginia Tech. Jego zainteresowania badawcze dotyczą samego projektowania oraz bezpiecznych i wydajnych metod projektowania osadzonych systemów obliczeniowych czasu rzeczywistego.

PRZEDMOWA

Był czas w nie tak odległej przeszłości, kiedy sprzęt został zepchnięty na margines haker stwa. Wielu uważało, że angażowanie się w to jest zbyt trudne. „Sprzęt jest trudny” – mówili. Oczywiście dotyczy to wszystkiego, dopóki tego nie poznamy.

Gdy byłem nieletnim przestępcą z pasją do hakowania sprzętu, dostęp do wiedzy i technologii był często poza moim zasięgiem. Wskakiwałem do śmietników, aby znaleźć porzucony sprzęt, kradłem materiały z firmowych pojazdów i budowałem narzędzia opisane w plikach tekstowych ze schematami opartymi na grafice ASCII. Wślizgiwałem się do bibliotek uniwersyteckich, aby znaleźć książki z danymi, błagałem o darmowe próbki na targach inżynierskich i ściszałem głos, aby uzyskać odpowiednią barwę, próbując przez telefon uzyskać informacje od dostawców. Jeśli interesowało się bardziej łamaniem systemów niż ich projektowaniem, trudno było znaleźć miejsce. Od hakowania do godnej szacunku kariery droga była daleka.

Z biegiem lat zainteresowanie tym, co mogą osiągnąć hakerzy sprzętu, przeniosło się z podziemia do głównego nurtu. Zasoby i sprzęt stały się bardziej dostępne i przystępne cenowo. Grupy hakerskie i konferencje umożliwiły nam spotkania, naukę i łączenie sił. Naszą wartość dostrzegły nawet środowisko akademickie i świat korporacji. Wkroczyliśmy w nową erę, w której sprzęt jest wreszcie uznawany za ważną część krajobrazu bezpieczeństwa.

W Podręczniku hackingu sprzętowego Jasper i Colin łączą swoje doświadczenia z łamaniem rzeczywistych produktów, aby zgrabnie przekazać współczesny proces hakowania sprzętu. Dostarczają oni szczegółów dotyczących rzeczywistych ataków, pozwalając śledzić postępy, uczyć się niezbędnych technik i doświadczyć poczucia magii, które towarzyszy udanemu włamaniu. Nie ma znaczenia, czy jesteś nowy w tym obszarze, czy przybywasz z innego miejsca w społeczności hakerskiej, czy też chcesz „podnieść poziom” swoich aktualnych umiejętności związanych z bezpieczeństwem – każdy znajdzie tu coś dla siebie.

Jako hakerzy sprzętu staramy się wykorzystać ograniczenia nałożone na inżynierów i budowane przez nich układy. Inżynierowie koncentrują się na tym, aby produkt działał zgodnie z harmonogramem i budżetem. Podążają za określonymi specyfikacjami oraz muszą spełniać inżynierskie standardy. Muszą sprawić, że produkt będzie można wyprodukować i że możliwy będzie dostęp do oprogramowania, testowania, debugowania, naprawy lub konserwacji systemu. Ufają dostawcom wykorzystywanych układów i podsystemów i oczekują, że będą one działać zgodnie z założeniami. Nawet jeśli wdrożą zabezpieczenia, niezwykle trudno jest to zrobić dobrze. Hakerzy mają luksus ignorowania wszystkich wymagań, powodowania celowego niewłaściwego zachowania systemu i poszukiwania najskuteczniejszego sposobu na pomyślne zaatakowanie go. Możemy próbować wykorzystać słabe punkty w systemie, czy to przez peryferyjne interfejsy i magistrale (Rozdział 2), fizyczny dostęp do komponentów (Rozdział 3), czy też wady implementacji podatne na wstrzykiwanie błędów lub wycieki związane z side-channel (Rozdział 4 i kolejne).

To, co jesteśmy w stanie obecnie osiągnąć w hakowaniu sprzętu, opiera się na badaniach, zmaganiach i sukcesach hakerów z przeszłości – wszyscy opieramy się na barkach gigantów. Nawet jeśli inżynierowie i dostawcy stopniowo poprawiają swoją świadomość bezpieczeństwa i integrują więcej funkcji bezpieczeństwa i środków zapobiegawczych w swoich układach, te postępy będą nadal cofane dzięki uporczywości i wytrwałości społeczności hakerów. Ten dosłowny wyścig zbrojeń nie tylko prowadzi do coraz bezpieczniejszych produktów, ale także doskonali umiejętności następnej generacji inżynierów i hakerów.

Przesłanie w tym wszystkim jest takie, że hakowanie sprzętu będzie trwało nadal. Podręcznik hackingu sprzętowego pokazuje ramy, w których można zbadać wiele możliwych ścieżek – to od Ciebie zależy, czy zaczniesz własną podróż!

Z pozdrowieniami dla sprzętowców

Joe Grand aka Kingpin

Technologiczny awanturnik od 1982 roku

Portland, Oregon

PODZIĘKOWANIA

Podwaliny pod książkę, którą masz przed sobą, położył dawno temu Stephen Ridley – zaprosił kilku znanych hakerów sprzętu do jej napisania oraz dodatkowo zdecydował się włączyć nas (Colina i Jaspera) do omówienia siły analiz side-channel i wstrzykiwania błędów. Od tego czasu książka ta była wspierana przez Billa Pollocka, który cały czas w nią wierzył i który przez kolejne lata pracował z nami wszystkimi, aby zapewnić istnienie jakiejś jej formy (w postaci, którą masz obecnie). W pierwotnej wersji książki Joe Fitz-Patrick (securinghardware.com) jest autorem dużej części Rozdziału 2, za co jesteśmy wdzięczni; jakiekolwiek błędy zostały na pewno wprowadzone przez nas. Od samego początku wspierali ten projekt Marc Witteman i firma Riscure, co pozwoliło Jasperowi uniknąć bezrobocia.

Jeśli chodzi o Riscure, od ponad dekady jest to plac zabaw Jaspera i uniwersytetu hackingu. Marc, Harko, Job, Cees, Caroline, Raj, Panci, Edgar, Alexander, Maarten i wiele innych osób było nieocenionych w tworzeniu środowiska, w którym Jasper mógł upadać i wstawać, a ostatecznie zdobyć wiedzę potrzebną do napisania tej książki.

Liczne przykłady i narzędzia użyte w tej książce wnieśli bezpośrednio koledzy Colina z NewAE Technology Inc. W szczególności mocno zaangażowani w obecny stan narzędzi i oprogramowania byli Alex Dewar i Jean-Pierre Thibault. W fizyczną produkcję większości sprzętu była zaangażowana Claire Frias. Jej pomoc umożliwiła osiągnięcie prawie każdego narzędzia lub celu NewAE.

Chcielibyśmy również podziękować wszystkim autorom treści i narzędzi (open source) użytych w tej książce; nikt nie buduje niczego sam, a ta praca nie jest wyjątkiem. Wszyscy w zespole edytorskim (Bill Pollock, Barbara Yien, Neville Young, Annie Choi, Dapinder Dosanjh, Jill Franklin, Rachel Monaghan i Bart Reed) obdarzyli naszą publikację bardziej wnikliwszą, niż moglibyśmy normalnie oczekiwać. Patrick Schaumont, jako recenzent techniczny, odegrał kluczową rolę we wskazywaniu dobrych, złych, dziwacznych i całkowicie błędnych wcześniejszych wersji tej książki. Wiele przykładów ataków pochodzi ze społeczności naukowej i jesteśmy wdzięczni tym, którzy decydują się na otwarte publikowanie swojej pracy, czy to w formie artykułu naukowego, czy wpisu na blogu. Na koniec dziękujemy Joe Grandowi za napisanie przedmowy, inspirowanie nas przez lata i bycie świetnym hakerem sprzętu, który uosabia nie tylko techniczną wiedzę, lecz także przyjazną i życzliwą osobowość, mogącą pomóc w kształtowaniu tego rodzaju społeczności, w jakiej wszyscy się rozwijamy.

WPROWADZENIE

Dawno, dawno temu, w niezbyt odległym wszechświecie, komputery były ogromnymi maszynami, które wypełniały duże pomieszczenia i do działania potrzebowały niewielkiej ekipy.

Wraz z miniaturyzacją coraz bardziej realne stało się umieszczanie komputerów w małych przestrzeniach.

Około 1965 roku komputer pokładowy programu Apollo był na tyle mały, że można go było wynieść w kosmos, aby wspierał astronautów w zadaniach obliczeniowych i kontroli nad modułami Apollo. Ten komputer można uznać za jeden z najwcześniejszych systemów wbudowanych. Obecnie przytłaczająca większość produkowanych chipów procesorów jest wbudowywana w telefony, samochody, sprzęt medyczny, infrastrukturę krytyczną i urządzenia „inteligentne”. Wiele spośród nich ma nawet twój laptop. Innymi słowy, te małe chipy wpływają na życie wszystkich, co sprawia, że kluczowe znaczenie ma zrozumienie ich bezpieczeństwa.

Zatem co charakteryzuje urządzenie, które jest określane jako wbudowane? Urządzenia wbudowane to komputery na tyle małe, że można je włączyć w strukturę sprzętu, którym sterują. Komputery te mają zazwyczaj postać mikroprocesorów, które najczęściej zawierają pamięć i interfejsy do sterowania sprzętem, w jaki są wbudowane. Słowo wbudowane podkreśla, że są one używane głęboko w jakimś obiekcie. Czasami urządzenia wbudowane są na tyle małe, że mieszczą się w grubości karty kredytowej, aby zapewnić inteligencję do zarządzania transakcją. W zamierzeniu urządzenia wbudowane powinny być praktycznie niewykrywalne dla użytkowników, którzy mają ograniczony lub żaden dostęp do ich wewnętrznych funkcji i nie mogą modyfikować oprogramowania w nich się znajdującego.

Co właściwie robią te urządzenia? Urządzenia wbudowane mają wiele zastosowań. Mogą umożliwiać działanie w pełni rozwiniętego systemu operacyjnego Android (OS) w inteligentnym telewizorze lub wspierać elektroniczną jednostkę sterującą (ECU, ang. electronic control unit) samochodu z systemem operacyjnym działającym w czasie rzeczywistym. Mogą mieć postać komputera z systemem Windows 98 wewnątrz skanera do rezonansu magnetycznego (MRI, ang. magnetic resonance imaging). Wykorzystują je programowalne sterowniki logiczne (PLC, ang. programmable logic controller) w zastosowaniach przemysłowych, a nawet zapewniają kontrolę i komunikację w szczoteczkach do zębów podłączonych do Internetu.

Przyczyny ograniczania dostępu do wnętrza urządzenia często mają związek z gwarancją, bezpieczeństwem i zgodnością z przepisami. Ta niedostępność sprawia oczywiście, że bardziej interesująca, skomplikowana i kusząca jest inżynieria wsteczna. Na systemy wbudowane składa się wiele różnych projektów płyt głównych, procesorów i systemów operacyjnych, przez co jest wiele do zbadania, zaś wyzwania związane z inżynierią wsteczną są szerokie. Ta książka ma pomóc czytelnikom w sprostaniu tym wyzwaniom, oferując zrozumienie projektu systemu i jego komponentów. Przesuwa granice bezpieczeństwa systemów wbudowanych, badając metody analizy zwane atakami side-channel i atakami związanymi z wprowadzaniem błędów.

Wiele rzeczywistych systemów wbudowanych zapewnia bezpieczne użytkowanie sprzętu, ale może również posiadać mechanizmy, które mogą spowodować uszkodzenie, jeśli zostaną uruchomione poza zamierzonym środowiskiem pracy. Zachęcamy do zabawy używanym ECU w swoim laboratorium, ale nie zachęcamy do zabawy z ECU podczas jazdy samochodem! Baw się dobrze, bądź ostrożny i nie krzywdź siebie ani innych.

Z tej książki dowiesz się, jak przejść od podziwiania urządzenia w Twoich rękach do poznania mocnych i słabych stron jego zabezpieczeń. Ta książka pokazuje poszczególne kroki w tym procesie i dostarcza wystarczającej wiedzy teoretycznej, aby go zrozumieć, ze szczególnym naciskiem na pokazanie, jak samodzielnie przeprowadzać praktyczne eksperymenty. Obejmuje cały proces, więc dowiesz się więcej niż tego, co znajduje się w literaturze akademickiej i innej, a także tego, co jest ważne i istotne, na przykład jak zidentyfikować komponenty na płytce drukowanej (PCB, ang. printed circuit board). Mamy nadzieję, że Ci się to spodoba!

Jak wyglądają urządzenia wbudowane

Urządzenia wbudowane są zaprojektowane z funkcjami właściwymi dla sprzętu, w który są wbudowane. Podczas opracowywania aspekty takie jak bezpieczeństwo, funkcjonalność, niezawodność, rozmiar, zużycie energii, czas wprowadzenia produktu na rynek, koszt, a nawet bezpieczeństwo podlegają kompromisom. Różnorodność realizacji sprawia, że większość projektów może być niepowtarzalna, zgodnie z wymaganiami konkretnego zastosowania. Na przykład w samochodowej elektronicznej jednostce sterującej skupienie się na bezpieczeństwie może oznaczać, że wiele redundantnych rdzeni jednostki centralnej (CPU, ang. central processing unit) jednocześnie oblicza tę samą odpowiedź mechanizmu hamulca, aby nadzorująca jednostka mogła zweryfikować ich poszczególne decyzje.

Czasami główną funkcją urządzenia wbudowanego jest bezpieczeństwo, tak jak w wypadku karty kredytowej. Pomimo znaczenia bezpieczeństwa finansowego dokonuje się kompromisów kosztowych, ponieważ sama karta musi pozostać przystępna cenowo. Istotnym czynnikiem w wypadku nowego produktu może być czas wejścia na rynek, ponieważ firma musi tego dokonać, zanim straci dominację na rzecz konkurencji. W szczoteczce podłączonej do internetu bezpieczeństwo można uznać za mało ważne, w związku z tym w ostatecznym projekcie zajmie ono ostatnie miejsce.

W związku z wszechobecnością taniego, gotowego sprzętu, z którego można tworzyć systemy wbudowane, istnieje tendencja do odchodzenia od elementów niestandardowych. Specjalizowane układy scalone (ASIC, ang. application-specific integrated circuit) są zastępowane przez zwykłe mikrokontrolery. Niestandardowe implementacje systemów operacyjnych są zastępowane przez FreeRTOS, gołe jądra Linux, albo nawet przez kompletny stos Androida. Moc współczesnego sprzętu może sprawić, że niektóre urządzenia wbudowane mogą być odpowiednikiem tabletu, telefonu, a nawet kompletnego komputera.

Ta książka ma zastosowanie do większości systemów wbudowanych, które można spotkać. Zalecamy, aby zacząć od płytki deweloperskiej prostego mikrokontrolera, cokolwiek poniżej 100 dolarów i najlepiej obsługiwanego przez Linuksa. Pomoże to zrozumieć podstawy, zanim przejdziemy do bardziej złożonych urządzeń lub urządzeń, o których będziemy mieć mniejszą wiedzę czy nad którymi będziemy mieli mniejszą kontrolę.

Sposoby hakowania urządzeń wbudowanych

Załóżmy, że mamy urządzenie z wymogiem bezpieczeństwa, aby nie zezwalało na wykonywanie kodu innej firmy, natomiast naszym celem jest uruchomienie na nim w jakiś sposób kodu. Gdy z jakiegokolwiek powodu rozważamy włamanie, funkcjonalność urządzenia i jego techniczna implementacja mają wpływ na zastosowane podejście. Na przykład jeśli urządzenie zawiera system operacyjny oparty na Linuksie z otwartym interfejsem sieciowym, może być możliwe uzyskanie pełnego dostępu po prostu przez zalogowanie przy użyciu znanego domyślnego hasła konta root. Następnie możemy uruchomić na nim swój kod. Jeśli jednak mamy do czynienia z innym mikrokontrolerem wykonującym weryfikację podpisu wbudowanego oprogramowania i wszystkie porty do debugowania zostały wyłączone, to takie podejście nie zadziała.

Aby osiągnąć ten sam cel, inne urządzenie będzie wymagało innego podejścia. Musimy dokładnie dopasować nasz cel do sprzętowej implementacji urządzenia. W tej książce będziemy wychodzić naprzeciw tej potrzebie przez rysowanie drzewa ataków, które jest sposobem na wykonanie przybliżonego modelu zagrożeń pomagającego w wizualizacji i zrozumieniu najlepszej ścieżki prowadzącej do celu.

Co oznacza atak sprzętowy?

Będziemy skupiać się głównie na atakach sprzętowych i tym, co należy wiedzieć, aby je wykonać, a nie na atakach programowych, które zostały szeroko omówione w innych miejscach. Najpierw doprecyzujmy nieco terminologię. Postaramy się podać przydatne definicje i uniknąć analizowania wszystkich wyjątków.

Urządzenie składa się zarówno z oprogramowania, jak i sprzętu. Dla naszych celów przyjmiemy, że oprogramowanie składa się z bitów, a sprzęt z atomów. Dlatego potraktujemy oprogramowanie układowe (kod wbudowany we wbudowane urządzenie) jako to samo co oprogramowanie.

Mówiąc o atakach sprzętowych, łatwo jest powiązać atak wykorzystujący sprzęt z atakiem ukierunkowanym na sprzęt. Staje się to jeszcze bardziej zagmatwane, gdy zdamy sobie sprawę, że istnieją również cele programowe i ataki programowe. Oto kilka przykładów opisujących różne kombinacje.

• Możemy zaatakować oscylator pierścieniowy urządzenia (cel sprzętowy) przez zakłócenie napięcia zasilania (atak sprzętowy).

• Możemy zakłócić napięcie zasilania procesora (atak sprzętowy), co wpłynie na wykonywany program (cel programowy).

• Możemy zamienić bity w pamięci (cel sprzętowy) przez uruchomienie kodu Rowhammera na procesorze (atak programowy).

• Dla kompletności – możemy wykonać przepełnienie bufora (atak programowy) na demonie sieciowym (cel programowy).

W tej książce zajmiemy się atakami sprzętowymi, zatem celem będą albo oprogramowanie, albo sprzęt. Należy pamiętać, że ataki sprzętowe są generalnie trudniejsze do wykonania niż ataki programowe, ponieważ ataki programowe wymagają mniej skomplikowanej interwencji fizycznej. Jednak tam, gdzie urządzenie może być odporne na ataki programowe, atak sprzętowy może okazać się skuteczną, tańszą (i naszym zdaniem zdecydowanie fajniejszą) opcją. Ataki zdalne, gdy urządzenie nie jest w zasięgu ręki, ograniczają się do dostępu przez interfejs sieciowy. Gdy sprzęt jest fizycznie dostępny, można przeprowadzić każdy rodzaj ataku.

Aby podsumować, można powiedzieć, że istnieje wiele różnych typów urządzeń wbudowanych, a każde urządzenie ma swoje własne funkcje, kompromisy, cele bezpieczeństwa i implementacje. Ta różnorodność pozwala na zastosowanie wielu odmiennych strategii ataków sprzętowych, które poznamy w tej książce.

Kto powinien przeczytać tę książkę?

W tej książce założymy, że wcielamy się w rolę napastnika, który jest zainteresowany złamaniem zabezpieczeń, aby czynić dobro. Założymy również, że w większości jesteśmy w stanie skorzystać ze stosunkowo niedrogiego sprzętu, takiego jak proste oscyloskopy i sprzęt do lutowania, oraz że mamy komputer z zainstalowanym Pythonem.

Nie zakładamy, że będziemy mieli dostęp do sprzętu laserowego, akceleratorów cząstek lub innych narzędzi wykraczających poza budżet hobbysty. Jeśli masz dostęp do takiego sprzętu, być może w laboratorium na lokalnym uniwersytecie, powinieneś odnieść jeszcze większe korzyści z tej książki. Jeśli chodzi o urządzenia wbudowane stanowiące cel, zakładamy, że będziemy mieli do nich fizyczny dostęp i będziemy zainteresowani dostępem do przechowywanych na nich zasobów. A co najważniejsze, zakładamy, że jesteśmy zainteresowani poznawaniem nowych technik, mamy nastawienie na inżynierię wsteczną i jesteśmy gotowi do zagłębienia się w tematykę!

O książce

Oto krótki przegląd tego, co znajduje się w tej książce:

Rozdział 1: Higiena jamy ustnej. Wprowadzenie do zabezpieczeń wbudowanych

Koncentruje się na różnych architekturach implementacji systemów wbudowanych i modelowaniu zagrożeń, a także omawia różne ataki.

Rozdział 2: Nawiązywanie kontaktu, połącz się ze mną, połączę się z tobą. Sprzętowe interfejsy peryferyjne

Mówi o różnych portach i protokołach komunikacyjnych, w tym o elektrycznych podstawach potrzebnych do zrozumienia sygnałów i miernictwie.

Rozdział 3: Obserwowanie. Identyfikacja komponentów i zbieranie informacji

Opisuje, jak zbierać informacje o celu, interpretować specyfikacje i schematy, identyfikować komponenty na płytce drukowanej oraz wyodrębniać i analizować obrazy oprogramowania układowego.

Rozdział 4: Słoń w sklepie z porcelaną. Wprowadzenie do wstrzykiwania błędów

Przedstawia koncepcje ataków związanych z wprowadzaniem błędów, w tym sposoby identyfikowania miejsc wstrzykiwania błędów, przygotowania celu, tworzenia konfiguracji wstrzykiwania błędów i doskonalenia efektywnych parametrów.

Rozdział 5: Nie liż próbnika. Jak wstrzykiwać błędy

Omawia wstrzykiwanie błędów związane z zegarem, napięciem, elektromagnetyzmem, laserem i body biasing oraz opisuje, jakiego rodzaju narzędzia musimy zbudować lub kupić, aby ich dokonać.

Rozdział 6: Czas na badania. Laboratorium wstrzykiwania błędów

Przedstawia trzy praktyczne laboratoria wstrzykiwania błędów możliwe do stworzenia w domu.

Rozdział 7: To jest to miejsce. Zrzut pamięci portfela Trezor One

Na przykładzie portfela Trezor One pokazuje, jak odtworzyć klucz za pomocą wstrzykiwania błędów w podatnej wersji oprogramowania układowego.

Rozdział 8: Mam moc. Wprowadzenie do analizy mocy

Przedstawia ataki czasowe i prostą analizę mocy oraz pokazuje, jak można je wykorzystać do odtwarzania haseł i kluczy kryptograficznych.

Rozdział 9: Czas na badania. Prosta analiza mocy

Prowadzi przez całą drogę od zbudowania podstawowej konfiguracji sprzętowej do wszystkiego, co jest potrzebne do przeprowadzenia ataku SPA w laboratorium domowym.

Rozdział 10: Dzielenie różnic. Różnicowa analiza mocy

Wyjaśnia różnicową analizę mocy i pokazuje, jak niewielkie wahania w zużyciu energii mogą prowadzić do ekstrakcji klucza kryptograficznego.

Rozdział 11: Skup się na tym. Zaawansowana analiza mocy

Przedstawia szeroki wybór technik, które pozwalają podnieść na wyższy poziom analizę mocy: od praktycznych wskazówek pomiarowych po filtrowanie zbiorów śladów, analizę sygnałów, przetwarzanie i wizualizację.

Rozdział 12: Czas na badania. Różnicowa analiza mocy

Traktuje fizyczny cel za pomocą specjalnego programu rozruchowego i łamie poufne dane przy użyciu różnych technik analizy mocy.

Rozdział 13: Bez żartów. Przykłady z życia

Przedstawia wiele opublikowanych ataków związanych z wprowadzaniem błędów oraz side-channel przeprowadzonych na rzeczywistych celach.

Rozdział 14: Pomyśl o dzieciach. Środki zapobiegawcze, certyfikaty i dalsze kroki

Omawia liczne środki zapobiegawcze, które łagodzą niektóre z zagrożeń wyjaśnionych w tej książce, a także dotyka certyfikacji urządzeń i możliwych dalszych kroków.

Dodatek A: Maksymalizacja wartości karty kredytowej. Konfiguracja laboratorium testowego

Sprawi, że poleci Ci ślinka dzięki doskonałemu przedstawieniu narzędzi, jakich w przyszłości będziesz potrzebować, i nie tylko.

Dodatek B: Cała twoja baza należy do nas. Popularne pinouty

Ściągawka z kilkoma popularnymi pinoutami, z którymi regularnie będziesz miał do czynienia.

1

HIGIENA JAMY USTNEJ. WPROWADZENIE DO ZABEZPIECZEŃ WBUDOWANYCH

Sama różnorodność urządzeń wbudowanych sprawia, że ich badanie jest fascynujące, ale ta sama różnorodność może również sprawić, że będziemy drapać się po głowie, gdy napotkamy jeszcze inny kształt, obudowę lub dziwny układ scalony (IC, ang. integrated circuit), i zastanawiać, co to będzie oznaczać w odniesieniu do jego bezpieczeństwa.

Ten rozdział rozpoczyna się od przyjrzenia się różnym komponentom sprzętu i rodzajom uruchamianego na nich oprogramowania. Następnie omówimy atakujących, różne ataki, zasoby i cele związane z bezpieczeństwem oraz środki zapobiegawcze, aby dokonać przeglądu modelowania kwestii bezpieczeństwa. Opiszemy podstawy tworzenia drzewa ataku, które można wykorzystać zarówno do celów defensywnych (znajdowania możliwości do przeciwdziałania), jak i ofensywnych (aby wnioskować o najłatwiejszym możliwym ataku). Zakończymy przemyśleniami na temat skoordynowanego ujawniania luk w świecie sprzętu.

Komponenty sprzętu

Zacznijmy od przyjrzenia się istotnym częściom fizycznej implementacji urządzenia wbudowanego, na które prawdopodobnie się natkniemy. Omówimy główne elementy, które zaobserwujemy po pierwszym otwarciu urządzenia.

Wewnątrz urządzenia wbudowanego znajduje się płytka drukowana (PCB), która zasadniczo zawiera następujące komponenty sprzętowe: procesor, pamięć ulotną, pamięć nieulotną, komponenty analogowe i interfejsy zewnętrzne (rysunek 1.1).

Rysunek 1.1. Typowa płytka PCB urządzenia wbudowanego

Magia obliczeń dzieje się w procesorze (jednostka centralna lub CPU). Na rysunku 1.1 procesor jest umieszczony w systemie na czipie (SoC, ang. System-on-Chip) pośrodku płytki 1. Zasadniczo procesor wykonuje główne oprogramowanie i system operacyjny (OS, ang. operating system), natomiast SoC zawiera dodatkowe sprzętowe urządzenia peryferyjne.

Zwykle realizowana w postaci w układów dynamicznej pamięci RAM (DRAM) umieszczonych w osobnych obudowach, pamięć ulotna 2 to pamięć używana przez procesor podczas działania; jej zawartość jest tracona po wyłączeniu urządzenia. Pamięć DRAM działa na częstotliwościach zbliżonych do częstotliwości procesora i potrzebuje szerokiej magistrali, aby nadążyć za procesorem.

Na rysunku 1.1 pamięć nieulotna 3 to miejsce, gdzie urządzenie wbudowane przechowuje dane, które muszą pozostać po odłączeniu zasilania urządzenia. Pamięć ta może mieć postać EEPROM, pamięci flash, a nawet kart SD czy dysków twardych. Pamięć nieulotna zwykle zawiera kod wymagany do rozruchu, aplikacje oraz zapamiętane dane.

Chociaż same w sobie nie są zbyt interesujące z punktu widzenia bezpieczeństwa, komponenty analogowe, takie jak rezystory, kondensatory i cewki, są punktem wyjścia do analizy side-channel oraz ataków polegających na wstrzykiwaniu błędów, które szczegółowo omówimy w tej książce. Na typowej płytce drukowanej komponenty analogowe to wszystkie małe czarne, brązowe i niebieskie elementy, które nie wyglądają jak chip i mogą mieć etykiety zaczynające się od „C”, „R” lub „L”.

Interfejsy zewnętrzne zapewniają SoC mechanizmy do nawiązywania połączeń ze światem zewnętrznym. Interfejsy można podłączyć do innych komercyjnych układów „z półki” (COTS, ang. commercial off-the-shelf) w ramach systemu połączeń na PCB. Obejmuje to na przykład szybki interfejs magistrali do DRAM lub innych chipów, a także interfejsy o niskiej prędkości, takie jak I2C i SPI do czujników. Na płytce drukowanej mogą być również udostępnione jako złącza i listwy stykowe interfejsy zewnętrzne; USB i PCI Express (PCIe) to przykłady szybkich interfejsów, które umożliwiają dołączenie urządzeń zewnętrznych. To tutaj odbywa się cała komunikacja; na przykład do Internetu, lokalnych interfejsów debugowania czy czujników i elementów wykonawczych. (Więcej informacji na temat łączenia się z urządzeniami znajduje się w Rozdziale 2).

Miniaturyzacja pozwala SoC zawierać więcej składowych bloków będących układami scalonymi (IP[1], ang. intellectual property). Rysunek 1.2 przedstawia przykład SoC firmy Intel w architekturze Skylake.

Ta kość zawiera wiele rdzeni, w tym rdzenie głównej jednostki centralnej (CPU), procesor Intel Converged Security and Management Engine (CSME), procesor graficzny (GPU) i wiele innych. Magistrale wewnętrzne w SoC są trudniej dostępne niż magistrale zewnętrzne, co sprawia, że SoC są niewygodnym punktem wyjścia do hakowania. SoC mogą zawierać następujące bloki IP.

Wiele (mikro)procesorów i urządzeń peryferyjnych

Na przykład procesor aplikacji, silnik kryptograficzny, akcelerator wideo i sterownik interfejsu I2C.

Pamięć ulotna

W postaci układów scalonych DRAM ułożonych na wierzchu SoC, SRAM lub banków rejestrów.

Rysunek 1.2. SoC firmy Intel w architekturze Skylake (domena publiczna Fritzchensa Fritza)

Pamięć nieulotna

W postaci wbudowanej pamięci tylko do odczytu (ROM), pamięci programowalnej jednokrotnie (OTP), EEPROM i pamięci flash. Pamięć OTP zazwyczaj zawiera krytyczne dane dotyczące konfiguracji chipów, takie jak informacje identyfikacyjne, etap cyklu życia i informacje o wersji, co zapobiega wykonaniu wycofywania.

Magistrale wewnętrzne

Chociaż technicznie to tylko niewiele mikroskopijnych połączeń między różnymi komponentami w SoC, jest to w rzeczywistości główny czynnik bezpieczeństwa. Pomyślmy o tych połączeniach jako o sieci między dwoma węzłami w SoC. Będące siecią magistrale wewnętrzne mogą być podatne na podszywanie (spoofing), podsłuchiwanie (sniffing), wstrzykiwanie i wszelkie inne formy ataków typu man-in-the-middle. Zaawansowane SoC zawierają kontrolę dostępu na różnych poziomach, aby sprawić, że komponenty SoC będą odpowiednio „odgrodzone” od siebie.

Każdy z tych elementów jest częścią powierzchni ataku, punktem wyjścia dla atakującego i dlatego jest on interesujący. W Rozdziale 2 dokładniej przestudiujemy te zewnętrzne interfejsy, a w Rozdziale 3 przyjrzymy się sposobom znajdowania informacji o układach i komponentach.

Komponenty oprogramowania

Oprogramowanie to uporządkowany zbiór instrukcji procesora i danych wykonywanych przez procesor. Dla naszych celów nie ma znaczenia, czy to oprogramowanie jest przechowywane w pamięci ROM, flash, czy na karcie SD – chociaż może być rozczarowaniem dla naszych starszych czytelników to, że nie będziemy zajmować się kartami perforowanymi. Urządzenia wbudowane mogą zawierać niektóre (lub nie zawierać żadnych) z poniższych typów oprogramowania.

UWAGA

Chociaż ta książka skupia się na atakach sprzętowych, często atak sprzętowy służy do złamania zabezpieczeń oprogramowania. Za pomocą luk w sprzęcie atakujący mogą uzyskać dostęp do fragmentów oprogramowania, które zwykle są trudno dostępne lub w ogóle nie powinny być dostępne.

Początkowy kod rozruchu

Początkowy kod rozruchu to zestaw instrukcji wykonywanych przez procesor po włączeniu zasilania. Kod rozruchu jest generowany przez producenta procesora i przechowywany w pamięci ROM. Główną funkcją kodu rozruchu z ROM jest przygotowanie głównego procesora do uruchomienia kolejnego kodu. Zwykle pozwala na rozpoczęcie działania programowi rozruchowemu, a także zawiera procedury do jego uwierzytelniania lub obsługi jego alternatywnych źródeł (takich jak USB). Jest również używany do wsparcia podczas produkcji w celu personalizacji, analizy awaryjności, debugowania i autotestów. Często funkcje dostępne w rozruchowej pamięci ROM są konfigurowane za pomocą tzw. bezpieczników (ang. fuse), które są jednorazowo programowalnymi bitami zintegrowanymi z układem krzemowym, dającymi możliwość trwałego wyłączenia niektórych funkcji rozruchowej pamięci ROM, gdy procesor opuści zakład produkcyjny.

Rozruchowy ROM ma kilka właściwości odróżniających go od zwykłego kodu: jest niezmienny, jest pierwszym kodem uruchamianym w systemie i musi mieć dostęp do pełnego procesora SoC, aby spełniać swoją funkcję w produkcji oraz umożliwiać debugowanie i analizę awaryjności. Tworzenie kodu dla ROM wymaga dużej staranności. Ponieważ jest on niemodyfikowalny, zwykle nie jest możliwe załatanie luki w ROM-ie wykrytej po jego wyprodukowaniu (chociaż niektóre układy obsługują łatanie ROM za pomocą bezpieczników). Kod rozruchu z ROM jest wykonywany przed aktywacją jakichkolwiek funkcji sieciowych, zatem w celu wykorzystania jakichkolwiek luk w zabezpieczeniach wymagany jest fizyczny dostęp. Luka wykorzystana w tej fazie rozruchu prawdopodobnie będzie skutkować bezpośrednim dostępem do całego systemu.

Ze względu na jego duże znaczenie dla producentów w zakresie niezawodności i reputacji ogólnie kod rozruchowy z ROM jest zwykle krótki, czysty i dobrze zweryfikowany (a przynajmniej taki powinien być).

Program rozruchowy

Program rozruchowy (ang. bootloader) inicjuje system po wykonaniu kodu rozruchu z pamięci ROM. Zazwyczaj jest przechowywany w nieulotnej, ale modyfikowalnej pamięci, dzięki czemu można go później aktualizować. Producent PCB (OEM, ang. oryginal equipment manufacturer) tworzy program rozruchowy, umożliwiając mu inicjalizację komponentów na poziomie PCB. Oprócz podstawowego zadania, jakim jest ładowanie i uwierzytelnianie systemu operacyjnego lub środowiska zaufanego uruchamiania (TEE, ang. trusted execution environment), może również opcjonalnie zablokować niektóre funkcje związane z bezpieczeństwem. Ponadto program rozruchowy może oferować funkcjonalności w celu obsługi urządzenia lub debugowania. Będący najwcześniejszym modyfikowalnym kodem uruchamianym na urządzeniu program rozruchowy jest atrakcyjnym celem ataku. Mniej bezpieczne urządzenia mogą mieć rozruchową pamięć ROM, która nie uwierzytelnia programu rozruchowego, co pozwala atakującym na łatwą wymianę jego kodu.

Programy rozruchowe są uwierzytelniane za pomocą podpisów cyfrowych, które zazwyczaj są weryfikowane przez wbudowanie klucza publicznego (lub skrótu klucza publicznego) w rozruchowej pamięci ROM lub w bezpiecznikach. Ponieważ taki klucz publiczny jest trudny do zmodyfikowania, jest uważany za źródło zaufania. Producent podpisuje program rozruchowy za pomocą klucza prywatnego skojarzonego z kluczem publicznym, dzięki czemu kod rozruchowej pamięci ROM może zweryfikować i zaufać, że producent go wyprodukował. Gdy program rozruchowy jest zaufany, może z kolei zawierać klucz publiczny dla następnego etapu kodu i dać zaufanie, że następny etap będzie autentyczny. Ten łańcuch zaufania może rozciągać się aż do aplikacji działających w systemie operacyjnym (rysunek 1.3).

Rysunek 1.3. Łańcuch zaufania – etapy programu rozruchowego oraz weryfikacja

Teoretycznie utworzenie takiego łańcucha zaufania wydaje się dość bezpieczne, ale ten schemat jest podatny na wiele ataków, od wykorzystywania słabości weryfikacji po wstrzykiwanie błędów, ataki czasowe i inne. Aby zapoznać się z przeglądem 10 najczęstszych ułomności, warto zobaczyć wykład Jaspera na Hardwear.io USA 2019 Top 10 Secure Boot Mistakes na YouTube (https://www.youtube.com/watch?v=B9J8qjuxysQ/).

Środowisko zaufanego uruchamiania systemu operacyjnego (TEE) i zaufane aplikacje

W chwili pisania tego tekstu TEE jest rzadką funkcją w mniejszych urządzeniach wbudowanych, ale jest bardzo powszechna w telefonach i tabletach opartych na systemach takich jak Android. Pomysł polega na stworzeniu „wirtualnego” bezpiecznego SoC przez podzielenie całego SoC na światy „bezpieczny” i „niezabezpieczony”. Oznacza to, że każdy komponent SoC będzie albo aktywny wyłącznie w świecie bezpiecznym, albo aktywny wyłącznie w świecie niezabezpieczonym, albo będzie w stanie przełączać się między nimi dynamicznie. Na przykład programista SoC może zdecydować się na umieszczenie silnika kryptograficznego w bezpiecznym świecie, a interfejsów sieciowych w niezabezpieczonym świecie i zezwolić głównemu procesorowi na przełączanie się między tymi dwoma światami. Może to pozwolić systemowi na szyfrowanie pakietów sieciowych w bezpiecznym świecie, a następnie przesyłanie ich przez niezabezpieczony świat – to znaczy „normalny świat” – powodując, że klucz szyfrowania nigdy nie dotrze do głównego systemu operacyjnego lub aplikacji użytkownika działającej na procesorze.

Na telefonach komórkowych i tabletach TEE zawiera własny system operacyjny z dostępem do wszystkich bezpiecznych komponentów świata. Bogate środowisko wykonawcze (REE, ang. rich execution environment) obejmuje system operacyjny „normalnego świata”, taki jak jądro iOSa lub Linux oraz aplikacje użytkownika.

Celem jest utrzymanie wszystkich niezabezpieczonych i złożonych operacji, takich jak aplikacje użytkownika, w niezabezpieczonym świecie, a wszystkich bezpiecznych operacji, takich jak aplikacje bankowe, w bezpiecznym świecie. Te bezpieczne aplikacje są nazywane zaufanymi aplikacjami (TA, ang. trusted application). Celem ataków jest jądro TEE, które po zhakowaniu zwykle daje pełny dostęp zarówno do świata bezpiecznego, jak i niezabezpieczonego.

Obrazy oprogramowania układowego

Oprogramowanie układowe to oprogramowanie niskiego poziomu, które działa na procesorach lub elementach peryferyjnych. Proste komponenty peryferyjne w urządzeniu są często w pełni oparte na sprzęcie, ale bardziej złożone mogą zawierać mikrokontroler wykonujący oprogramowanie układowe. Na przykład po włączeniu zasilania większość chipów Wi-Fi wymaga załadowania „blobu” z oprogramowaniem układowym. Dla tych, którzy używają Linuksa, spojrzenie do /lib/firmware pokazuje, ile oprogramowania układowego jest zaangażowanego w działanie komponentów peryferyjnych PC. Jak w wypadku każdego oprogramowania oprogramowanie układowe może być złożone, a przez to wrażliwe na ataki.

Główne jądro systemu operacyjnego i aplikacje

Głównym systemem operacyjnym w systemie wbudowanym może być system operacyjny ogólnego przeznaczenia, taki jak Linuks, lub system operacyjny czasu rzeczywistego, taki jak VxWorks lub FreeRTOS. Karty mikroprocesorowe mogą zawierać własnościowe systemy operacyjne, które uruchamiają aplikacje napisane w Java Card. Te systemy operacyjne mogą oferować funkcje bezpieczeństwa (na przykład usługi kryptograficzne) i implementować izolację procesów, co oznacza, że jeśli jeden proces zostanie naruszony, inny może być nadal bezpieczny.

System operacyjny ułatwia życie programistom, którzy mogą polegać na szerokiej gamie istniejących funkcji, ale może to nie być opłacalna opcja dla mniejszych urządzeń. Bardzo małe urządzenia mogą nie mieć jądra systemu operacyjnego, zaś w zarządzaniu nimi działa tylko jeden program „bare-metal” (bezpośrednio na procesorze). Zwykle oznacza to brak izolacji procesu, więc naruszenie jednej funkcji prowadzi do narażenia całego urządzenia.

Modelowanie zagrożeń sprzętowych

Modelowanie zagrożeń jest jedną z ważniejszych potrzeb podczas tworzenia obrony każdego systemu. Zasoby do obrony systemu nie są nieograniczone, więc analiza, w jaki sposób najlepiej wykorzystać te zasoby, aby zminimalizować możliwości ataku, jest niezbędna. To jest droga do „wystarczająco dobrego” bezpieczeństwa.

Podczas modelowania zagrożeń z grubsza wykonujemy następujące czynności: przyjmujemy postawę defensywną, aby zidentyfikować ważne zasoby systemu i zadać sobie pytanie, w jaki sposób te zasoby powinny być zabezpieczone. Z drugiej strony, z ofensywnego punktu widzenia, możemy określić, kim mogą być napastnicy, jakie mogą być ich cele i jakie ataki mogą podjąć. Te rozważania zapewniają spojrzenie na to, co chronić i jak chronić najcenniejsze zasoby.

Standardową referencyjną pracą dotyczącą modelowania zagrożeń jest książka Adama Shostacka Threat Modeling: Designing for Security (Wiley, 2014). Szeroki zakres modelowania zagrożeń jest fascynujący, ponieważ obejmuje bezpieczeństwo środowiska deweloperskiego od jego wytworzenia, łańcuch dostaw, wysyłkę i okres eksploatacji. Zajmiemy się tutaj podstawowymi aspektami modelowania zagrożeń i zastosujemy je do zabezpieczeń urządzeń wbudowanych, koncentrując się na samych urządzeniach.

Czym jest bezpieczeństwo?

Oxford English Dictionary definiuje bezpieczeństwo jako „stan wolności od niebezpieczeństwa lub zagrożenia”. Ta raczej binarna definicja sugeruje, że jedynym bezpiecznym systemem jest taki, którego nikt nie byłby w stanie zaatakować, albo taki, który może obronić się przez każdym zagrożeniem. Ten pierwszy nazwiemy cegłą, ponieważ nie byłby w stanie się uruchomić; ten drugi nazwiemy jednorożcem, ponieważ jednorożce nie istnieją. Nie ma idealnego zabezpieczenia, zatem można byłoby argumentować, że obrona nie jest warta wysiłku. Ta postawa jest znana jako nihilizm bezpieczeństwa. Jednak takie podejście lekceważy ważny fakt, że z każdym atakiem wiąże się kompromis między kosztami a korzyściami.

Wszyscy traktujemy koszty i korzyści w kategoriach finansów. Dla atakującego koszty są zwykle związane z zakupem lub wypożyczeniem sprzętu potrzebnego do przeprowadzenia ataków. Korzyści mają na przykład postać nieuczciwych zakupów, skradzionych samochodów, wynagrodzeń za oprogramowanie ransomware i wypłat z automatów do gier.

Koszty i korzyści związane z przeprowadzaniem ataków nie mają jednak wyłącznie charakteru finansowego. Oczywistym kosztem pozafinansowym jest czas; mniej oczywistym kosztem jest frustracja napastnika. Na przykład atakujący, który hakuje dla zabawy, w obliczu frustracji może po prostu przenieść się na inny cel. Jest to z pewnością lekcja obrony. Więcej informacji na temat tej idei można znaleźć w wystąpieniu Chrisa Domasa na DEF CON 23: Repsych: Psychological Warfare in Reverse Engineering. Korzyści pozafinansowe obejmują zbieranie informacji umożliwiających identyfikację osób i sławę wywodzącą się z publikacji konferencyjnych lub udanego sabotażu (chociaż korzyści te mogą zostać również spieniężone).

W tej książce uważamy, że system jest „wystarczająco bezpieczny”, jeśli koszt ataku jest wyższy niż cena korzyści. Projekt systemu może nie być nieprzenikniony, ale powinien być wystarczająco trudny, aby nikt nie doprowadził do pełnego sukcesu ataku. Aby podsumować, można stwierdzić, że modelowanie zagrożeń to proces określania, w jaki sposób osiągnąć wystarczająco bezpieczny stan w określonym urządzeniu lub systemie. Teraz przyjrzyjmy się kilku aspektom, które wpływają na korzyści i koszty ataku.

Ataki na przestrzeni czasu

Amerykańska Agencja Bezpieczeństwa Narodowego (NSA) ma powiedzenie: „Ataki zawsze stają się lepsze; nigdy nie stają się gorsze”. Innymi słowy, ataki stają się z czasem coraz tańsze i silniejsze. Zasada ta obowiązuje zwłaszcza w większych skalach czasowych, ze względu na większą publiczną wiedzę o celu, zmniejszony koszt mocy obliczeniowej i łatwiejszą dostępność sprzętu hakerskiego. Czas od początkowego projektu chipa do końcowej produkcji może trwać kilka lat, po których następuje co najmniej rok na wdrożenie chipa w urządzeniu, co daje od trzech do pięciu lat, zanim zacznie on działać w środowisku komercyjnym. Taki chip może wymagać zachowania sprawności przez kilka lat (w wypadku produktów Internetu rzeczy [IoT]), 10 lat (w wypadku paszportu elektronicznego), a nawet 20 lat (w środowiskach motoryzacyjnych i medycznych). Dlatego projektanci muszą brać pod uwagę wszelkie ataki, które mogą nastąpić za 5 do 25 lat. Jest to oczywiście niemożliwe, dlatego często trzeba wprowadzać poprawki w oprogramowaniu, aby złagodzić problemy ze sprzętem, których nie można naprawić. Spójrzmy na to z innej perspektywy: 25 lat temu inteligentna karta mogła być bardzo trudna do złamania, ale po przeczytaniu tej książki 25-letnia inteligentna karta nie powinna stanowić dużego problemu podczas odtwarzania kluczy.

Różnice w kosztach pojawiają się również w mniejszych skalach czasowych podczas przechodzenia od pierwotnego ataku do jego powtarzania. Faza identyfikacji obejmuje identyfikację słabych punktów. Po niej następuje faza eksploatacji, która polega na wykorzystaniu zidentyfikowanych luk w celu zaatakowania celu. W wypadku (skalowalnych) podatności oprogramowania koszt identyfikacji może być znaczny, natomiast koszt eksploatacji jest prawie zerowy, ponieważ atak można zautomatyzować. W wypadku ataków sprzętowych koszt eksploatacji może nadal być znaczny.

Jeśli chodzi o korzyści, ataki zazwyczaj mają ograniczone okno, w którym są wartościowe. Złamanie ochrony przed kopiowaniem w Commodore 64 daje dziś niewielką korzyść finansową. Strumień wideo Twojej ulubionej gry w piłkę ma wysoką wartość tylko wtedy, gdy gra jest w toku i przed poznaniem wyniku. Dzień później jego wartość jest znacznie niższa.

Skalowalność ataków

Fazy identyfikacji i eksploatacji ataków na oprogramowanie i sprzęt różnią się znacznie od siebie pod względem kosztów i korzyści. Koszt fazy eksploatacji sprzętu może być porównywalny z kosztem fazy identyfikacji, co jest rzadkością w wypadku oprogramowania. Na przykład bezpiecznie zaprojektowany system płatności kartą inteligentną wykorzystuje zróżnicowane klucze, dzięki czemu znalezienie klucza na jednej karcie oznacza, że nie dowiemy się niczego o kluczu innej karty. Jeśli zabezpieczenia kart są wystarczająco silne, atakujący potrzebują tygodni lub miesięcy i drogiego sprzętu, aby dokonać nieuczciwych zakupów o wartości kilku tysięcy dolarów na daną kartę. Muszą powtórzyć ten proces dla każdej nowej karty, aby zyskać kolejne kilka tysięcy dolarów. Jeśli karty są tak mocne, to oczywiście nie ma żadnego uzasadnienia biznesowego dla napastników motywowanych finansami; taki atak słabo się skaluje.

Z drugiej strony rozważmy modchipy Xbox 360. Rysunek 1.4 pokazuje modchip Xenium ICE jako białą płytkę drukowaną po lewej stronie.

Rysunek 1.4. Modchip Xenium ICE w konsoli Xbox, używany do ominięcia weryfikacji kodu (zdjęcie wykonane przez Helohe, licencja CC BY 2.5)

Na rysunku 1.4 po lewej stronie modchip Xenium ICE jest przylutowany do głównej płytki PCB Xbox w celu wykonania ataku. Ta płyta automatyzuje atak polegający na wstrzykiwaniu błędów w celu załadowania dowolnego oprogramowania układowego. Ten atak sprzętowy jest tak łatwy do przeprowadzenia, że sprzedaż modchipów może zostać przekształcona w biznes; dlatego mówimy, że „dobrze się skaluje” (Rozdział 13 zawiera bardziej szczegółowy opis tego ataku).

Atakujący sprzęt skorzystali z ekonomii skali, natomiast jest to możliwe tylko wtedy, gdy koszt fazy eksploatacji jest bardzo niski. Jednym z przykładów są ataki sprzętowe mające na celu wydobycie tajnych informacji, które można następnie wykorzystać na dużą skalę, takich jak zdobycie głównego klucza aktualizacji oprogramowania układowego ukrytego w sprzęcie, co ułatwi dostęp do wielu rodzajów oprogramowania układowego. Innym przykładem jest jednorazowa operacja wyodrębnienia kodu rozruchu z ROM lub oprogramowania układowego, które może ujawnić luki w systemie, możliwe do wielokrotnego wykorzystania.

Wreszcie w wypadku niektórych ataków sprzętowych skala może nie być ważna. Na przykład jednokrotne włamanie wystarczyłoby do uzyskania niezaszyfrowanej kopii wideo z systemu zarządzania prawami cyfrowymi (DRM, ang. digital rights management), która następnie dostępna byłaby jako piracka, tak samo jak w wypadku wystrzelenia pojedynczej rakiety nuklearnej lub odszyfrowania zeznań podatkowych prezydenta.

Drzewo ataków

Drzewo ataków wizualizuje kroki, jakie podejmuje napastnik, przechodząc od płaszczyzny ataku do możliwości zagrożenia zasobowi, co pozwala nam w sposób systematyczny analizować strategię ataku. Cztery składniki, które bierzemy pod uwagę w drzewie ataków, to atakujący, ataki, zasoby (cele związane z bezpieczeństwem) i środki zapobiegawcze (patrz rysunek 1.5).

Rysunek 1.5. Związki między elementami modelowania zagrożeń

Profilowanie atakujących

Profilowanie atakujących jest ważne, ponieważ atakujący mają motywy, zasoby i ograniczenia. Można stwierdzić, że botnety lub robaki to nie są ludzie i nie mają motywacji, ale robak jest na początku uruchamiany przez osobę, która wciska klawisz ENTER z radości, złości lub zachłanności.

UWAGA

W całej niniejszej książce używamy słowa urządzenie dla określenia celu ataków, a sprzęt dla narzędzi, których używa atakujący do wykonania ataku.

Profilowanie atakującego zależy w dużej mierze od charakteru ataku wymaganego dla określonego typu urządzenia. Sam atak określa niezbędny sprzęt i wymagane wydatki; oba czynniki w pewnym stopniu pomagają sprofilować atakującego. Chęć odblokowania telefonu komórkowego przez rząd jest przykładem kosztownego ataku, który ma silną motywację, taką jak szpiegostwo czy bezpieczeństwo państwa.

Poniżej przedstawiono niektóre typowe scenariusze ataków i powiązane motywy, postacie oraz możliwości odpowiadających im atakujących.

Organizacje przestępcze

Organizacje przestępcze do ataków motywowane są przede wszystkim przez zyski finansowe. Maksymalizacja zysku wymaga skalowania. Jak wspomniano wcześniej, atak sprzętowy może być podstawą ataku skalowalnego, co wymaga dobrze wyposażonego laboratorium ataków sprzętowych. Jako przykład można wskazać ataki na branżę płatnej telewizji, w których piraci mają solidne uzasadnienie biznesowe, tłumaczone inwestycjami w sprzęt wart miliony dolarów.

Konkurencja w branży

Motywacja atakującego w tym scenariuszu obejmuje analizę konkurencji (niewinny eufemizm inżynierii wstecznej, aby zobaczyć, co robi konkurencja), śledzenie naruszenia praw własności intelektualnej, zbieranie pomysłów i inspiracji do ulepszania własnego, zbliżonego produktu. Podobną taktyką jest sabotaż pośredni przez niszczenie wizerunku marki konkurenta. Ten typ atakującego niekoniecznie jest osobą, ale może być częścią zespołu zatrudnionego (być może w podziemiu) lub wynajętego zewnętrznie przez firmę, która posiada wszystkie potrzebne narzędzia sprzętowe.

Służby państwowe

Powszechnymi motywatorami są sabotaż, szpiegostwo i antyterroryzm. Służby państwowe prawdopodobnie mają do dyspozycji wszystkie narzędzia, wiedzę i czas. Według niesławnych słów Jamesa Mickensa jeśli Mossad (narodowa agencja wywiadowcza Izraela) weźmie kogoś na celownik, to bez względu na to, co zrobi ta osoba, aby temu zapobiec, „nadal będzie nękana przez Mosad”.

Hakerzy kierujący się etyką

Hakerzy kierujący się etyką mogą stanowić zagrożenie, ale wiążą się z innym ryzykiem. Mogą mieć umiejętności sprzętowe i dostęp do podstawowych narzędzi w domu lub do drogich narzędzi na lokalnym uniwersytecie, dzięki czemu mogą być równie dobrze wyposażeni jak złośliwi napastnicy. Tego typu hakerzy szukają problemów, co do których czują, że mogą coś w nich zmienić. Mogą być hobbystami, którzy chcą zrozumieć, jak działają rzeczy, lub ludźmi, którzy starają się być najlepsi albo dobrze znani ze swoich umiejętności. Mogą to być również badacze, którzy wykorzystują swoje umiejętności jako główne lub dodatkowe źródło zarobku, albo patrioci lub protestujący, którzy zdecydowanie popierają pewne kwestie lub sprzeciwiają się im. Haker kierujący się etyką niekoniecznie nie ryzykuje. Jeden z producentów inteligentnych zamków kiedyś żalił się nam, że dużym problemem jego firmy było pojawienie się jej jako przykładu podczas wydarzenia zorganizowanego przez hakerów kierujących się etyką; firma postrzegała to jako zmniejszenie zaufania do marki. W rzeczywistości większość przestępców użyje cegły do „zhakowania” zamka, zatem klienci zamków są w niewielkim stopniu narażeni na ryzyko zhakowania, ale hasło „Nie martw się, użyją cegły, a nie komputera” nie działa tak dobrze w kampanii public relations.

Atakujący laicy

Ten ostatni typ napastnika to zazwyczaj osoba lub mała grupa osób, która wyrządzając krzywdę innej osobie, firmie lub infrastrukturze, robi to z powodów osobistych. Nie zawsze jednak ma techniczną przenikliwość. Jej celem może być zysk finansowy przez szantaż lub sprzedaż tajemnic handlowych albo po prostu skrzywdzenie innej strony. Udane ataki sprzętowe ze strony takich napastników są zazwyczaj mało prawdopodobne ze względu na ograniczoną wiedzę i ograniczony budżet. (Dla wszystkich laików: proszę, nie wysyłajcie nam wiadomości, jak włamać się na konto na Facebooku twojej byłej).

Identyfikacja potencjalnych napastników niekoniecznie jest jednoznaczna i zależy od urządzenia. Ogólnie rzecz biorąc, łatwiej jest sprofilować napastników, gdy rozważa się konkretny produkt, a nie jego komponent. Na przykład groźba zhakowania przez Internet marki ekspresów do kawy z IoT w celu wyprodukowania słabego naparu może być powiązana z różnymi wymienionymi typami atakujących. Profilowanie staje się bardziej złożone na wyższych szczeblach łańcucha dostaw urządzenia. Komponentem urządzeń IoT może być akcelerator AES (zaawansowanego standardu szyfrowania, ang. advanced encryption standard) dostarczany przez dostawcę IP. Akcelerator ten jest zintegrowany w SoC, zintegrowanym z płytką PCB, z użyciem której wykonane jest urządzenie końcowe. W jaki sposób dostawca IP akceleratora AES zidentyfikowałby zagrożenia na 1001 różnych urządzeniach korzystających z tego akceleratora AES? Dostawca będzie musiał skoncentrować się bardziej na typie ataku niż na atakujących (na przykład przez wdrożenie pewnego stopnia odporności na ataki side-channel).

Podczas projektowania urządzenia zdecydowanie zalecamy zdobycie wiedzy od dostawców komponentów, przed jakimi typami ataków zostały one zabezpieczone. Modelowanie zagrożeń bez tej wiedzy nie może być dokładne, a być może jeszcze istotniejsze jest to, że jeśli dostawcy nie będą o to pytani, to nie będą zmotywowani do poprawy stosowanych przez siebie środków bezpieczeństwa.

Typy ataków

Ataki sprzętowe są oczywiście ukierunkowane na sprzęt, tak jak otwarcie portu debugowania JTAG (Joint Test Action Group), ale mogą również dotyczyć oprogramowania, na przykład przez omijanie sprawdzania hasła. Ta książka nie dotyczy ataków programowych na oprogramowanie, ale dotyczy użycia oprogramowania do atakowania sprzętu.

Jak wspomniano wcześniej, punktem wyjścia dla atakującego jest powierzchnia ataku – bezpośrednio dostępne elementy sprzętu i oprogramowania. Rozważając powierzchnię ataku, zazwyczaj zakładamy pełny fizyczny dostęp do urządzenia. Jednak punktem wyjścia do ataku może być również przebywanie w zasięgu Wi-Fi (bliski zasięg) lub połączenie przez dowolną sieć (zdalnie).

Ataki programowe na sprzęt

Ataki programowe na sprzęt wykorzystują różne sposoby programowego kontrolowania sprzętu lub jego monitorowania. Istnieją dwie podklasy takich ataków: wstrzykiwanie błędów i ataki side-channel.

Wstrzykiwanie błędów

Wstrzykiwanie błędów to praktyka doprowadzenia sprzętu do punktu, w którym powstaną błędy przetwarzania. Samo wstrzyknięcie błędu nie jest atakiem; atakiem staje się to, co jest robione z jego skutkiem. Atakujący próbują wykorzystać te sztucznie wytworzone błędy. Na przykład mogą uzyskać uprzywilejowany dostęp przez ominięcie kontroli bezpieczeństwa. Praktyka wstrzykiwania błędu, a następnie wykorzystywania jego skutków nazywana jest atakiem usterek.

Dobrze znaną techniką wstrzykiwania błędów jest DRAM hammering, w którym układ pamięci DRAM jest bombardowany nienaturalnym wzorcem dostępu w trzech sąsiednich rzędach. Wielokrotne aktywowanie dwóch zewnętrznych rzędów powoduje odwrócenie bitów w środkowym rzędzie ofiary. Atak Rowhammer wykorzystuje odwracanie bitów w DRAM, powodując, że wiersze ofiary stają się tablicami stron. Tablice stron to struktury obsługiwane przez system operacyjny, które ograniczają dostęp aplikacji do pamięci. Przez zmianę bitów kontroli dostępu lub adresów pamięci fizycznej w tych tablicach stron aplikacja może uzyskać dostęp do pamięci, do której normalnie nie miałaby dostępu, co z łatwością prowadzi do eskalacji uprawnień. Sztuczka polega na wymuszeniu układu pamięci w taki sposób, aby rząd ofiary z tablicą stron znajdował się pomiędzy rzędami kontrolowanymi przez atakującego, a następnie aktywowaniu tych rzędów za pomocą wysokopoziomowego oprogramowania. Udowodniono, że ta metoda jest możliwa do zastosowania na procesorach x86 i ARM, za pomocą różnych języków – od oprogramowania niskopoziomowego aż po JavaScript. Więcej informacji znajduje się w artykule Drammer: Deterministic Rowhammer Attacks on Mobile Platforms autorstwa Victora van der Veena i innych.

Kolejną techniką wstrzykiwania błędów jest przetaktowywanie procesora. Powoduje to wystąpienie tymczasowego błędu zwanego błędem taktowania. Może on objawiać się błędem bitowym w rejestrze procesora. Przykładem ataku polegającego na przetaktowaniu procesora jest CLKSCREW. Ponieważ oprogramowanie w telefonach komórkowych może kontrolować częstotliwość procesora, a także napięcie rdzenia, obniżając napięcie i chwilowo zwiększając częstotliwość procesora, atakujący może skłonić procesor do błędów. Jeśli odpowiednio to zsynchronizują, atakujący mogą wygenerować błąd w weryfikacji podpisu RSA, co pozwala im załadować nieprawidłowo podpisany dowolny kod. Więcej informacji można znaleźć w artykule CLKS-CREW: Exposing the Perils of Security-Oblivious Energy Management autorstwa Adriana Tanga i innych.

Tego rodzaju luki można znaleźć wszędzie tam, gdzie oprogramowanie może zmusić sprzęt do działania poza normalnymi parametrami operacyjnymi. Spodziewamy się, że pojawią się kolejne warianty.

Ataki side-channel

Pomiar czasu zużywanego przez oprogramowanie odnosi się do ilości normalnego czasu wymaganego przez procesor do wykonania zadania. Ogólnie rzecz biorąc, bardziej złożone zadania wymagają więcej czasu. Na przykład sortowanie listy 1000 wartości zajmuje więcej czasu niż sortowanie listy 100 wartości. Nie powinno dziwić, że atakujący może wykorzystać czas wykonania oprogramowania jako wskazówkę do ataku. W nowoczesnych systemach wbudowanych napastnik może z łatwością zmierzyć czas wykonania, często z dokładnością do pojedynczego cyklu zegara! Prowadzi to do ataków czasowych, w których atakujący próbuje powiązać czas wykonania oprogramowania z ważnością poufnych informacji wewnętrznych.

Na przykład funkcja strcmp z języka C określa, czy dwa łańcuchy tekstowesą takie same. Porównuje znaki jeden po drugim, zaczynając od początku, zaś kiedy napotyka różnicę, kończy działanie. Podczas używania strcmp do porównania wprowadzonego hasła z przechowywanym hasłem czas wykonywania strcmp powoduje wyciek informacji o haśle, ponieważ funkcja kończy działanie po znalezieniu pierwszego niepasującego znaku między hasłem kandydatem atakującego a hasłem chroniącym urządzenie. W związku z tym przez czas wykonania strcmp wycieka liczba początkowych poprawnych znaków w haśle. (Szczegółowo opiszemy ten atak w Rozdziale 8, a właściwy sposób implementacji tego porównania przedstawimy w Rozdziale 14).

Kolejny atak side-channel, który można uruchomić z oprogramowania, to RAMBleed. Został on zademonstrowany przez Kwong i innych w RAM-Bleed: Reading Bits in Memory Without Accessing Them. Do odczytywania bitów z DRAM wykorzystuje słabości typu Rowhammer. W ataku RAMBleed odwrócenie następuje w rzędzie atakującego na podstawie danych w rzędach ofiary. W ten sposób atakujący może obserwować zawartość pamięci innego procesu.

Ataki mikroarchitektoniczne

Teraz, gdy rozumiemy zasadę ataków czasowych, rozważmy następującą kwestię. Współczesne procesory są szybkie z powodu ogromnej liczby optymalizacji, które zostały zidentyfikowane i wdrożone na przestrzeni lat. Na przykład pamięć podręczna jest zbudowana na założeniu, że ostatnio używane lokalizacje pamięci prawdopodobnie wkrótce będą ponownie potrzebne. Dlatego dane w tych lokalizacjach pamięci są przechowywane fizycznie bliżej procesora, aby uzyskać do nich szybszy dostęp. Inny przykład optymalizacji wynikał ze spostrzeżenia, że wynik mnożenia liczby N przez 0 lub 1 jest trywialny, więc wykonywanie pełnego obliczenia mnożenia nie jest potrzebne, ponieważ odpowiedź zawsze brzmi po prostu 0 lub N. Takie optymalizacje są częścią mikroarchitektury, która jest sprzętową implementacją zestawu instrukcji.

Jednak w tym momencie optymalizacje pod kątem szybkości i bezpieczeństwa są względem siebie sprzeczne. Jeśli w związku z jakąś poufną wartością jest aktywowana optymalizacja, może ona wskazywać na wartości w danych. Na przykład jeśli mnożenie N razy K dla nieznanego K jest czasami szybsze niż w innych wypadkach, wartość K w tych szybkich wypadkach może wynosić 0 lub 1. Lub jeśli region pamięci został zbuforowany, to można uzyskać do niego szybszy dostęp, a zatem szybki dostęp oznacza, że ostatnio wykonywano dostęp do określonego regionu.

Niesławny atak Spectre z 2018 roku wykorzystuje zgrabną optymalizację zwaną wykonywaniem spekulatywnym. Określenie, czy rozgałęzienie w warunku powinno zostać wykonane czy nie, wymaga czasu. Zamiast czekać na jego obliczenie, wykonywanie spekulatywne zgaduje warunek rozgałęzienia i wykonuje kolejne instrukcje tak, jakby przypuszczenie było poprawne. Jeśli przypuszczenie jest poprawne, wykonywanie po prostu się kontynuuje, a jeśli nie, zostanie cofnięte. Jednak to spekulatywne wykonywanie nadal wpływa na stan pamięci podręcznej procesora. Spectre zmuszał procesor do wykonania operacji spekulatywnej, która wpływała na pamięć podręczną w sposób zależny od jakiejś poufnej wartości, a następnie wykorzystywał atak czasowy na pamięć podręczną w celu odtworzenia poufnej wartości. Jak pokazano w artykule Spectre Attacks: Exploiting Speculative Execution autorstwa Paula Kochera i innych, tej sztuczki można użyć w niektórych istniejących lub spreparowanych programach, aby zrzucić całą pamięć procesu ofiary. Większym problemem jest to, że procesory pod kątem szybkości były w ten sposób optymalizowane od dziesięcioleci i istnieje wiele optymalizacji, które można wykorzystać podobnie.

Ataki na poziomie PCB

W wypadku urządzeń często początkową powierzchnią ataku jest PCB, dlatego dla atakujących ważne jest wydobycie z projektu PCB jak najwięcej informacji. Projekt dostarcza wskazówek, gdzie dokładnie można doczepić się do płytki, lub ujawnia, gdzie znajdują się lepsze miejsca ataku. Na przykład aby zmienić oprogramowanie układowe urządzenia (potencjalnie umożliwiając pełną kontrolę nad urządzeniem), atakujący musi najpierw zidentyfikować na PCB port do ładowania oprogramowania układowego.

W wypadku ataków na poziomie PCB aby uzyskać dostęp do wielu urządzeń, wystarczy śrubokręt. Niektóre urządzenia cechują się fizyczną odpornością na manipulacje i reakcją na nie, na przykład urządzenia z certyfikatem FIPS (Federal Information Processing Standard) 140 poziomu 3 lub 4 albo terminale płatnicze. Chociaż jest to ciekawy sport, ominięcie zabezpieczenia przed manipulacją i dotarcie do elektroniki wykracza poza zakres tej książki.

Jednym z przykładów ataku na poziomie PCB jest wykorzystanie opcjonalnych cech SoC, które mogą być konfigurowane przez ustawianie pewnych pinów w stanie wysokim lub niskim za pomocą rezystorów zworkowych (ang. strap). Są one widoczne na PCB jako rezystory 0 Ω (zero-omowe) (patrz rysunek 1.6). Te właściwości konfiguracyjne SoC mogą równie dobrze polegać na włączeniu debugowania, uruchamiania bez sprawdzania podpisu lub innych ustawieniach związanych z bezpieczeństwem.

Rysunek 1.6. Rezystory zero-omowe (R29 i R31)

Dodawanie lub zdejmowanie rezystorów w celu zmiany konfiguracji jest trywialne. Choć nowoczesne wielowarstwowe płytki PCB i urządzenia do montażu powierzchniowego komplikują te modyfikacje, to wystarczą pewna ręka, mikroskop, pęseta, opalarka, a przede wszystkim cierpliwość do wykonania zadania.

Innym skutecznym atakiem na poziomie PCB jest odczytanie chipa flash, który zazwyczaj zawiera większość oprogramowania działającego w urządzeniu, ujawniającego skarbnicę informacji. Chociaż niektóre komponenty flash są tylko do odczytu, większość umożliwia zapisywanie na nich krytycznych zmian w sposób, który usuwa lub ogranicza funkcje zabezpieczeń. Chip flash prawdopodobnie wymusza uprawnienia tylko do odczytu za pośrednictwem jakiegoś mechanizmu kontroli dostępu, który może być podatny na wstrzykiwanie błędów.

W wypadku systemów zaprojektowanych z myślą o bezpieczeństwie zmiany w pamięci flash powinny spowodować, że system nie będzie się uruchamiał, ponieważ obraz pamięci flash musi zawierać prawidłowy podpis cyfrowy. Czasami obraz flash jest zakodowany lub zaszyfrowany; to pierwsze można odwrócić (widzieliśmy proste XORy), a drugie wymaga zdobycia klucza.

Inżynierię odwrotną PCB bardziej szczegółowo omówimy w Rozdziale 3, a sterowanie zegarem i zasilaniem omówimy, gdy zajmiemy się dostępem do rzeczywistych celów.

Ataki logiczne

Ataki logiczne działają na poziomie interfejsów logicznych (na przykład przez komunikację przez istniejące porty wejścia/wyjścia). W przeciwieństwie do ataku na poziomie PCB atak logiczny nie odbywa się na poziomie fizycznym. Atak logiczny jest wymierzony w oprogramowanie wbudowanego urządzenia lub jego oprogramowanie układowe i próbuje złamać zabezpieczenia bez fizycznego włamania. Można to porównać do włamania do domu (urządzenia), gdy właściciel (oprogramowanie) ma zwyczaj pozostawiania otwartych drzwi balkonowych (interfejsu); w związku z tym nie jest potrzebne otwieranie zamków.

Znane ataki logiczne dotyczą uszkadzania pamięci i wstrzykiwania kodu, natomiast w praktyce mają one znacznie szerszy zakres. Na przykład jeśli na ukrytym porcie szeregowym zamka elektronicznego jest nadal dostępna konsola debugowania, wysłanie polecenia „odblokuj” może spowodować jego otwarcie. Lub jeśli urządzenie wyłącza niektóre mechanizmy zabezpieczające w warunkach niskiego napięcia zasilania, wstrzykiwanie sygnałów o niskim poziomie zasilania może wyłączyć te mechanizmy bezpieczeństwa. Ataki logiczne są wycelowane w błędy projektowe, błędy konfiguracji, błędy implementacji lub funkcje, które mogą zostać wykorzystane do złamania bezpieczeństwa systemu.

Debugowanie i śledzenie

Wśród najpotężniejszych mechanizmów kontrolnych wbudowanych w procesor podczas projektowania i produkcji są funkcje debugowania i śledzenia sprzętu. Są one często implementowane z wykorzystaniem interfejsów Joint Test Action Group (JTAG) czy Serial Wire Debug (SWD). Rysunek 1.7 przedstawia widoczne złącze JTAG.

Należy pamiętać, że w wypadku zabezpieczonych urządzeń bezpieczniki, rezystory zworkowe albo jakiś niedostępny poufny kod lub mechanizm challenge/response mogą wyłączyć debugowanie i śledzenie. Na mniej zabezpieczonych urządzeniach złącze JTAG może być po prostu usunięte (więcej o JTAG w następnych rozdziałach).

Rysunek 1.7. PCB z widocznym złączem JTAG. Zwykle nie jest ono oznaczane tak ładnie, jak w tym przykładzie!

Stosowanie fuzzingu na urządzeniach

Fuzzing to technika zapożyczona z bezpieczeństwa oprogramowania, która ma na celu identyfikację w kodzie problemów związanych z bezpieczeństwem. Typowym celem tej techniki jest znajdowanie awarii, które można wykorzystać do wstrzyknięcia kodu. Bezmyślny fuzzing to wysyłanie losowych danych do celu i obserwowanie jego zachowania. W czasie takiego ataku solidne i zabezpieczone cele pozostaną stabilne, ale mniej wytrzymałe lub mniej bezpieczne cele mogą wykazywać nienormalne zachowanie bądź awarie. Zrzuty błędów lub inspekcje z użyciem debuggera mogą wskazać źródło awarii i możliwości jej wykorzystania. Inteligentny fuzzing koncentruje się na protokołach, strukturach danych, typowych wartościach powodujących awarie lub strukturze kodu i jest bardziej efektywny w generowaniu sytuacji szczególnych (sytuacje, których normalnie nie należałoby się spodziewać), które powodują awarię celu. Fuzzing oparty na generowaniu tworzy dane wejściowe od zera, podczas gdy fuzzing oparty na mutacjach pobiera istniejące dane wejściowe i je modyfikuje. Fuzzing sterowany pokryciem wykorzystuje dodatkowe dane (na przykład dane pokryciowe o tym, które części programu są wykonywane z określonymi danymi wejściowymi), aby umożliwić znalezienie poważniejszych błędów.

Fuzzing można również zastosować do urządzeń, ale w znacznie trudniejszy sposób w porównaniu ze stosowaniem do oprogramowania. W wypadku stosowania fuzzingu do urządzenia zazwyczaj znacznie trudniej jest uzyskać dane pokryciowe działającego na nim oprogramowania, ponieważ mamy nad nim znacznie mniejszą kontrolę. Fuzzing przez interfejs zewnętrzny bez dalszej kontroli nad urządzeniem uniemożliwia uzyskanie informacji o pokryciu, a w niektórych wypadkach utrudnia ustalenie, czy doszło do uszkodzenia. Wreszcie fuzzing jest skuteczny, gdy można go wykonać z dużą szybkością. W fuzzingu oprogramowania może to być od tysięcy do milionów przypadków na sekundę. Osiągnięcie takiej wydajności na urządzeniach wbudowanych nie jest trywialne. Re-hosting oprogramowania układowego to technika pobierania oprogramowania układowego urządzenia i umieszczania go w emulatorze, który można uruchomić na komputerze PC. Rozwiązuje to większość problemów związanych z fuzzingiem na urządzeniu, kosztem konieczności stworzenia działającego emulowanego środowiska.

Analiza obrazu pamięci flash

Większość urządzeń zawiera chipy flash, które są zewnętrzne w stosunku do głównego procesora. Jeśli urządzenie da się aktualizować za pomocą oprogramowania, często można znaleźć obrazy oprogramowania układowego w Internecie. Po pobraniu obrazu do jego analizy można użyć różnych narzędzi, takich jak binwalk, pomagających zidentyfikować różne części obrazu, w tym sekcje kodu, sekcje danych, systemy plików i podpisy cyfrowe.

Wreszcie bardzo ważna w określaniu możliwych luk w zabezpieczeniach jest deasemblacja i dekompilacja różnych obrazów oprogramowania. Istnieje również wiele wprowadzających interesujących prac dotyczących analizy statycznej (takiej jak concolic execution) oprogramowania układowego urządzeń. Warto zapoznać się z BootStomp: On the Security of Bootloaders in Mobile Devices Nilo Rediniego i innych.

Ataki nieinwazyjne

Ataki nieinwazyjne nie modyfikują fizycznie chipa. W celu ujawnienia poufnych informacji ataki side-channel wykorzystują pewne mierzalne zachowanie systemu (na przykład pomiar poboru mocy przez urządzenie w celu wyodrębnienia klucza AES). W celu obejścia mechanizmu zabezpieczeń atak usterek wykorzystuje wstrzykiwanie błędu do sprzętu; na przykład duży impuls elektromagnetyczny (EM) może wyłączyć test weryfikacji hasła, tak aby było akceptowane każde hasło. (Zagadnieniom tym poświęcone są rozdziały 4 i 5 tej książki).

Ataki inwazyjne na chipy

Atak tej klasy jest wymierzony w obudowę lub krzem wewnątrz obudowy, a zatem działa w miniaturowej skali – na poziomie połączeń i bramek. Wymaga to znacznie bardziej wyrafinowanych, zaawansowanych i kosztownych technik oraz sprzętu niż omawiane do tej pory. Takie ataki wykraczają poza zakres tej książki, ale oto krótkie spojrzenie na to, co mogą zrobić zaawansowani napastnicy.

Dekapsulacja, usuwanie warstw ochronnych i ponowne łączenie

Dekapsulacja to proces usuwania części materiału z obudowy układu scalonego za pomocą środków chemicznych, zwykle przez wkraplanie oparów kwasu azotowego lub siarkowego na obudowę chipa, aż się ona rozpuści. Rezultatem jest dziura w obudowie, przez którą można zbadać sam mikrochip. Jeśli zostanie to zrobione poprawnie, to chip nadal będzie działał.

UWAGA

Dekapsulację można przeprowadzić w domu, o ile na miejscu dysponujemy wyciągiem laboratoryjnym i innymi zabezpieczeniami. Dla odważnych: szczegółowe informacje o tym, jak przeprowadzić dekapsulację w warunkach domowych, zawiera biblia PoC||GTFO wydana przez No Starch Press.

Podczas usuwania warstw ochronnych (ang. depackaging) obudowę zanurza się w kwasie, po czym w rezultacie dostępne jest wnętrze chipa. Aby przywrócić jego funkcjonalność, należy ponownie połączyć chip, co oznacza ponowne podłączenie maleńkich wyprowadzeń, które normalnie łączą go z pinami w obudowie (patrz rysunek 1.8).

Rysunek 1.8. Odsłonięty chip wraz z jego widocznymi drucikami połączeniowymi (Travis Goodspeed, licencja CC BY 2.0)

Mimo że mogą one paść w trakcie tego procesu, uszkodzone chipy nadają się do tworzenia obrazów i optycznej inżynierii odwrotnej. Jednak w wypadku większości ataków chipy muszą być sprawne.

Obrazowanie mikroskopowe i inżynieria wsteczna

Po odsłonięciu wnętrza chipa pierwszym krokiem jest identyfikacja jego większych bloków funkcjonalnych, a konkretnie – znalezienie interesujących bloków. Rysunek 1.2 pokazuje niektóre z tych struktur. Największymi blokami na matrycy będzie pamięć, taka jak statyczna pamięć RAM (SRAM) dla pamięci podręcznej procesora lub pamięć TCM (ang. tightly coupled memory), oraz ROM dla kodu rozruchu. Wszelkie długie, w większości proste wiązki linii to magistrale łączące procesory i urządzenia peryferyjne. Znajomość względnych rozmiarów i tego, jak wyglądają poszczególne struktury, pozwala rozpocząć inżynierię odwrotną chipów.

Gdy odsłonięte jest wnętrze chipa, jak na rysunku 1.8, widać tylko górną warstwę metaliczną. Aby wykonać inżynierię wsteczną całego chipa, musimy go podzielić na warstwy, co oznacza zdjęcie poszczególnych metalicznych warstw chipa, aby odsłonić kolejne, znajdujące się pod nim.

Rysunek 1.9 przedstawia przekrój układu scalonego w technologii CMOS (ang. complementary metal oxide semiconductor), która jest sposobem budowy większości współczesnych układów. Jak widać, tranzystory (krzem polikrystaliczny / podłoże) łączy wiele warstw i przelotek z metali zawierających miedź. Warstwa metaliczna najniższego poziomu służy do tworzenia standardowych komórek, które są elementami tworzącymi bramki logiczne (AND, XOR itd.) z wielu tranzystorów. Warstwy metaliczne najwyższego poziomu są zwykle używane do zarządzania zasilaniem i zegarem.

Rysunek 1.9. Przekrój układu scalonego w technologii CMOS

Rysunek 1.10 przedstawia zdjęcia różnych warstw wewnątrz typowego chipa.

Rysunek 1.10. Różne warstwy wewnątrz chipa w technologii CMOS (zdjęcie dzięki uprzejmości Christophera Tarnovsky’ego, semiconductor.guru@gmail.com)

Dobre obrazowanie chipów pozwala na odbudowanie netlisty z obrazów lub zrzutu binarnego rozruchowej pamięci ROM. Netlista to zasadniczo opis połączenia wszystkich bramek, który obejmuje całą logikę cyfrową projektu. Zarówno netlista, jak i zrzut pamięci ROM pozwalają napastnikom znaleźć słabe punkty w kodzie lub w projekcie układu. Dobre wprowadzenie do tematu stanowią Bits from the Matrix: Optical ROM Extraction Chrisa Gerlinsky’ego i Integrated Circuit Offensive Security Oliviera Thomasa, zaprezentowane na konferencji Hardwear.io 2019.

Obrazowanie z użyciem skaningowego mikroskopu elektronowego

Skaningowy mikroskop elektronowy SEM (ang. scanning electron microscope) wykonuje skan rastrowy celu za pomocą wiązki elektronów oraz pomiary z detektora elektronów w celu utworzenia obrazu zeskanowanego o rozdzielczości lepszej niż 1 nm, co pozwala na obrazowanie poszczególnych tranzystorów i połączeń. Podobnie jak w wypadku obrazowania mikroskopowego z obrazów w łatwy sposób można tworzyć netlisty.

Optyczne wstrzykiwanie błędów i optyczna analiza emisji

Gdy powierzchnia chipa jest widoczna, możliwe jest „wypluwanie fotonów”. Ze względu na efekt zwany luminescencją gorącego nośnika przełączające się tranzystory czasami emitują fotony. Za pomocą światłoczułego czujnika CCD (ang. charge-coupled device), takiego jak te stosowane przez hobbystów astronomii, lub fotodiody lawinowej (APD, ang. avalanche photodiode), możliwe jest wykrycie obszarów aktywności fotonów, co może pomóc w procesie inżynierii odwrotnej (lub dokładniej analiz side-channel), a także korelowanie pomiarów fotonów z poufnymi kluczami. W tym temacie warto zapoznać się z Simple Photonic Emission Analysis of AES: Photonic Side Channel Analysis for the Rest of Us Alexandra Schlössera i innych.

Oprócz wykorzystywania fotonów do obserwowania procesów można ich również używać do wstrzykiwania błędów przez zmianę przewodnictwa bramek. Nazywa się to optycznym wstrzykiwaniem błędów (więcej szczegółów znajduje się w Rozdziale 5 i Dodatku A).

Użycie zogniskowanej wiązki jonów i mikrosondowanie

Zogniskowana wiązka jonów (FIB, ang. focused ios beam) wykorzystuje wiązkę jonów do frezowania części chipa lub osadzania materiału na chipie w skali nanometrowej, co umożliwia atakującym cięcie połączeń w chipie, przekierowywanie połączeń w chipie, lub tworzenie podkładek dla sondy w celu mikroanalizy. Używanie FIB wymaga czasu i umiejętności (oraz kosztownego FIB), ale jak można sobie wyobrazić, takie ingerencje mogą obejść wiele mechanizmów bezpieczeństwa w sprzęcie, jeśli atakujący jest w stanie je zlokalizować. Liczby na rysunku 1.11 pokazują otwory utworzone przez FIB w celu uzyskania dostępu do niższych warstw metalicznych. Struktury „kapeluszowe” wokół otworów są tworzone w celu ominięcia aktywnych mechanizmów zapobiegawczych.

Mikrosondowanie to technika stosowana do pomiaru lub wstrzykiwania prądu do połączeń w chipie, która w wypadku większych elementów może nie wymagać podkładki dla sondy FIB. Warunkiem wstępnym do wykonania dowolnego z tych ataków są umiejętności, a gdy atakujący ma już zasoby do wykonania ataków na tym poziomie, to niezwykle trudno jest utrzymać bezpieczeństwo.

Rysunek 1.11. Szereg zmian wprowadzonych z użyciem FIB w celu ułatwienia mikrosondowania (zdjęcie dzięki uprzejmości Christophera Tarnovsky’ego, semiconductor.guru@gmail.com)

Omówiliśmy tutaj szereg różnych ataków związanych z systemami wbudowanymi. Pamiętajmy, że do złamania systemu wystarczy dowolny pojedynczy atak. Drastycznie różnią się jednak koszty i umiejętności, zatem warto rozumieć, jakiego rodzaju celu bezpieczeństwa potrzebujemy. Opieranie się atakowi ze strony kogoś z budżetem miliona dolarów i przeciwstawianie się atakowi kogoś, kto ma 25 dolarów i kopię tej książki, to bardzo różne zadania.

Zasoby i cele bezpieczeństwa

Pytanie, które należy zadać, rozważając zasoby zawarte w zaprojektowanym produkcie, brzmi: „na jakich zasobach naprawdę mi zależy?”. Atakujący zada to samo pytanie. Choć jest ono pozornie proste, obrońca zasobów może uzyskać wiele odpowiedzi. Prezes firmy może skupić się na wizerunku marki i kondycji finansowej. Specjalista w zakresie danych osobowych będzie dbał o poufność prywatnych informacji konsumentów, a kryptograf będzie miał paranoję na punkcie elementów związanych z poufnymi kluczami. Wszystkie te odpowiedzi na pytanie są ze sobą powiązane. Ujawnienie kluczy może mieć wpływ na prywatność klientów, co z kolei negatywnie wpłynie na wizerunek marki, a w konsekwencji zagrozi kondycji finansowej całej firmy. Jednak na każdym poziomie mechanizmy ochrony są różne.

Zasób również reprezentuje wartość dla atakującego. To, co dokładnie jest wartościowe, zależy od motywacji napastnika. Może to być luka, która pozwala atakującemu sprzedać innym atakującym wykonywalny kod exploita. Pożądanym zasobem mogą być dane karty kredytowej lub klucze płatności ofiary. Intencją w świecie korporacji może być złośliwe zaatakowanie marki konkurenta.

Podczas modelowania zagrożeń należy analizować perspektywy zarówno atakującego, jak i obrońcy. Na potrzeby tej książki ograniczamy się do zasobów technicznych w urządzeniu, więc zakładamy, że nasze zasoby są reprezentowane jako sekwencja bitów w urządzeniu, które powinny pozostać poufne i chronione przez integralność. Poufność jest ukrywaniem zasobu przed atakującymi, a integralność polega na niepozwalaniu napastnikowi na jego modyfikację.

Jako entuzjasta bezpieczeństwa możesz się zastanawiać, dlaczego nie wspomnieliśmy o dostępności. Dostępność polega na utrzymywaniu responsywnego i funkcjonalnego systemu. Jest to szczególnie ważne w wypadku centrów danych i systemów zajmujących się bezpieczeństwem, takich jak przemysłowe systemy sterowania i pojazdy autonomiczne, w których nie mogą wystąpić przerwy w działaniu systemu.

Obrona dostępności zasobów ma sens tylko w sytuacjach, gdy nie można uzyskać fizycznego dostępu do urządzenia, na przykład gdy dostęp odbywa się przez sieć albo Internet. Spowodowanie niedostępności takich usług jest celem ataków typu „odmowa usługi”, które powodują przeciążenie witryn internetowych. W wypadku urządzeń wbudowanych wyeliminowanie dostępności jest trywialne: wystarczy je wyłączyć, uderzyć młotkiem lub wysadzić w powietrze.

Celem bezpieczeństwa jest określenie, jak dobrze chcemy chronić zasoby, które sobie zdefiniowaliśmy, przed typami ataków i atakujących oraz na jak długo. Definiowanie celów bezpieczeństwa pomaga skoncentrować argumenty projektowe na strategiach przeciwdziałania oczekiwanym zagrożeniom. Ze względu na wiele możliwych scenariuszy nieuchronnie wystąpią kompromisy i chociaż zdajemy sobie sprawę, że nie ma uniwersalnych rozwiązań, podajemy poniżej kilka typowych przykładów.

Chociaż nie jest to bardzo powszechne, pewną oznaką dojrzałości w podejściu do bezpieczeństwa u dostawcy jest specyfikacja mocnych i słabych stron urządzenia.

Poufność i integralność kodu binarnego

Zazwyczaj w wypadku kodu binarnego głównym celem jest ochrona integralności lub upewnienie się, że kod uruchamiany na urządzeniu jest kodem zamierzonym przez autora. Ochrona integralności ogranicza modyfikację kodu, ale stanowi miecz obosieczny. Silna ochrona integralności może zablokować urządzenie przed jego właścicielem, co ograniczy kod możliwy do uruchomienia na nim. Cała społeczność hakerów próbuje obejść te mechanizmy na konsolach do gier, aby uruchamiać własne kody. Z drugiej strony ochrona integralności z pewnością ma niezamierzoną korzyść w postaci obrony przed złośliwym oprogramowaniem infekującym łańcuch rozruchowy, piractwem w grach lub instalacją przez rządy backdoorów.

Celem zachowania poufności jako wyznacznika bezpieczeństwa jest utrudnienie kopiowania własności intelektualnej, takiej jak treści cyfrowe, lub znajdowanie luk w oprogramowaniu układowym. To drugie utrudnia również badaczom bezpieczeństwa działającym w dobrej wierze znajdowanie i zgłaszanie luk w zabezpieczeniach, a także hakerom wykorzystanie tych luk. (Aby uzyskać więcej informacji na temat tego złożonego dylematu, zobacz punkt Ujawnianie kwestii związanych z bezpieczeństwem na stronie 39).

Poufność i integralność kluczy

Kryptografia zamienia problemy związane z ochroną danych w problemy związane z ochroną kluczy. W praktyce klucze są zazwyczaj łatwiejsze do ochrony niż pełne bloby danych. W wypadku modelowania zagrożeń warto zwrócić uwagę, że są teraz dwa zasoby: dane w postaci zwykłego tekstu i sam klucz. Poufność kluczy jako cel wiąże się zatem zwykle z poufnością danych, które są chronione.

Integralność jest na przykład ważna, gdy klucze publiczne są przechowywane na urządzeniu w celu sprawdzania autentyczności: jeśli atakujący mogą zastąpić oryginalne klucze publiczne własnymi, mogą podpisać dowolne dane, które będą przechodzić weryfikację podpisu na urządzeniu. Jednak integralność nie zawsze jest celem kluczy; na przykład jeśli celem klucza jest odszyfrowanie przechowywanego bloba danych, modyfikacja klucza spowoduje po prostu niemożność jego odszyfrowania.

Innym interesującym aspektem jest to, jak klucze są bezpiecznie wbudowywane do urządzenia lub generowane na etapie produkcji. Jedną z możliwości jest zaszyfrowanie lub podpisanie samych kluczy, ale wiąże się to z jeszcze innym kluczem. To są żółwie aż do końca. Gdzieś w systemie istnieje źródło zaufania, klucz lub mechanizm, któremu po prostu musimy zaufać.

Typowym rozwiązaniem jest zaufanie do procesu produkcyjnego podczas generowania pierwotnego klucza lub podczas jego umieszczania. Na przykład specyfikacja standardu układu scalonego Trusted Platform Module (TPM) w wersji 2.0 wymaga zatwierdzanego pierwotnego ziarna (EPS, ang. endorsement primary seed). To EPS jest unikalnym identyfikatorem dla każdego modułu TPM i jest używany do wygenerowania pewnego podstawowego materiału klucza. Zgodnie ze specyfikacją ten EPS musi zostać wbudowany do TPM lub utworzony w TPM podczas produkcji.

Ta praktyka ogranicza narażenie materiału klucza, ale w zakładzie produkcyjnym tworzy krytyczny centralny punkt zbiorczy materiałów kluczy. Szczególnie dobrze chronione muszą być systemy umieszczania, aby uniknąć narażenia kluczy w tych wszystkich elementach, które są konfigurowane przez dany system. Najlepsze praktyki polegają na generowaniu ich na urządzeniu, tak aby zakład produkcyjny nie miał dostępu do wszystkich, a także dzielenie tajnych informacji i upewnianie się, że różne etapy produkcji wprowadzają lub generują różne składniki materiału klucza.

Zdalna atestacja rozruchu

Atestacja rozruchu to możliwość kryptograficznej weryfikacji, czy system faktycznie uruchomił się z autentycznych obrazów oprogramowania układowego. Zdalna atestacja rozruchu to możliwość wykonania tego zdalnie. W atestację zaangażowane są dwie strony. Strona udowadniająca zamierza udowodnić weryfikatorowi, że pewne miary systemu nie zostały naruszone. Na przykład zdalnej atestacji rozruchu możemy użyć, aby zezwolić urządzeniu na dostęp do sieci korporacyjnej lub odmówić mu dostępu albo zdecydować o udostępnieniu urządzeniu usługi online. W tym drugim wypadku urządzenie jest stroną udowadniającą, usługa online jest weryfikatorem, a miarami są skróty danych konfiguracyjnych i obrazy (firmware) używane podczas rozruchu. Aby udowodnić, że miary nie zostały naruszone, podpisuje się je cyfrowo za pomocą klucza prywatnego podczas etapów rozruchu. Weryfikator może sprawdzić podpisy na liście dozwolonych lub zablokowanych i powinien mieć możliwość weryfikacji klucza prywatnego używanego do tworzenia podpisów. Wykrywa on manipulacje i sprawia, że na urządzeniu zdalnym nie zostaną uruchomione stare i być może podatne na ataki obrazy rozruchowe.

Jak zawsze wiąże się to z kilkoma praktycznymi kwestiami. Po pierwsze, weryfikator musi w jakiś sposób być w stanie zaufać kluczowi użytemu do podpisu przez stronę udowadniającą – na przykład ufać certyfikatowi zawierającemu klucz publiczny strony udowadniającej, który jest podpisany przez jakiś wiarygodny organ. W najlepszym wypadku organ ten był w stanie poświadczyć zaufanie podczas procesu produkcyjnego, jak opisano wcześniej. Po drugie, im pełniejsze pokrycie obrazów rozruchowych i danych, tym więcej będzie w praktyce różnych konfiguracji. Oznacza to, że staje się niewykonalna znajomość wszystkich znanych-dobrych konfiguracji, zatem trzeba powrócić do blokowania znanych-złych konfiguracji. Jednak ustalenie znanej-złej konfiguracji nie jest trywialnym ćwiczeniem i zazwyczaj można ją wykryć dopiero po wykryciu i przeanalizowaniu modyfikacji.

Należy zauważyć, że atestacja rozruchu chroni komponenty używane w czasie rozruchu, które są zabezpieczone w celu zapewnienia autentyczności. Nie chroni przed atakami w czasie wykonywania, takimi jak wstrzykiwanie kodu.

Poufność i integralność danych osobowych

Dane osobowe (PII, ang. personally identifiable information) to dane, które umożliwiają identyfikację osoby. Oczywiste dane obejmują nazwiska, numery telefonów komórkowych, adresy i numery kart kredytowych, ale mniej oczywistymi danymi mogą być dane z akcelerometru zarejestrowane w urządzeniu ubieralnym. Poufność danych osobowych staje się problemem, gdy mogą pobierać te informacje aplikacje zainstalowane na urządzeniu. Na przykład dane z akcelerometru, które charakteryzują chód osoby, mogą być wykorzystane do identyfikacji tej osoby: patrz Gait Identifcation Using Accelerometer on Mobile Phone Hoanga Minha Thanga i innych. Dane dotyczące zużycia energii przez telefon komórkowy mogą wskazać lokalizację osoby na podstawie sposobu, w jaki radio w telefonie zużywa energię, w zależności od odległości od stacji bazowych sieci komórkowej, jak opisano w PowerSpy: Location Tracking Using Mobile Device Power Analysis Yana Michalevsky’ego i innych.

W dziedzinie medycyny obowiązują również regulacje dotyczące ochrony danych osobowych. Ustawa Health Insurance Portability and Accountability Act (HIPAA) z 1996 roku to prawo w Stanach Zjednoczonych, które kładzie duży nacisk na prywatność informacji medycznych i ma zastosowanie do każdego systemu przetwarzającego dane osobowe pacjenta. HIPAA nie wskazuje specyficznych wymagań dotyczących bezpieczeństwa technicznego.

Integralność danych umożliwiających identyfikację jest niezbędna, aby uniknąć podszywania się. W bankowych kartach inteligentnych materiał klucza jest powiązany z kontem, a zatem z tożsamością. W przeciwieństwie do HIPAA konsorcjum kart kredytowych EMVCo bardzo wyraźne określa wymagania techniczne. Na przykład materiał klucza musi być chroniony przed atakami logicznymi, side-channel i wstrzykiwaniem błędów, a ochrona ta musi być sprawdzona za pomocą rzeczywistych ataków przeprowadzonych przez akredytowane laboratorium.

Integralność i poufność danych z sensorów

Właśnie dowiedzieliśmy się, w jaki sposób dane z czujników są powiązane z informacjami umożliwiającymi identyfikację osób. Integralność musi być ważna, ponieważ urządzenie musi dokładnie wykrywać i rejestrować swoje otoczenie. Jest to jeszcze ważniejsze, gdy system wykorzystuje wejście czujnika do sterowania. Świetnym (choć spornym) przykładem jest zmuszenie amerykańskiego drona RQ-170 do lądowania w Iranie, rzekomo po tym, jak jego sygnał GPS został sfałszowany, aby sądził, że ląduje w amerykańskiej bazie w Afganistanie.

Gdy do podejmowania decyzji urządzenie wykorzystuje jakąś formę sztucznej inteligencji, integralność decyzji jest kwestionowana przez obszar badań zwany kontradyktoryjnym uczeniem maszynowym. Jednym z przykładów jest wykorzystanie słabości klasyfikatorów sieci neuronowych przez sztuczną modyfikację obrazów znaku stopu. Dla ludzi modyfikacja jest niewykrywalna, ale obraz może być zupełnie nierozpoznawalny przy użyciu standardowych algorytmów rozpoznawania obrazu, podczas gdy w rzeczywistości powinien być rozpoznawalny. Chociaż identyfikacja przez sieć neuronową może zostać udaremniona, nowoczesne autonomiczne samochody mają bazę danych lokalizacji znaków, do których mogą się odwołać, więc w tym konkretnym wypadku nie powinno to stanowić problemu związanego z bezpieczeństwem. Więcej szczegółów zawiera Practical Black-Box Attacks Against Machine Learning Nicolasa Papernota i innych.

Ochrona poufności treści

Ochrona treści sprowadza się do upewnienia się, że ludzie płacą za pobierane treści multimedialne i że przestrzegają pewnych ograniczeń licencyjnych, takich jak data i lokalizacja geograficzna. Odbywa się to za pomocą mechanizmu zarządzania prawami/ograniczeniami cyfrowymi (DRM, ang. digital rights/restrictions management). DRM polega głównie na szyfrowaniu strumienia danych transportującego treści do/z urządzenia oraz na logice kontroli dostępu wewnątrz urządzenia, umożliwiającej odmowę dostępu oprogramowania do odblokowanych treści. W wypadku urządzeń mobilnych większość wymagań w zakresie ochrony dotyczy tylko ataków programowych, ale w wypadku dekoderów wymagania ochrony również ataków side-channel i wstrzykiwania błędów. Dlatego dekodery są uważane za trudniejsze do złamania i są używane do treści o większej wartości.

Odpowiedzialność i odporność

Odpowiedzialność jest właściwością polegającą na niewyrządzaniu szkody (na przykład ludziom), zaś odporność to zdolność do działania w wypadku (niezłośliwych) awarii. Na przykład mikrokontroler w satelicie będzie narażony na intensywne promieniowanie, które powoduje tzw. zakłócenia single event upsets (SEU). SEU odwracają bity w danym stanie chipa, co może prowadzić do błędów w podejmowaniu decyzji. Elastycznym rozwiązaniem jest wykrycie tego i naprawienie błędu lub wykrycie i przywrócenie znanego dobrego stanu. Taka odporność niekoniecznie musi być bezpieczna; daje komuś, kto próbuje wstrzyknąć błąd, nieograniczoną liczbę prób, ponieważ system nadal akceptuje nadużycia.

Analogicznie nie byłoby odpowiedzialne wyłączanie jednostki sterującej pojazdu autonomicznego przy prędkościach autostradowych, gdy tylko czujnik wskaże złośliwą aktywność. Po pierwsze, każdy detektor może generować fałszywe alarmy, a po drugie, potencjalnie umożliwia to osobie atakującej użycie czujnika do skrzywdzenia pasażerów. Podobnie jak w wypadku innych celów także i te stawiają przed programistami produktu wymagania wprowadzenia kompromisów między bezpieczeństwem a odpowiedzialnością/odpornością. Odporność i odpowiedzialność to nie to samo co bezpieczeństwo; czasami są w sprzeczności z bezpieczeństwem. Dla atakującego oznacza to możliwość złamania urządzenia z powodu dobrych intencji uczynienia go odpowiedzialnym lub odpornym.

Środki zapobiegawcze

Środki zapobiegawcze definiujemy jako wszelkie (techniczne) środki mające na celu zmniejszenie prawdopodobieństwa sukcesów lub skutków ataku. Pełnią trzy funkcje: chronią, wykrywają i reagują. (Niektóre z tych środków zapobiegawczych omówimy w Rozdziale 14).

Chronienie

Ta kategoria środków zapobiegawczych ma na celu uniknięcie lub złagodzenie ataków. Przykładem jest szyfrowanie zawartości pamięci flash, by chronić ją przed ciekawskimi oczami. Dobrze ukryty klucz zapewnia niemal niezniszczalną ochronę. Inne mechanizmy ochrony mogą zagwarantować tylko częściową ochronę. Jeśli uszkodzenie pojedynczego rozkazu procesora może spowodować możliwy do wykorzystania błąd, to losowe wykonanie krytycznego rozkazu w ciągu jednego z pięciu cykli zegara nadal daje atakującemu 20-procentowe prawdopodobieństwo trafienia go. Całkowite ominięcie niektórych mechanizmów ochronnych jest możliwe, ponieważ chronią one tylko przed określoną klasą ataków (na przykład środek zapobiegawczy dla ataku side-channel nie chroni przed wstrzyknięciem kodu).

Wykrywanie

Ta kategoria środków zapobiegawczych wymaga albo pewnego rodzaju elementów sprzętowych wykrywających atak, albo logiki wykrywania zawartej w oprogramowaniu. Na przykład można monitorować zasilanie chipa w zakresie wystąpienia pików lub spadków napięcia, które wskazują na napięciowy atak usterek. Do wykrywania anormalnych stanów można także użyć oprogramowania. Na przykład ataki mogą wykrywać dzienniki aplikacji lub systemy, które stale analizują ruch sieciowy. Inne popularne techniki wykrywania anomalii to między innymi weryfikacja tak zwanych nadpisań stosu, wykrywanie chronionych stron pamięci, do których wykonano dostęp, znajdowanie instrukcji switch bez odpowiadających im instrukcji case oraz błędy cyklicznej kontroli nadmiarowej (CRC) na wewnętrznych zmiennych.

Odpowiadanie

Wykrywanie bez odpowiadania ma niewielki skutek. Rodzaj odpowiedzi zależy od przypadku użycia urządzenia. W wypadku wysoce zabezpieczonych urządzeń, takich jak inteligentne karty płatnicze, podczas wykrycia ataku rozsądne byłoby wyczyszczenie wszystkich danych poufnych w urządzeniu (skuteczne zastosowanie wobec siebie ataku typu „odmowa usługi”). Takie postępowanie nie byłoby dobrym pomysłem w wypadku systemów krytycznych dla bezpieczeństwa, które muszą nadal działać. Wówczas odpowiedniejszą reakcją byłoby nawiązanie kontaktu z kimś zaufanym lub powrót do bezpiecznego trybu awaryjnego. Inną niedocenianą, ale skuteczną reakcją na atakującego będącego człowiekim jest doprowadzenie do jego znużenia (na przykład przez resetowanie urządzenia i wydłużanie czasu jego uruchamiania).

Środki zapobiegawcze mają kluczowe znaczenie dla budowy bezpiecznego systemu. Zwłaszcza w wypadku sprzętu, którego nie da się w pełni zabezpieczyć przed atakami fizycznymi, dodanie funkcji wykrywania i reagowania często podnosi poprzeczkę ponad to, co napastnik jest skłonny lub nawet jest w stanie zrobić.

Przykładowe drzewo ataku

Teraz, gdy opisaliśmy już cztery składniki potrzebne do skutecznego modelowania zagrożeń, zacznijmy od przykładu, w którym jako atakujący chcemy włamać się do szczoteczki do zębów IoT w celu wydobycia poufnych informacji i (dla zabawy) zwiększenia prędkości szczotkowania do takiej, jakiej dziewięcioro na dziesięcioro dentystów nie pochwaliłoby (chociaż ostatni uwielbia mocne wyzwania).

Rysunek 1.12. Drzewo ataku na szczoteczkę do zębów IoT

W naszym przykładowym drzewie ataków, pokazanym na rysunku 1.12, mamy następujące elementy.

• Zaokrąglone pola wskazują stany, w których znajduje się atakujący, lub zasoby, które napastnik naruszył („rzeczowniki”).

• Prostokątne pola wskazują udane ataki przeprowadzone przez napastnika („czasowniki”).

• Strzałki rysowane ciągłą linią pokazują przepływ między wcześniejszym stanem i atakiem.

• Strzałki rysowane ciągłą przerywaną wskazują ataki, które są łagodzone przez jakiś środek zapobiegawczy.

• Kilka zbiegających się strzałek wskazuje, że „do danego stanu może doprowadzić dowolna ze strzałek”.

• Trójkąt „AND” oznacza, że wszystkie warunki znad zbiegających się strzałek muszą być spełnione.

Liczby w drzewie ataku oznaczają etapy ataku na szczoteczkę do zębów. Jako atakujący mamy fizyczny dostęp do szczoteczki do zębów IoT (1). Naszą misją jest zainstalowanie na niej telnetowego backdoora, aby określić, jakie dane osobowe są obecne na urządzeniu (8), a także uruchomić szczoteczkę z niedorzeczną prędkością (11).

Małe litery wskazują ataki, a cyfry rzymskie wskazują środki zapobiegawcze. Jedną z pierwszych rzeczy, które robimy, jest wylutowanie pamięci flash i odczytanie zawartości – całych 16 MB (a). Widzimy jednak, że w obrazie nie ma możliwych do odczytania łańcuchów tekstowych. W wyniku analizy entropii stwierdzamy, że zawartość wydaje się zaszyfrowana lub skompresowana, ale ponieważ nie ma nagłówka wskazującego format kompresji, zakładamy, iż ta zawartość jest zaszyfrowana, jak pokazano w ataku (2) i zapobieganiu ataku (i). Aby go odszyfrować, potrzebujemy klucza szyfrującego. Wygląda na to, że nie jest przechowywany w pamięci flash, jak pokazuje łagodzenie ataku (ii), więc prawdopodobnie jest przechowywany gdzieś w pamięci ROM lub w bezpiecznikach. Bez dostępu do skaningowego mikroskopu elektronowego nie jesteśmy w stanie „odczytać” go z krzemu.

Zamiast tego postanawiamy poeksperymentować z analizą mocy. Podłączamy sondę mocy i oscyloskop i rejestrujemy przebiegi mocy podczas uruchamiania systemu. Przebieg pokazuje około miliona małych pików. Wiedząc, na podstawie naszego odczytu pamięci flash, że obraz ma 16 MB, wnioskujemy, iż każdy pik odpowiada 16 bajtom zaszyfrowanych danych. Zakładamy zatem, że jest to szyfrowanie AES-128 w postaci jednej z typowych wersji: elektronicznej książki kodowej (ECB, ang. electronic code block) lub wiązania bloków szyfrogramu (CBC, ang. cipher block chaining). ECB to tryb, w którym każdy blok jest odszyfrowywany niezależnie od innych bloków, a CBC to tryb, w którym odszyfrowanie kolejnych zależy od wcześniejszych. Ponieważ znamy zaszyfrowaną postać obrazu oprogramowania układowego, na podstawie zmierzonych wartości szczytowych możemy wypróbować atak związany z analizą mocy. Po długim wstępnym przetwarzaniu śladów i wykonaniu ataku związanego z różnicową analizą mocy (DPA, ang. differential power analysis) (b) jesteśmy w stanie zidentyfikować prawdopodobnego kandydata na klucz. (Nie martw się; czym jest DPA, dowiesz się, gdy będziesz czytał tę książkę). Deszyfrowanie za pomocą ECB da nam śmieci, natomiast w ataku (c) za pomocą CBC otrzymamy kilka czytelnych łańcuchów; wygląda na to, że na etapie (3) znaleźliśmy właściwy klucz, a na etapie (4) pomyślnie odszyfrowaliśmy obraz!

Na podstawie odszyfrowanego obrazu możemy użyć tradycyjnych technik inżynierii wstecznej oprogramowania (g), aby określić, czym się zajmują poszczególne bloki kodu, gdzie przechowywane są dane oraz w jaki sposób uruchamiane są elementy wykonawcze i, co ważne z punktu widzenia bezpieczeństwa, możemy teraz szukać luk w zabezpieczeniach w kodzie (9). Ponadto na etapie (d) modyfikujemy odszyfrowany obraz, aby zawierał backdoora, który pozwoli nam za pomocą telneta połączyć się zdalnie do szczoteczki do zębów (5).

W ataku (d) ponownie szyfrujemy obraz i umieszczamy go we flashu, tylko po to, by odkryć, że szczoteczka do zębów się nie uruchamia. Wpadamy na to, że powodem jest najprawdopodobniej weryfikacja podpisu oprogramowania układowego. Bez klucza prywatnego używanego do podpisywania obrazów nie możemy uruchomić zmodyfikowanego obrazu ze względu na mechanizm łagodzący atak (iii). Jednym z powszechnych ataków na ten środek zapobiegawczy jest wstrzykiwanie błędu napięcia. W wypadku wstrzykiwania błędów będziemy dążyć do uszkodzenia instrukcji odpowiedzialnej za podjęcie decyzji o zaakceptowaniu lub odrzuceniu obrazu oprogramowania układowego. Jest to zwykle porównanie, które używa wyniku logicznego zwróconego przez funkcję rsa_signature_verify(). Ponieważ ten kod jest zaimplementowany w pamięci ROM, tak naprawdę na podstawie inżynierii wstecznej nie możemy uzyskać informacji o jego implementacji. Wypróbujemy więc starą sztuczkę – w ataku (e) weźmiemy przebieg mocy podczas uruchamiania niezmodyfikowanego obrazu uzyskany w trakcie wykonywanego wcześniej ataku side-channel i porównamy go z przegiegiem mocy podczas uruchamiania zmodyfikowanego obrazu. W etapie (6) punktem, w którym ślady się różnią, jest prawdopodobnie moment, w jakim kod rozruchowy decyduje, czy zaakceptować obraz oprogramowania układowego. W tym momencie generujemy błąd, aby spróbować zmodyfikować decyzję.

W ataku (f) wczytujemy złośliwy obraz i obniżamy napięcie na kilkaset nanosekund w losowym momencie 5-mikrosekundowego okna, mniej więcej w tej chwili, gdy stwierdzamy, że została podjęta decyzja. Po kilku godzinach powtarzania tego ataku mamy szczęście; w etapie (7) szczoteczka do zębów uruchamia nasz złośliwy obraz. Teraz, gdy zmodyfikowany kod pozwala nam się telnetować, dochodzimy do etapu (8), gdzie możemy zdalnie kontrolować szczotkowanie i szpiegować każde użycie szczoteczki. Na końcowym i zabawnym etapie (11) podkręcamy jej prędkość do absurdalnej wartości!

Jest to oczywiście głupi przykład, ponieważ uzyskane informacje i dostęp prawdopodobnie nie są wystarczająco cenne dla poważnego atakującego; do przeprowadzenia ataków side-channel i wstrzyknięcia błędów jest niezbędny dostęp fizyczny, a reset urządzenia przez właściciela spowoduje odmowę usługi. Jest to jednak pouczające ćwiczenie i zawsze warto pobawić się tymi scenariuszami dotyczącymi zabawek.

Podczas rysowania drzew ataku łatwo dać się ponieść emocjom i sprawić, że drzewo będzie ogromne. Pamiętajmy, że atakujący prawdopodobnie spróbują tylko kilku najprostszych ataków (to narzędzie pomaga zidentyfikować, które to są). Należy skoncentrować się na tych atakach, które można określić przez sprofilowanie atakującego, i możliwościach ataku zidentyfikowanych na wcześniejszym etapie modelowania zagrożeń.

Identyfikacja vs. eksploatacja

Ścieżka ataku na szczoteczkę do zębów koncentruje się na fazie identyfikacji ataku przez znalezienie klucza, inżynierię wsteczną oprogramowania układowego, modyfikację obrazu i odkrycie możliwości bezpośredniego wstrzyknięcia błędu. Pamiętajmy, że eksploatacja to próba skalowania włamania przez dostęp do wielu urządzeń. Powtarzając atak na inne urządzenie, możemy ponownie wykorzystać wiele informacji uzyskanych podczas identyfikacji. Kolejne ataki wymagają jedynie przesłania obrazu w ataku (d) na etapie (5), znajomości punktu wstrzyknięcia błędu na etapie (6) i wygenerowania błędu w ataku (f). Wysiłek związany z eksploatacją jest zawsze mniejszy niż wysiłek związany z identyfikacją. W niektórych formalizmach tworzenia drzew ataku każda strzałka jest opisana kosztem i wysiłkiem związanym z atakiem, ale tutaj unikamy zbytniego wchodzenia w ilościowe modelowanie ryzyka.

Skalowalność

Atak na szczoteczkę do zębów nie jest skalowalny, ponieważ faza eksploatacji wymaga fizycznego dostępu. W wypadku danych osobowych lub zdalnego uruchamiania atakujący zwykle jest zainteresowany atakiem tylko wtedy, gdy może go przeprowadzić na dużą skalę.

Załóżmy jednak, że w naszym ataku związanym z inżynierią wsteczną (g) na etapie (9) udaje się zidentyfikować podatność, dla której tworzymy exploit (h) na etapie (10). Odkryliśmy, że luka jest dostępna przez otwarty port TCP, zatem atak (j) może zdalnie ją wykorzystać. To natychmiast zmienia całą skalę ataku. Gdy wykorzystujemy ataki sprzętowe w fazie identyfikacji, w fazie eksploatacji (12) możemy używać wyłącznie zdalnych ataków programowych. Teraz możemy zaatakować każdą szczoteczkę do zębów, uzyskać dostęp do czyichś nawyków szczotkowania i podrażnić dziąsła w skali globalnej. Co za życie!

Analizowanie drzewa ataku

Drzewo ataków pomaga wizualizować ścieżki ataków w celu omówienia ich jako całości, zidentyfikowania punktów, w których można wprowadzić dodatkowe środki zapobiegawcze, i analizy skuteczności istniejących środków zapobiegawczych. Na przykład łatwo zauważyć, że łagodzenie skutków za pomocą szyfrowania obrazów oprogramowania układowego (i) zmusiło atakującego do użycia ataku side-channel (b), który jest trudniejszy niż zwykłe odczytanie pamięci. Podobnie łagodzenie skutków przez podpisywanie obrazów oprogramowania układowego (iii) zmusiło atakującego do ataku polegającego na wstrzyknięciu błędu (f).

Jednak głównym zagrożeniem jest nadal skalowalna ścieżka ataku przez eksploatację (j), która jest obecnie niezabezpieczona. Oczywiście należałoby załatać tę lukę, wprowadzić środki zapobiegające wykorzystywaniu oraz wprowadzić ograniczenia sieciowe, aby uniemożliwić komukolwiek bezpośrednie, zdalne połączenie się ze szczoteczką do zębów.

Ocenianie ścieżek ataków sprzętowych

Oprócz wizualizacji ścieżek ataków w celu ich analizy możemy również dodać nieco ujęcia ilościowego, aby dowiedzieć się, które ataki są łatwiejsze lub tańsze dla atakującego. W tym punkcie przedstawimy kilka systemów oceny zgodnych ze standardami branżowymi.

Common Vulnerability Scoring System (CVSS) próbuje oceniać luki pod kątem ważności, zwykle w kontekście komputerów podłączonych do sieci w organizacji. Zakłada, że luka w zabezpieczeniach jest znana, i próbuje ocenić, jak bardzo byłaby niebezpieczna, gdyby została wykorzystana. Common Weakness Scoring System (CWSS) określa ilościowo słabości w systemach, ale te słabości niekoniecznie są lukami i niekoniecznie w kontekście komputerów podłączonych do sieci. Wreszcie Joint Interpretation Library (JIL) służy do oceny ścieżek ataków (sprzętowych) w procedurze certyfikacji Common Criteria (CC).

Każda z tych metod ma różne parametry i sposoby ich punktowego oceniania, które razem tworzą łączny wynik pomagający porównywać różne luki lub ścieżki ataków. Te metody punktacji mają również tę zaletę, że zastępują nieokreślone opisy parametrów wartościami, które zyskują sens tylko w kontekście docelowej metody oceny. Tabela 1.1 zawiera przegląd trzech sposobów oceniania i możliwości ich zastosowania.

W kontekście defensywnym systemu ocen można użyć, aby ocenić wpływ ataku po jego wystąpieniu i zdecydować, jak zareagować na atak. Na przykład jeśli wykryta zostanie luka w oprogramowaniu, system ocen CVSS może pomóc w podjęciu decyzji, czy wdrożyć pilną poprawkę (z wszystkimi związanymi z nią kosztami), czy wdrożyć ją w następnej głównej wersji, jeśli luka jest niegroźna.

Systemu ocen można również użyć w kontekście defensywnym, aby ocenić, jakie środki zapobiegawcze są potrzebne. W zakresie certyfikacji Common Criteria Smart Card ocena JIL jest krytyczną częścią celu bezpieczeństwa – chip musi być odporny na ataki o ocenie do 30 punktów, aby można go było uznać za odporny na ataki o wysokim potencjale. Dokument SOG-IS Application of Attack Potentials to Smartcards opisuje system ocen oraz różne ataki sprzętowe. Aby dać wyobrażenie o skali ocen – jeśli atak za pomocą systemu dwóch wiązek laserowych wstrzykujących odpowiedni błąd w celu zdobycia poufnego tajnego klucza zajmuje kilka tygodni, to taki atak jest oceniany na 30 lub mniej punktów. Jeśli zdobycie klucza za pomocą ataku side-channel zajmuje sześć miesięcy, to wdrożenie środka zapobiegawczego nie jest konieczne, ponieważ taki atak ma 31 lub więcej punktów.

Tabela 1.1. Przegląd systemów oceniania ataków

Common Vulnerability Scoring System

Common Weakness Scoring System

Common Criteria Joint Interpretation Library

Cel

Pomaga organizacjom w procesach zarządzania podatnościami

Priorytetyzuje słabości oprogramowania, w zależności od potrzeb administracji publicznej, środowiska akademickiego i przemysłu

Ocenia ataki w celu spełnienia/niespełnienia procedury CC

Wpływ

Rozróżnia poufność/integralność/dostępność

Wpływ techniczny 0,0–1,0, zdobyty poziom uprzywilejowania (warstwa)

nd.

Wartość zasobu

nd.

Wpływ na biznes 0,0–1,0

nd.

Koszt identyfikacji

Zakłada, że identyfikacja już się odbyła

Prawdopodobieństwo odkrycia

Ocena fazy identyfikacji pod względem czasu, który upłynął, specjalizacji, wiedzy, dostępu, sprzętu i dostępnych próbek

Koszt eksploatacji

Różne czynniki; brak aspektów sprzętowych

Różne czynniki; brak aspektów sprzętowych

Ocena fazy eksploatacji

Wektor ataku

Cztery poziomy, od fizycznego do zdalnego

Poziom 0,0–1,0, od fizycznego do internetowego

Zakłada fizycznie obecnego napastnika

Zewnętrzne środki łagodzące

Kategoria „zmodyfikowane” zawiera środki łagodzące

Skuteczność kontroli zewnętrznej

Brak zewnętrznych środków łagodzących

Skalowalność

Niezupełnie, niektóre powiązane aspekty

Niezupełnie, niektóre powiązane aspekty

Niski koszt eksploatacji może sugerować skalowalność

CWSS ma na celu ocenę słabości systemów, zanim zostaną one wykorzystane. Jest to przydatna metoda oceny stosowana podczas projektowania, ponieważ pomaga przypisać priorytety do środków zapobiegawczych zaprojektowanych dla konkretnych słabości. Wszyscy wiedzą, że każda naprawa ma swoją cenę i że próba naprawienia wszystkich błędów nie jest praktyczna, więc ocena słabości pozwala programistom skoncentrować się na tych najbardziej istotnych.

W rzeczywistości większość atakujących dokonuje również pewnego rodzaju oceny, aby zminimalizować koszty i zmaksymalizować skutek ataku. Chociaż atakujący nie publikują zbyt wiele na te tematy, Dino Dai Zovi wygłosił interesującą przemowę zatytułowaną Attacker Math 101 na SOURCE Boston 2011, w której starano się wskazać pewne ograniczenia w kosztach atakujących.

Te oceny są ograniczone, niejednoznaczne, nieprecyzyjne, subiektywne i nie są specyficzne dla konkretnego rynku, ale stanowią dobry punkt wyjścia do dyskusji nad atakiem lub luką w zabezpieczeniach. Przy modelowaniu zagrożeń dla systemów wbudowanych zalecamy zacząć od JIL, który koncentruje się głównie na atakach sprzętowych. Jeśli chodzi o ataki programowe, warto użyć CWSS, ponieważ zawierają odpowiednie konteksty metod punktacji. Dzięki CWSS można pominąć nieistotne aspekty i dostroić inne, takie jak wpływ na biznes, w celu oceny wartości zasobów lub skalowalności. Warto upewnić się również, że aby uzyskać spójne porównanie wyników, oceniamy całą ścieżkę ataku, od punktu startowego atakującego aż do wpływu na zasób. Żadna z trzech ocen nie radzi sobie dobrze ze skalowalnością: atak na milion systemów może dać tylko nieznacznie gorszy wynik niż na pojedynczy system. Bez wątpienia są też inne ograniczenia, ale obecnie nie istnieją lepiej znane standardy branżowe.

W różnych schematach certyfikacji bezpieczeństwa występuje niejawny lub jawny cel bezpieczeństwa. Na przykład, jak wspomniano wcześniej, w wypadku kart inteligentnych za istotne uznaje się ataki o wartości zaledwie 30 punktów JIL lub mniej. Atak taki jak w prezentacji Tarnovsky’ego z 2010 r. na Black Hat DC Deconstructing a „Secure” Processor ma więcej niż 30 punktów i dlatego nie jest uważany za część celu bezpieczeństwa. W wypadku FIPS 140-2 nie są uważane za istotne żadne ataki spoza określonej listy ataków. Na przykład atak side-channel może w ciągu jednego dnia naruszyć silnik kryptograficzny zatwierdzony przez FIPS 140-2, natomiast cel bezpieczeństwa FIPS 140-2 nadal będzie uważał go za bezpieczny. Za każdym razem, gdy używamy urządzenia, które ma certyfikat bezpieczeństwa, warto sprawdzić, czy cele bezpieczeństwa certyfikatu są zgodne z naszymi.

Ujawnianie kwestii związanych z bezpieczeństwem

Ujawnianie kwestii związanych z bezpieczeństwem to gorący temat i nie zamierzamy rozwiązać tego problemu w kilku akapitach. Chcemy dodać nieco kolorytu do debaty, jeśli chodzi o kwestie bezpieczeństwa sprzętu. Sprzęt i oprogramowanie zawsze będą miały problemy z bezpieczeństwem. W wypadku oprogramowania można rozpowszechniać nowe wersje lub poprawki. Zmiany w sprzęcie są kosztowne z wielu powodów.

Uważamy, że celem ujawniania jest bezpieczeństwo publiczne, a nie są nim przypadki biznesowe producentów czy sława i fortuna badaczy. Oznacza to, że ujawnienie musi służyć społeczeństwu na dłuższą metę. Jest narzędziem zmuszającym producentów do naprawy luki w zabezpieczeniach, a także informowania opinii publicznej o zagrożeniach związanych z danym produktem. Niepożądanym efektem ubocznym pełnego ujawniania jest to, że lukę będzie mogła wykorzystać duża grupa atakujących, dopóki poprawka nie będzie powszechnie dostępna.

W wypadku luk w sprzęcie po jego wyprodukowaniu błędu często nie da się naprawić, chociaż może go złagodzić wydanie poprawki do oprogramowania. Wówczas może działać dobrze konwencja podobna do tej stosowanej w wypadku oprogramowania, gdy pełne ujawnienie następuje po 90 dniach od stwierdzenia luki. Jeśli chodzi o czyste poprawki sprzętowe, nie znamy takich konwencji (chociaż widzieliśmy zastosowanie konwencji dotyczących oprogramowania).

W wypadku sprzętu często zdarza się, że aktualizacja oprogramowania nie może obejść błędu, a rozpowszechnianie i instalowanie poprawek jest praktycznie niemożliwe. Producent mający dobre intencje może naprawić błąd w następnym wydaniu, ale produkty już istniejące na rynku pozostaną podatne na ataki. W tej sytuacji jedyną zaletą ujawnienia jest poinformowana opinia publiczna; wadą jest długi czas do wymiany lub wycofania wrażliwych produktów. Alternatywą jest ujawnianie częściowe. Na przykład producent może nazwać ryzyko i produkt, ale nie ujawnia szczegółów dotyczących wykorzystania luki. (Ta strategia nie sprawdziła się dobrze w świecie oprogramowania, gdzie luki często są szybko znajdowane nawet po niesprecyzowanym ujawnieniu).

Komplikacje zwiększają się, gdy podatności nie można naprawić, i mogą one bezpośrednio wpływać na zdrowie i bezpieczeństwo. Rozważmy atak, który może zdalnie wyłączyć dowolny rozrusznik serca. Ujawnienie tej sytuacji z pewnością odstraszy pacjentów od zakładania rozruszników serca, co spowoduje, że więcej osób umrze z powodu zawału serca. Z drugiej strony zachęciłoby to ich producenta do zwiększenia bezpieczeństwa w kolejnej wersji i zmniejszyło ryzyko ataku o śmiertelnych skutkach. Unikalne kompromisy dotyczą samochodów autonomicznych, szczoteczek do zębów IoT, systemów SCADA i każdej innej aplikacji oraz urządzenia. Jeszcze więcej wyzwań pojawia się, gdy luki w zabezpieczeniach wystąpią w danym typie chipa używanego w różnych produktach.

Nie twierdzimy, że mamy tu magiczną odpowiedź na wszystkie sytuacje, ale zachęcamy wszystkich do uważnego rozważenia zakresu ujawniania, do którego należy dążyć. Producenci powinni projektować systemy z założeniem, że zostaną złamane, i zaplanować bezpieczne scenariusze wokół tego założenia. Niestety ta praktyka nie jest powszechna, szczególnie w sytuacjach, gdy rządzi czas na wprowadzenie produktu na rynek i niski koszt.

Podsumowanie

W tym rozdziale zostały omówione niektóre podstawy wbudowanych zabezpieczeń. Opisaliśmy komponenty programowe i sprzętowe, na które niewątpliwie można natknąć się podczas analizy urządzenia, i omówiliśmy, co „bezpieczeństwo” oznacza z perspektywy filozoficznej. Aby właściwie przeanalizować bezpieczeństwo, wprowadziliśmy cztery elementy modelu zagrożeń: atakujących, różne ataki (sprzętowe), zasoby systemu i cele bezpieczeństwa oraz, na koniec, rodzaje środków zapobiegawczych, które można wdrożyć. Opisaliśmy również narzędzia do tworzenia, analizowania i oceniania ataków za pomocą drzewa ataków i systemów ocen zgodnych ze standardami branżowymi. Na koniec, w kontekście luk sprzętowych, zbadaliśmy trudny temat ujawniania informacji.

Skoro jesteśmy obładowani całą tą wiedzą, naszym następnym krokiem będzie rozpoczęcie dłubania w urządzeniach, do którego przystąpimy w kolejnym rozdziale.

Przypisy

[1] Układy scalone, które zostały zaprojektowane i mogą być implementowane w różnych technologiach [przyp. tłum.].