如果控制台应用程序需要root权限,它如何在OS X下自我管理?

sor*_*rin 2 macos privileges sudo elevated-privileges

我想知道命令行应用程序是否有可能请求root访问权限,就像尝试调用自身一样sudo.

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

它不必始终只在需要时请求root访问权限.

小智 5

选项:

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

因此,基本上可以通过许多选项实现,但所有可靠的选项都要求用户进行身份验证,并且已经以可以在根上下文中运行的方式部署工具.我实际上写了一本关于这些东西的书...特别参见Professional Cocoa Application Security的第6章.

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