背景:
我最近读到一篇关于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)的角度来看,用户名有多可有可无?是否需要,可以使用吗?
我的怀疑是,用户名只是一种专门在用户空间中使用的“便利设施”。
一个好的答案将尝试通过提供有关用户名在哪些设置中变得“必要”以及在哪些设置中“可消耗”的信息来阐明这一点。
答案1
在 Linux 和 BSD 世界中,内核几乎完全按照数字用户和组 ID 进行操作。有一个标准化的 C 库,可以提供对用户数据库,其中可以从 ID 查找名称,反之亦然,这就是应用程序软件如何从人类提供的名称获取系统调用所需的 ID,然后再返回。进程凭证和访问控制列表条目均根据 ID 进行操作。
一个例外是setlogin()
BSD 世界中的(未标准化)API 函数,它根据字符串、用户名而不是数字用户 ID 进行操作。然而,内核没有对该字符串进行任何解释。
一可以编写完全根据数字 ID 运行的应用程序,并将其呈现给人类。但这并不是大多数软件的编写方式,原因很简单,人类可以更好地使用以下帐户:命名的。
内核也没有不存在帐户的概念。就内核而言,所有 ID(除了一些保留值)都是有效的。您可以(作为超级用户)启动一个以 UID 24394 运行的进程,并创建该 UID 拥有的文件系统对象(当然,在它有权的地方),并且内核不会抱怨。
请注意,PolicyKit 错误实际上与 UID 无关。这是关于一个名为pkttyagent
abending 的程序……
错误:pkttyagent.c:156:main:断言失败:(polkit_unix_process_get_uid (POLKIT_UNIX_PROCESS (subject)) >= 0)…以及授权机制无法打开而不是关闭失败在这种情况下,返回用户已通过桌面总线获得授权。
进一步阅读
- “用户数据库”。 基本定义。单一 UNIX 规范。 IEEE 1003.1。 2018。公开组。
getpwnam()
。 系统接口。单一 UNIX 规范。 IEEE 1003.1。 2018。公开组。getpwuid()
。 系统接口。单一 UNIX 规范。 IEEE 1003.1。 2018。公开组。- 乔纳森·德博因·波拉德 (2018)。
setlogin
。 小吃指南。软件。 - 乔纳森·德博因·波拉德 (2018)。
setuidgid
。 小吃指南。软件。 - 让多个 UNIX 用户共享一个 UID 会产生哪些副作用?
- https://news.ycombinator.com/item?id=18605607
- https://superuser.com/a/706578/38062