zl程序教程

您现在的位置是:首页 >  其他

当前栏目

如何检索我的进程的已保存的用户ID?

2023-04-18 13:04:16 时间

在POSIX中,有众所周知的函数getuid()geteuid()用于获取进程的真实有效uid。但是,检查保存的uid也是很有用的(在支持POSIX保存的uid的平台上,这是每个当前的操作系统)。如何检索我的进程的已保存的用户ID?

例如,在经典指南"Setuid Demystified" (Chen, Dean, Wagner 2002)中,作者建议在任何调用setuid()函数后立即检查真实的,有效的和保存的uid是否都是预期的。然而,在他们的实施指南中,他们没有解释如何检查所有平台上保存的uid。

如何检索我的进程的已保存的用户ID?

Nicholas Wilson

回答

以下代码段实现了getsuid()函数。经测试可用于Linux 2.6+,FreeBSD 8+,Solaris 8+,AIX 5.3+,HP-UX 11.00+,MacOS 10.6+。可能也适用于旧版本。

#include <unistd.h> 
#include <stdio.h> 
#ifdef _AIX 
#include <sys/id.h> 
#elif defined(__sun) 
#include <fcntl.h> 
#include <procfs.h> 
#elif defined(__hpux) 
#include <dlfcn.h> 
#include <sys/pstat.h> 
#elif defined(__APPLE__) 
#include <sys/sysctl.h> 
#endif 

#if defined(__linux) || defined(__FreeBSD__) 
static int getsuid(uid_t* suid) { 
    uid_t ruid, euid; 
    return getresuid(&ruid, &euid, suid); 
} 

#elif defined(_AIX) 
static int getsuid(uid_t* suid) { 
    *suid = getuidx(ID_SAVED); 
    return *suid == (uid_t)-1 ? -1 : 0; 
} 

#elif defined(__sun) 
static int getsuid(uid_t* suid) { 
    int fd = open("/proc/self/cred", O_RDONLY); 
    if (fd < 0) return -1; 
    prcred_t prcred; 
    int n = read(fd, &prcred, sizeof(prcred)); 
    close(fd); 
    if (n != sizeof(prcred)) return -1; 
    *suid = prcred.pr_suid; 
    return 0; 
} 

#elif defined(__hpux) 
static int getsuid(uid_t* suid) 
{ 
    // HP-UX does have getresuid, but>
                                
                        

如何检索我的进程的已保存的用户ID?