Compania Microsoft a deschis lucrările legate de proiectul CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things), destinat să blocheze problemele de securitate din codul existent scris în limbajele C și C++. CHERIoT oferă o soluție care permite protejarea bazelor de cod existente în C/C++ fără a fi nevoie de reimplementare. Protecția este realizată prin utilizarea unui compilator modificat, care folosește un set extins special de instrucțiuni procesor (ISA), furnizate de procesor și la nivel de hardware, care monitorizează accesul la memorie, verifică corectitudinea manipulării pointere și asigură izolarea blocurilor de cod.
Proiectul a fost creat având în vedere că natura de nivel scăzut a limbajului C devine o sursă de erori în gestionarea memoriei, ducând la astfel de probleme precum depășirea bufferelor, accesarea memoriei deja eliberate, dereferențierea pointerelor sau eliberarea dublă a memoriei. Practica arată că chiar și companii mari, cum ar fi Google și Microsoft, care au politici stricte de revizuire a modificărilor și utilizează metode moderne de dezvoltare și instrumente de analiză statică, nu pot garanta absența erorilor în gestionarea memoriei (de exemplu, aproximativ 70% din vulnerabilitățile produselor software Microsoft și Google sunt cauzate de gestionarea nesigură a memoriei).
Problema poate fi rezolvată prin utilizarea limbajelor de programare care garantează o gestionare sigură a memoriei sau prin legături cu verificări suplimentare, de exemplu, prin utilizarea în loc de pointere obișnuite a tipului MiraclePtr (raw_ptr), care efectuează verificări suplimentare asupra accesului la zonele de memorie eliberate. Dar astfel de metode sunt mai potrivite pentru codul nou, iar proiectele existente în C/C++ sunt dificil de refăcut, în special dacă sunt destinate să funcționeze în medii cu resurse limitate, precum sistemele încorporate și dispozitivele Internet of Things.
Componente hardware CHERIoT sunt organizate sub forma unui microcontroler bazat pe arhitectura RISC-V, care implementează arhitectura de procesor protejat CHERI (Capability Hardware Extension to RISC-V), oferind un model de acces controlat la memorie bazat pe „capability” (fiecare operațiune de citire și scriere în memorie este autorizată). Pe baza arhitecturii setului de instrucțiuni (ISA) oferite în CHERIoT, este construit un model software care garantează siguranța operării cu memoria la nivelul obiectelor individuale, oferind protecție împotriva accesului la memorie deja eliberată și realizând un sistem ușor de izolare a accesului la memorie. Acest model software de protecție se reflectă direct în modelul lingvistic C/C++, permițând utilizarea sa pentru protecția aplicațiilor existente (este necesară doar recompilarea și lansarea pe hardware care suportă ISA CHERIoT).
Soluția propusă permite blocarea erorilor care cauzează ieșiri în afara limitelor obiectului în memorie, nu permite substituirea pointerelor (toate pointerele trebuie să fie generate din pointere deja existente), urmărește accesul la memorie după eliberare (orice acces la memorie printr-un pointer greșit sau un pointer care face referire la un obiect eliberat va genera o excepție). De exemplu, utilizarea CHERIoT permite implementarea automată a verificării limitelor, urmăririi duratei de viață a zonelor de memorie și asigurarea integrității pointerelor în componentele care procesează date nesigure, fără a necesita modificări ale codului.
Proiectul include specificația arhitecturii extinse a setului de instrucțiuni CHERIoT, o implementare de referință a unui CPU RISC-V pe 32 de biți cu suport pentru ISA CHERIoT și un instrumentar LLVM modificat. Schemele prototipului CPU și descrierile blocurilor hardware în limbajul Verilog sunt distribuite sub licența Apache 2.0. Ca bază pentru CPU a fost utilizat nucleul Ibex din proiectul lowRISC. Modelul de cod CHERIoT ISA este definit în limbajul Sail și distribuit sub licența BSD.
De asemenea, a fost propus un prototip de sistem de operare în timp real CHERIoT RTOS, care oferă posibilitatea izolării compartimentelor (compartment) chiar și pe sisteme încorporate cu 256 MB RAM. Codul CHERIoT RTOS este scris în C++ și este distribuit sub licența MIT. Componentele de bază ale sistemului de operare sunt structurate sub formă de compartimente, cum ar fi bootloader-ul, scheduler-ul și sistemul de gestionare a memoriei.
Compartimentul din CHERIoT RTOS reprezintă o combinație izolată de cod și variabile globale, care seamănă cu o bibliotecă partajată, dar, spre deosebire de aceasta, își poate schimba starea (mutable) și se poate rula într-un context de securitate separat. Niciun cod din exterior nu poate transfera controlul către codul din compartiment și nu poate accesa obiectele, cu excepția apelării unor puncte de intrare special definite și utilizării pointerilor la obiecte, explicit transmiși la apelarea altui compartiment. Integritatea și confidențialitatea codului și obiectelor globale din compartiment sunt garantate.
Sursa: opennet.ro
