Las aplicaciones no deben tener acceso a los datos de otras aplicaciones ni a los datos privados del usuario, a menos que el usuario lo permita. ¿No es esto una necesidad obvia? Pero cada programa que lanzamos tiene acceso completo a nuestro directorio $ HOME, a nuestro micrófono y cámara. La mayoría de los usuarios ni siquiera notarán si (por ejemplo) Skype comienza a enviar a algún lugar sus archivos privados o transmite sonido desde su micrófono.
Estoy buscando maneras de solucionar este problema. Siéntase libre de sugerir cualquier cosa, incluso si su método implica escribir políticas SELinux, módulos LSM, parches del kernel, cambiar a otro sistema operativo similar a UNIX.
Aquí hay algunas ideas que tuve y las razones por las que las rechacé:
- Creamos nuevos usuarios de Unix para todas las aplicaciones que no son de confianza. Usamos el bit SUID para hacer que la aplicación siempre se ejecute como usuario. Malo. Porque necesitamos poner en una lista negra todas las aplicaciones en las que no confiamos y cada aplicación nueva que instalemos. Toneladas de trabajo, fáciles de perder algo. También los binarios pueden perder el indicador SUID cuando actualizamos / reinstalamos la aplicación. Además, hay un problema con los procesos secundarios: en teoría, las aplicaciones que no tienen algún permiso pueden usar otras aplicaciones para lograr su objetivo. Y si no usamos SUID, será difícil recordar que necesitamos usar "su" para iniciar todas las aplicaciones que no sean de confianza.
- Usamos la transición del dominio SELinux para confinar aplicaciones no confiables. También malo. El mismo problema que con el # 1. Necesitamos escribir / actualizar / inyectar políticas SELinux para cada aplicación en la que no confiamos. Quiero que las aplicaciones no tengan acceso especial por defecto, no acceso completo.
- Creamos nuevos usuarios unix "confiables" para aplicaciones confiables. Podemos usar grupos para implementar varias categorías de datos privados: fotos, notas, etc. Pero no podemos usar SUID y necesitamos cambiar manualmente a ese usuario antes de iniciar la aplicación (con contraseña). El problema de esta opción son los procesos hijos. No podemos permitir que todos los procesos secundarios del programa de confianza sean confiables (si abrimos el archivo de medios en el administrador de archivos de confianza, no queremos que el reproductor de medios herede el estado de confianza del administrador de archivos). Pero tampoco podemos permitir que todos los procesos secundarios omitan sus permisos en forma predeterminada. ¡También malo!
- Usamos SELinux para implementar dominios "confiables" para cada aplicación confiable. No podemos usar la transición automática de dominio en este caso. Así que tenemos que cambiar de dominio con contraseña. Esta opción es ligeramente mejor que la # 3 porque podemos prohibir el lanzamiento de aplicaciones que no sean de confianza en dominios tan confiables. Pero sigue siendo malo e incómodo.
- Si pensamos más, estamos empezando a ver que no podemos vincular los permisos a los binarios ejecutables en absoluto. Por ejemplo, el intérprete de Python puede necesitar diferentes permisos dependiendo del script que ejecuta. Así que podemos olvidarnos de las opciones # 1 y # 2.
- Podemos hacer nuestro propio módulo LSM (como SELinux). Pero, ¿cómo se supone que funciona? No estoy seguro de que tenga ideas. ¿Modo interactivo? ¿Pedir permiso al usuario cada vez que algún proceso intenta leer archivos privados? ¿O deberíamos tomar algunas ideas del modelo "lomac" (marca de agua baja)? Por ejemplo, leer datos que no son de confianza hace que el entorno esté contaminado y lo bloquea al no leer datos privados.
- ¿Demonio del espacio de usuario + biblioteca LD_PRELOAD? En este caso, las aplicaciones no tienen acceso a archivos privados de forma predeterminada, pero pueden ponerse en contacto con daemon privilegiado y pedirle que abra dichos archivos y pase el descriptor de archivos. Esto es factible y se verá como "cortafuegos interactivos" para Windows.
¿Más ideas? Por favor, dime que sabes una solución ya hecha :)
ACTUALIZAR
Comencé a desarrollar mi propio LSM (reemplazo de SELinux). Parece que aquí nadie está interesado. Pero, por si acaso, puedes encontrarme aquí:
o aquí: