
我正在查看/proc
目錄,作為用戶,我無法列出目錄,即使它顯示用戶是所有者。
為什麼以及如何發生這種情況?
例如,其中ls -l /proc/2323/map_files
說ls: reading directory '.': Permission denied
。但所有者顯然是用戶。使用者可以 cd 進入該目錄,但不能ls
.不過,以 root 身分執行此操作還是可以的。
新增背景故事:
目前,該進程正在使用 firejail(這是一個 setuid 二進位)來刪除大寫字母和命名空間隔離 firefox。如果沒有 firejail,一切都會按預期工作,即使用者能夠ls map_files
,但使用 firejail,map_files 目錄不能ls
由使用者使用,儘管cd
很好。這不是權限問題,因為該目錄是使用者可讀的,並且作為 .so 檔案的符號連結的檔案也顯示 u+r。
答案1
您可以從您擁有的檔案中刪除讀取權限,然後您將無法再讀取該檔案。
$ echo hello >foo
$ chmod u=w,go+r foo
$ ls -l foo
--w-rw-r-- 1 gilles gilles 6 Oct 20 15:13 foo
$ cat foo
cat: foo: Permission denied
這對於安全性來說沒有什麼用處,因為擁有者可以隨時更改檔案的權限。這只是權限運作方式的結果。
但是,這並不能解釋您在 中看到的內容/proc
。/proc
是一個有點特殊的檔案系統。對於「普通」檔案系統,當進程開啟檔案(或列出目錄,或讀取符號連結的目標)時,核心會檢查進程的憑證(即它以什麼使用者身分執行等),讀取檔案的權限,並檢查憑證是否允許存取該文件。但/proc
不是這樣運作的。內核應用特定的檢查,對於/proc
.另外,當進程列出目錄時,核心會產生權限,這些權限近似於開啟檔案時執行的檢查。
特別是,如果進程正在或已經使用提升的憑證運行(通常setuid 或 setgid,其中的某些資訊/proc
使用者無法再訪問,只能 root 訪問。這沒有反映在權限中。例如,考慮一個正在運行 setgid 的進程。此進程將擁有預期使用者擁有的所有文件/proc
,並且權限將與非特權進程相同。但是,由於該進程可能在擁有額外群組權限的同時存取了機密信息,因此核心不再允許使用者執行可能排除此資訊的操作。因此,例如,/proc/$pid/cwd
如果進程已變更為使用者通常無法存取的目錄,則使用者無法看到指向的內容。使用者無法透過 轉儲進程的記憶體/proc/$pid/mem
。使用者無法查看進程的記憶體映射,/proc/$pid/map*
以防它們反映機密資訊(並且還可以保留ASLR有效的)。等等。
答案2
要設定一個用戶擁有但不能被同一用戶讀取的檔案實際上非常簡單:
chmod u-r file
如果您這樣做 - 讀取檔案的唯一方法是提升您的權限或傳回讀取標誌 ( u+r
)。
目錄也是如此。從中刪除使用者讀取標誌,目錄的擁有者將無法存取ls
它。從目錄 ( u-x
) 中刪除可執行標誌,擁有者將失去cd
進入該目錄的能力。
同時 - 這些文件和目錄可以被其他人存取(o+r
和o+x
)。當然,它們始終可以透過根誰忽略了權限標誌。
目錄和/proc
目錄中的檔案代表行程、執行緒、共享記憶體物件。它們的權限由應用程式在創建線程/共享記憶體時設定。因此,它們不會響應chmod
工具,並且嘗試更改權限是破壞正在運行的應用程式的必然方法。但ls
仍cd
遵守 中物件的權限標誌/proc
。所以如果你真的需要在那裡讀一些東西 - 你必須提升自己根。
答案3
這是用戶權利造成的。
例子:
[~] whoami
mm
[~] mkdir test
[~] echo "Hello World" > test/hello.txt
[~] ls -ld test
drwxr-xr-x 2 mm mm 4,0K 20. Okt 14:20 test
[~] chmod 111 test
[~] ls -ld test
d--x--x--x 2 mm mm 4,0K 20. Okt 14:20 test
[~] ls test
ls: cannot open directory 'test': Permission denied
[~, ERR:2] cat test/hello.txt
Hello World
[~] chmod 555 test
[~] ls -ld test
dr-xr-xr-x 2 mm mm 4,0K 20. Okt 14:20 test
[~] ls test
hello.txt
資料夾權限與檔案權限不同。這x
意味著您可以訪問該資料夾,但無法查看它。要查看該資料夾,您還需要r
。當然w
意味著您可以寫入該資料夾。