Gli sviluppatori del progetto Chromium Sono state identificate 912 vulnerabilità pericolose e critiche nelle versioni stabili di Chrome dal 2015, e si è giunti alla conclusione che il 70% di esse è stato causato da un utilizzo non sicuro della memoria (errori di gestione dei puntatori nel codice C/C++). La metà di questi problemi (36,1%) è dovuta ad accessi al buffer dopo il rilascio della memoria ad esso associata (use-after-free).
Nella progettazione di Chromium si è inizialmente , che nel codice potevano verificarsi errori, per cui si puntava molto sull'applicazione della sandboxing per limitare le conseguenze delle vulnerabilità. Attualmente, le capacità di applicare questa tecnologia hanno raggiunto il loro limite e ulteriori suddivisioni in processi non sono sostenibili in termini di consumo di risorse.
Per mantenere la sicurezza della base di codice, Google applica anche la "«In base a cui qualsiasi codice aggiunto deve rientrare in non più di due condizioni su tre: lavorare con dati di input non verificati, utilizzare un linguaggio di programmazione non sicuro (C/C++) e operare con privilegi elevati. Da questa regola deriva che il codice per l'elaborazione di dati esterni deve essere ridotto a privilegi minimi (isolare) o scritto in un linguaggio di programmazione sicuro.
Per migliorare ulteriormente la sicurezza della base di codice, è stato avviato un progetto per prevenire la comparsa di errori di gestione della memoria nella base di codice. Vengono evidenziati tre approcci principali: la creazione di librerie C++ con funzioni per una gestione sicura della memoria e l'estensione dell'ambito del garbage collector, l'utilizzo di meccanismi di protezione hardware (Memory Tagging Extension) e la scrittura di componenti in linguaggi che garantiscono una gestione sicura della memoria (Java, Kotlin, JavaScript, Rust, Swift).
Si prevede che il lavoro sarà concentrato in due direzioni:
- Una significativa modifica del processo di sviluppo in C++, che non esclude un impatto negativo sulle prestazioni (controlli aggiuntivi dei confini e raccolta dei rifiuti). Si propone di utilizzare nel codice il tipo , che può ridurre gli errori exploitabili di tipo use-after-free a crash non pericolosi per la sicurezza, senza un impatto negativo significativo sulle prestazioni, sul consumo di memoria e sulla stabilità.
- L'uso di linguaggi progettati per eseguire controlli di sicurezza della memoria durante la compilazione (consentirà di evitare un impatto negativo sulle prestazioni, tipico di tali controlli durante l'esecuzione del codice, ma comporterà costi aggiuntivi per organizzare l'interazione del codice in un nuovo linguaggio con il codice in C++).
L'uso di librerie per la gestione sicura della memoria è il modo più semplice, ma anche meno efficace. Riscrivere il codice in Rust è considerato il modo più efficace, ma anche molto costoso.
Fonte: opennet.ru
