Setuid

SetUID 位在 Ubuntu 中不起作用?

  • April 19, 2017

我想一個設置了 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.

顛倒chownchmod順序對我有用:

$ 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

引用自:https://unix.stackexchange.com/questions/359598