
我想為非 root 使用者 ( nicollet
) 提供檢測並向 Apache2 啟動的進程發送訊號的能力(這些進程是 FastCGI 腳本,訊號告訴它們清空快取)。這些進程由 Web 使用者 ( www-data
) 擁有,並且我在 Debian不穩定上運行。
我找不到任何方法讓nicollet
用戶看到這些進程。
進程正在運行,並且可以通過root
和看到www-data
:
root@linux-01:~# ps -Af | grep baryton
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:12 baryton --bot
root 18701 18700 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~#
nicollet
但是,與我的用戶運行相同的命令不會返回任何內容:
nicollet@linux-01:~$ ps -Af | grep baryton
nicollet 18704 18703 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
我嘗試創建一個可執行文件,使用system()
.它屬於www-data
並設定了 setuid 位元:
root@linux-01:~# which setuid-update
/usr/local/bin/setuid-update
root@linux-01:~# ls -l /usr/local/bin/setuid-update
-rwsr-xr-x 1 www-data www-data 11046 Nov 2 10:27 /usr/local/bin/setuid-update
root@linux-01:~#
但是,我觀察到同樣的情況:進程可見root
,www-data
但不可見nicollet
:
root@linux-01:~# setuid-update
www-data 17649 17648 0 10:27 ? 00:00:00 baryton
www-data 28145 1 0 Nov01 ? 00:00:13 baryton --bot
www-data 18712 18711 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18714 18712 0 10:46 pts/0 00:00:00 grep baryton
root@linux-01:~# su nicollet
nicollet@linux-01:~$ setuid-update
www-data 18716 18715 0 10:46 pts/0 00:00:00 sh -c ps -Af | grep baryton
www-data 18717 18716 0 10:46 pts/0 00:00:00 grep baryton
nicollet@linux-01:~$
最令人驚訝的是,該grep
進程確實是由www-data
(因為它是從 setuid 可執行檔案啟動的)運行的並且是可見的,但該baryton
進程不是。
這裡發生了什麼事?為什麼可以ps
透過www-data
show 這些進程來運行,但是ps
透過 setuid 可執行檔運行www-data
,當它通過 啟動時卻不能運行nicollet
?
答案1
多年來,我們可以在核心層級限制常規用戶帳戶只能看到他們自己的進程。 grsecurity、SELinux 和其他安全框架可以實現此限制,但發行版預設並不常用。
我有一段時間沒有嘗試過 Debian 不穩定分支(一直在運行 Lenny),但也許他們最近在核心配置上打開了該開關。它會導致與您觀察到的效果完全相同 - 即使使用 setuid 可執行文件,原始 uid (nicollet) 仍然已知,並且只有 EUID (有效 uid) 發生變化。