Le applicazioni non dovrebbero avere accesso ai dati di altre applicazioni o ai dati privati dell'utente a meno che l'utente non li autorizzi. Non è una necessità ovvia? Ma ogni programma che lanciamo ha pieno accesso alla nostra cartella $ HOME, al nostro microfono e cam. La maggior parte degli utenti non si accorgerà nemmeno se (ad esempio) Skype inizia a inviare da qualche parte i propri file privati o lo streaming audio dal proprio microfono.
Sto cercando modi per risolvere questo problema. Sentiti libero di suggerire qualsiasi cosa, anche se il tuo metodo implica la scrittura di criteri SELinux, moduli LSM, patch del kernel, passaggio a un altro sistema operativo simile a UNIX.
Ecco alcune idee che ho avuto e motivi per cui le ho respinte:
- Creiamo nuovi utenti unix per ogni app non affidabile. Usiamo il bit SUID per fare in modo che l'app funzioni sempre come se fosse un utente. Male. Perché dobbiamo inserire nella blacklist tutte le app di cui non ci fidiamo e ogni nuova app che installiamo. Tonnellate di lavoro, facile perdersi qualcosa. Anche i binari potrebbero perdere la bandiera SUID quando aggiorniamo / reinstalliamo l'app. Inoltre, c'è un problema con i processi figli: in teoria, le app che non hanno qualche permesso, possono usare altre app per raggiungere il loro obiettivo. E se non usiamo SUID, sarà difficile ricordare che dobbiamo usare "su" per avviare ogni app non sicura.
- Utilizziamo la transizione del dominio SELinux per limitare le app non attendibili. Anche cattivo Lo stesso problema con # 1. Abbiamo bisogno di scrivere / aggiornare / iniettare politiche SELinux per ogni app di cui non ci fidiamo. Voglio che le app non abbiano accesso speciale per impostazione predefinita, non accesso completo.
- Creiamo nuovi utenti unix "fidati" per app affidabili. Possiamo utilizzare i gruppi per implementare varie categorie di dati privati: foto, note ecc. Ma non possiamo usare SUID e abbiamo bisogno di passare manualmente a quell'utente prima di avviare l'app (con password). Il problema di questa opzione sono i processi figli. Non possiamo permettere che tutti i processi figli del programma fidato siano attendibili (se apriamo il file multimediale nel gestore di file attendibile, non vogliamo che il lettore multimediale erediti lo stato di fiducia del file manager). Ma non possiamo nemmeno permettere a tutti i processi figli di rilasciare le loro autorizzazioni predefinite. Anche cattivo!
- Usiamo SELinux per implementare domini "fidati" per ogni app di fiducia. In questo caso non possiamo utilizzare la transizione automatica del dominio. Quindi dobbiamo cambiare dominio con password. Questa opzione è leggermente migliore di # 3 perché possiamo vietare l'avvio di app non affidabili in tali domini attendibili. Ma ancora brutto e scomodo.
- Se pensiamo di più, stiamo iniziando a vedere che non possiamo assolutamente associare i permessi ai binari eseguibili. Ad esempio, l'interprete Python potrebbe richiedere autorizzazioni diverse a seconda dello script eseguito. Quindi possiamo dimenticare le opzioni 1 e 2
- Possiamo creare il nostro modulo LSM (come SELinux). Ma come dovrebbe funzionare? Non sono sicuro di avere idee. Modalità interattiva? Chiedendo il permesso dell'utente ogni volta che un processo tenta di leggere i file privati? O dovremmo prendere alcune idee dal modello "lomac" (filigrana bassa)? Diciamo che leggere dati non affidabili rende l'ambiente contaminato e impedisce di leggere dati privati.
- Demone spazio utente + libreria LD_PRELOAD? In questo caso, le app non hanno accesso ai file privati per impostazione predefinita, ma possono contattare il daemon privilegiato e chiedere di aprire tali file e passare il descrittore di file. Questo è fattibile e assomiglierà ai vecchi "firewall interattivi" per Windows.
Altre idee? Per favore dimmi che conosci la soluzione pronta:)
Aggiorna
Ho iniziato a sviluppare il mio LSM (sostituzione SELinux). Sembra che nessuno qui sia interessato. Ma, nel caso, puoi trovarmi qui:
o qui: