2010-12-10 14 views
9

我正在考慮沙盒Linux進程的幾個選項。使用clone()CLONE_NEWNET(等)是選項之一。 CLONE_NEWNET可確保沙盒進程無法建立或接受真實的網絡連接。但是我想完全禁用這個進程的套接字,即使bind()也可以連接到0.0.0.0上的任何端口,並綁定到Unix doman套接字(甚至是匿名)。我想這樣做是爲了防止進程通過綁定到數千個端口來使用太多的內核資源。我怎麼做?一般來說,我對許多沙盒方法感興趣(即由Linux內核提供的那些方法和由ptrace()執行的那些方法),但在這個問題中,我只關心沙盒方法的套接字創建方面(所以如果你提出了一個沙箱方法,請解釋如何防止使用它創建套接字),而且我對那些需要內核修補或者加載不屬於Ubuntu Lucid默認二進制內核包的內核模塊的方法不感興趣,或者哪些會影響系統上的每個進程。如何禁用用於沙盒的Linux進程的套接字創建?

+2

類似Qs的在Linux或Unix沙箱/監禁進程: * http://unix.stackexchange.com/q/6433/4319 * http://stackoverflow.com/q/3859710/94687 * HTTP:/ /stackoverflow.com/q/4249063/94687 * http://stackoverflow.com/q/1019707/94687 – 2011-03-13 13:37:40

回答

8

ptrace似乎是最明顯的工具,但除了...

的util-linux的[-ng]有一個命令unshare,它採用了內核的clone/unshare接口。如果通過unshare -n(或clone(CLONE_NEWNET))運行新進程,則它創建的任何網絡套接字都位於不同的名稱空間中。這並不能解決內核資源問題,但它會對該進程進行沙箱化。

Linux內核還支持seccomp,模式與prctl(PR_SET_SECCOMP, 1)防止過程(當然,螺紋,真的)從調用任何其他系統調用比readwriteexitsigreturn輸入。這是一個非常有效的沙箱,但難以使用未經修改的代碼。

您可以定義不允許socket/bind的/ etc SELinux的域。調用,並執行到該類型的動態轉換。這(顯然)需要一個主動執行SELinux策略的系統。 (可能類似的事情是可能的AppArmor配置和TOMOYO,但我不是很熟悉它們。)

+1

感謝您撰寫這樣一份完整的清單。我已經接受你的答案。我試過AppArmor,並且我可以確認它可以防止套接字創建。我已經在問題中提到過'CLONE_NEWNET'(爲什麼它不是解決方案)。 seccomp對我的問題不是一個好的答案,因爲它限制了比我想要的更多(例如fork())。 – pts 2010-12-11 17:34:45

4

看看systrace - 不限於插座,但通用的系統調用策略生成/執行者。報價:

GNU/Linux移植完成,內核補丁被馬呂斯埃裏克森積極維護。 可以在不使用ptrace後端進行內核更改的情況下運行。

Disclamer - 我從來沒有嘗試過在Linux上。

+1

謝謝你提到systrace。我剛剛在Linux i386上看過它,它在功能方面看起來很強大:它可以防止套接字創建等等。我編譯了大約五個小問題,但一旦完成,它似乎適用於簡單程序的沙盒,但是我無法將GCC作爲(1)使用systrace調用GNU的沙箱:systrace無限期地被wait4系統調用卡住。此外,它沒有維持2年。所以我放棄了。因爲之前的wait4錯誤報告沒有得到回覆:http://forum.soft32.com/linux/strace-wait4-pending-SIGALRM-ftopict484715.html – pts 2010-12-10 18:34:36

+0

僅供參考我已經投了你的答案,但由於systrace對我不穩定,我不能接受這個答案。 – pts 2010-12-10 18:36:48

2

嘗試的Seccomp(請參見prctl手冊頁),它可以限制你的進程只訪問一個被懸空在使用prctl有人呼籲當時的插座。

+1

我知道seccomp,但這不是我的問題的好答案,因爲它限制了比我想要的更多(例如fork())。 – pts 2010-12-11 17:31:31

+1

分:我同意。切線方面,這就是爲什麼seccomp2應該被接受進入主線Linux而不是被冷嘲熱諷的原因。 – 2010-12-13 20:00:31

+0

你說的seccomp2在哪裏?鏈接到郵件列表存檔有帖子? 「 – user562374 2011-01-04 23:34:32

2

你可能有興趣與「sydbox」沙箱「pinktrace」庫:

http://www.diigo.com/user/wierzowiecki/sydbox

+1

謝謝你提到這兩個。我很早就拋棄了他們,因爲他們的文件很糟糕。也許他們將來會改進。 – pts 2011-01-01 13:12:12

+1

我在開始時有同樣的感覺。幸運的是,我決定查看郵件列表中的消息來源和帖子,並且我發現這個項目看起來很有趣,最後它不像乞討那樣小,並且提供了很多方法來舒適地「過濾」系統調用 - 以靈活的方式! :) – 2011-01-01 15:26:31

+2

在我的工作負載(運行g ++)中,sydbox比用戶模式Linux慢50%,所以我現在堅持使用用戶模式的Linux,因爲這不僅給我提供了沙盒,還限制了大量內存的使用。 – pts 2011-01-06 13:48:47

2

如果您的主要目標是限制一些良性進程P打開的套接字的數量應用於良性輸入,那麼setrlimit(RLIMIT_NOFILE, ...)將按照您想要的大致執行。然而,如果假定P是惡意的而不是良性的,或者如果您想要在面對潛在的惡意投入時如何表現P的強有力保證,那麼您可能運氣不佳:即,在最好的是,通過現在提供的工具,您可以爲攻擊者創建障礙課程。

(這就是說,如果一個超越障礙訓練場爲你工作,那麼你可以通過在sandboxing.org閒逛到這裏,或發送您的問題向友好的鄉親[email protected]得到一些更多的好點子。)