【问题标题】:Changin uid/gid of a running non-provileged process更改正在运行的非特权进程的 uid/gid
【发布时间】:2017-08-29 01:00:40
【问题描述】:

我需要为 Linux 实现一个类似于 Plan 9 cap 设备的小型功能系统。主机所有者(Linux 中的root)允许user1 冒充user2,将user1@user2@random-string 写入/dev/caphash。任何知道random-stringuser1 进程都可以将其uid 更改为user2,将user1@user2@random-string 写入/dev/capuse

在 Linux 上,任何特权进程都可以通过setuid(2) 系统调用模拟任何非特权用户,但我不知道任何允许水平模拟的机制。 Linux 是怎么做到的?

【问题讨论】:

    标签: c linux


    【解决方案1】:

    Serge E. Hallyn 于 2010 年 4 月向 Linux 内核邮件列表提交了 p9auth,这将提供几乎此功能(尽管在上次提交的表单中,界面略有不同)。不幸的是,它没有包含在 Linux 内核中。

    Linux 中的底层安全范例是垂直的,而不是水平的。

    权限分为capabilities只能在执行时获取。可以随时删除额外的权限。在实践中,您可以使用文件系统功能和setcap 实用程序在非特权二进制文件执行时为其提供一些特定功能,而不管执行它的用户身份如何。 (使用 Linux 内核 2.6.33 及更高版本,任何进程都无法再修改另一个正在运行的进程的功能。)

    需要注意的关键点是,在 Linux 中,只有特权进程(带有CAP_SETUID 的进程)可以在运行时更改其身份。

    换句话说,exec 的点在 Linux 中用于提升特权,现在特权二进制更改为指定的用户(和/或组,可能还有补充组),删除额外的特权。我不知道有任何机制允许非特权进程在没有 exec 的情况下更改其 credentials

    对于 OP,这意味着 Plan 9 接口(@98​​7654326@、/dev/capuse)将不起作用。在用户空间中实现的类似 Linux 接口将需要执行二进制文件作为凭据更改的一部分,但除此之外,我对 OP 的用例了解不足,无法提出任何建议。

    在内核中,这样的接口显然是可能的(如本答案中的第一个链接所示),只是在 vanilla 内核中不可用。

    【讨论】:

      【解决方案2】:

      在 linux(以及一般的 unix)中,有一个类似的功能与可执行文件的位权限之一有关。如果您有一个可执行的二进制文件,标记为 setuid 位,那么当您执行该文件时,内核通过将进程的有效用户 ID 设置为该文件的所有者来运行该可执行文件。因此,如果您具有执行该文件的执行权限,则该机制将起作用。假设您希望用户abc 在执行某个程序时模拟用户d。您首先在系统中创建一组用户(组setuid_d)并将所有用户abc 放在上面。然后创建可执行文件,使其属于用户d 和组setuid_d。完成此操作后,作为用户 droot 使文件只能由组 setuid_d 执行,并激活权限中的 set uid 位

      $ chgrp setuid_d program
      $ chown d program
      $ chmod ug+x,o-x,u+s program
      $ program  # you'll be effectively user d when executing program
      

      【讨论】:

      • 问题更多的是 API 而非 CLI,但我也会检查该选项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2011-07-14
      • 2018-11-28
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多