2011-03-03 50 views
7

我在我的大學局域網中有一個門戶,人們可以上傳代碼到C/C++的編程難題。我想使門戶安全,以便人們不能通過他們提交的代碼進行系統調用。可能有幾種解決方法,但我想知道我是否可以簡單地通過設置一些聰明的gcc標誌來完成。默認情況下libc似乎包含<unistd.h>,這似乎是聲明系統調用的基本文件。有沒有一種方法可以告訴gcc/g ++在編譯時忽略這個文件,以便在unistd.h中聲明的函數都不能被訪問?使用gcc/g ++時抑制系統調用

+2

如何使用像http://www.citi.umich.edu/u/provos/systrace/? – GWW 2011-03-03 21:00:38

+0

我現在正在做的事情就像systrace - 只是想知道是否更容易繞過那些明顯區別於常規庫代碼的東西(至少在人類的描述中)。 – kyun 2011-03-03 21:17:26

回答

3

爲什麼chroot("/var/jail/empty"); setuid(65534);不夠好(假設65534有明顯的限制)?

+0

這就像創建/模擬不同的用戶來運行上傳的代碼一樣嗎?我見過其他人使用這種方法 - 總是想知道如何。 – kyun 2011-03-03 21:19:12

+1

它與-static鏈接的想法,寫入二進制到監獄,並運行它。監獄裏沒有別的東西,所以他們根本無法做任何事情。 – Joshua 2011-03-03 23:11:47

+0

啊!這是一個很好的黑客!它就像你自己的小沙箱!我認爲這比按原樣壓制系統調用要簡單得多。現在,我已經從沙箱理念轉變爲沙箱實施。謝謝! – kyun 2011-03-03 23:27:54

2

-D可以覆蓋單個函數名稱。例如:

gcc file.c -Dchown -Dchdir 

或者你可以設置包括守衛自己:

gcc file.c -D_UNISTD_H 

但他們的影響可以很容易地#undef S按智能匯交:)

+0

我明白你的意思 - 我認爲馬修斯拉特里指出,要走的路是擁有某種沙箱環境 – kyun 2011-03-03 21:21:36

3

限制訪問頭收歸文件不會阻止你訪問libc函數:如果你鏈接到libc,它們仍然可用 - 你只是不會有原型(和宏)的手;但你可以自己複製它們。

而不是鏈接到libc也不會幫助:系統調用可以直接通過內聯彙編程序(甚至涉及跳入數據的技巧)。

我不認爲這是一個很好的方法。在完全自包含的虛擬沙箱中運行上傳的代碼(可能通過QEMU或類似的東西)可能是更好的方式。

+0

這是真的 - 沒有想到這一點。我猜沙盒會成爲一種方式,對於這樣一個簡單的(通常是非惡意的)環境來說似乎有很多開銷 – kyun 2011-03-03 21:20:45