Chciałbym wdrożyć piaskownicę przez ptrace()
proces, który rozpoczynam i wszystkie jego dzieci będą tworzyć (w tym wnuki itp.). Proces macierzysty ptrace()
, tj. Kierownik. byłby prostym programem w języku C lub Python i koncepcyjnie ograniczyłby dostęp do systemu plików (w oparciu o nazwę ścieżki i kierunek dostępu (odczyt lub zapis) oraz dostęp do gniazda (np. uniemożliwiający utworzenie gniazda). tak, aby ptrace()
d przetwarzać i jego dzieci (rekursywnie) nie będzie w stanie ominąć piaskownicy? Czy jest coś specjalnego, co powinien zrobić przełożony w fork()
, aby uniknąć warunków wyścigu? Czy jest możliwe odczytanie argumentów nazw plików np. rename()
z procesu dziecka bez warunków wyścigu?W jaki sposób śledzenie systemu Linux może być niebezpieczne lub zawierać warunki wyścigu?
Oto, co już planowałem zrobić:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
uniknąć (troche) coditions wyścigu kiedyfork()
ing- Disallow wszystkich wywołań systemowych domyślnie i komponować biała lista dozwolonych wywołań systemowych
- upewnić się, że
*at()
warianty wywołanie systemowe (takie jakopenat
) są prawidłowo chronione
Na co jeszcze powinienem zwrócić uwagę?
Tak więc, w zasadzie, próbujesz replikować oparty na ptrace backend Systrace (http://www.systrace.org/)? – thkala
Tak, mój przełożony działałby podobnie do systrace. Niestety, systrace wydaje się być nieobsługiwany, nie kompiluje się czysto, a także wydaje się być wadliwy (zawiesił się w nieskończoność, gdy piaskowałem GCC z uruchomionym GNU as). – pts