为什么setuid在可执行文件上不起作用?


9

我知道在脚本上启用setuid会带来安全问题,因此默认情况下处于禁用状态,但是希望它对可执行文件有效。我创建了一个可执行文件,该文件按照本文中所述的说明将uid显示为输出:在shell脚本上允许setuid

但是它在运行之前和之后都返回相同的uid(1000)sudo chmod +s ./setuid-test。我认为这意味着setuid对我的可执行文件没有任何影响,为什么以及如何解决?

源代码:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

构建并运行

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

运行时ls -la,这是我得到的:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test

2
可执行文件是否由您所运行的用户以外的其他用户拥有?(setuid并不意味着更改为root;这意味着更改为拥有可执行文件的用户。)
cjm 2014年

PHPLearner我认为您需要一个小组/用户才能更改文件的SUID
ryekayo 2014年

@cjm me@me:~$ ls -la setuid-test---- returns -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP学习者

7
如果您的程序位于我的主目录中,则可以在我的Ubuntu 14.04系统上按预期方式工作,但如果位于/ tmp中,则该程序无法正常工作,因为用于挂载/ tmp的参数禁止setuid程序。您的程序在哪里?
2014年

2
键入df .在目录中找到挂载点,然后mount | grep nameofmountpoint。那里有一个nosuid标志吗?
马克·普洛特尼克

Answers:


10

可以为大多数为Unix / Linux设计的文件系统挂载一个nosuid属性,该属性将防止位于这些文件系统上的setuid或setgid二进制文件更改进程的有效uid或gid。当挂载“非信任”文件系统时,通常会使用该文件系统,这些文件系统由非管理员控制。

在您的情况下,您正在使用的文件系统是ecryptfs类型,根据askubuntu的说法:在加密主目录下使用root setuid运行二进制文件时出错,从几年前的版本开始自动执行nosuid(和nodev)。

这是更改原因的描述,网址https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409

Vincent Danen 2012-07-20 11:25:56 EDT
据报道,setuid-root的私有ecryptfs挂载助手(/sbin/mount.ecryptfs_private)可能允许无特权的本地用户挂载用户控制的ecryptfs共享在本地系统上。因为ecryptfs帮助程序未使用“ nosuid”和“ nodev”标志挂载文件系统,所以用户可能会挂载包含setuid-root二进制文件和/或设备文件的文件系统,这可能导致其特权升级。如果用户可以物理访问系统,则可以通过USB设备完成此操作。
...
强制MS_NOSUID和MS_NODEV挂载标志已添加到版本99。


如果系统允许用户安装允许setuid的文件系统,那么成为root用户将是微不足道的。1)创建可执行文件2)在其他地方chown rootchmod +s3)挂载它4)运行可执行文件
ctrl-alt-delor

1

可执行文件上的SetUID位允许在文件所有者(不是超级用户)上运行可执行文件。为了能够以root用户身份运行可执行文件,请执行:

sudo chown 0:0 ./setuid-test

当然可以,但这不是问题。可能有一个对root以外的用户是setuid的程序。在问题中的情况下,setuid-test应显示nobody的UID。
吉尔(Gilles)'所以

@吉尔斯你是对的。我希望显示setuid-test nobody,而不是root
PHP Learner 2014年

“可执行文件上的SetUID位允许在文件所有者上运行可执行文件”,而我的文件所有者是nobody,因此我希望65534得到回报,但是我看到1000谁是所有者!
PHP学习者

2
检查运行测试程序的文件系统的安装选项。如果使用装载nosuid,则您的程序可能无法工作。
countermode

1
@countermode @MarkPlotnick mount | grep /home/me返回 /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP学习者
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.