Зробіть процес, який неможливо видалити в Linux


14

Я працюю над програмою менеджера паролів, і з міркувань безпеки хочу запустити процес, який не можна скасувати.

І крім того, я не хочу, щоб ця програма була демоном, оскільки мені потрібно читати зі стандартного вводу та писати на ній.

Чи є спосіб це зробити?


11
"з міркувань безпеки я хочу запустити процес, який не можна скасувати". Лише зауваження - якби це було дозволено, люди могли з легкістю експлуатувати це з нечесних причин - наприклад, запустити бомби, що не зупиняються.
ВЛАЗ

32
Це звучить як проблема XY . Я підозрюю, що все, що ви насправді намагаєтесь досягти, нерозбірливий процес - це не спосіб цього зробити. "З міркувань безпеки" дуже розпливчастий. Що саме ви хочете заважати користувачеві робити? Який вони мають доступ?
Нейт Елдредж

4
Будь-який процес, нерозбірливий для всіх намірів і цілей, є вірусом.
Naftuli Kay

3
@NateEldredge: Скоріше, програма нехай ігнорує сигнали. Це типовий спосіб зробити це; в іншому випадку хтось може надіслати SIGINT або SIGTSTP безпосередньо до процесу, минаючи термінал.
Ной Шпрір’єр

2
@NoahSpurrier: Я уявляю ситуацію, коли у вас є користувач, який може вводити речі на консолі, але інакше не може виконувати код на комп'ютері (наприклад, у кіоску). Ви налаштуєте його так, що жоден ключ, який вони можуть ввести, не матиме несподіваного ефекту. Якщо вони можуть виконати інший код, ігнорування SIGINT та SIGTSTP та SIGQUIT не допоможе; кожен, хто міг би направити ці сигнали безпосередньо до процесу, також може надіслати SIGKILL або SIGSTOP, які ви не можете ігнорувати.
Нейт Елдредж

Відповіді:


41

Робить менеджер паролів прохід під окремим користувачем і ручки / ігнорувати / блокувати сигнали , які генеруються термінальні ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, і SIGTTOU).

Ви не можете надсилати сигнали до процесів (= kill), запущених під іншим користувачем (користувачем, чий реальний uid і uid-встановлений uid відрізняється від вашого ефективного uid), якщо ваш ефективний ідентифікатор не дорівнює 0 (root).

Усі процеси все ще підлягатимуть викоріненню коренем.

Детальніше див. Вбивство (2) .


15

Єдиний спосіб зробити процес нерозбірливим - це реалізувати його як нитку ядра , що не є чимось тривіальним.

Ви все одно можете його вбити, але це було б пошкодженням відключення ОС.

Ви також можете розробити спеціальний модуль ядра, який встановив би SIGNAL_UNKILLABLEпрапор вашому процесу. Цей прапор призначений тільки для встановлення init(або systemdбудь-якого початкового процесу запуску ядра), які є єдиними процесами, що захищаються від безумовного вбивства, але ніщо не забороняє цьому прапору бути присутнім у звичайному процесі.


1
це може бути процес init
muhmuhten

@muhmuhten Ви маєте рацію, init - це процес, що захищається від безумовного вбивства. Однак він не призначений для налаштування, хоча для модулів та потоків ядра точно існує API.
jlliagre

Щоб детальніше розібратися з власною відповіддю, я припускаю, що у вас немає доступу до кореневого облікового запису (що, до речі, натякає, що це або приклад іграшки, проект курсу або зловмисне програмне забезпечення). Виключає ідею, що ви могли б зв'язати модуль ядра для цієї мети. Також зауважте, що прапор SIGNAL_UNKILLABLE недоступний для нормальних процесів і виключає деякі важливі нормальні операції (наприклад, vforking), і тому я вважаю це нормально непрактичним крайовим випадком.
GregD

@jlliagre дійсно, це не так.
muhmuhten

@dudek Нерозбірливий процес - це звичайно непрактичний крайній випадок.
jlliagre

11

Технічно не існує способу зробити процес неможливим.

Звичайно, для некорінних користувачів вони можуть знищувати лише ті процеси, які мають той самий ідентифікатор користувача, що і вони, тому якщо ви можете створити різні облікові записи, ви можете використовувати "унікальний" ідентифікатор користувача для цього процесу, і тоді тільки root може вбити його.

Просте, але менш надійне рішення - зробити ваш процес вловлювати якомога більше сигналів (можливо, ігноруючи їх). Це підходить лише для іграшкових прикладів або не-змагальних середовищ, оскільки немає способу зловити сигнал KILL (сигнал 9), але в іншому випадку ви можете уникнути їх вбиття.

Нарешті, ви можете домовитись, щоб ваш процес був відтворений, якщо його вбили. Це також крихке (дуже тендітне), але зробить його трохи складніше. Це можна досягти, використовуючи власний процес моніторингу або використовуючи inittab. Для супротивника, який знає, що вони роблять, це можна легко обійти, вбивши відразу декілька процесів.


1
Але (крім inittab) можливо, процес монітора також може бути вбитий, ні?
roaima

Ні, драйвери пристроїв (модулі ядра) можуть створювати процеси, які не можуть бути знищені коренем.
Ной Шпрір’єр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.