在 Linux 上使进程不可终止

Moh*_*ghi 15 linux process kill

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

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

有没有办法做到这一点?

PSk*_*cik 41

使一个单独的用户和手柄下密码管理器运行/忽略/块终端产生的信号(SIGINTSIGQUITSIGHUPSIGTSTPSIGTTIN,和SIGTTOU)。

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

所有进程仍然可以被 root 杀死。

有关详细信息,请参阅kill(2)


jll*_*gre 15

使进程不可杀死的唯一方法是将其实现为内核线程,这并非易事。

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

您还可以开发一个自定义内核模块来SIGNAL_UNKILLABLE为您的进程设置标志。此标志旨在仅设置init(或systemd内核启动的任何初始进程),这些进程是唯一受保护免受无条件终止的用户级进程,但似乎没有禁止该标志出现在常规进程中。


Gre*_*egD 12

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

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

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

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