如何检索我的进程的已保存的用户ID?
在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?
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击