使 Linux 上的进程不可终止

使 Linux 上的进程不可终止

我正在开发一个密码管理器应用程序,出于安全原因,我想启动一个不可杀死的进程。

除此之外,我不希望这个程序成为守护进程,因为我需要从标准输入读取并写入它。

有没有办法做到这一点?

答案1

使密码管理器在单独的用户下运行,并处理/忽略/阻止终端生成的信号(SIGINTSIGQUITSIGHUPSIGTSTPSIGTTINSIGTTOU)。

除非您的有效 id 为 0(root),否则您无法向(=kill)在不同用户(其真实 uid 和保存集 uid 均不同于您的有效 uid 的用户)下运行的进程发送信号。

所有进程仍可被 root 杀死。

有关更详细的信息,请参阅杀死(2)

答案2

使进程无法被杀死的唯一方法是将其实现为内核线程,这不是一件小事。

您仍然可以杀死它,但这将是操作系统关闭的附带损害。

SIGNAL_UNKILLABLE您还可以开发一个自定义内核模块,为您的进程设置标志。该标志被设计为仅针对init(或systemd内核启动的任何初始进程)设置,它们是唯一免受无条件终止的用户态进程,但似乎没有什么禁止该标志出现在常规进程中。

答案3

从技术上讲,用户无法使进程无法被杀死。

当然,对于非 root 用户,他们只能杀死与他们具有相同用户 ID 的进程,因此,如果您可以创建不同的帐户,则可以为该进程使用“唯一”用户 ID,然后只有 root 可以杀死它。

一个简单但不太稳健的解决方案是让您的进程捕获尽可能多的信号(可能忽略它们)。这仅适用于玩具示例或非对抗性环境,因为无法捕获 KILL 信号(信号 9),但否则您可以避免被它们杀死。

最后,您可以安排在进程被杀死时重生。这也很脆弱,但会使其更难以删除。这可以使用您自己的监视进程或使用 inittab 来完成。对于知道自己在做什么的对手来说,可以通过一次终止多个进程来规避这一点。

相关内容