Ataki na układy scalone
| TechnikaRozwój Internetu Rzeczy, płatności elektronicznych, rozwiązań autonomicznych i aplikacji w chmurze napędza zapotrzebowanie na bezpieczne komponenty, gwarantujące wymagającym tego informacjom ochronę przed nieautoryzowanym dostępem i manipulacjami. Zapewnia to identyfikowalność urządzeń, na przykład węzłów IoT łączących się z aplikacjami w chmurze, integralność i poufność danych, na przykład przesyłanych w ramach transakcji płatniczych. Od bezpiecznych komponentów wymaga się obsługi szyfrowanych zabezpieczeń, zapewnienia zaufanego środowiska wykonywania kodu oraz odporności na ataki z zewnątrz.
W zależności od intencji ataki na układy scalone mogą polegać na nieuprawnionym monitorowaniu i analizowaniu ich działania, na przykład w ramach inżynierii wstecznej albo złośliwym wpływaniu na nie, na przykład w celu kradzieży danych lub podszywania się. Mogą mieć różny charakter.
Generalnie dzieli się je na: nieinwazyjne, półinwazyjne i inwazyjne. Różnią się pod względem stopnia ingerencji w cel ataku. Te inwazyjne polegają na pokonaniu barier fizycznych, na przykład przez zdjęcie obudowy w celu wglądu w strukturę wewnętrzną układu scalonego i uzyskania do niej bezpośredniego dostępu. To z kolei pozwala na przykład na jej analizę pod mikroskopem, odczyt i modyfikowanie stanu linii sygnałowych, odczytywanie chronionych obszarów pamięci czy zmianę stanu rejestrów. Przeprowadzenie udanego ataku inwazyjnego wymaga dużej wiedzy teoretycznej, umiejętności praktycznych i dostępności specjalistycznego sprzętu. Poza tym zwykle wiąże się on z nieodwracalnymi zniszczeniami układu będącego celem, który przez to staje się bezużyteczny.
Ataki częściowo inwazyjne
Ataki półinwazyjne też wymagają fizycznego dostępu do komponentu, na przykład przewiercenia obudowy, lecz bez naruszania jego funkcjonalności. Można dzięki temu wpływać na wewnętrzny stan układu, omijając zabezpieczenia lub monitorować jego reakcje na aktywność atakującego, żeby na tej podstawie odgadnąć mechanizmy działania komponentu lub zapisane w nim chronione dane. Zakończony sukcesem atak pół inwazyjny może skutkować: uzyskaniem nieuprawnionego dostępu, uruchomieniem złośliwego kodu lub wyciekami wrażliwych danych, jak klucze szyfrowania. Ataki nieinwazyjne natomiast w ogóle nie wymagają fizycznej ingerencji.
Niektóre ataki przeprowadza się w oparciu o tanie i nieskomplikowane metody. Inne natomiast wymagają zaangażowania większych zasobów (środków finansowych, sprzętów, umiejętności), a ich skutki są dotkliwsze.
Te pierwsze z reguły mają na celu przetestowanie odporności układu scalonego i ocenę wdrożonych w nim zabezpieczeń. Do tanich w realizacji zaliczane są ataki man in the middle i wprowadzenie złośliwego kodu powodującego przepełnienie bufora. Mechanizmy uwierzytelniania komunikacji i weryfikacja podpisów cyfrowych oprogramowania i uruchamianie jedynie zabezpieczonego w ten sposób kodu mogą im zapobiec.
Ataki nieinwazyjne
Przykładowy atak nieinwazyjny może wykorzystywać zjawisko utrwalania się resztkowej fizycznej reprezentacji danych, które zostały usunięte. Wbrew powszechnemu przekonaniu komórki pamięci SRAM nie tracą bowiem całkiem zawartości po odłączeniu zasilania. Wynika to z właściwości materiałów półprzewodnikowych oraz zjawisk, które w nich zachodzą (wstrzykiwanie gorących nośników, elektromigracja, występowanie zanieczyszczeń jonowych).
Zatem klucz, który był przechowywany w tych samych komórkach SRAM przez długi czas, zostaje w nich niejako „wypalony”, przez co istnieje prawdopodobieństwo, że zostanie w nich zachowany nawet po wyłączeniu urządzenia. Efekt ten nasila się szczególnie w niższych temperaturach – dane mogą być przechowywane przez około 1,5 godziny w temperaturze +75°C, trzy dni w temperaturze +50°C, prawie dwa miesiące w temperaturze +20ºC i aż około trzech lat w temperaturze 0°C. W razie znaczącego obniżenia temperatury wrażliwe dane zapisane w pamięci SRAM mogą więc nie zostać w pełni usunięte, nawet w razie wykonania pełnego resetu urządzenia. Przez to stają się dostępne dla osób nieuprawnionych.
Kolejny przykład nieinwazyjnej ingerencji to atak typu row-hammer, który można przeprowadzić programowo. Są na niego podatne pamięci DRAM. Wynika to stąd, że mają coraz większe pojemności, w konsekwencji czego coraz trudniej jest zapobiec interakcji elektrycznej ich komórek. W rezultacie wielokrotny dostęp do danego wiersza może spowodować zmianę bitów w sąsiednich wierszach.
Do kategorii nieinwazyjnych zalicza się również ataki kanałem bocznym (side-channel attacks). Polegają one na zbieraniu informacji o układzie będącym celem i/albo wpływaniu na niego przez pomiar i/lub wykorzystanie pośrednich efektów towarzyszących jego działaniu, na przykład w czasie wykonywania silnie obliczeniowo obciążających operacji kryptograficznych. Są to przede wszystkim: pobór mocy oraz emisja promieniowania elektromagnetycznego. Rejestruje się je i analizuje, wyszukując zależności oraz wzorców, które pozwolą na "odgadnięcie" zaszyfrowanych informacji. Podstawowym zabezpieczeniem przed atakami kanałem bocznym jest ograniczenie wycieków, które atakujący może wykorzystać, albo ich zaszumienie. To w tym przypadku uzyskuje się na przykład przez ograniczenie zależności poboru mocy od wartości danych i/lub realizowanych operacji.
Wstrzykiwanie błędów
Przykładem podejścia półinwazyjnego jest wstrzykiwanie błędów (fault injection). Ataki, które są zaliczane do tej kategorii, w ostatnim czasie znacznie zyskują na popularności, ponieważ są coraz łatwiejsze do przeprowadzenia. Ich istotą jest manipulowanie różnymi wielkościami, jak napięcie, w celu wywołania błędów w układzie scalonym. Te skutkują jego nieprzewidywalnym działaniem, na czego negatywne skutki liczy atakujący i je wykorzystuje.
Przykładem takiego ataku jest chwilowe obniżenie napięcia zasilania i/albo zmiana częstotliwości taktowania zegara w czasie wykonywania określonych operacji. Wstrzykiwanie błędów polega też na generowaniu zlokalizowanego, krótkotrwałego impulsu elektromagnetycznego o znacznej mocy, który wywołuje przepływ dodatkowego prądu w obwodach układu scalonego. Kolejny przykład to manipulacja przełączeniami tranzystorów na skutek naświetlenia komponentu laserem podczerwonym.
To ostatnie zwykle wymaga dekapsulacji układu scalonego w celu odsłonięcia krzemowej struktury. Ataki, które polegają na zmianach napięcia z kolei przeważnie wymuszają usunięcie kondensatorów filtrujących zasilanie. Możliwe jest jednak również przeprowadzenie ataków typu fault injection za pomocą samego oprogramowania, bez konieczności wprowadzania modyfikacji sprzętowych.
Jest to wykonalne m.in. w układach scalonych, w których regulatory napięcia i źródła sygnału zegara są przełączane programowo, zwykle w ramach realizacji funkcji DVFS (Dynamic Voltage Frequency Scaling), czyli dynamicznego skalowania napięcia zasilania i częstotliwości w celu ograniczenia zużycia energii. Wstrzykiwanie błędów może mieć rożne konsekwencje.
Skutki wstrzykiwania błędów
Wynikiem jest pomijanie fragmentów kodu, a celem są zwykle instrukcje porównania, których ominięcie skutkuje przejściem do kolejnych linii kodu, które przy danym wyniku porównania normalnie nie zostałyby wykonane. Pominięcie pojedynczej instrukcji jest łatwo osiągalne. Ominięcie większej ich liczby jest już jednak trudniejsze. Wstrzykiwanie może również powodować błędy resetowania bitów, czyli odwracania ich zawartości z 0 na 1 i odwrotnie. Zafałszowuje to dane i może prowadzić do uruchomienia przypadkowych instrukcji w kodzie. Konsekwencją ataku fault injection są także problemy z zapisem danych, w efekcie których na przykład rejestr albo stan pamięci nie zostają zaktualizowane mimo wykonania takiej instrukcji.
Skuteczność wstrzykiwania błędów oceniana jest w kategoriach precyzji czasowej i przestrzennej, która charakteryzuje zdolność atakującego do wpłynięcia na konkretny blok atakowanego układu w określonym czasie. Reguluje się ją, dobierając czas trwania i nasilenie zakłócenia, na przykład czas i poziom obniżenia napięcia zasilania czy nakierowując impuls elektromagnetyczny albo laserowy na miejsce o konkretnych współrzędnych w obrębie obudowy.
Skuteczność ataku
Ukierunkowane wstrzykiwanie błędów na określone urządzenia peryferyjne albo rdzenie procesora jest łatwiejsze w razie rozdzielenia zasilania i taktowania poszczególnych bloków. Atak może być na przykład skierowany na zasilanie pamięci SRAM, DRAM czy EEPROM, by uniemożliwić zapis określonych danych, bez wpływania na inne operacje procesora albo dotyczyć tylko rdzeni o znaczeniu krytycznym dla bezpieczeństwa, takich jak akceleratory kryptograficzne
Dokładność czasowa wstrzykiwania błędów ma szczególne znacznie, ponieważ pozwala uniknąć niepożądanych efektów ubocznych, jak reset całego układu. Osiąga się ją przez zsynchronizowanie zakłócenia ze zdarzeniem wyzwalającym, z zachowaniem odpowiedniego opóźnienia. Na przykład ataki na pamięci ROM są najczęściej dokonywane z ustalonym opóźnieniem po wyjściu układu z resetu, ze względu na jego deterministyczny przebieg. Jeśli determinizm czasowy operacji będącej celem ataku nie jest gwarantowany, na przykład z powodu jej zależności od działania zewnętrznych urządzeń peryferyjnych albo przez losowe opóźnienia, celowo wprowadzone w celu udaremnienia wstrzykiwania błędów, wybór wyzwalacza jest trudniejszy. Przykładami alternatyw są: obserwacja wzorców sygnałów zewnętrznych magistral komunikacyjnych, stanu zacisków GPIO, analiza zmienności poboru prądu lub emisji promieniowania elektromagnetycznego.
Planowanie ataku
Planując atak fault injection, trzeba najpierw scharakteryzować skutki, jakie może wywołać dane zakłócenie. Chodzi przeważnie o wprowadzenie układu będącego celem ataku w stan graniczny, czyli poza normalnym zakresem pracy, ale zarazem bez przekraczania akceptowalnych parametrów operacyjnych do tego stopnia, że układ zostanie automatycznie zresetowany albo w inny sposób przejdzie w stan bezpieczny. Z punktu widzenia hakera to właśnie ten stan przejściowy jest najkorzystniejszy, gdyż układ pracuje wówczas nieprawidłowo, na przykład pomija instrukcje kodu, ale poza tym kontynuuje działanie.
Następnie trzeba znaleźć podatną na ataki operację, na przykład identyfikując zdarzenie krytyczne z punktu widzenia bezpieczeństwa. Przykładem jest walidacja podpisu cyfrowego oprogramowania układowego. Zwykle wymaga to działań z zakresu inżynierii wstecznej atakowanego komponentu. Po wybraniu operacji docelowej atakujący powinien ustalić, kiedy jest ona faktycznie wykonywana. W tym celu można przeprowadzić atak kanałem bocznym. Praktykowane podejście metodą prób i błędów zakłada również zmienianie parametrów zakłócenia i obserwowanie, jaki efekt wywołuje to w atakowanym układzie. Planowanie wstrzyknięcia błędu jest przeważnie procesem iteracyjnym i czasochłonnym.
Cele i ochrona
Najczęściej ataki tego typu są skierowane na funkcjonalność bezpiecznego rozruchu, aby docelowo umożliwić atakującemu wykonanie dowolnego, potencjalnie złośliwego kodu. Omijanie walidacji kryptograficznego podpisu oprogramowania układowego czy zabezpieczeń odczytu pamięci, w celu ujawnienia poufnych danych, to kolejne przykłady.
Jeśli chodzi o ochronę przed wstrzykiwaniem błędów, realizuje się ją na poziomie sprzętowym, jak i programowo, m.in. przez powtarzanie sprawdzania spełnienia warunków instrukcji warunkowych, dublowanie instrukcji, refaktoryzację kodu, w celu zastąpienia łatwych do zakłócenia porównań boolowskich porównaniami bitowymi, trudniejszymi do zakłócenia, przechowywanie wartości o krytycznym znaczeniu w sposób redundantny, wprowadzanie losowych opóźnień po zdarzeniach zewnętrznych albo przed wrażliwymi operacjami.
Zabezpieczenia sprzętowe z kolei obejmują rozwiązania w zakresie detekcji i reagowania na próby wstrzykiwania błędów. Kiedy taki atak zostanie wykryty, najlepiej jest wywołać reset procesora, zamiast wymuszać powtórzenie zmanipulowanej instrukcji, ponieważ znacząco spowolni to kolejne próby zakłócenia danego fragmentu kodu przez atakującego.
Mechanizmy sprzętowe detekcji ataków fault injection to natomiast m.in.: szybko reagujące układy monitorowania napięcia oraz zabezpieczenia brown-out detection, wykrywające podejrzane wahania napięcia zasilania, zabezpieczenia typu tunable replica circuits, reagujące na zakłócenia napięcia i taktowania, obserwacja pętli synchronizacji fazowej, na którą silnie wpływają zakłócenia w postaci impulsu elektromagnetycznego, porównywanie zegarów zewnętrznych z zegarem wewnętrznym, czujniki w obudowie, które wykrywają dekapsulację.
Monika Jaworowska