Po roku prac nad rozwojem opublikowana została nowa wersja narzędzia do organizacji pracy w izolowanych środowiskach Bubblewrap 0.9, używanego do ograniczenia dostępu poszczególnych aplikacji dla nieuprzywilejowanych użytkowników. W praktyce Bubblewrap jest wykorzystywany przez projekt Flatpak jako pośrednik do izolacji uruchamianych aplikacji z pakietów. Kod projektu napisany jest w języku C i udostępniany na licencji LGPLv2+.
Do izolacji wykorzystywane są tradycyjne technologie wirtualizacji kontenerów dla systemów Linux, oparte na korzystaniu z cgroups, przestrzeni nazw (namespaces), Seccomp i SELinux. Aby wykonać operacje uprzywilejowane związane z konfiguracją kontenera, Bubblewrap uruchamiane jest z prawami root (plik wykonywalny z flagą suid) z późniejszym zresetowaniem uprawnień po zakończeniu inicjalizacji kontenera.
Aktywacja w systemie przestrzeni nazw identyfikatorów użytkownika (user namespaces), pozwalających na korzystanie w kontenerach z odrębnego zestawu identyfikatorów, do działania nie jest wymagana, ponieważ domyślnie nie działa w wielu dystrybucjach (Bubblewrap jest promowane jako ograniczona implementacja suid podzbioru możliwości przestrzeni nazw użytkownika — do wyłączenia wszystkich identyfikatorów użytkowników i procesów z środowiska, poza obecnym, używane są tryby CLONE_NEWUSER i CLONE_NEWPID). Aby zapewnić dodatkową ochronę, programy uruchamiane pod zarządzaniem Bubblewrap są uruchamiane w trybie PR_SET_NO_NEW_PRIVS, który zabrania uzyskiwania nowych uprawnień, na przykład w przypadku posiadania flagi setuid.
Izolacja na poziomie systemu plików odbywa się poprzez stworzenie domyślnej nowej przestrzeni nazw punktów montowania (mount namespace), w której z pomocą tmpfs tworzony jest pusty katalog główny. W razie potrzeby do tego katalogu podpinane są partycje zewnętrznego systemu plików w trybie „mount —bind” (na przykład przy uruchamianiu z opcją „bwrap —ro-bind /usr /usr” partycja /usr jest przekazywana z głównego systemu w trybie tylko do odczytu). Możliwości sieciowe są ograniczone do dostępu do interfejsu loopback z izolacją stosu sieciowego za pomocą flag CLONE_NEWNET i CLONE_NEWUTS.
Kluczową różnicą w porównaniu do podobnego projektu Firejail, który również korzysta z modelu uruchamiania z użyciem setuid, jest to, że w Bubblewrap pośrednik do tworzenia kontenerów zawiera tylko niezbędny minimalny zbiór możliwości, podczas gdy wszystkie rozszerzone funkcje, potrzebne do uruchamiania aplikacji graficznych, interakcji z pulpitem oraz filtrowania połączeń z Pulseaudio, zostały przeniesione na stronę Flatpak i są wykonywane już po zresetowaniu uprawnień. Firejail natomiast łączy w jednym pliku wykonywalnym wszystkie powiązane funkcje, co utrudnia jego audyt i utrzymanie bezpieczeństwa na odpowiednim poziomie.
W nowym wydaniu:
- Z pakietu z dokumentacją usunięto pliki wygenerowane w Autotools. Do budowy teraz zaleca się użycie systemu budowania Meson. Opcjonalne wsparcie dla Autotools zostało na razie zachowane, ale w przyszłych wydaniach planowane jest jego usunięcie.
- Dodano opcję «—argv0» do ustalania wartości zerowego argumentu w linii poleceń (argv[0] — nazwa pliku wykonywalnego, na przykład «—argv0 /usr/bin/test»).
- Opcja «—symlink» teraz działa tylko wtedy, gdy symboliczne połączenie już istnieje i wskazuje na właściwy plik docelowy.
- Udokumentowano opcję «—cap-add», wykorzystywaną do ustalania flag capabilities, na przykład «CAP_DAC_READ_SEARCH».
- Zwiększona informacyjność błędów wyświetlanych przy niepowodzeniu montowania.
- Uproszczono proces tworzenia testów jednostkowych.
- W przykładach użycia zaprzestano wspierania starych wersji Pythona.
- Udoskonalone operacje alokacji pamięci.
Źródło: opennet.ru
