SO_PEERCRED和SCM_CREDENTIALS - 为什么两者都存在? (注:此为提问标题,无需回答)

14

SO_PEERCRED是一种简单的方法,可以获取连接的AF_UNIX流套接字的pid / uid / gid,SCM_CREDENTIALS或多或少相同,但更复杂(各种辅助消息)。链接到显示两种方法的示例

  1. 为什么有两种获取基本相同信息的方式?
  2. 为什么更舒适的SO_PEERCRED没有列在unix(7)手册中?
  3. 在现实生活应用中使用哪个更多?

我应该使用什么?

2个回答

13
  1. 如果我理解正确,两者之间存在微妙的差异。 SO_PEERCRED 检索对等进程的凭据,而不需要从对等进程进行任何交互。相比之下,SCM_CREDENTIALS 是发送/接收对等进程凭据的机制,然后由内核进行检查。当进程以UID 0运行时,这种微妙的差别可能很重要。 SCM_CREDENTIALS 允许以UID 0运行的进程声明自己的权限较低(例如,UID 50),而使用 SO_PEERCRED 则不可能。

  2. 请参见上文。我认为鼓励使用 SCM_CREDENTIALS,而 SO_PEERCRED 仅支持兼容性。

  3. dbus守护程序似乎使用 SO_PEERCREDgetpeereid()。我认为最好复制他们的代码,以便可移植地获取凭据。

http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-sysdeps-unix.c?id=edaa6fe253782dda959d78396b43e9fd71ea77e3


6
还有一个微妙的区别。SO_PEERCRED命令可以让你获取到在另一端创建socket的进程的凭证信息。创建socket的进程之后可以降低权限,使用setuid、setgid等操作,但是SO_PEERCRED命令得到的结果不会改变。 - jtchitty
2
为了进一步澄清@jtchitty的评论 - created 意味着peer调用connect的时间(而不是socket)。 - domen
1
值得注意的是,在至少一个套接字的一端打开SO_PASSCRED之后,您只能在SCM_CREDENTIALS中获得有效的数据。如果您打开SO_PASSCRED,然后尝试接收之前发送的消息,您将收到一个带有无效值(pid = 0,uid/gid = -1)的SCM_CREDENTIALS控制消息。 - undefined

4

SO_PEERCRED返回套接字对等方的凭据。 SCM_CREDENTIALS允许您传递任何您拥有特权的凭据。这非常有价值,因为内核将翻译id,因此一个pid命名空间中的任务可以向另一个命名空间中的进程发送pid,并确保接收到的pid将引用它想要的相同进程。

如果您想要对等方的凭据,则使用SO_PEERCREDSCM_CREDENTIAL是调用方指定的凭据(它不必拥有特权),不一定是对等方的凭据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接