Я хочу создать программу, которую будет трудно остановить (даже администратору) после запуска (с правами суперпользователя). После запуска процесс должен продолжать запускаться при запуске до тех пор, пока его не попросят остановить. Процесс остановки должен занять некоторое время (т.е. должно быть дорого).
Я знаю, что это может звучать как вредоносное программное обеспечение, но я хочу по подлинной причине. Я хочу запускать блокировщики сайта на своем ноутбуке (на котором я являюсь администратором). И я хочу, чтобы мне было трудно их остановить.
Решение, о котором я подумал, заключается в следующем:
Процесс должен запускаться с другим именем при каждом запуске, так что я не могу предсказать имя процесса и уничтожить его.
Процесс сохранит себя в /etc/rc5.d при завершении работы
Процесс зашифрует свое имя, используя шифр в известном месте. Процесс остановки должен будет использовать bruteforce, чтобы восстановить имя программы и убить его.
Я хотел бы найти хорошее решение для этой задачи.
Ответы:
Одним из подходов может быть использование пространств имен PID:
Загрузите вашу систему с
init=/some/cmd
параметром ядра as, где/some/cmd
разветвляется процесс в новом пространстве имен (CLONE_NEWPID
) и запускается/sbin/init
в нем (у него будет PID 1 в этом новом пространстве имен и pid 2 в корневом пространстве имен), а затем в родительском файле выполните ваше " программа».Возможно, вам понадобится способ так или иначе управлять вашей программой (например, сокет TCP или ABSTRACT Unix).
Возможно, вы захотите заблокировать вашу программу в памяти и закрыть большинство ссылок на файловую систему, чтобы она ни на что не опиралась.
Этот процесс не будет видно из остальной системы. Остальная часть системы будет работать, как в контейнере.
Если этот процесс умирает, ядро будет паниковать, что дает вам дополнительную гарантию.
Однако неудобным побочным эффектом является то, что мы не увидим потоков ядра в выводе
ps
.В качестве подтверждения концепции (используя этот трюк для загрузки копии вашей системы на виртуальной машине qemu):
Создать
/tmp/init
лайк:(вам нужна
unshare
последняя версия util-linux (2.14)). Выше мы используемsocat
в качестве «программы», которая просто отвечает на TCP-соединения через порт 1234 с выводомps -efH
.Затем загрузите вашу виртуальную машину как:
Затем мы видим:
источник
Не уверен, является ли это окончательным решением или это лучший способ сделать это. Мои мнения:
Изменить,
init
так как это первый процесс, если он умирает, все остальные тоже умирают. Таким образом, ваша машина будет использоваться только с ним.Создайте модуль ядра и загружайте критические модули в зависимости от него (если его убьют, это вызовет цепную реакцию, как в
init
примере).Модифицируйте ядро, чтобы игнорировать запросы на удаление для определенного процесса.
Имейте в виду, что последние два будут работать в режиме ядра (который очень ограничен с точки зрения библиотек и т. Д.). Модификация
init
будет выполняться в пользовательском пространстве, что позволит вам использовать многие его функции.источник