È previsto il porting del meccanismo di isolamento della promessa su Linux

Di recente, l'autore della libreria standard Cosmopolitan C e della piattaforma Redbean ha annunciato l'implementazione del meccanismo di isolamento pledge() per Linux.

Originariamente sviluppato dal progetto OpenBSD , pledge consente di impedire selettivamente alle applicazioni di accedere alle chiamate di sistema non utilizzate (creando una lista bianca di chiamate di sistema per l'applicazione e bloccando le altre). A differenza dei meccanismi di controllo dell'accesso alle chiamate di sistema disponibili in Linux, come seccomp, pledge è stato progettato fin dall'inizio per essere il più intuitivo possibile.

L'iniziativa fallita di isolare le applicazioni nell'ambiente di base OpenBSD utilizzando il meccanismo systrace ha dimostrato che l'isolamento a livello delle singole chiamate di sistema è troppo complicato e richiede tempo.

In alternativa, è stato proposto un meccanismo che permetteva di creare regole di isolamento senza entrare nei dettagli e manipolare classi di accesso predefinite.

Ad esempio, le classi offerte sono stdio (input/output), rpath (file di sola lettura), wpath (file di scrittura), cpath (crea file), tmppath (lavora con file temporanei), inet (rete di socket), unix (socket unix ), dns (risoluzione DNS), getpw (accesso in lettura al database utente), ioctl (chiamata ioctl), proc (controllo processo), exec (processi di avvio) e id (controllo autorizzazioni).

Le regole per la gestione delle chiamate di sistema sono specificate tramite annotazioni che includono un elenco delle classi di chiamate di sistema consentite e un array di percorsi di file a cui è permesso l'accesso. Dopo la compilazione e l'esecuzione dell'applicazione modificata, il kernel si occupa di monitorare la conformità alle regole specificate.

Separatamente è in fase di sviluppo l'implementazione del pledge per FreeBSD, che si distingue per la capacità di isolare le applicazioni senza apportare modifiche al loro codice, mentre in OpenBSD il pledge call è finalizzato alla stretta integrazione con l'ambiente di base e all'aggiunta di annotazioni al codice di ciascuno.

La promessa è come il frutto proibito che tutti bramiamo quando il capo dice che dovremmo usare cose come Linux. Perché importa? È perché il pledge() rende effettivamente comprensibile la sicurezza. Linux non ha mai avuto un livello di sicurezza che i comuni mortali possano capire.

Gli sviluppatori della versione Linux di Pledge hanno seguito l'esempio di FreeBSD e, invece di apportare modifiche al codice, hanno preparato un'utilità aggiuntiva da pledge.com che consente di applicare restrizioni senza alterare il codice dell'applicazione. Ad esempio, per eseguire l'utilità curl con accesso solo alle classi di chiamate di sistema stdio, rpath, inet e threadstdio, è sufficiente eseguire `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.

L'utility funziona su tutte le distribuzioni Linux a partire da RHEL6 e non richiede i permessi di root. Inoltre, basandosi sulla libreria cosmopolitan, fornisce un'API per la gestione delle restrizioni nel codice C, consentendo, tra le altre cose, la creazione di enclave per limitare selettivamente l'accesso a specifiche funzioni dell'applicazione.

Ci sono stati alcuni sviluppatori in passato che hanno provato questo. Non farò nomi, perché la maggior parte di questi progetti non sono mai stati completati. Quando si tratta di SECOMP, i tutorial online spiegano solo come inserire nella whitelist le chiamate di sistema, quindi la maggior parte delle persone perde interesse prima di capire come filtrare gli argomenti. I progetti che sono andati avanti hanno avuto anche sviste come la possibilità di modificare i bit setuid/setgid/sticky. Pertanto, nessuna delle attuali alternative dovrebbe essere utilizzata. Penso che questo sforzo ci porti molto più vicini all'avere pledge() che mai.

L'implementazione non richiede modifiche al kernel: i vincoli di utilità vengono tradotti in regole SECCOP BPF ed elaborati utilizzando il meccanismo di isolamento delle chiamate di sistema nativo di Linux. Ad esempio, chiamando promise("stdio rpath", 0) verrà convertito in un filtro BPF

Infine, se siete interessati ad approfondire l'argomento, potete trovare maggiori dettagli al seguente link.


Aggiungi come fonte preferita in Google