用户名(与 uids 相比)有多重要?

hum*_*ace 3 linux users kernel uid

背景: 我最近读到了一个freedesktop.org-bug,它允许systemctluid>执行任何命令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
Run Code Online (Sandbox Code Playgroud)

寻找一种我后来发现的更清洁的方法

root@host$> setpriv --reuid 4000000000 systemctl ["whatever"]
[bug exists, and "whatever" stuff gets executed]
Run Code Online (Sandbox Code Playgroud)

表明为了利用该漏洞,不需要(临时)用户名。这也表明,我不太确定:用户名实际上有多重要?.

问题 因此我的问题是。从内核(linux/posix)的角度来看,用户名有多可有可无?是否需要,可以使用吗?

我的怀疑是,用户名只是一种专门用于用户空间的“便利设施”。

一个好的答案将试图通过提供有关用户名在哪些设置中成为“必需”以及在哪些设置中它们是“消耗性”的信息来对此有所了解。

Jde*_*eBP 6

在 Linux 和 BSD 世界中,内核几乎完全根据数字用户和组 ID 运行。有一个标准化的 C 库,它提供对用户数据库的访问,在那里可以从 ID 查找名称,反之亦然,这就是应用软件如何从人类提供的名称到系统调用所需的 ID,然后再返回。进程凭据和访问控制列表条目都根据 ID 进行操作。

一个例外是setlogin()BSD 世界中的(非标准化)API 函数,它根据字符串、用户名而不是数字用户 ID 进行操作。然而,内核不对这个字符串进行解释。

人们可以编写完全根据数字 ID 操作的应用程序,将这些 ID 呈现给人类。但这并不是大多数软件的编写方式,原因很简单,人类使用名为 的帐户可以更好地工作。

内核也没有不存在帐户的概念。就内核而言,所有 ID(除了一些保留值)都是有效的。您可以(作为超级用户)启动一个以 UID 24394 运行的进程,并创建该 UID 拥有的文件系统对象(当然,在它有权限的地方),内核不会抱怨。

请注意,PolicyKit 错误实际上与 UID 无关。它是关于一个名为pkttyagentabending的程序......

错误:pkttyagent.c:156:main: 断言失败: (polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)
……以及授权机制在这种情况下打开失败而不是关闭失败,返回用户通过桌面总线获得授权。

进一步阅读