Setuid
SetUID 位在 Ubuntu 中不起作用?
我想一個設置了 SetUID 位的執行檔應該作為它的所有者執行,但我不能真正重現它。我嘗試了以下。
$ 貓準備.sh cp /bin/bash 。 chown root.root bash chmod 4770 bash # 已驗證 $ sudo sh 準備.sh $ ./bash $ id -u 1000 $退出 $
$貓測試.c #include<stdio.h> #include<unistd.h> 詮釋主要(){ printf("%d,%d\n", getuid(), geteuid()); 返回0; } $ gcc -o 測試 test.c $ chmod 4770 測試 # 已驗證 $ sudo chown root.root 測試 $ ./測試 1000,1000 $#為什麼???
然而
$蘇 # ./bash # id -u 0 # 。/測試 0,0 # 出口 # 出口 $
注意:掛載點沒有
nosuid
也沒有noexec
設置。誰能解釋為什麼它無法在 Ubuntu 16.04 LTS 上執行?
對於已編譯的執行檔,來自
man 2 chown
:When the owner or group of an executable file are changed by an unprivileged user the S_ISUID and S_ISGID mode bits are cleared. POSIX does not specify whether this also should happen when root does the chown(); the Linux behavior depends on the kernel version.
顛倒
chown
和chmod
順序對我有用:$ sudo chmod 4770 foo $ sudo chown root:root foo $ stat foo File: 'foo' Size: 8712 Blocks: 24 IO Block: 4096 regular file Device: 801h/2049d Inode: 967977 Links: 1 Access: (0770/-rwxrwx---) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2017-04-18 15:15:15.074425000 +0900 Modify: 2017-04-18 15:15:15.074425000 +0900 Change: 2017-04-18 15:15:33.683725000 +0900 Birth: - $ sudo chmod 4777 foo $ ./foo 1000,0