Per FreeBSD è stata proposta un'implementazione di un meccanismo di isolamento delle applicazioni che ricorda le chiamate di sistema pledg e unveil sviluppate dal progetto OpenBSD. L'isolamento in pledg avviene attraverso il divieto di accesso a chiamate di sistema non utilizzate dall'applicazione, mentre in unveil avviene tramite l'apertura selettiva dell'accesso solo per percorsi di file specifici con cui l'app può interagire. Viene quindi creato un certo tipo di elenco bianco di chiamate di sistema e percorsi di file per l'applicazione, mentre tutte le altre chiamate e percorsi sono vietati.
La differenza tra l'analogo sviluppato per FreeBSD e i meccanismi plegde e unveil sta nella fornitura di uno strato aggiuntivo che permette di isolare le applicazioni senza modifiche al loro codice o con modifiche minime. Ricordiamo che in OpenBSD, plegde e unveil sono orientati a una stretta integrazione con l'ambiente di base e vengono implementati attraverso l'aggiunta di annotazioni speciali nel codice di ciascuna applicazione. Per semplificare l'organizzazione della protezione, i filtri consentono di evitare la specificazione a livello di singole chiamate di sistema e di gestire le classi di chiamate di sistema (input/output, lettura file, scrittura file, socket, ioctl, sysctl, avvio processi, ecc.). Le funzioni di limitazione dell'accesso possono essere invocate nel codice dell'applicazione durante l'esecuzione di determinate azioni, ad esempio, l'accesso a socket e file può essere chiuso dopo l'apertura dei file necessari e la creazione di una connessione di rete.
L'autore del porto plegde e unveil per FreeBSD intende offrire la possibilità di isolamento di applicazioni arbitrarie, per questo è stata proposta l'utilità curtain, che consente di applicare alle applicazioni regole definite in un file separato. La configurazione proposta include un file con impostazioni di base che definiscono le classi delle chiamate di sistema e i percorsi di file tipici specifici per determinate applicazioni (gestione audio, interazione di rete, output nei log, ecc.), oltre a un file con le regole di accesso per specifiche applicazioni.
L'utility curtain può essere utilizzata per isolare la maggior parte delle utility non modificate, processi server, applicazioni grafiche e persino interi sessioni desktop. È supportata la condivisione di curtain con i meccanismi di isolamento forniti dai sottosistemi Jail e Capsicum. È anche possibile organizzare un'isolamento annidato, in cui le applicazioni avviate ereditano le regole stabilite dall'applicazione principale, integrandole con limitazioni specifiche. Alcune operazioni del kernel (strumenti di debug, IPC POSIX/SysV, PTYs) sono protette ulteriormente tramite il meccanismo dei barrier, che impedisce l'accesso agli oggetti del kernel non creati dal processo corrente o parentale.
Il processo può configurare autonomamente la propria isolamento attraverso la chiamata a curtainctl o utilizzando le funzioni plegde() e unveil() fornite dalla libreria libcurtain, simili a funzioni analoghe di OpenBSD. Per monitorare i blocchi durante l'esecuzione dell'applicazione è previsto sysctl 'security.curtain.log_level'. L'accesso ai protocolli X11 e Wayland viene abilitato separatamente specificando al momento dell'avvio di curtain le opzioni '-X'/'-Y' e '-W', ma il supporto per le applicazioni grafiche non è ancora sufficientemente stabilizzato e presenta una serie di problemi irrisolti (i problemi si manifestano principalmente con X11, mentre il supporto per Wayland è stato implementato in modo significativamente migliore). Gli utenti possono aggiungere ulteriori restrizioni creando file locali con regole (~/.curtain.conf). Ad esempio, per consentire la scrittura da Firefox solo nella directory ~/Downloads/ è possibile aggiungere una sezione '[firefox]' con la regola '~/Downloads/ : rw +'.
L'implementazione include il modulo del kernel mac_curtain per il controllo degli accessi obbligatorio (MAC, Mandatory Access Control), un insieme di patch per il kernel di FreeBSD che realizza i necessari gestori e filtri, la libreria libcurtain per utilizzare le funzioni pledge e unveil nelle applicazioni, l'utility curtain, esempi di file di configurazione, un insieme di test e patch per alcuni programmi nello spazio utente (ad esempio, per l'utilizzo di $TMPDIR al fine di unificare la gestione dei file temporanei). L'autore intende, per quanto possibile, ridurre al minimo il numero di modifiche che richiedono l'applicazione di patch al kernel e alle applicazioni.
Fonte: opennet.ru
