Najczęstsze pytania

Czy mogę używać wątków?

Tak, wątki są obsługiwane w trybie piaskownicy 2.

Wszystkie wątki muszą być w trybie piaskownicy

Ze względu na sposób działania systemu Linux zasada seccomp-bpf jest stosowana tylko do bieżącego wątku. Oznacza to, że nie jest stosowana do innych istniejących wątków, ale przyszłe wątki odziedziczą tę zasadę:

  • Jeśli używasz piaskownicy 2 w pierwszym trybie, w którym piaskownica jest włączona przed execve(), wszystkie wątki odziedziczą tę zasadę i nie ma problemu. Jest to preferowany tryb piaskownicy.
  • Jeśli używasz drugiego trybu, w którym wykonawca ma set_enable_sandbox_before_exec(false), a narzędzie piaskownicy informuje go, że chce wykonać piaskownicę z SandboxMeHere(), upewnij się, że filtr został zastosowany do wszystkich wątków. W przeciwnym razie istnieje ryzyko ucieczki poza piaskownicą: złośliwy kod może zostać przeniesiony z wątku znajdującego się w piaskownicy do wątku poza piaskownicą.

Jak skompilować plik Sandboxee?

Jeśli nie zachowasz ostrożności, możesz łatwo dziedziczyć wiele zależności i efekty uboczne (dodatkowe wywołania syscall, dostęp do plików, a nawet połączenia sieciowe), co utrudnia piaskownicę (śledzenie wszystkich efektów ubocznych) i zmniejsza bezpieczeństwo (ponieważ zasady dotyczące syscall i plików są szersze). Aby ograniczyć liczbę takich problemów, możesz użyć kilku opcji kompilacji:

  • Statycznie skompiluj plik binarny Sandboxee, aby uniknąć dynamicznego łączenia, które wykorzystuje wiele wywołań systemowych (open/openat, mmap itp.).
  • Bazel domyślnie dodaje atrybut pie, ale element static jest z nim niezgodny, więc rozważ użycie flagi funkcji, aby wymusić jego wyłączenie za pomocą tych opcji w regułach cc_binary:

    linkstatic = 1,
    features = [
        "fully_static_link",  # link libc statically
        "-pie",
    ],
    

Jednak: korzystanie z plików statycznych ma wada zmniejszającą entropię sterty ASLR (z 30 do 8 bitów), co ułatwia wykorzystywanie. Uważnie zdecyduj, co jest preferowane w zależności od implementacji i zasad piaskownicy:

  • niestatyczny: dobry skrót ASLR sterty, który może być trudniejszy do początkowego wykonania kodu, ale kosztem mniej skutecznej zasady piaskownicy, potencjalnie łatwiejszy do usunięcia.
  • statyczna: nieprawidłowa sterota ASLR, potencjalnie łatwiejsza do początkowego wykonania kodu, ale skuteczniejsza zasada piaskownicy, potencjalnie trudniejsza do wyłamania.

Nie udało się dokonać wyboru, ponieważ kompilator nie obsługuje statycznego pliku PIE (Position Independent Executables). W celu wdrożenia pliku binarnego obiekt binarny musi być obiektem dynamicznym, a mechanizm dynamicznego ładowania mapuje go w losowej lokalizacji przed wykonaniem. Ponieważ sterta jest tradycyjnie umieszczona w losowym przesunięciu po adresie bazowym pliku binarnego (i rozszerzana za pomocą polecenia brk syscall), oznacza to, że w przypadku statycznych plików binarnych entropia sterty ASLR ma tylko to przesunięcie, ponieważ nie ma PIE.

Przykłady tych opcji kompilacji znajdziesz w statycznym przykładzie BUILD.bazel: static_bin.cc jest kompilowany statycznie, co pozwala nam stosować bardzo ścisłą zasadę wywołania systemu. Świetnie sprawdza się to też w przypadku piaskownicy plików binarnych innych firm.

Czy mogę umieścić pliki binarne x86 w piaskownicy?

Piaskownica 2 może zawierać tylko tę samą architekturę, z którą została skompilowana.

Wycofaliśmy też obsługę 32-bitowych procesorów x86 z Piaskownicy 2. Jeśli spróbujesz użyć 64-bitowego wykonawcy x86 do piaskownicy plików binarnych 32-bitowych procesorów x86 lub 64-bitowego pliku binarnego x86 wykonującego 32-bitowe wywołania systemu syscall (za pomocą int 0x80), oba te elementy powodują naruszenie piaskownicy, które można rozpoznać za pomocą etykiety architektury [X86-32].

Wynika to z tego, że numery wywołań syscall różnią się w poszczególnych architekturach, a ponieważ zasada połączeń syscall jest zapisana w architekturze wykonawcy, zezwolenie na inną architekturę Sandboxee może być niebezpieczne. Może to faktycznie doprowadzić do zezwolenia na pozornie niegroźne wywołanie syscall, które w rzeczywistości oznacza, że inny, bardziej szkodliwy komunikat Syscall może otworzyć piaskownicę i uzyskać ucieczkę.

Czy są jakieś limity liczby piaskownicy, o które może prosić proces wykonawcy?

Dla każdej instancji Sandboxee (nowego procesu wywoływanego z serwera forkowego) tworzony jest nowy wątek. I wtedy spoczywają na nim ograniczenia.

Czy Wykonawca może poprosić o utworzenie więcej niż 1 piaskownicy?

Nie. Istnieje relacja 1:1 – instancja wykonawcy przechowuje identyfikator PID instancji piaskownicy, zarządza instancją komunikacji do instancji piaskownicy itd.

Dlaczego widzę informację „Funkcja nie została zaimplementowana” w pliku forkserver.cc?

Piaskownica 2 obsługuje uruchamianie tylko w nowych jądrach. Obecnie udostępniamy jądro w wersji 3.19, choć w przyszłości może się to zmienić. Wynika to z tego, że używamy stosunkowo nowych funkcji jądra, w tym przestrzeni nazw użytkowników i funkcji seccomp z flagą TSYNC.

Jeśli korzystasz z wersji produkcyjnej, nie powinien to być problem, ponieważ prawie cała flota używa nowego wystarczająco nowego jądra. W razie jakichkolwiek problemów skontaktuj się z nami.

Jeśli używasz Debiana lub Ubuntu, zaktualizowanie jądra jest równie łatwe jak uruchomienie:

sudo apt-get install linux-image-<RECENT_VERSION>