我已经阅读了有关其功能的其他问题——叉子炸弹通过在分叉过程中消耗 CPU 时间以及使操作系统的进程表饱和来进行操作。
分叉炸弹的基本实现是一个无限循环,重复启动相同的进程。
但我真的很想知道:这个命令的来历是什么?为什么是这个:(){ :|:& };:
而不是另一个?
答案1
这不是什么新鲜事。它的历史可以追溯到 1970 年代推出的时候。
引用自这里,
Fork 炸弹最早的描述之一是 1969 年在华盛顿大学的 Burroughs 5500 上。它被描述为一个名为 RABBITS 的“黑客”,它在运行时会制作两个自身副本,而这两个副本会生成两个副本。每个副本都会产生更多副本,并且副本会继续制作更多副本,直到内存已满,从而导致系统崩溃。问:1972 年,厌世者使用 BASIC 编写了一个类似 Rabbit 的程序,当时他还在读 7 年级。耶鲁大学的 Jerry Leichter 描述了在他的母校普林斯顿听到的类似兔子或叉子炸弹的程序,并说考虑到他的毕业日期,这些程序一定来自1973 年或更早。 1974 年的一篇报道描述了一个实际上名为“兔子”的程序,该程序在一家大公司的 IBM 360 系统上运行,一名年轻员工因运行该程序而被解雇。
所以这:(){ :|:& };:
只是在 shell 中实现 fork 炸弹的一种方法。如果您采用其他编程语言,您也可以使用这些语言来实现。例如,在 python 中,你可以将 fork 炸弹实现为:
import os
while True:
os.fork()
更多用不同语言实现 fork 炸弹的方法可以从维基百科关联。
如果您想了解语法,那非常简单。 shell 中的正常函数如下所示:
foo(){
# function code goes here
}
炸弹fork()
的定义如下:
:(){
:|:&
};:
:|:
- 接下来,它将使用称为递归的编程技术来调用自身,并将输出通过管道传输到函数的另一个调用:
。最糟糕的部分是函数被调用两次来轰炸你的系统。
&
- 将函数调用放在后台,这样子进程就不会死掉并开始消耗系统资源。
;
- 终止函数定义
:
- 调用(运行)该函数,也称为设置 fork() 炸弹。
这是更易于人类阅读的代码:
bomb() {
bomb | bomb &
}; bomb
参考
答案2
一位意大利黑客艺术家将其表述为一系列类似微笑的字符,并使其流行起来:https://jaromil.dyne.org/journal/forkbomb.html
毕竟,同样的 fork 炸弹可以用更容易理解的方式编写:
bomb() {
bomb | bomb &
}
bomb
然而,雅罗米尔想以一种诗意的方式编码病毒,引用他的话:
在将源代码视为文学时,我将病毒描述为魏尔伦、兰波等人写的那种诗歌,反对那些将网络作为异性恋社会的安全区出售的人。 [...] 病毒是一个仍然极其庞大的社会的政治症状,禁止病毒并不能解决由此产生的问题。对于匿名和黑客攻击也是如此。
必须指出的是,雅罗米尔并未发明炸弹,而是将其作为匿名艺术作品提出。