UNIX 域套接字可以通过用户 ID 锁定吗?

信息安全 操作系统 Unix 权限 文件访问
2021-08-21 14:48:46

如果我创建了一个/tmp/me具有权限的文件夹700,并在其下启动了一个进程me,则在/tmp/me/socket.

  • 我目前假设与该套接字的连接源自在同一台服务器上运行的进程(恶意或其他),而不是来自另一台服务器的连接(除非通过其中一个进程)。
  • 我是否还可以假设唯一可以访问该套接字的用户是me, 和root

我特别问的是 Solaris。

注意:我知道在socket文件本身上设置权限在各种操作系统上都无效。这就是我选择将socket文件包含在目录中的原因me

2个回答

我目前假设与该套接字的连接源自在同一台服务器上运行的进程

正确的。文件系统套接字必须由有权访问文件的进程读取。

我是否还可以假设唯一可以访问该套接字的用户是我和 root?

是的。由于me是唯一具有权限的用户,因此他们是唯一可以进入该文件夹并查看套接字的用户。root,当然是root

是的,您可以这样做,但它可能不是最好的设计,因为在某些系统上,例如 HP-UX,套接字文件的权限被忽略了。虽然仍将应用父目录的权限,但这些权限可能比套接字文件本身的权限更难管理。

Unix 域套接字提供了另一种验证远程进程身份的方法:SCM_CREDENTIALS,如unix(7). 这是万无一失的,因为只允许 root* 传递伪造的凭据。不幸的是,这似乎并不比将文件系统权限放在套接字文件上更标准:

SCM_CREDENTIALS抽象命名空间是在 Linux 2.2 中引入的,不应在可移植程序中使用。(一些 BSD 派生的系统也支持凭证传递,但实现细节有所不同。)

* 在 Linux 上,从技术上讲,外部进程只需要具有CAP_SETUID 能力,但无论如何,在任何模糊合理的系统配置下,这都是与 root 等效的能力(换句话说,如果攻击者具有这种能力,他们实际上就具有 root 权限)。由于类似的原因,外部进程还可以向您提供任何真实、有效和保存的用户/组 ID,这也不是漏洞(TL;DR:任何进程都可以随时交换这些凭据) )。