【问题标题】:Advanced forkbomb immune to kill signal高级叉弹免疫杀伤信号
【发布时间】:2017-12-09 23:18:40
【问题描述】:

在我的一门 CS 课程中,我们的任务是制造一个很难阻止的叉形炸弹。

需要免疫control-c、control-z、control-d关闭终端。它还必须不受 sigkill 和信号 9 的影响,我们很快就使用 sigsegv 进行了信号处理,但仅此而已。我读到 sigaction 无法捕获 sigkill 或 sigstop 信号。

我还读到,守护进程将允许它在后台运行,因此关闭终端不会停止它。

如何使 fork 炸弹进程对 sigkill 信号免疫?

这是我们之前制作的叉子炸弹。

#include<unistd.h>

int main(){

    while(1){
        fork();
    }
    return 0;
}

我也在使用虚拟盒子来安全地测试它。

【问题讨论】:

  • 你不能让进程对 SIGKILL 信号免疫;这总是致命的。但是,您可以做的是确保即使启动 fork 炸弹的原始进程因 SIGKILL 而死,它的众多后代也不会收到该信号,因此将继续产生子进程,并使您的系统像允许您同时运行的进程数的限制将允许。我不建议尝试 - 您可能需要重新启动。 (过程组和会话将是相关的。)
  • 我正在使用虚拟盒子测试炸弹,如何让子进程收不到SIGKILL?
  • 你不能让任何进程不接收来自适当授权进程的 SIGKILL(例如,由root 运行的进程)。如果子进程设法从创建它的用户更改其身份(例如,因为它是另一个用户的 SUID),那么它可能会获得某种免疫。但是,如果root 设法启动一个向它发送 SIGKILL 的进程,该进程将突然死亡,并且没有任何缓和选项。唯一失败的情况是进程挂在不可中断的系统调用中——这偶尔会发生在不可用的 NFS 文件系统上(但更早),但是……

标签: c linux signals fork daemon


【解决方案1】:

无法避免/免疫sigkill 信号。阅读signal() 的手册页 它说信号 SIGKILL 和 SIGSTOP 不能被捕获或忽略

while(1){
        fork();
    }

这不是一个好主意,因为您无法根据需要创建进程,有一些限制,请查看ulimit。在没有资源的阶段,它会失败(sh 将显示错误消息)。

【讨论】:

  • 这只是答案的一部分,尽管它是答案的一个非常重要的部分。
  • 你建议我怎么做叉子炸弹?我读过 :(){ :|:& };: 是一个简单的分叉炸弹,这会是更好的选择吗?
  • @Will:shell 片段:(){:|:&amp;};: 是一个简单的fork-bomb,但它与您展示的C 代码没有显着差异。它与任何其他类似代码一样容易受到 SIGKILL 的攻击。你了解那段代码(shell 片段)实际上做了什么吗?
  • @JonathanLeffler 我相信是的,我现在知道 SIGKILL 无法停止,我们的教授确实提到它不必对限制过程免疫,我想我需要做什么您在上面提到并确保子进程在其父进程时不会被杀死。
  • @Will:我建议使用有限的 fork 炸弹测试免疫(当父/祖先被杀死时孩子不会死),其中进程在一段时间后停止(例如,在循环之前设置为 0 的计数器并在循环体中递增 - 或者可能是for (int i = 0; i &lt; 5; i++) fork();),然后是pause();,以便进程进入暂停动画,等待信号。然后,您可以将 SIGKILL 发送到初始进程并查看子进程不会死。冲洗并重复有关如何设置信号处理的不同实验,直到您确定自己知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2021-10-07
相关资源
最近更新 更多