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

为何setuid二进制程序直接运行切换用户,gdb调试时无用户切换效果

你遇到的行为差异完全是SUID权限结合Linux调试安全机制导致的,属于系统预期的安全设计,具体原理如下:

1. 直接运行时的权限逻辑

你的level0二进制文件设置了SUID权限(ls输出中权限位的s标记就是SUID位):

  • 普通用户level0直接运行该程序时,Linux内核会自动将进程的有效用户ID(EUID) 提升为程序属主level1的ID,有效组ID(EGID)提升为属组users的ID。
  • 结合反汇编代码逻辑:当你传入的参数等于423时,程序会通过getegid、geteuid拿到内核赋予的level1身份ID,再调用setresgid、setresuid把进程的真实、有效、保存的三个身份ID全改为level1的ID,最后执行execv启动的shell自然就归属level1用户。

2. GDB调试时SUID失效的原因

GDB是通过ptrace系统调用实现程序调试的,Linux为了防止攻击者通过调试SUID程序提权,有默认安全规则:

当进程处于ptrace跟踪状态时,内核会忽略程序的SUID/SGID位,进程的EUID、EGID直接继承启动调试器的用户身份,也就是你当前的level0用户。

此时反汇编中getegid、geteuid拿到的都是level0的ID,后续的身份设置操作也只能停留在level0权限,最终启动的shell自然不会切换到level1。

3. 调试场景下复现提权效果的方法

如果是合法调试需求,可以用root身份启动GDB:root用户的ptrace操作不会触发SUID忽略规则,运行程序时就能正常拿到level1的权限。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:54:02