Microsoft otevírá CHERIoT, hardwarové řešení pro zlepšení zabezpečení kódu C

Microsoft objevil vývoj související s projektem CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), jehož cílem je blokovat bezpečnostní problémy v existujícím kódu v C a C++. CHERIoT nabízí řešení, které vám umožní chránit stávající kódové báze C/C++ bez nutnosti jejich přepracování. Ochrana je realizována pomocí upraveného kompilátoru, který využívá speciální rozšířenou sadu instrukcí procesoru (ISA), kterou zajišťuje procesor a na hardwarové úrovni monitoruje přístup do paměti, kontroluje správnost práce s ukazateli a zajišťuje izolaci bloků kódu.

Projekt byl vytvořen s ohledem na skutečnost, že nízkoúrovňová povaha jazyka C se stává zdrojem chyb při práci s pamětí, což vede k problémům, jako je přetečení vyrovnávací paměti, přístup k již uvolněné paměti, dereference ukazatelů nebo dvojité uvolnění . Praxe ukazuje, že ani velké korporace jako Google a Microsoft, které mají přísnou politiku kontroly změn a používají moderní vývojové metody a nástroje statické analýzy, nemohou zaručit absenci chyb při práci s pamětí (např. asi 70 % zranitelností v Microsoft a Google jsou způsobeny nebezpečným zacházením s pamětí).

Problém lze vyřešit použitím programovacích jazyků, které zaručují bezpečný provoz s pamětí, nebo vazeb s dodatečnými kontrolami, například použitím namísto běžných ukazatelů jako MiraclePtr (raw_ptr), který provádí dodatečné kontroly pro přístup k uvolněným oblastem paměti. Ale takové metody jsou vhodnější pro nový kód a přepracování stávajících C/C++ projektů je značně problematické, zvláště pokud jsou navrženy tak, aby běžely v prostředí s omezenými zdroji, jako jsou vestavěné systémy a zařízení internetu věcí.

Hardwarové komponenty CHERIoT jsou navrženy jako mikrokontroléry založené na architektuře RISC-V, implementují chráněnou architekturu procesoru CHERI (Capability Hardware Extension to RISC-V), která poskytuje model řízeného přístupu k paměti na základě „schopnosti“ (každé čtení a zápis operace do paměti je autorizována). Na základě architektury instrukční sady (ISA) poskytované v CHERIoT je sestaven softwarový model, který zaručuje bezpečnost práce s pamětí na úrovni jednotlivých objektů, poskytuje ochranu před přístupem k již uvolněné paměti a implementuje odlehčený systém izolace přístupu do paměti. . Uvedený model softwarové ochrany se přímo odráží v jazykovém modelu C/C++, což umožňuje jeho použití k ochraně stávajících aplikací (je vyžadována pouze rekompilace a spuštění na zařízení, které podporuje ISA CHERIoT).

Navrhované řešení umožňuje blokovat chyby, které způsobí, že objekt překročí hranice paměti, neumožňuje substituci ukazatelů (všechny ukazatele musí být generovány z existujících ukazatelů) a monitoruje přístup k paměti po uvolnění (jakýkoli přístup k paměti pomocí nesprávného ukazatel nebo ukazatel odkazující na uvolněný objekt má za následek vyvolání výjimky). Použití CHERIoT vám například umožňuje implementovat automatickou kontrolu hranic, sledování životnosti paměti a vynucování integrity ukazatelů v komponentách, které zpracovávají nedůvěryhodná data, aniž by vyžadovaly jakékoli změny kódu.

Projekt zahrnuje specifikaci rozšířené architektury instrukční sady CHERIoT, referenční implementaci 32bitového RISC-V CPU podporujícího CHERIoT ISA a upravenou sadu nástrojů LLVM. Diagramy prototypů CPU a popisy hardwarových bloků ve Verilog jsou distribuovány pod licencí Apache 2.0. Jako základ pro CPU bylo použito jádro Ibex z projektu lowRISC. Model kódu CHERIoT ISA je definován v jazyce Sail a je licencován pod licencí BSD.

Navíc je navržen prototyp operačního systému v reálném čase CHERIoT RTOS, který poskytuje schopnost izolovat oddíly i na vestavěných systémech s 256 MB RAM. Kód CHERIoT RTOS je napsán v C++ a je distribuován pod licencí MIT. Základní součásti OS, jako je bootloader, plánovač a distribuční systém paměti, jsou navrženy ve formě oddílů.

Oddíl v CHERIoT RTOS je izolovaná kombinace kódu a globálních proměnných, která se podobá sdílené knihovně, ale na rozdíl od posledně jmenované může změnit svůj stav (proměnlivý) a běžet v samostatném kontextu zabezpečení. Žádný kód zvenčí nemůže přenést kontrolu na kód v přihrádce a přistupovat k objektům, s výjimkou přístupu ke speciálně definovaným vstupním bodům a používání ukazatelů na objekty explicitně předané při volání jiné přihrádky. Integrita a důvěrnost jsou zaručeny pro kód a globální objekty v přihrádce.

Zdroj: opennet.ru

Přidat komentář