Riassunto analitico
I sistemi informatici moderni dipendono dai sistemi operativi, ma i bug all'interno di questi software, in particolare nel codice del kernel, compromettono spesso la sicurezza del sistema. A questo propsito, i kernel monolitici e ibridi soffrono di un importante problema di robustezza: sono implementati tramite milioni di righe di codice che eseguono nello stesso spazio di indirizzamento e in contesti privilegiati. Di conseguenza, un singolo errore in una riga di codice può compromettere l'intero kernel. La maggior parte del codice risiede nei driver, spesso difficili da scrivere in modo sicuro a causa della natura intrinseca del codice di basso livello e ancora più difficili da mantenere e rendere sicuri. Non sorprende che recenti incidenti siano stati causati da bug dei driver e che abbiano provocato interruzioni significative su molti computer, con conseguenti perdite economiche sostanziali.
Questa tesi affronta questo problema critico proponendo `driver_ext`, una nuova famiglia di interfacce stabili per collegare i driver dei dispositivi dall'user space al kernel. Ciò consente di incanalare i driver in user space, spostando così il codice in un contesto non privilegiato e dividendo i driver in processi propri. Per esporre l'interfaccia utilizziamo BPF, una tecnologia simile a una macchina virtuale. Ciò consente la verifica del codice e l'isolamento dal resto del kernel senza sacrificarne l'efficienza.
Infine, la presenza dei driver in user space offre ulteriori vantaggi, come la possibilità di utilizzare (dall'interno del codice del driver) l'ecosistema disponibile dall'user space, nonché una manutenzione semplificata dei driver stessi, poiché non devono più essere controllati (per verificare la presenza di incompatibilità ABI/API) ed eventualmente corretti a ogni cambio di versione del kernel.
Per implementare concretamente la nostra idea di `driver_ext` abbiamo sviluppato due interfacce per device driver, `hid_ext` permette l'implementazione di driver HID BPF, mentre `usb_ext` permette la creazione di driver USB BPF. Per completare il quadro e dimostrare l'uso complessivo del nostro framework, abbiamo sviluppato due driver dimostrativi utilizzando queste interfacce: un driver per tastiera HID basato su `hid_ext` e un driver per webcam USB basato su `usb_ext`.
|
Abstract
Modern computing systems heavily rely on operating systems, yet bugs within this software, particularly in kernel code, frequently compromise safety and security.
In this respect, monolithic and hybrid kernels suffer from an important robustness issue: their millions of lines of code all run in a privileged context within the same address-space.
Therefore, any error in any line of code may break the whole kernel.
Most lines of code reside in device drivers that are often hard to write safely due to the inherent nature of low-level code, they are even harder to maintain and keep safe.
Not surprisingly, recent incidents were due to kernel-driver bugs, and caused significant disruptions across deployed machines, resulting in substantial economic losses.
This thesis addresses this critical issue by proposing `driver_ext`, a novel, stable interface family for attaching user-space device drivers to the kernel. This enables drivers to be channeled to user space, thereby moving the code to an unprivileged context and dividing drivers in their own processes. We use BPF, a VM-like technology, to expose the interface. This enables code verification and isolation from the rest of the kernel without sacrificing efficiency.
Last but not least, having drivers in user space provides additional benefits, such as the possibility to use (from within driver code) the huge body of user space libraries, as well as simplified maintenance of drivers themselves, since they do no longer need to be checked (for ABI/API breakage) and possibly fixed on each kernel-version change.
To concretely implement our proposed idea of `driver_ext` we developed two device driver interfaces, `hid_ext` permits the implementation of BPF HID device drivers while `usb_ext` permits the creation of BPF USB device drivers. To complete the picture and demonstrate the overall use of our framework, we developed two proof-of-concept drivers using these interfaces: an HID keyboard driver relying on `hid_ext` and an USB webcam driver relying on `usb_ext`.
|