我编写并编译了一个简短的程序,允许任何用户更改我的/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
启动序列末尾附近执行的一些其他脚本中。