Setuid、SUID位不提供root权限

Setuid、SUID位不提供root权限

我编写并编译了一个简短的程序,允许任何用户更改我的/sys/class/backlight/intel_backlight/brightness文件的内容,但我无法升级他们的权限。我可能会错过什么。

#include <stdio.h>
#include <stdlib.h>
#define FILENAME "/sys/class/backlight/intel_backlight/brightness"

int main (int argc, char * argv[])
{
    int res;
    setuid(0); // I didn't intend to keep this, but I included it just in case
    printf("euid %d\n", geteuid());
    system("whoami");
    // Attempt to open FILENAME; print "Can't open..." on failure
}

然而,whoami始终返回exampleuser而不是root,并且程序始终无法打开输出文件。

我编译它并设置 uid 位然后运行程序:

$ gcc -o example.bin example.c     # compile
$ sudo chown root:root example.bin # set owner & group
$ sudo chmod 4770 example.bin      # set uid bit
$ ./example.bin 75                 # execute
euid 1000
exampleuser
Can't open output file /sys/class/backlight/intel_backlight/brightness

目标输出文件确实存在:

$ ls -l /sys/class/backlight/intel_backlight/brightness
-rw-r--r-- 1 root root 4096 May  2 07:57 /sys/class/backlight/intel_backlight/brightness

我正在运行 Ubuntu 14.04 LTS

答案1

要么文件系统不支持 setuid 可执行文件(因为它是使用选项挂载的nosuid,或者因为它是由非 root 用户挂载的 FUSE 文件系统),要么存在安全框架(例如 SELinux 或 AppArmor),可以在此处阻止 setuid(我但不认为 Ubuntu 会设置这样的东西)。那,或者你实际上并没有运行这些命令 - 你已经使该文件无法被其他人执行,所以它们只有在你在该root组中时才有效,而你不应该在该组中。

无论如何,这都不是一个好方法。更改文件的权限要简单得多。

chgrp users /sys/class/backlight/intel_backlight/brightness
chmod g+w /sys/class/backlight/intel_backlight/brightness

如果您不是该组的成员,请使用您所属的组users

将这些命令添加到/etc/rc.local启动序列末尾附近执行的一些其他脚本中。

相关内容