You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何setresuid无法切换权限,生成目标用户shell失败?

问题:SUID程序无法切换到目标用户身份执行shell

编写的代码

期望生成以目标用户身份运行的/bin/sh,代码如下:

#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
        setresgid(getegid(), getegid(), getegid());
        setresuid(geteuid(), geteuid(), geteuid());

        execve("/bin/sh", argv,  envp);
        return 0;
}

权限配置操作

将程序所有者改为目标用户并设置SUID权限:

chown usertarget:globalgroup ./shell
chmod 777 ./shell
chmod +s ./shell

程序权限显示为:-rwsrwsrwx 1 targetuser globalgroup 7.2K Aug 18 18:21 shell2

实际执行结果

执行程序后,shell仍以当前用户身份运行:

baseuser@machine:/tmp/tata$ id
uid=1507(baseuser) gid=1314(globalgroup) groups=1314(globalgroup),100(users)

baseuser@machine:/tmp/tata$ ./shell2

====== WELCOME USER ======
baseuser@machine:/tmp/tata$ id -a
uid=1507(baseuser) gid=1314(globalgroup) groups=1314(globalgroup),100(users)

排查方向

  • 检查SUID挂载限制:执行mount | grep /tmp,如果/tmp目录挂载时带有nosuid选项,SUID程序在该目录下不会生效,需将程序移到非nosuid目录测试。
  • 验证SUID位有效性:用stat shell2确认权限字段中的SUID位(-rwsrwsrwx的第一个s)真实有效,部分文件系统或安全配置会阻止SUID生效。
  • 排除shell特权重置:/bin/bash等shell会在启动时自动放弃特权(当有效UID与真实UID不一致时),可以临时将代码中的execve("/bin/sh", ...)替换为execve("/bin/id", (char*[]){"id", "-a", NULL}, envp);,直接验证程序是否成功切换身份。
  • 检查硬编码UID的正确性:如果尝试硬编码目标UID无效,确认目标用户的UID是否正确,调用setresuid时需将三个参数(ruid, euid, suid)都设置为目标用户的UID,例如setresuid(1234, 1234, 1234)(1234替换为targetuser的实际UID)。
  • 排查编译链接限制:用readelf -d shell2 | grep -i suid检查是否存在禁用SUID的链接选项,比如-z nosuid会导致SUID失效。

内容的提问来源于stack exchange,提问作者user19793459

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:15:35