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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:28