Firma Microsoft otwiera CHERIOT, rozwiązanie sprzętowe poprawiające bezpieczeństwo kodu C

Microsoft odkrył zmiany związane z projektem CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), których celem jest blokowanie problemów bezpieczeństwa w istniejącym kodzie w językach C i C++. CHERIoT oferuje rozwiązanie, które pozwala chronić istniejące bazy kodu C/C++ bez konieczności ich przeróbki. Ochrona realizowana jest poprzez zastosowanie zmodyfikowanego kompilatora, wykorzystującego specjalny rozszerzony zestaw instrukcji procesorowych (ISA), dostarczanych przez procesor i na poziomie sprzętowym monitorującym dostęp do pamięci, sprawdzającym poprawność pracy ze wskaźnikami oraz zapewniającym izolację bloków kodu.

Projekt powstał z myślą o tym, że niskopoziomowy charakter języka C staje się źródłem błędów podczas pracy z pamięcią, prowadzących do problemów takich jak przepełnienia bufora, dostęp do już zwolnionej pamięci, wyłuskiwanie wskaźników, czy podwójne zwalnianie . Praktyka pokazuje, że nawet duże korporacje, takie jak Google i Microsoft, które mają rygorystyczną politykę przeglądu zmian i korzystają z nowoczesnych metod programistycznych i narzędzi analizy statycznej, nie mogą zagwarantować braku błędów podczas pracy z pamięcią (przykładowo około 70% podatności w Microsoft i Google są spowodowane niebezpieczną obsługą pamięci).

Problem można rozwiązać stosując języki programowania gwarantujące bezpieczną pracę z pamięcią, lub powiązania z dodatkowymi kontrolami, na przykład stosując zamiast zwykłych wskaźników typu MiraclePtr (raw_ptr), który wykonuje dodatkowe kontrole dostępu do zwolnionych obszarów pamięci. Jednak takie metody są bardziej odpowiednie w przypadku nowego kodu, a przeróbka istniejących projektów C/C++ jest dość problematyczna, zwłaszcza jeśli są one zaprojektowane do działania w środowiskach o ograniczonych zasobach, takich jak systemy wbudowane i urządzenia Internetu rzeczy.

Komponenty sprzętowe CHERIoT zaprojektowano jako mikrokontroler oparty na architekturze RISC-V, realizujący chronioną architekturę procesora CHERI (Capability Hardware Extension to RISC-V), która zapewnia model kontrolowanego dostępu do pamięci w oparciu o „możliwość” (każdy odczyt i zapis operacja na pamięci jest autoryzowana). W oparciu o architekturę zestawu instrukcji (ISA) dostarczoną w CHERIoT budowany jest model oprogramowania gwarantujący bezpieczeństwo pracy z pamięcią na poziomie poszczególnych obiektów, zapewniający ochronę przed dostępem do już zwolnionej pamięci oraz implementujący lekki system izolacji dostępu do pamięci . Podany model ochrony oprogramowania ma bezpośrednie odzwierciedlenie w modelu języka C/C++, co pozwala na wykorzystanie go do ochrony istniejących aplikacji (wymagana jest jedynie rekompilacja i uruchomienie na sprzęcie obsługującym ISA CHERIoT).

Zaproponowane rozwiązanie pozwala blokować błędy powodujące wyjście obiektu poza granice pamięci, nie pozwala na podstawienie wskaźników (wszystkie wskaźniki muszą być generowane z istniejących wskaźników) oraz monitoruje dostęp do pamięci po jej zwolnieniu (każdy dostęp do pamięci przy użyciu nieprawidłowego wskaźnik lub wskaźnik odwołujący się do uwolnionego obiektu powoduje zgłoszenie wyjątku). Na przykład użycie CHERIoT umożliwia wdrożenie automatycznego sprawdzania granic, śledzenia czasu życia pamięci i egzekwowania integralności wskaźników w komponentach obsługujących niezaufane dane bez konieczności wprowadzania jakichkolwiek zmian w kodzie.

Projekt obejmuje specyfikację rozszerzonej architektury zestawu instrukcji CHERIoT, referencyjną implementację 32-bitowego procesora RISC-V obsługującego CHERIoT ISA oraz zmodyfikowany zestaw narzędzi LLVM. Diagramy prototypów procesorów i opisy bloków sprzętowych w Verilog są rozpowszechniane na licencji Apache 2.0. Jako podstawę procesora wykorzystano rdzeń Ibex z projektu lowRISC. Model kodu CHERIoT ISA jest zdefiniowany w języku Sail i jest objęty licencją BSD.

Dodatkowo zaproponowano prototyp systemu operacyjnego czasu rzeczywistego CHERIOT RTOS, który zapewnia możliwość izolowania przedziałów nawet na systemach wbudowanych z 256 MB pamięci RAM. Kod CHERIoT RTOS jest napisany w języku C++ i jest rozpowszechniany na licencji MIT. Podstawowe komponenty systemu operacyjnego, takie jak program ładujący, program planujący i system dystrybucji pamięci, zaprojektowano w formie przedziałów.

Komora w CHERIoT RTOS to izolowana kombinacja kodu i zmiennych globalnych, która przypomina bibliotekę współdzieloną, ale w przeciwieństwie do tej ostatniej może zmieniać swój stan (modyfikowalny) i działać w osobnym kontekście bezpieczeństwa. Żaden kod z zewnątrz nie może przekazać kontroli kodowi w przedziale i uzyskać dostępu do obiektów, z wyjątkiem dostępu do specjalnie zdefiniowanych punktów wejścia i użycia wskaźników do obiektów jawnie przekazywanych podczas wywoływania innego przedziału. Gwarantowana jest integralność i poufność kodu i obiektów globalnych w przedziale.

Źródło: opennet.ru

Dodaj komentarz