Mac上的叉子炸彈?
我剛剛了解了分叉炸彈,一種有趣的拒絕服務攻擊類型。維基百科(和其他一些地方)建議
:(){ :|:& };:
在 UNIX 機器上使用無限次 fork 程序。但是,它似乎不適用於 Mac OS X Lion(我記得讀過最流行的作業系統不容易受到這種直接攻擊)。然而,我對這種攻擊的工作原理(和外觀)非常好奇,並想在我的 Mac 上試用一下。有沒有辦法繞過系統的保護措施,或者在 Mac 上無法使用叉形炸彈?
叉子炸彈是如何工作的:在 C(或類似 C)程式碼中,呼叫了一個名為的函式
fork()
。這會導致 linux 或 Unix 或 Unix-a-likes 創建一個全新的程序。這個程序有一個地址空間、一個程序 ID、一個信號遮罩、打開的文件描述符,以及所有佔用 OS 核心有限記憶體空間的東西。新創建的程序還在核心的資料結構中佔有一席之地,供程序執行。對於呼叫的程序,fork()
看起來什麼也沒發生。一個 fork-bomb 程序將嘗試fork()
盡可能快地呼叫,盡可能多地呼叫。訣竅是新創建的程序*也來自
fork()
*相同的程式碼。分叉後,您有兩個程序執行相同的程式碼。每個新的 fork-bomb 程序都嘗試fork()
盡可能快地呼叫,盡可能多地呼叫。您作為範例給出的程式碼是分叉炸彈的 Bash 腳本版本。很快,所有作業系統核心的程序相關資源都用完了。程序表已滿。等待執行的程序列表已滿。實際記憶體已滿,因此開始分頁。如果這種情況持續足夠長的時間,交換分區就會填滿。
這對使用者來說是什麼樣的:一切都執行得非常慢。當您嘗試簡單的操作(例如
ls
. 嘗試 aps
會導致無休止的暫停(如果它執行的話)並返回一個很長的程序列表。有時這種情況需要通過電源線重新啟動。在過去,叉形炸彈曾經被稱為“兔子”。因為它們繁殖得如此之快。
只是為了好玩,我用 C 寫了一個 fork 炸彈程序:
#include <stdio.h> #include <unistd.h> int main(int ac, char **av) { while (1) fork(); return 0; }
我在一個 xterm 中在 Arch Linux 下編譯並執行了該程序。我另一個 xterm 我試圖獲得一個程序列表:
1004 % ps -fu bediger zsh: fork failed: resource temporarily unavailable
第二個 xterm 中的 Z shell 無法
fork()
成功呼叫,因為與第一個 xterm 相關的 fork 炸彈程序已用完與創建和執行的程序相關的所有核心資源。