Pracuję nad aplikacją do zarządzania hasłami i ze względów bezpieczeństwa chcę uruchomić proces, którego nie można zabić.
Poza tym nie chcę, aby ten program był demonem, ponieważ muszę czytać ze standardowego wejścia i pisać na nim.
Czy jest na to sposób?
Odpowiedzi:
Dokonać bieg menedżer haseł na podstawie odrębnej użytkownika i uchwyt / ignore / sygnałów sterujących generowanych blokowe (
SIGINT
,SIGQUIT
,SIGHUP
,SIGTSTP
,SIGTTIN
, iSIGTTOU
).Nie można wysyłać sygnałów do procesów (= kill) działających pod innym użytkownikiem (użytkownikiem, którego zarówno rzeczywisty identyfikator użytkownika, jak i zapisany identyfikator użytkownika różnią się od efektywnego identyfikatora użytkownika), chyba że efektywny identyfikator to 0 (root).
Wszystkie procesy będą nadal możliwe do wywołania przez rootowanie.
Aby uzyskać szczegółowe informacje, zobacz kill (2) .
źródło
Jedynym sposobem na unieważnienie procesu jest zaimplementowanie go jako wątku jądra , co nie jest trywialne.
Nadal możesz go zabić, ale byłoby to uszkodzenie dodatkowe związane z zamknięciem systemu operacyjnego.
Możesz także opracować niestandardowy moduł jądra, który ustawi
SIGNAL_UNKILLABLE
flagę dla twojego procesu. Ta flaga została zaprojektowana tylko dlainit
(lubsystemd
dowolnego początkowego procesu uruchomienia jądra), które są jedynymi procesami użytkownika chronionymi przed bezwarunkowym zabiciem, ale nic nie zabrania obecności tej flagi dla regularnego procesu.źródło
Technicznie nie ma sposobu, aby proces był niemożliwy do zabicia.
Oczywiście dla użytkowników innych niż root mogą zabijać tylko procesy, które mają ten sam identyfikator użytkownika, co oni, więc jeśli możesz tworzyć różne konta, możesz użyć „unikalnego” identyfikatora użytkownika dla procesu, a następnie tylko root może go zabić.
Prostym, ale mniej niezawodnym rozwiązaniem jest przechwycenie przez proces jak największej liczby sygnałów (być może ich zignorowanie). Jest to odpowiednie tylko dla przykładów zabawek lub środowisk nieprzyjmujących przeciwników, ponieważ nie ma sposobu, aby złapać sygnał KILL (sygnał 9), ale w przeciwnym razie możesz uniknąć ich zabicia.
Wreszcie możesz zorganizować odrodzenie procesu, jeśli zostanie zabity. Jest to również delikatne (bardzo delikatne), ale utrudni jego usunięcie. Można tego dokonać za pomocą własnego procesu monitorowania lub inittab. Dla przeciwnika, który wie, co robią, można to łatwo obejść, zabijając wiele procesów jednocześnie.
źródło
inittab
) możliwe jest, że proces monitorowania również może zostać zabity, nie?