背景:
我最近读到一个freedesktop.org-bug,它允许为>执行任何systemctl
命令。因此我跑了: uid
INT_MAX
root@host$> useradd -u 4000000000 largeuiduser
root@host$> su largeuiduser
largeuiduser@host$> systemctl ["whatever"]
[bug exists, and "whatever" gets executed]
largeuiduser@host$> exit
root@host$> userdel largeuiduser
寻找我后来发现的更清洁的方式
root@host$> setpriv --reuid 4000000000 systemctl ["whatever"]
[bug exists, and "whatever" stuff gets executed]
表明利用该漏洞不需要(临时)用户名。这也很明显,我不太确定:用户名实际上有多重要?.
问题 因此我的问题是。从内核(linux/posix)的角度来看,用户名有多可有可无?是否需要,是否可以使用?
我的怀疑是,用户名只是用户空间中专门使用的一种“便利设施”。
一个好的答案将试图通过提供用户名在哪些设置中变得“必要”以及在哪些设置中它们是“可消耗的”的信息来阐明这一点。
在 Linux 和 BSD 世界中,内核几乎完全根据数字用户和组 ID 运行。有一个标准化的 C 库可以提供对用户数据库的访问,其中可以从 ID 查找名称,反之亦然,这就是应用程序软件如何从人类提供的名称获取系统调用所需的 ID,然后再返回。进程凭证和访问控制列表条目都根据 ID 进行操作。
一个例外是
setlogin()
BSD 世界中的(非标准化的)API 函数,它根据字符串、用户名而不是数字用户 ID 进行操作。然而,内核不对这个字符串进行任何解释。人们可以编写完全根据数字 ID 运行的应用程序,并将其呈现给人类。但这不是大多数软件的编写方式,原因很简单,人类使用名为.
内核也没有不存在帐户的概念。就内核而言,所有 ID(除了一些保留值)都是有效的。您可以(作为超级用户)启动一个以 UID 24394 运行的进程,并创建该 UID 拥有的文件系统对象(当然,在它有权访问的地方),内核不会抱怨。
请注意,PolicyKit 错误与 UID 无关。它是关于一个名为
…在这种情况下,授权机制打开失败而不是关闭失败,返回用户已通过桌面总线获得授权。pkttyagent
abending 的程序......进一步阅读
getpwnam()
. 系统接口。单一 UNIX 规范。IEEE 1003.1。2018 年开放组。getpwuid()
. 系统接口。单一 UNIX 规范。IEEE 1003.1。2018 年开放组。setlogin
. 小吃指南。软件。setuidgid
. 小吃指南。软件。