2

我想知道命令行应用程序是否可以请求 root 访问权限,例如尝试使用sudo.

我正在寻找一种解决方案,允许编写需要sudo特权的应用程序(如果需要)。

它不必总是请求 root 访问权限,只有在需要时才需要。

4

2 回答 2

5

选项:

  • 它可以setuid(0),但前提是它已经被 root 调用,因此它的真实 UID 为 0,并且有效 UID 为其他人。
  • 它可以尝试exec使用sudoorsu命令并让自己在 UID 0 下运行,但前提sudo是配置为允许这样做(这通常需要用户提交身份验证,因为会有授权检查)。
  • 它可以尝试通过 启动自己的新副本AuthorizationExecWithPrivileges(),但这再次要求用户提交给 authn。
  • 它可能已经安装了一个可以在系统上下文launchd中与之通信的作业。launchd与该作业进行通信将导致launchd调用它,并且可能已将其配置为在 root 用户下运行。现在要实现这一点,需要已经部署了该作业:通过安装程序(在这种情况下,用户经过身份验证)或通过服务管理框架的SMJobBless()API(同样,用户需要身份验证才能批准)。
  • 它可以利用其他人写得不好的launchd作业让该作业以 UID 0 自行执行。如上所述,这涉及到一个写得不好的launchd作业来回敲打。

因此,基本上可以通过许多选项来实现,但所有可靠的选项都要求用户进行身份验证,并且该工具已经以可以在根上下文中运行的方式部署。我实际上写了一本关于这些东西的整本书……特别是专业 Cocoa 应用程序安全的第 6 章。

setuid请注意,除了(我不建议您使用)之外的所有选项实际上都涉及fork()创建一个单独的进程,无论是通过调用进程还是通过launchd. 这意味着您实际上可以拥有两个单独的可执行文件:一个与用户交互,一个执行特权任务。这是一种比将所有功能都放在一个应用程序中更好的设计,所以我推荐这种方法。

于 2011-05-28T12:41:37.853 回答
0

是的。例如:

#!/bin/sh
su root
# Do things as root here, if authorized
于 2011-05-28T12:35:23.273 回答