Permissions

Setuid、SUID 位不提供 root 權限

  • May 2, 2015

我編寫並編譯了一個簡短的程序,以允許任何使用者更改我的/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

文件系統不支持 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或在引導序列結束時執行的其他一些腳本中。

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