Chcę stworzyć program, który będzie trudny do zatrzymania (nawet dla administratora) po uruchomieniu (z uprawnieniami roota). Po uruchomieniu proces powinien zacząć się od samego początku, dopóki nie zostanie poproszony o zatrzymanie. Proces zatrzymywania powinien zająć trochę czasu (tj. Powinien być drogi).
Wiem, że może to brzmieć jak złośliwe oprogramowanie, ale chcę go z prawdziwego powodu. Chcę uruchomić blokowanie witryn na moim laptopie (na którym jestem administratorem). I chcę utrudnić sobie ich powstrzymanie.
Rozwiązanie, o którym myślałem, to:
Proces powinien być uruchamiany z inną nazwą za każdym razem, gdy jest uruchamiany, aby nie mogłem przewidzieć nazwy procesu i zabić go.
Proces zapisze się w /etc/rc5.d przy wyłączaniu
Proces zaszyfruje swoją nazwę za pomocą szyfru w znanej lokalizacji. Proces zatrzymania będzie musiał użyć bruteforce do odzyskania nazwy programu i zabicia go.
Chciałbym znaleźć dobre rozwiązanie dla tego zadania.
Odpowiedzi:
Jednym z podejść może być użycie przestrzeni nazw PID:
Uruchom system z
init=/some/cmd
parametrem jądra jako, w którym/some/cmd
forksuje proces w nowej przestrzeni nazw (CLONE_NEWPID
) i uruchamia się/sbin/init
w nim (będzie miał PID 1 w tej nowej przestrzeni nazw i pid 2 w głównej przestrzeni nazw), a następnie w rodzicu, wykonaj polecenie „ program".Prawdopodobnie będziesz chciał mieć sposób kontrolowania swojego programu w taki czy inny sposób (na przykład gniazdo TCP lub ABSTRACT Unix).
Prawdopodobnie będziesz chciał zablokować swój program w pamięci i zamknąć większość odniesień do systemu plików, aby na niczym nie polegał.
Ten proces nie będzie widoczny z reszty systemu. Reszta systemu będzie działać tak jak w kontenerze.
Jeśli ten proces umrze, jądro wpadnie w panikę, co daje dodatkową gwarancję.
Niewygodnym efektem ubocznym jest jednak to, że nie zobaczymy wątków jądra na wyjściu
ps
.Jako dowód koncepcji (używając tej sztuczki, aby uruchomić kopię systemu na maszynie wirtualnej qemu):
Utwórz
/tmp/init
podobny:(potrzebujesz
unshare
z najnowszej wersji util-linux (2.14)). Powyżej używamysocat
jako „program”, który po prostu odpowiada na połączeniach TCP na porcie 1234 z wyjściemps -efH
.Następnie uruchom maszynę wirtualną jako:
Następnie widzimy:
źródło
Nie jestem pewien, czy jest to ostateczne rozwiązanie, czy też jest to najlepszy sposób. Moje opinie:
Zmodyfikuj,
init
ponieważ jest to pierwszy proces, jeśli umiera, wszyscy inni też umierają. Dzięki temu Twoja maszyna będzie nadawać się tylko do użytku.Utwórz moduł jądra i załaduj moduły krytyczne w zależności od niego (jeśli zostanie zabity, spowoduje reakcję łańcuchową jak w
init
przykładzie).Zmodyfikuj jądro, aby ignorować żądania zabicia dla określonego procesu.
Pamiętaj, że dwa ostatnie będą działały w trybie jądra (który jest bardzo ograniczony pod względem bibliotek i tak dalej). Modyfikacja
init
będzie działać w przestrzeni użytkownika, umożliwiając korzystanie z wielu jej funkcji.źródło