Microsoft åpner CHERIoT, en maskinvareløsning for å forbedre C-kodesikkerheten

Microsoft har oppdaget utviklinger knyttet til CHERIoT-prosjektet (Capability Hardware Extension to RISC-V for Internet of Things), som har som mål å blokkere sikkerhetsproblemer i eksisterende kode i C og C++. CHERIoT tilbyr en løsning som lar deg beskytte eksisterende C/C++-kodebaser uten å måtte omarbeide dem. Beskyttelse implementeres ved bruk av en modifisert kompilator som bruker et spesielt utvidet sett med prosessorinstruksjoner (ISA), levert av prosessoren og på maskinvarenivå overvåker minnetilgang, kontrollerer riktigheten av arbeidet med pekere og sikrer isolasjon av kodeblokker.

Prosjektet ble opprettet med tanke på det faktum at lavnivået til C-språket blir en kilde til feil når du arbeider med minne, noe som fører til problemer som bufferoverløp, tilgang til allerede frigjort minne, pekereferanser eller doble frigjøringer . Praksis viser at selv store selskaper som Google og Microsoft, som har en streng endringsvurderingspolicy og bruker moderne utviklingsmetoder og statiske analyseverktøy, ikke kan garantere fravær av feil når de arbeider med minne (for eksempel ca. 70 % av sårbarhetene i Microsoft og Google er forårsaket av usikker minnehåndtering).

Problemet kan løses ved å bruke programmeringsspråk som garanterer sikker drift med minne, eller bindinger med ekstra kontroller, for eksempel ved å bruke i stedet for vanlige pekere som MiraclePtr (raw_ptr), som utfører tilleggssjekker for å få tilgang til frigjorte minneområder. Men slike metoder er mer egnet for ny kode, og omarbeiding av eksisterende C/C++-prosjekter er ganske problematisk, spesielt hvis de er designet for å kjøre i ressursbegrensede miljøer, for eksempel innebygde systemer og Internet of Things-enheter.

CHERIoT maskinvarekomponenter er designet som en mikrokontroller basert på RISC-V-arkitekturen, og implementerer den beskyttede CHERI (Capability Hardware Extension to RISC-V) prosessorarkitekturen, som gir en modell for kontrollert minnetilgang basert på "kapasitet" (hver lesing og skriving) drift til minne er autorisert). Basert på instruksjonssettarkitekturen (ISA) gitt i CHERIoT, er det bygget en programvaremodell som garanterer sikkerheten ved å arbeide med minne på nivå med individuelle objekter, gir beskyttelse mot tilgang til allerede frigjort minne, og implementerer et lett isolasjonssystem for minnetilgang. . Den spesifiserte programvarebeskyttelsesmodellen reflekteres direkte i språkmodellen C/C++, som gjør at den kan brukes til å beskytte eksisterende applikasjoner (kun rekompilering og kjøring på utstyr som støtter ISA CHERIoT er nødvendig).

Den foreslåtte løsningen lar deg blokkere feil som får et objekt til å gå utover minnets grenser, tillater ikke pekererstatning (alle pekere må genereres fra eksisterende pekere), og overvåker minnetilgang etter frigjøring (enhver tilgang til minne ved bruk av feil peker eller en peker som refererer til et frigjort objekt resulterer i at et unntak blir kastet). Ved å bruke CHERIoT kan du for eksempel implementere automatisk grensekontroll, sporing av minnelevetid og håndhevelse av pekerintegritet i komponenter som håndterer uklarerte data uten å kreve noen kodeendringer.

Prosjektet inkluderer en spesifikasjon av den utvidede CHERIoT instruksjonssettarkitekturen, en referanseimplementering av en 32-biters RISC-V CPU som støtter CHERIoT ISA, og et modifisert LLVM verktøysett. CPU-prototypediagrammer og maskinvareblokkbeskrivelser i Verilog distribueres under Apache 2.0-lisensen. Ibex-kjernen fra lowRISC-prosjektet ble brukt som grunnlag for CPU. CHERIoT ISA-kodemodellen er definert på Sail-språket og er lisensiert under BSD-lisensen.

I tillegg foreslås en prototype av CHERIoT RTOS sanntidsoperativsystemet, som gir muligheten til å isolere rom selv på innebygde systemer med 256 MB RAM. CHERIOT RTOS-koden er skrevet i C++ og distribueres under MIT-lisensen. De grunnleggende komponentene i operativsystemet, som bootloader, planlegger og minnedistribusjonssystem, er designet i form av rom.

Et rom i CHERIoT RTOS er en isolert kombinasjon av kode og globale variabler som ligner et delt bibliotek, men i motsetning til sistnevnte kan den endre tilstanden (mutbar) og kjøre i en separat sikkerhetskontekst. Ingen kode utenfra kan overføre kontroll til kode i et rom og få tilgang til objekter, bortsett fra ved å få tilgang til spesielt definerte inngangspunkter og bruke pekere til objekter som eksplisitt sendes når du ringer en annen avdeling. Integritet og konfidensialitet er garantert for kode og globale objekter i et rom.

Kilde: opennet.ru

Legg til en kommentar