2014-05-01 49 views
3

我正在嘗試使用Linux命名空間創建沙盒環境。我在https://github.com/swetland/mkbox上發現了一個簡潔的示例,它大致按我的意思做,但我想要一個可信的/ proc出現在沙箱內。我怎樣才能做到這一點?在非特權名稱空間沙盒中安裝proc

我試着綁定安裝在proc上的proc FS,但是失敗了EINVAL。當我試圖正常安裝「proc」時,它會產生EPERM。

想法?

+0

你做了什麼是什麼呢? ./mkbox沙箱'pwd'/proc? 可能是你試圖在沒有命名空間比如沙箱的情況下在proc上掛載proc嗎? – resultsway

+1

查看https://github.com/hanwen/mkbox/commit/043d6fdf3fe81275c4c184e689faa23d844ee36b我所準備的。 – hanwen

回答

4

本地大師想通了這一點對我來說:在PROC必須使用MS_REC標誌,像這樣(無證):

ok(mount, "/proc", "proc", NULL, MS_REC|MS_BIND, NULL); 

綁定安裝,如果沒有設置CLONE_PIDNS只做一些有用的東西,很明顯。

+2

我只是遇到了這個問題,它是你的StackOverflow答案,解決了它,並幫助我把頭髮拉出來。而且Swetland實際上寫了我家的mkbox代碼。小世界。 PS之所以你需要MS_REC(我現在記得讀完這個之後)是因爲/ proc在其中掛載了其他東西(例如/ proc/sys/fs/binfmt_misc),並且如果你沒有遞歸安裝它們,你可能會揭示那些通過裝載被故意隱藏的東西。 –

+0

我也對此有些ban my。記錄:在普通命令行shell中,通過調用'mount --rbind/proc proc'可以獲得相同的效果 – josch

0

我沒有仔細查看您的承諾,以確定是否這是您的問題,但如果您有CLONE_NEWUSER | CLONE_NEWNS而不是CLONE_NEWPID,則會發生EPERM。這是因爲要安裝proc,您需要在當前PID名稱空間對應的用戶名空間中使用CAP_SYS_ADMIN,而不是當前用戶名空間。

的Linux 4.4,fs/proc/root.clines 112–117

ns = task_active_pid_ns(current); 
options = data; 

/* Does the mounter have privilege over the pid namespace? */ 
if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN)) 
     return ERR_PTR(-EPERM); 
相關問題