Nach einem Jahr Entwicklung wurde die neue Version des Tools zur Organisation isolierter Umgebungen, Bubblewrap 0.9, veröffentlicht. Dieses wird zur Einschränkung einzelner Anwendungen von nicht privilegierten Benutzern verwendet. In der Praxis wird Bubblewrap im Flatpak-Projekt als Schicht zur Isolierung von Anwendungen aus Paketen verwendet. Der Code des Projekts ist in C geschrieben und unter der LGPLv2+-Lizenz verfügbar.
Zur Isolierung werden die traditionellen Technologien der Container-Virtualisierung für Linux verwendet, die auf cgroups, Namespaces, Seccomp und SELinux basieren. Um privilegierte Operationen zur Konfiguration des Containers durchzuführen, wird Bubblewrap mit Root-Rechten (eine ausführbare Datei mit SUID-Flag) gestartet, gefolgt von einem Privilegienabbau nach Abschluss der Containerinitialisierung.
Die Aktivierung von Benutzer-Namensräumen (user namespaces), die es ermöglichen, in Containern einen separaten Satz von Identifikatoren zu verwenden, ist nicht erforderlich, da sie in vielen Distributionen standardmäßig nicht aktiviert ist. Bubblewrap wird als eingeschränkte SUID-Implementierung eines Teilbereichs der Funktionen von Benutzer-Namensräumen positioniert – zur Ausnahme aller Benutzer- und Prozessidentifikatoren aus der Umgebung, außer dem aktuellen, werden die Modi CLONE_NEWUSER und CLONE_NEWPID verwendet. Zum zusätzlichen Schutz werden von Bubblewrap verwaltete Programme im PR_SET_NO_NEW_PRIVS-Modus ausgeführt, der das Erlangen neuer Berechtigungen, wie z. B. bei vorhandenem Setuid-Flag, verbietet.
Die Isolierung auf Dateisystemebene erfolgt durch die standardmäßige Schaffung eines neuen Mount-Namensraums, in dem mit tmpfs ein leeres Root-Dateisystem erstellt wird. Notwendige Partitionen eines externen Dateisystems werden bei Bedarf im Modus „mount —bind“ an dieses Dateisystem angehängt (zum Beispiel wird bei der Ausführung mit der Option „bwrap —ro-bind /usr /usr“ das Verzeichnis /usr aus dem Hauptsystem im Nur-Lese-Modus bereitgestellt). Die Netzwerkfunktionen beschränken sich auf den Zugang zum Loopback-Interface, während der Netzwerkstack durch die Flags CLONE_NEWNET und CLONE_NEWUTS isoliert wird.
Der entscheidende Unterschied zu einem ähnlichen Projekt wie Firejail, das ebenfalls ein setuid-Modell zur Ausführung nutzt, besteht darin, dass Bubblewrap nur das notwendige Minimum an Funktionen für die Erstellung von Containern bereitstellt. Alle erweiterten Funktionen, die für die Ausführung grafischer Anwendungen, die Interaktion mit dem Desktop und die Filterung von Anfragen an Pulseaudio erforderlich sind, sind auf die Seite von Flatpak ausgelagert und erfolgen bereits nach der Privilegienenthebung. Firejail hingegen vereint alle zugehörigen Funktionen in einer einzigen ausführbaren Datei, was die Überprüfung und Aufrechterhaltung der Sicherheit erschwert.
In der neuen Version:
- Die aus den Quelltextpaketen entfernten Dateien, die in Autotools generiert wurden. Für den Build-Prozess wird jetzt empfohlen, das Build-System Meson zu verwenden. Die optionale Unterstützung für Autotools bleibt vorerst erhalten, wird jedoch in zukünftigen Versionen voraussichtlich entfernt.
- Eine Option «—argv0» wurde hinzugefügt, um den Wert des ersten Arguments der Befehlszeile festzulegen (argv[0] — der Name der ausführbaren Datei, beispielsweise «—argv0 /usr/bin/test»).
- Die Option «—symlink» wird jetzt nur aktiviert, wenn der symbolische Link bereits existiert und auf die richtige Zieldatei verweist.
- Die Option «—cap-add» ist jetzt dokumentiert, die verwendet wird, um Capability-Flags, wie «CAP_DAC_READ_SEARCH», festzulegen.
- Die Fehlerausgaben bei einem Mount-Fehler wurden informativer gestaltet.
- Der Prozess zur Erstellung von Unit-Tests wurde vereinfacht.
- In den Nutzungshinweisen wird die Unterstützung älterer Python-Versionen eingestellt.
- Die Speicherzuweisungen wurden verbessert.
Quelle: opennet.ru
