Jaromil在2002年设计了最精简的LinuxFork炸弹,整个代码只有13个字符,在shell中运行几秒后系统就会崩溃:这个好像不太好理解,我们可以改一下格式:为了更好的理解,是这样的:因为shell中的函数可以省略function关键字,所以上面的13个字符就是定义一个函数并调用这个函数的function。函数名称为:,主要核心代码为:|:&,可见这是函数本身的递归调用,通过&在后台启动一个新的进程,通过管道实现几何增长的过程,最后通过:调用函数来引爆炸弹。因此,几秒钟后系统就会因为处理不了太多的进程而崩溃,唯一的解决办法就是重启。炸弹,抱着不做不做不死的心态,我们也跑吧,于是把矛头指向了云主机。我用的是2G内存的国产云主机。首先在本地打开两个终端,一个终端连接到云主机。运行炸弹,然后在几秒钟后尝试使用另一个终端登录。效果如下图:看,运行一段时间后,直接报-bash:fork:Cannotallocatememory,说明内存不足。我尝试在第二个终端上进行连接,但没有任何反应。因为是虚拟云主机,我只能通过主机服务商的后台进行主机断电重启。然后才能再次登录:BombHazardFork炸弹的后果是耗尽服务器资源,使服务器无法正常对外提供服务,也就是常说的DoS(拒绝服务)。与传统的1v1不断向服务器发送请求导致服务器崩溃不同,Fork炸弹有一种坐山观虎斗、兵不血刃杀敌的感觉。更可怕的是,这个功能可以在没有root权限的情况下运行。看到网上有个帖子说有人把个人签名改成了Fork炸弹。结果,好奇的人被枪杀了。想象一下,如果被拍的人在公司的服务器上运行,哦,!防范方法当然,Fork炸弹并没有那么可怕,你可以用其他语言分分钟写一个,比如python版:Fork炸弹的本质是通过创建进程来抢占系统资源。在Linux中,我们可以使用ulimit命令来限制某些用户的行为。运行ulimit-a看看我们可以做哪些限制:可以看到,-u参数可以限制用户创建的进程数,所以我们可以使用ulimit-u20来允许用户最多创建20个进程。这样可以防止炸弹炸弹。但这并不彻底,关闭终端后该命令将失效。我们可以通过修改/etc/security/limits.conf文件来进行更深层次的防范,在文件中添加如下一行(ubuntu需要换成你的用户名):ubuntu-nproc20这样,注销后再次登录,会发现最大进程数已经改成20了,这时候我们再运行bomb,不会报内存不足,而是会提示-bash:fork:retry:没有子进程,这很好。这时候说明linux限制了bombcreationthread。.
