概述

内核为每个进程维护的三个UID值:

  • RUID (Real User ID) 进程的实际拥有者
  • EUID (Effective User ID) 用于系统决定用户对系统资源的访问权限,通常情况下等于RUID
  • SUID (Saved set-user-ID) 仅适用于可执行文件,若文件设置了 SUID,那么当用户执行此文件时,会以文件所有者的身份去执行此文件

示例

test.c,以普通用户打印 /etc/shadow 文件内容

#define _GNU_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(void){
    uid_t ruid, euid, suid;
    getresuid(&ruid, &euid, &suid);
    printf("RUID: %d, EUID: %d, SUID: %d\n", ruid, euid, suid);
    execlp("cat", "cat", "/etc/shadow", (char *)0);
    exit(0);
}

编译 make test,执行 ./test

$ ls -l test
-rwxr-xr-x 1 king king 15528 Mar 29 17:11 test

$ ./test
RUID: 1000, EUID: 1000, SUID: 1000
cat: /etc/shadow: Permission denied

修改 ownersuid 后再执行

# chown root test && chmod u+s test

$ ls -l test
-rwsr-xr-x 1 root king 15528 Mar 29 17:11 test

$ ./test
RUID: 1000, EUID: 0, SUID: 0
成功打印,略...

当可执行文件有 SUID 位时,其他用户执行时 EUID 为文件 ownerid,与 owner 有相同的权限