W tym wpisie na blogu przyjrzymy się, w jaki sposób technologie wprowadzone w celu zwiększenia wydajności procesora doprowadziły do powstania luk w zabezpieczeniach, takich jak Meltdown i Spectre.
Jeśli interesują Cię wiadomości z branży IT, możesz pamiętać problemy z bezpieczeństwem znane jako „Meltdown” i „Spectre”, które miały miejsce jakiś czas temu. Te dwa błędy to potężne luki w zabezpieczeniach, które umożliwiają kradzież informacji bez wiedzy kogokolwiek, niezależnie od rodzaju celu. Tradycyjne narzędzia ataku, takie jak wirusy i złośliwe oprogramowanie, są łatwo wykrywane przez oprogramowanie antywirusowe, ponieważ pozostawiają ślady swoich ataków. Jednak Meltdown i Spectre mogą uzyskać dostęp do rdzenia programów komputerowych bez pozostawiania jakichkolwiek śladów. Wynika to z zasad leżących u podstaw Meltdown i Spectre. W tym artykule wyjaśnimy, jak działają nowoczesne komputery i zasady leżące u podstaw błędu Meltdown, który to wykorzystuje.
Najpierw przyjrzyjmy się, jak działają komputery. Komputery można ogólnie podzielić na CPU do obliczeń i RAM do nagrywania. CPU oznacza Central Processing Unit, która odpowiada za ogólne zadanie obliczania i przetwarzania danych zgodnie z instrukcjami. RAM oznacza Random Access Memory, która przechowuje serię poleceń, które CPU musi wykonać, oraz pośrednie wyniki obliczeń. Te obliczenia obejmują informacje o programie, od małych elementów, takich jak stan zdrowia gracza w aktualnie rozgrywanej grze, po duże elementy, takie jak informacje o systemie operacyjnym i jądrze, które są kluczowe dla działania komputera.
Podczas korzystania z pamięci RAM procesor zapisuje dane za pomocą adresów. Komputery nie mogą swobodnie zapisywać liczb i liter, tak jak robimy to na notebooku. Wszystkie rekordy są tworzone w bajtach, które są sekwencją ośmiu zer i jedynek. Po przekonwertowaniu na system dziesiętny w pamięci RAM można przechowywać tylko liczby od 0 do 1. Podczas zapisywania znaków każdy znak jest konwertowany na odpowiadającą mu liczbę i przechowywany. Na przykład ciąg znaków „apple” jest konwertowany na 0, 255, 97, 112 i 112 i przechowywany w pamięci RAM w odpowiedniej kolejności.
Pamięć RAM była rewolucyjna pod względem szybkości, gdy została po raz pierwszy opracowana, ale wraz z rozwojem komputerów, pamięć szybsza niż RAM stała się niezbędna. Typowym przykładem jest pamięć podręczna. Pamięć podręczna ma podobną funkcję do pamięci RAM, ale jest przestrzenią pamięci, która znajduje się w oddzielnej lokalizacji. Pamięć podręczna jest zasadniczo wbudowana w procesor i jest znacznie szybsza niż pamięć RAM, ale ma mniejszą pojemność. Procesor znacznie zwiększa szybkość przetwarzania, przechowując wyniki obliczeń, które prawdopodobnie będą często używane podczas przetwarzania instrukcji w pamięci podręcznej zamiast w pamięci RAM.
Tymczasem wraz ze wzrostem wydajności komputera, szybkość przetwarzania wymagana przez programy również wzrosła, a CPU nie mógł już sprostać wymaganiom programów korzystających z klasycznej metody przetwarzania sekwencyjnego. Osiągnęła ona swoje fizyczne granice. Dlatego około 2000 roku producenci CPU wprowadzili nową funkcję zwaną wykonywaniem poza kolejnością. Polecenia są przechowywane sekwencyjnie w pamięci RAM, ale CPU wykonuje polecenia, które pojawiają się jako pierwsze i przechowuje wyniki. Gdy później potrzebne są inne polecenia, CPU szybko pobiera wyniki obliczeń przechowywane w pamięci podręcznej, co poprawia ogólną szybkość przetwarzania.
W takim przypadku, jeśli polecenie wykonane wcześniej okaże się później nieważne, jak zareaguje procesor? Na przykład, jeśli zażądane zostaną dane hasła dla konta administratora przechowywane w pamięci RAM, procesor musi przerwać wykonywanie tego polecenia. Jednak w przypadku wykonywania niesekwencyjnego polecenie jest wykonywane bez sprawdzania jego ważności, a dane wynikowe są przechowywane w pamięci podręcznej. Jeśli program zażąda tych danych wynikowych w normalny sposób, nawet jeśli polecenie zostało wykonane wcześniej, żądanie zostanie odrzucone, ale w tej strukturze wystąpi błąd, a Meltdown wykorzysta tę słabość.
Przyjrzyjmy się teraz strukturze programu ataku Meltdown. Jedyne, czego potrzebujesz, to stoper, aby zmierzyć czas potrzebny na odczytanie danych. Najpierw wyczyść pamięć podręczną, obliczając jej pojemność. Ma to na celu zainicjowanie danych w pamięci podręcznej i wyeliminowanie wszelkich zbiegów okoliczności. Następnie uzyskaj dane z określonego adresu w pamięci RAM, który zawiera ważne dane, które chcesz poznać (nazwijmy te dane α) i przechowuj losowe dane w tej samej przestrzeni, co adres 1000+α w pamięci. To polecenie jest odrzucane, ponieważ próbuje pobrać dane z chronionego adresu (który musi być chroniony, ponieważ zawiera informacje o systemie operacyjnym), ale z powodu przetwarzania niesekwencyjnego jest wykonywane przed odrzuceniem, a dane pod adresem 1000+α są przechowywane w pamięci podręcznej.
Następnie atakujący odczytuje pamięć i mierzy czas potrzebny na odczytanie danych z każdego adresu. Generalnie prędkość dostępu jest stała, ale niektóre adresy odczytują dane z prędkością znacznie szybszą niż inne. Są to adresy 1000+α, które zostały właśnie obliczone i zapisane. Ostatecznie, po zidentyfikowaniu adresów zapisanych w pamięci podręcznej, można określić wartość 1000+α i znaleźć wartość α, tj. ważne informacje systemowe. Powtarzając ten proces, można wyodrębnić wszystkie informacje ważne dla bezpieczeństwa komputera, w tym hasło konta administratora.
Powodem, dla którego Meltdown jest tak przerażający, jest to, że technika wykonywania niesekwencyjnego jest technologią stosowaną do wszystkich procesorów Intel, a nawet jeśli nie jest to Intel, jest również stosowana przez Qualcomm i Samsung, które produkują głównie procesory do urządzeń mobilnych. Innymi słowy, prawie wszystkie urządzenia elektroniczne na Ziemi są narażone na to zagrożenie. Konkurent Intela, AMD, nie jest narażony na Meltdown, ponieważ najpierw sprawdza polecenia podczas wykonywania poza kolejnością, ale jest narażony na Spectre, trudniejszy do opanowania błąd, który atakuje luki w wykonywaniu spekulatywnym, które nie jest wykonywaniem poza kolejnością. W rezultacie wszystkie procesory są narażone na błąd Spectre-Meltdown.
Wiele systemów operacyjnych, w tym Windows, wydało awaryjne poprawki, aby rozwiązać te błędy, ale ponieważ ataki nie pozostawiają śladów, nie można stwierdzić, czy komputer został zaatakowany przed zainstalowaniem poprawki. Co więcej, nawet po zainstalowaniu poprawki, która nie była podstawowym rozwiązaniem, a jedynie sposobem na zablokowanie wykonywania niesekwencyjnego, prędkość przetwarzania komputera znacznie spadła. Ponieważ jest to problem z konstrukcją procesora, jedynym rozwiązaniem jest wymiana sprzętu.
Do tej pory wyjaśniliśmy, jak działają współczesne komputery i jak Meltdown to wykorzystuje. Procesor, który odpowiada za obliczenia w komputerach, ma funkcję wykonywania niesekwencyjnego, która wykonuje polecenia z wyprzedzeniem, przechowuje je i odzyskuje w razie potrzeby, co znacznie zwiększa szybkość przetwarzania. Jednak luki wynikające z tego procesu doprowadziły do poważnych luk w zabezpieczeniach. Istnieje również błąd o nazwie Spectre, ale ponieważ wyjaśnienie Spectre wymaga dodatkowego wyjaśnienia spekulatywnego wykonania i technik ataku, nie będziemy go tutaj wyjaśniać. Jednak Spectre to również przypadek, w którym technologia wprowadzona w celu poprawy wydajności procesora spowodowała problemy. Mamy nadzieję, że posłuży to jako precedens do głębokiego zastanowienia się nad poprawą wydajności w dziedzinach innych niż komputery i sprawdzenia, czy nie pomijamy czegoś ważnego.