Výskumníci zo Stanfordovej univerzity, Kalifornskej univerzity v San Diegu a Texanskej univerzity v Austine nástroj , ktorý môže slúžiť ako dodatočná úroveň izolácie na blokovanie zraniteľností v knižniciach funkcií. RLBox je zameraný na riešenie problémov s bezpečnosťou nespoľahlivých externých knižníc, ktoré nie sú pod kontrolou vývojárov, ale zraniteľnosti v nich môžu ohroziť hlavný projekt.
Spoločnosť Mozilla implementovať RLBox v linuxových zostavách Firefox 74 a macOS zostavách Firefox 75 na izoláciu vykonávania knižnice , ktorá je zodpovedná za vykresľovanie písiem. RLBox nie je špecifický len pre Firefox a môže sa používať na izoláciu akýchkoľvek knižníc v rôznych projektoch. RLBox pod licenciou MIT. V súčasnosti RLBox podporuje fungovanie na platformách Linux a macOS, podpora Windows sa očakáva neskôr.
činnosť RLBox spočíva v preklade C/C++ kódu izolovanej knižnice do nízkoúrovňového medziproduktu WebAssembly, ktorý je potom spracovaný ako WebAssembly modul, ktorého oprávnenia sú obmedzené iba na tento modul (napríklad knižnica na spracovanie reťazcov nebude schopná otvoriť sieťový socket alebo súbor). Prevod C/C++ kódu na WebAssembly sa realizuje pomocou .
Na priame vykonávanie sa WebAssembly modul prekladá do strojového kódu pomocou kompilátora a vykonáva sa v oddelenom "nanoprocesse", ktorý je izolovaný od zvyšku pamäte aplikácie. Kompilátor Lucet je založený na rovnakom kóde ako JIT engine , ktorý sa používa v Firefoxe na vykonávanie WebAssembly.
Skompilovaný modul pracuje v oddelenom priestore pamäte a nemá prístup k ostatnému adresnému priestoru. V prípade zneužitia zraniteľnosti v knižnici bude útočník obmedzený a nebude schopný získať prístup k oblastiam pamäte hlavného procesu alebo preniesť riadenie mimo izolovaného prostredia.
Pre vývojárov je poskytnuté vysokoúrovňové , ktorý umožňuje volať funkcie knižnice v izolačnom režime. WebAssembly spracovatelia si takmer nevyžadujú ďalšie zdroje a interakcia s nimi nie je výrazne pomalšia než volanie bežných funkcií (funkcie knižnice sa vykonávajú vo forme natívneho kódu a náklady vznikajú iba pri kopírovaní a kontrole údajov počas interakcie s izolovaným prostredím). Funkcie izolovanej knižnice nemôžu byť volané priamo a pre ich prístup je potrebné použiť
medzivrstvu invoke_sandbox_function().
Na druhej strane, ak je potrebné z knižnice volať vonkajšie funkcie, tieto funkcie musia byť výslovne definované pomocou metódy register_callback (podľa predvolenia RLBox poskytuje prístup k funkciám ). Na zabezpečenie bezpečnej práce s pamäťou (memory safety) izolácia vykonávania kódu nestačí a je potrebné zabezpečiť aj kontrolu vracaných tokov údajov.
Hodnoty vytvorené v izolovanom prostredí sú označené ako nedôveryhodné, sú obmedzené pomocou a na 'vyčistenie' potrebujú a kopírovanie do pamäte aplikácie.
Bez vyčistenia, pokus o použitie tainted údajov v kontexte, ktorý vyžaduje obyčajné údaje (a naopak), vedie k vygenerovaniu chýb počas kompilácie. Malé argumenty funkcií, vracané hodnoty a štruktúry sa prenášajú cez kopírovanie medzi pamäťou procesu a pamäťou izolovaného prostredia. Pre väčšie údaje sa pamäť prideľuje v izolovanom prostredí a hlavný proces dostáva priamy ukazovateľ 'sandbox-reference'.
Zdroj: opennet.ru
