进一步阅读

进一步阅读

背景: 我最近读到一篇关于freedesktop.org-bug它允许执行> 的任何systemctl命令。因此我跑了: uidINT_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)的角度来看,用户名有多可有可无?是否需要,可以使用吗?

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

一个好的答案将尝试通过提供有关用户名在哪些设置中变得“必要”以及在哪些设置中“可消耗”的信息来阐明这一点。

答案1

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

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

可以编写完全根据数字 ID 运行的应用程序,并将其呈现给人类。但这并不是大多数软件的编写方式,原因很简单,人类可以更好地使用以下帐户:命名的

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

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

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

进一步阅读

相关内容