使进程在Linux上不可杀灭


14

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

而且我不希望该程序成为守护程序,因为我需要从标准输入中读取并写入它。

有没有办法做到这一点?


11
“出于安全考虑,我想启动一个不可杀伤的进程。” 只是一个提示-如果允许,人们可能会出于邪恶的原因而轻易地利用它-例如,发射不可阻挡的叉子炸弹。
VLAZ

32
这听起来像XY问题。我怀疑无论您真正想实现什么,一个无法杀死的过程都无法做到。“出于安全原因”非常含糊。您到底想阻止用户做什么?他们有什么访问权限?
Nate Eldredge

4
出于所有意图和目的不可杀死的任何过程都是病毒。
Naftuli Kay 2015年

3
@NateEldredge:相反,让程序忽略信号。这是典型的方式。否则,有人可以绕过终端直接将SIGINT或SIGTSTP发送到该进程。
Noah Spurrier 2015年

2
@NoahSpurrier:我正在想象这样一种情况:您有一个用户可以在控制台上键入内容,但不能以其他方式在计算机上执行代码(例如信息亭)。您进行了设置,以使它们可以键入的任何键都不会产生意外的效果。如果他们可以执行其他代码,则忽略SIGINT和SIGTSTP和SIGQUIT并没有帮助;可以将那些信号直接发送到进程的任何人也可以发送您不能忽略的SIGKILL或SIGSTOP。
Nate Eldredge

Answers:


41

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

除非您的有效ID为0(root),否则您不能向在不同用户(其实际uid和保存的设置uid都与您的有效uid不同的用户)下运行的(= kill)进程发送信号。

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

有关更多详细信息,请参见kill(2)


15

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

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

您可能还会开发一个自定义内核模块,该模块将为SIGNAL_UNKILLABLE您的进程设置标志。该标志仅设计用于init(或systemd与内核启动无关的任何初始进程)设置,这是唯一防止无条件终止的用户级进程,但似乎没有什么禁止该标志出现在常规进程中的。


1
这可能是初始化过程
muhmuhten 2015年

@muhmuhten没错,init是一个防止无条件终止的用户级进程。但是,当确实存在用于内核模块和线程的API时,就不能对其进行自定义。
jlliagre

为了详细说明我自己的答案,我假设您没有访问根帐户的权限(顺便说一句,这暗示这可能是玩具示例,课程项目或恶意软件)。排除了您可以为此目的连接内核模块的想法。另请注意,SIGNAL_UNKILLABLE标志不适用于常规进程,并且排除了一些重要的常规操作(例如vforking),因此我将其视为不切实际的边缘情况。
GregD 2015年

@jlliagre确实是,不是。
muhmuhten

@dudek一个无法杀死的进程已经是通常不切实际的情况。
jlliagre

11

从技术上讲,没有办法使过程不可杀灭。

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

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

最后,您可以安排进程被杀死后重新生成。这也是易碎的(非常脆弱),但会使它更难清除。这可以使用您自己的监视进程或使用inittab来完成。对于知道自己在做什么的对手,可以通过一次杀死多个进程来轻松地避免这种情况。


1
但是(除了inittab),监视进程也有可能被杀死,不是吗?
roaima 2015年

不,设备驱动程序(内核模块)可以创建无法被root杀死的进程。
Noah Spurrier 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.