Chcę uruchomić polecenie w systemie Linux w taki sposób, że nie można utworzyć ani otworzyć żadnych plików do zapisu. Nadal powinien móc normalnie odczytywać pliki (więc pusty chroot nie jest opcją) i nadal móc zapisywać do plików już otwartych (szczególnie standardowe wyjście).
Punkty bonusowe, jeśli zapis plików do niektórych katalogów (tj. Bieżącego katalogu) jest nadal możliwy.
Szukam rozwiązania, które jest lokalne dla procesu, tj. Nie wymaga konfigurowania takich rzeczy jak AppArmor lub SELinux dla całego systemu, ani uprawnień roota. Może to jednak wymagać instalacji ich modułów jądra.
Patrzyłem na możliwości, które byłyby przyjemne i łatwe, gdyby istniała możliwość tworzenia plików. ulimit to inne podejście, które byłoby wygodne, gdyby obejmowało ten przypadek użycia.
strace
informuje, jakie pliki otwiera program. Dlaczego chcesz to zrobić? Czy to konkretny program, czy chcesz to do testowania, czy coś innego? Czy możesz uruchomić program jako użytkownik / grupa, która nie ma uprawnień do pisania prawie wszędzie, z wyjątkiem bieżącego katalogu? Nowoczesne dystrybucje Linuksa wykorzystują ideę grupy dla każdego użytkownika, dlatego konfiguracja powinna być stosunkowo łatwa.Odpowiedzi:
Co powiesz na utworzenie pustego chroota, a następnie podłączenie głównego systemu plików do wiązania jako chroot tylko do odczytu?
Powinno to być coś takiego do utworzenia montowania tylko do odczytu:
Możesz podłączyć także inne katalogi, w których więzienie ma mieć dostęp do zapisu. Zachowaj ostrożność, jeśli potrzebujesz zamontować specjalne katalogi (/ dev /, / proc /, / sys /), montowanie ich w stanie, w jakim jest, może być niepewne.
źródło
/foo/
ścieżka do głównego systemu plików?Wydaje się, że właściwym narzędziem do tego zadania jest
fseccomp
oparty nasync-ignoring
kodzie f Bastian Blank, wymyśliłem ten stosunkowo mały plik, który powoduje, że wszystkie jego dzieci nie mogą otworzyć pliku do zapisu:Tutaj możesz zobaczyć, że nadal można czytać pliki:
Nie zapobiega usuwaniu plików, ich przenoszeniu ani innym operacjom związanym z plikami oprócz otwierania, ale można je dodać.
Narzędziem, które umożliwia to bez konieczności pisania kodu C, jest syscall_limiter .
źródło
Czy rozważysz napisanie substytutu
open(…)
funkcji i załadowanie go za pomocą LD_PRELOAD?źródło
open
... Cóż, rozważyłbym użycie istniejącego rozwiązania, które wykorzystuje to podejście, tak.write(…)
.Najprostszym rozwiązaniem jest prawdopodobnie program otoki, który tworzy nową przestrzeń nazw systemu plików z odpowiednimi systemami plików zamontowanymi tylko do odczytu, a następnie uruchamia program, który próbujesz ograniczyć.
Dzieje się tak
systemd
, gdy używaszReadOnlyDirectories=
do oznaczania niektórych katalogów jako usługi tylko do odczytu dla usługi. Istnieje równieżunshare
polecenie,util-linux
które może wykonać zadanie tworzenia nowej przestrzeni nazw, dzięki czemu możesz zrobić coś takiego:gdzie
wrapper
musiałby po prostu ponownie zamontować systemy plików zgodnie z wymaganiami przed uruchomieniem prawdziwego programu docelowego.Jedynym problemem jest to, że musisz
root
utworzyć nową przestrzeń nazw ...źródło
Możesz uruchomić go w chroot, montując specjalne wersje itp
/tmp
. Wewnątrz. Być może systemd pomaga, a szczególnie systemd-nspawn (1) , który wygląda dokładnie tak, jak chcesz.źródło
Maszyna wirtualna umożliwiłaby skryptowi pisanie w dowolnym miejscu bez wpływu na system hosta oraz sprawdzanie, gdzie faktycznie próbuje pisać, co wydaje się być celem.
Na przykład możesz łatwo uruchomić Arch Linux
źródło
Wykonanie wstępnej konfiguracji jako root jest naprawdę najłatwiejszym sposobem. W szczególności chroot w mocowaniu do wiązania tylko do odczytu to ścieżka najmniejszego oporu.
Możesz użyć bindfs zamiast
mount --bind
tworzyć widok tylko do odczytu bez konieczności rootowania . Jednak musisz zrobić coś jako root, aby uniemożliwić dostęp do innych plików, takich jak chroot.Innym podejściem jest
LD_PRELOAD
biblioteka, która zaczepia się o otwieranie plików i odmawia zapisu. Nie wymaga to żadnych specjalnych uprawnień. Z punktu widzenia bezpieczeństwa można to obejść, ale jest to przydatne w przypadku użycia, w którym wystarczy tylko zawierać konkretną funkcję, a nie dowolny kod macierzysty. Nie wiem jednak o istniejącej bibliotece.LD_PRELOAD
może być również użyty do ograniczenia programu do widoku tylko do odczytu utworzonego za pomocąmount --bind
lubbindfs
; znowu nie wiem o istniejącej bibliotece.W Debianie i pochodnych możesz skonfigurować środowisko schroot . Schroot jest setuid root i musi być skonfigurowany jako root, ale może być wykonany przez dowolnego autoryzowanego użytkownika.
Metodą, która nie wymaga współpracy z rootem, jest uruchomienie procesu na maszynie wirtualnej. Możesz skonfigurować KVM, VirtualBox lub Linux w trybie użytkownika . Jest nieco ciężki i będzie oznaczał dodatkowe zużycie pamięci, ale nie powinien znacząco wpływać na szybkość obliczeń symbolicznych.
Jak „uwięzić” proces bez rootowania? może dostarczyć inspiracji.
źródło
Jednym ze sposobów, aby przynajmniej uniemożliwić procesowi zapisywanie plików (ale nie tworzenie ich), jest wywołanie w
ulimit -f 0
pierwszej kolejności. Spowoduje to przerwanie procesu, gdy tylko spróbuje on zapisać plik, ale tworzenie pustych plików jest nadal możliwe.źródło