RHEL6系统中Setuid功能失效问题求助(附简单示例)
如何让setuid root的C程序及其调用的csh脚本以程序文件所有者身份运行?
各位好,我遇到一个setuid程序权限切换的问题,和之前看到的案例需求刚好相反,想请教大家怎么解决:
我有一个设置了setuid root权限的C程序,现在需要它以及它内部调用的C-shell脚本不要以root身份运行,而是切换到这个C程序文件本身的所有者身份执行。
之前我参考过关于从setuid root程序调用脚本的解决方案,尝试了里面的相关方法(已经写到修改后的代码里了),但结果完全不对;后来我甚至把脚本的权限改成了777,彻底放开限制,问题还是没解决——脚本依然以root身份运行。
我修改后的C程序代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> int main() { // 获取当前程序文件的所有者UID和GID struct stat st; if (stat("./my_program", &st) == -1) { perror("Failed to get file stats"); exit(EXIT_FAILURE); } // 尝试切换到程序所有者的身份 if (setgid(st.st_gid) == -1) { perror("Failed to set group ID"); exit(EXIT_FAILURE); } if (setuid(st.st_uid) == -1) { perror("Failed to set user ID"); exit(EXIT_FAILURE); } // 调用csh脚本 system("./my_script.csh"); return EXIT_SUCCESS; }
对应的C-shell脚本(my_script.csh)
#!/bin/csh echo "Script running as user: `whoami`" echo "Effective UID: `id -u`" echo "Real UID: `id -ru`" echo "Effective GID: `id -g`" echo "Real GID: `id -rg`"
我已经尝试过的操作
- 给C程序设置setuid root权限:
chown root:root my_program && chmod u+s my_program,确认程序文件的原始所有者是普通用户dave - 在代码中先切换GID再切换UID(听说这样更安全),但执行后脚本还是输出root身份
- 给脚本设置
chmod 777 my_script.csh,确保权限不是问题 - 手动验证了
stat获取到的UID确实是普通用户dave的UID
现在运行程序后,脚本的输出里whoami还是root,effective UID也是0,完全没有切换到预期的用户身份。有没有人知道哪里出问题了?或者有没有其他方法可以实现这个需求?
内容的提问来源于stack exchange,提问作者daveg
相关产品推荐
相关产品推荐

