Сделать процесс невозможным в Linux

14

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

И, кроме того, я не хочу, чтобы эта программа была демоном, поскольку мне нужно читать со стандартного ввода и писать в него.

Есть ли способ сделать это?

Мухаммед Разеги
источник
11
«Из соображений безопасности я хочу запустить неубиваемый процесс». Просто примечание - если бы это было разрешено, люди могли бы легко использовать его по гнусным причинам - например, запустить неостанавливаемую вилочную бомбу.
ВЛАЗ
32
Это звучит как проблема XY . Я подозреваю, что чего бы вы на самом деле ни пытались достичь, неубиваемый процесс не способ сделать это. «По соображениям безопасности» очень расплывчато. Что именно вы хотите, чтобы пользователь не делал? Какой у них доступ?
Нейт Элдридж
4
Любой процесс, который невозможно уничтожить во всех отношениях, является вирусом.
Нафтули Кей
3
@NateEldredge: Скорее программа должна игнорировать сигналы. Это типичный способ сделать это; в противном случае кто-то может отправить SIGINT или SIGTSTP напрямую процессу, минуя терминал.
Ноа Спурриер
2
@NoahSpurrier: я представляю себе ситуацию, когда у вас есть пользователь, который может набирать текст на консоли, но не может иначе выполнить код на компьютере (например, в киоске). Вы настроили его так, чтобы ни одна клавиша, которую они могли набрать, не имела неожиданного эффекта. Если они могут выполнять другой код, игнорирование SIGINT и SIGTSTP и SIGQUIT не поможет; любой, кто может отправить эти сигналы непосредственно процессу, также может отправить SIGKILL или SIGSTOP, которые нельзя игнорировать.
Нейт Элдредж,

Ответы:

41

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

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

Все процессы по-прежнему будут уничтожены пользователем root.

Для более подробной информации смотрите kill (2) .

PSkocik
источник
15

Единственный способ сделать процесс неубиваемым - это реализовать его как поток ядра , что не является чем-то тривиальным.

Вы все еще можете убить его, но это будет сопутствующий ущерб ОС.

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

jlliagre
источник
1
это может быть процесс инициализации
muhmuhten
@muhmuhten Вы правы, init - это процесс пользователя, защищенный от безусловного уничтожения. Однако он не предназначен для настройки, хотя определенно есть API для модулей и потоков ядра.
июля
Чтобы уточнить свой собственный ответ, я предполагаю, что у вас нет доступа к корневой учетной записи (что, кстати, намекает на то, что это либо игрушечный пример, либо проект курса, либо вредоносная программа). Это исключает идею, что вы можете подключить модуль ядра для этой цели. Также обратите внимание, что флаг SIGNAL_UNKILLABLE недоступен для нормальных процессов и исключает некоторые важные нормальные операции (например, vforking), и поэтому я бы расценил его как обычно непрактичный крайний случай.
GregD
@jlliagre действительно, это не так.
muhmuhten
@dudek Неубиваемый процесс - это обычно непрактичный крайний случай.
июля
11

Технически, нет способа сделать процесс неубиваемым.

Конечно, для пользователей без полномочий root они могут уничтожать только процессы с одинаковым идентификатором пользователя, поэтому, если вы можете создавать разные учетные записи, вы можете использовать «уникальный» идентификатор пользователя для процесса, и тогда только root может уничтожить его.

Простое, но менее надежное решение состоит в том, чтобы ваш процесс перехватывал как можно больше сигналов (возможно, игнорируя их). Это подходит только для игрушечных примеров или не состязательной среды, так как нет способа поймать сигнал KILL (сигнал 9), но в противном случае вы можете избежать их гибели.

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

GregD
источник
1
Но (кроме inittab) возможно, что процесс мониторинга также может быть убит, не так ли?
Роайма
Нет, драйверы устройств (модули ядра) могут создавать процессы, которые не могут быть уничтожены пользователем root.
Ноа Спурриер,