Informacje w trybie piaskownicy 2

Architektura Sandbox2 opiera się na znanych i sprawdzonych technologiach, ramach zasad oraz 2 procesach: Sandbox Executor i Sandboxee.

Używane technologie

W kolejnych sekcjach opisujemy technologie, które stanowią warstwę podstawową Sandbox2.

Przestrzenie nazw w Linuksie

Przestrzenie nazw w Linuksie to próba zapewnienia wirtualizacji na poziomie systemu operacyjnego. Chociaż wiele przestrzeni użytkownika działa pozornie niezależnie od siebie, korzystają one z jednej instancji jądra. Sandbox2 używa tych rodzajów przestrzeni nazw:

  • IPC
  • Sieć (chyba że została wyraźnie wyłączona przez wywołanie PolicyBuilder::AllowUnrestrictedNetworking())
  • Montowanie (przy użyciu niestandardowego widoku drzewa systemu plików)
  • PID
  • Użytkownik
  • UTS

Więcej informacji o przestrzeniach nazw w Linuksie znajdziesz w Wikipedii lub na powiązanej stronie podręcznika.

IPC

Sandbox2 umożliwia wymianę dowolnych danych między Sandbox Executor a niezaufanym Sandboxee. Obsługuje wiadomości typu Type-Length-Value (TLV), przekazywanie deskryptorów plików oraz wymianę danych uwierzytelniających za pomocą tokenów i uchwytów.

Seccomp-BPF

Sandbox2 korzysta z seccomp-bpf, czyli rozszerzenia trybu bezpiecznego obliczania (seccomp), które umożliwia filtrowanie wywołań systemowych za pomocą reguł Berkeley Packet Filter (BPF).

seccomp to funkcja jądra Linuksa, która ogranicza wywołania systemowe procesu, zezwalając tylko na exit, sigreturn, read i write. Jeśli proces spróbuje wykonać inne wywołanie systemowe, zostanie zakończony. Rozszerzenie seccomp-bpf zapewnia większą elastyczność niż seccomp. Zamiast zezwalać na stały zestaw wywołań systemowych, seccomp-bpf uruchamia program BPF na danych wywołania systemowego i w zależności od wartości zwracanej przez program może wykonać wywołanie systemowe, pominąć je i zwrócić wartość zastępczą, zakończyć proces, wygenerować sygnał lub powiadomić narzędzie do śledzenia.

Ptrace

Wywołanie systemowe ptrace (śledzenie procesu) udostępnia funkcję, która umożliwia procesowi śledzącemu obserwowanie i kontrolowanie wykonywania procesu śledzonego. Po dołączeniu proces śledzący ma pełną kontrolę nad procesem śledzonym. Więcej informacji o ptrace znajdziesz w Wikipedii lub na powiązanej stronie podręcznika.

Zasady piaskownicy

Zasady piaskownicy są najważniejszą częścią piaskownicy, ponieważ określają działania, które Sandboxee może i nie może wykonywać. Zasady piaskownicy składają się z 2 części:

  • Zasady wywołań systemowych
  • Konfiguracja przestrzeni nazw

Domyślne zasady wywołań systemowych

Domyślne zasady blokują wywołania systemowe, które są zawsze niebezpieczne, i mają pierwszeństwo przed rozszerzonymi zasadami dostarczonymi przez użytkownika.

Rozszerzone zasady wywołań systemowych

Rozszerzone zasady wywołań systemowych można utworzyć za pomocą naszej PolicyBuilder. Ta klasa definiuje szereg wygodnych reguł (np. AllowStaticStartup, AllowDynamicStartup, AllowOpen), które mogą poprawić czytelność zasad.

W większości przypadków najlepiej zacząć od DefaultPolicyBuilder (sapi::Sandbox2Config::DefaultPolicyBuilder()), która zwraca PolicyBuilder wstępnie skonfigurowany z podstawowymi zasadami dla typowych bibliotek jednowątkowych i może być dalej dostosowywany za pomocą dodatkowych reguł (takich jak .AllowDynamicStartup() i .AddLibrariesForBinary() podczas umieszczania pliku binarnego w piaskownicy). W Sandboxed API (SAPI) DefaultPolicyBuilder() jest używany przez sapi::SandboxConfig::DefaultConfig() razem z sapi::SandboxConfig::DefaultFlags(), sapi::SandboxConfig::DefaultEnvironmentVariables() i sapi::Sandbox2Config::DefaultLimits(). Bezpośrednie tworzenie PolicyBuilder powinno być używane tylko wtedy, gdy DefaultPolicyBuilder() nie można użyć lub gdy wymagana jest precyzyjna konfiguracja.

Jeśli chcesz dodatkowo ograniczyć wywołania systemowe lub wymagać bardziej złożonych reguł, możesz określić surowe makra BPF za pomocą AddPolicyOnSyscall i AddPolicyOnSyscalls. Przykład crc4 korzysta z tego mechanizmu, aby ograniczyć argumenty wywołań systemowych read, write, i close.

Ogólnie rzecz biorąc, im bardziej rygorystyczne są zasady piaskownicy, tym lepiej, ponieważ wykorzystanie wszelkich luk w kodzie będzie ograniczone przez te zasady. Jeśli możesz dokładnie określić, które wywołania systemowe i argumenty są wymagane do normalnego działania programu, każdy atakujący wykorzystujący lukę w wykonaniu kodu jest również ograniczony do tych samych limitów.

Bardzo rygorystyczne zasady piaskownicy mogą odmawiać wszystkich wywołań systemowych z wyjątkiem odczytu i zapisu w standardowych deskryptorach plików standardowego strumienia wejścia i wyjścia. W tej piaskownicy program może przyjmować dane wejściowe, przetwarzać je i zwracać dane wyjściowe. Jeśli jednak proces spróbuje wykonać inne wywołanie systemowe, zostanie zakończony z powodu naruszenia zasad. Dlatego jeśli proces zostanie naruszony (wykonanie kodu przez złośliwego użytkownika), nie może on zrobić nic bardziej szkodliwego niż wygenerowanie nieprawidłowych danych wyjściowych (które wykonawca i inne osoby nadal muszą prawidłowo obsługiwać).

Konfiguracja przestrzeni nazw

Obiekt PolicyBuilder służy też do konfigurowania indywidualnego widoku systemu plików Sandboxee. Do środowiska Sandboxee można mapować pojedyncze pliki (AddFile / AddFileAt), całe katalogi (AddDirectory / AddDirectoryAt) oraz pamięć tymczasową (AddTmpfs) . Dodatkowo AddLibrariesForBinary może służyć do automatycznego mapowania wszystkich bibliotek potrzebnych do określonego wykonywalnego pliku połączonego dynamicznie.

Flagi wiersza poleceń

Każde zasady Sandbox2 można wyłączyć, określając jedną z tych flag wiersza poleceń. Te flagi są przeznaczone do testowania (np. podczas dopracowywania rozszerzonych zasad wywołań systemowych).

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

Sandbox Executor

Sandbox Executor to proces, który sam nie jest umieszczony w piaskownicy. Jest to proces śledzący ptrace, który dołącza się do Sandboxee (proces śledzony ptrace). Sandbox Executor konfiguruje też i uruchamia instancję Monitora, która śledzi Sandboxee i udostępnia informacje o stanie.

Sandbox2 umożliwia 3 tryby wykonywania: samodzielny, Sandbox2 Forkserver i Custom Forkserver. Jeśli używasz forkservera, Sandboxee jest tworzony jako proces podrzędny Sandbox Executor. Te tryby są szczegółowo opisane tutaj.

Sandboxee

Sandboxee to proces, który działa w ograniczonym środowisku piaskownicy zdefiniowanym przez zasady piaskownicy. Sandbox Executor wysyła zasady do Sandboxee za pomocą IPC. Sandboxee stosuje te zasady. Każde naruszenie zasad spowoduje zakończenie procesu, chyba że skonfigurujesz inaczej (patrz: Zasady piaskownicy).