Bubblewrap es una herramienta que sirve para organizar el trabajo de entornos aislados en Linux y funcionar a nivel de aplicación de usuarios sin privilegios. En la práctica, Bubblewrap es utilizado por el proyecto Flatpak como una capa intermedia para aislar aplicaciones lanzadas desde paquetes de software.
Para el aislamiento, Linux utiliza tecnologías de virtualización de contenedores tradicionales basadas en el uso de cgroups, namespaces, Seccomp y SELinux. Para realizar operaciones privilegiadas para configurar un contenedor, Bubblewrap se inicia con privilegios de root (un archivo ejecutable con un indicador de suid), seguido de restablecimiento de privilegios después de que se inicializa el contenedor.
No es necesario activar los espacios de nombres de usuario en el sistema, lo que le permite usar su propio conjunto de identificadores en contenedores, ya que de manera predeterminada no funciona en muchas distribuciones.
Sobre Bubblewrap
Bubblewrap se posiciona como una implementación suida limitada del subconjunto de las funciones de espacios de nombres de usuario para excluir todos los identificadores de usuarios y procesos del entorno, excepto el actual, usan los modos CLONE_NEWUSER y CLONE_NEWPID.
Para la protección adicional, los programas que se ejecutan en Bubblewrap se inician en el modo PR_SET_NO_NEW_PRIVS, que prohíbe nuevos privilegios, por ejemplo, con el indicador setuid.
El aislamiento en el nivel del sistema de archivos se realiza creando, de forma predeterminada, un nuevo espacio de nombres de montaje, en el que se crea una partición raíz vacía utilizando tmpfs.
Si es necesario, las secciones del FS externo se adjuntan a esta sección en el modo «mount –bind» (por ejemplo, al comenzar con la opción «bwrap –ro-bind /usr/usr«, la sección /usr se reenvía desde el sistema principal en modo de solo lectura).
Las capacidades de red se limitan al acceso a la interfaz de bucle invertido con aislamiento de la pila de red a través de los indicadores CLONE_NEWNET y CLONE_NEWUTS.
La diferencia clave con el proyecto similar de Firejail, que también usa el iniciador setuid, es que en Bubblewrap, la capa de contenedor incluye solo las características mínimas necesarias y todas las funciones avanzadas necesarias para iniciar aplicaciones gráficas, interactuar con el escritorio y filtrar llamadas a Pulseaudio, se llevan al lado de Flatpak y se ejecutan después de restablecer los privilegios.
Firejail, por otro lado, combina todas las funciones relacionadas en un archivo ejecutable, lo que complica su auditoría y mantiene la seguridad en el nivel adecuado.
Bubblewrap básicamente funciona mediante la creación de un espacio de nombres de montaje vacío en un sistema de archivos temporal que se destruirá después de que finalice el proceso del espacio aislado.
Mediante el uso de conmutadores, el usuario puede construir el entorno del sistema de archivos deseado dentro del espacio de nombres de montaje mediante el montaje en el enlace de los directorios deseados desde el sistema host.
Bubblewrap 0.4.0
Actualmente Bubblewrap se encuentra en su versión 0.4.0 la cual fue recientemente liberada. El código del proyecto está escrito en C y distribuido bajo la licencia LGPLv2 +.
La nueva versión es notable por la implementación de soporte para unir los espacios de nombres y procesos de usuarios existentes (espacios de nombres pid).
Los indicadores «–userns», «–userns2» y «–pidns» se han agregado para controlar la conexión de espacios de nombres.
Esta característica no funciona en modo setuid y requiere un modo separado que puede funcionar sin privilegios de root, pero requiere que los espacios de nombres de usuario se activen en el sistema (deshabilitado por defecto en Debian y RHEL / CentOS) y no excluye la posibilidad de explotar vulnerabilidades potencialmente restantes para el borde de las restricciones de «espacios de nombres de usuario».
De las nuevas características de Bubblewrap 0.4, también se observa la posibilidad de construir con la biblioteca musl C en lugar de glibc, y el soporte para guardar la información del espacio de nombres en un archivo de estadísticas en formato JSON.
El código de Bubblewrap, así como la documentación al respecto puede ser consultada en Github, el enlace es este.