Dla FreeBSD zaproponowano implementację mechanizmu izolacji aplikacji, przypominającą rozwijane w projekcie OpenBSD wywołania systemowe plegde i unveil. Izolacja w plegde odbywa się poprzez zakaz dostępu do niewykorzystywanych w aplikacji wywołań systemowych, natomiast w unveil poprzez selektywne otwieranie dostępu tylko do określonych ścieżek plików, z którymi może pracować aplikacja. Dla aplikacji tworzona jest swoista biała lista wywołań systemowych i ścieżek plików, a wszystkie inne wywołania i ścieżki są zakazane.
Różnica między rozwijanym dla FreeBSD odpowiednikiem plegde i unveil sprowadza się do zapewnienia dodatkowej warstwy, która pozwala izolować aplikacje bez wprowadzania zmian w ich kodzie lub przy minimalnych zmianach. Przypomnijmy, że w OpenBSD plegde i unveil są skoncentrowane na ścisłej integracji z podstawowym środowiskiem i są stosowane poprzez dodawanie specjalnych adnotacji do kodu każdej aplikacji. Dla uproszczenia organizacji ochrony filtry pozwalają obejść się bez szczegółowości na poziomie pojedynczych wywołań systemowych i manipulować klasami wywołań systemowych (wejście/wyjście, odczyt plików, zapis plików, gniazda, ioctl, sysctl, uruchamianie procesów itp.). Funkcje ograniczenia dostępu mogą być wywoływane w kodzie aplikacji w miarę wykonywania różnych działań, na przykład dostęp do gniazd i plików może być zamykany po otwarciu potrzebnych plików i nawiązaniu połączenia sieciowego.
Autor portu plegde i unveil dla FreeBSD zamierza zapewnić możliwość izolacji dowolnych aplikacji, w tym celu zaproponowano narzędzie curtain, umożliwiające stosowanie do aplikacji reguł określonych w osobnym pliku. Zaproponowana konfiguracja obejmuje plik z podstawowymi ustawieniami, definiującymi klasy wywołań systemowych i typowe ścieżki plików, specyficzne dla określonych zastosowań (praca z dźwiękiem, interakcja sieciowa, zapisywanie do logów itp.), a także plik z regułami dostępu dla konkretnych aplikacji.
Narzędzie curtain może być stosowane do izolacji większości niemodyfikowanych narzędzi, procesów serwerowych, aplikacji graficznych, a nawet całych sesji pulpitowych. Wspierane jest współdzielenie curtain z mechanizmami izolacji dostarczanymi przez podsystemy Jail i Capsicum. Możliwe jest również zorganizowanie zagnieżdżonej izolacji, w której uruchamiane aplikacje dziedziczą zasady nałożone na aplikację rodzica, uzupełniając je dodatkowymi ograniczeniami. Niektóre operacje jądra (narzędzia debugowania, POSIX/SysV IPC, PTYs) są dodatkowo zabezpieczane za pomocą mechanizmu barier, który uniemożliwia dostęp do obiektów jądra stworzonych przez inny proces niż bieżący lub proces rodzica.
Proces może samodzielnie skonfigurować swoją izolację za pomocą wywołania curtainctl lub korzystając z funkcji pledge() i unveil() dostarczanych przez bibliotekę libcurtain, podobnie jak podobne funkcje w OpenBSD. Do śledzenia blokad w trakcie pracy aplikacji przewidziano sysctl ‘security.curtain.log_level’. Dostęp do protokołów X11 i Wayland włącza się osobno, wskazując podczas uruchamiania curtain opcje «-X»/«-Y» i «-W», ale wsparcie dla aplikacji graficznych nie jest jeszcze wystarczająco stabilne i ma szereg nierozwiązanych problemów (problemy te głównie pojawiają się w przypadku korzystania z X11, a wsparcie dla Wayland zostało zrealizowane znacznie lepiej). Użytkownicy mogą dodać dodatkowe ograniczenia, tworząc lokalne pliki z zasadami (~/.curtain.conf). Na przykład, aby pozwolić na zapis z Firefoxa tylko do katalogu ~ /Downloads/, można dodać sekcję «[firefox]» z zasadą «~ /Downloads/ : rw +».
Implementacja zawiera moduł jądra mac_curtain dla mandomentowego kontroli dostępu (MAC, Mandatory Access Control), zestaw patchy dla jądra FreeBSD z implementacją niezbędnych obsługi i filtrów, bibliotekę libcurtain do użycia funkcji pledge i unveil w aplikacjach, narzędzie curtain, przykłady plików konfiguracyjnych, zestaw testów i patche dla niektórych programów w przestrzeni użytkownika (na przykład do używania $TMPDIR z celem ujednolicenia pracy z plikami tymczasowymi). W miarę możliwości autor ma zamiar zminimalizować liczbę zmian, dla których wymagana jest aplikacja patchy do jądra i aplikacji.
Źródło: opennet.ru
