【问题标题】:Running a C program as root user programatically以编程方式以 root 用户身份运行 C 程序
【发布时间】:2011-08-24 11:21:02
【问题描述】:

我需要在“/Library/Preferences/”Mac 目录下创建一个文件。但在 Lion 中,只有 root 用户对此目录有写入权限。

#include <stdio.h>

int main()
{
    FILE *fileHandle = NULL;
    fileHandle = fopen("/Library/Preferences/v.test", "w");
    fclose(fileHandle);

    return 0;
}

如果我将此代码作为sudo ./a.out 运行,则此代码行有效。我想以编程方式做同样的事情。

谢谢!

【问题讨论】:

  • 如果你能做到,任何人都可以破坏安全性,不是吗?
  • 为什么需要这样做 - 为什么不在每个用户运行时设置首选项 - 所以不需要管理员权限
  • 如果你的程序从输入中读取root密码是可能的。但是这种方式和sudo ./a.out没有区别。

标签: c macos


【解决方案1】:

您可以将可执行文件设置为 setuid 吗?只需将chown 发送到rootchmod u+s

【讨论】:

  • root。这很清楚。但这是一个“只做一次”的动作,不需要连续进行。
【解决方案2】:

您可以从 C 调用 setuid(0) 将您的用户 ID 更改为 root。该程序需要由 root 拥有并设置为允许的 setuid:

chown root:root a.out
chmod u+s a.out

【讨论】:

    【解决方案3】:

    我不认为有办法实现这一点(即在执行之前不手动授予程序一些特殊权限)——最好没有。任何此类方法都将是主要的操作系统安全漏洞。如果你能写出这样一个获取root权限的程序,任何恶意软件制造者也可以......

    【讨论】:

      【解决方案4】:

      要求用户以 root 身份登录并在需要完成此类特权工作时启动程序。

      【讨论】:

        【解决方案5】:

        这不是一件容易的事,但仍然可行。搜索来自 Apple 的 SMJobBless 示例。一般来说,它会设置在 root 拥有的 launchd 实例中运行的 launchd 守护进程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-12
          • 2011-04-20
          • 1970-01-01
          • 2013-01-29
          • 1970-01-01
          • 2016-04-11
          • 1970-01-01
          相关资源
          最近更新 更多