Spoločnosť Microsoft otvorila prípravy na projekt CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), ktorý je zameraný na riešenie problémov so zabezpečením existujúceho kódu napísaného v jazykoch C a C++. CHERIoT ponúka riešenie, ktoré umožňuje chrániť existujúce kódové základy v C/C++ bez potreby ich prepracovania. Ochrana sa implementuje prostredníctvom použitia modifikovaného kompilátora, ktorý využíva špeciálnu rozšírenú sadu inštrukcií procesora (ISA), ktorá na hardvérovej úrovni sleduje prístup k pamäti, overuje správnosť práce s ukazovateľmi a zabezpečuje izoláciu blokov kódu.
Projekt bol vytvorený s ohľadom na to, že nízkoúrovňová povaha jazyka C je zdrojom chýb pri práci s pamäťou, čo vedie k problémom ako pretečenie zásobníka, prístup k už uvoľnenej pamäti, dereferencovanie ukazovateľov alebo dvojité uvoľnenie pamäti. Prax ukazuje, že aj veľké korporácie, ako Google a Microsoft, ktoré majú prísnu politiku recenzovania zmien a používajú moderné metódy vývoja a nástroje statickej analýzy, nedokážu zaručiť absenciu chýb pri práci s pamäťou (napríklad, približne 70% zraniteľností v softvérových produktoch Microsoftu a Googlu je spôsobených nebezpečnou prácou s pamäťou).
Problém môže byť vyriešený použitím programovacích jazykov, ktoré zaručujú bezpečnú prácu s pamäťou, alebo obalov s dodatočnými kontrolami, napríklad použitím namiesto bežných ukazovateľov typu MiraclePtr (raw_ptr), ktorý vykonáva dodatočné kontroly prístupu k uvoľneným oblastiam pamäti. Avšak takéto metódy sa viacej hodia pre nový kód, zatiaľ čo existujúce projekty v C/C++ je ťažké prepracovať, najmä ak sú určené na vykonávanie v prostrediach s obmedzenými zdrojmi, ako sú zabudované systémy a zariadenia internetu vecí.
Hardvérové komponenty CHERIoT sú navrhnuté ako mikrokontrolér založený na architektúre RISC-V, implementujúci bezpečnú procesorovú architektúru CHERI (Capability Hardware Extension to RISC-V), ktorá poskytuje model riadeného prístupu k pamäti založený na „capability“ (každá operácia čítania a zápisu do pamäti je autorizovaná). Na základe architektúry sady inštrukcií (ISA) poskytnutej v CHERIoT je vybudovaný softvérový model, ktorý zaručuje bezpečnosť pri práci s pamäťou na úrovni jednotlivých objektov, poskytuje ochranu pred prístupom k už uvoľnenej pamäti a realizuje ľahký systém izolácie prístupu k pamäti. Uvedený softvérový model ochrany sa priamo odráža v jazykovom modeli C/C++, čo umožňuje jeho použitie na ochranu existujúcich aplikácií (vyžaduje sa iba prekompilácia a spustenie na hardvéri, ktorý podporuje ISA CHERIoT).
Navrhnuté riešenie umožňuje blokovať chyby, ktoré spôsobujú prekročenie hraníc objektu v pamäti, zabraňuje podvrhovaniu ukazovateľov (všetky ukazovatele musia pochádzať z už existujúcich ukazovateľov), sleduje prístup k pamäti po jej uvoľnení (akýkoľvek prístup k pamäti cez nesprávny ukazovateľ alebo ukazovateľ odkazujúci na uvoľnený objekt vedie k generovaniu výnimky). Napríklad použitie CHERIoT umožňuje bez zmien v kóde realizovať automatickú kontrolu hraníc, sledovanie životnosti oblastí pamäte a zabezpečiť integritu ukazovateľov v komponentoch, ktoré spracovávajú nedôveryhodné dáta.
Projekt obsahuje špecifikáciu rozšírenej architektúry sady inštrukcií CHERIoT, referenčnú implementáciu 32-bitového CPU RISC-V s podporou ISA CHERIoT a modifikovaný nástroj LLVM. Schémy prototypu CPU a popisy hardvérových blokov v jazyku Verilog sú šírené pod licenciou Apache 2.0. Ako základ pre CPU bolo použité jadro Ibex z projektu lowRISC. Model kódu CHERIoT ISA je definovaný v jazyku Sail a je šírený pod licenciou BSD.
Dodatočne je predstavený prototyp operačného systému reálneho času CHERIoT RTOS, ktorý poskytuje možnosť izolácie kompartimentov (compartment) aj na embedded systémoch s 256 MB RAM. Kód CHERIoT RTOS je napísaný v jazyku C++ a šíri sa pod licenciou MIT. V podobe kompartimentov sú spracované základné komponenty OS, ako sú bootloader, plánovač a systém správy pamäte.
Kompartmán v CHERIoT RTOS predstavuje izolovanú kombináciu kódu a globálnych premenných, ktorá pripomína zdieľanú knižnicu, ale na rozdiel od nej môže meniť svoj stav (mutable) a spúšťať sa v samostatnom bezpečnostnom kontexte. Žiadny kód zvonka nemôže odovzdať ovládanie kódu v kompartmánu ani získať prístup k objektom, okrem volania špeciálne definovaných vstupných bodov a použitia ukazovateľov na objekty, ktoré sú explicitne predané pri volaní iného kompartmánu. Pre kód a globálne objekty v kompartmáne je zaručená integrita a dôvernosť.
Zdroj: opennet.ru
