Changin uid / gid一个正在运行的非特权过程

时间:2017-04-04 01:30:02

标签: c linux

我需要为Linux实施类似于Plan 9 cap设备的小型功能系统。主持人(Linux中为root)允许user1冒充user2user1@user2@random-string撰写/dev/caphash。任何知道user1的{​​{1}}进程都可以将其random-string更改为uid,将user2更改为user1@user2@random-string

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

2 个答案:

答案 0 :(得分:1)

Serge E. Hallyn于2010年4月向Linux内核邮件列表提交了p9auth,该列表提供了相当多的功能(尽管在最后提交的表单中,界面略有不同)。不幸的是,它没有包含在Linux内核中。

Linux中的基础安全范例是纵向的,而不是水平的。

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

要注意的关键点是,在Linux中,只有特权进程(具有CAP_SETUID的进程)才能在运行时更改其标识。

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

对于OP,这意味着Plan 9界面(/dev/caphash/dev/capuse)将无效。在用户空间中实现的类似Linux接口将需要二进制的exec作为凭证更改的一部分,但除此之外,我不知道OP的用例是否足以提出任何建议。

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

答案 1 :(得分:0)

在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