UNIX套接字:是否可以欺骗getsockopt()SO_PEERCRED?

MRa*_*ser 5 c unix sockets security unix-socket

是否有(兼容的)欺骗(作为root)unix套接字(文件系统套接字)对等凭证的方式,可以通过getsockopt()选项获得SO_PEERCRED

背景:
我需要连接到一个服务器应用程序(我无法修改),它检查UID通过它连接到它的进程SO_PEERCRED.我想欺骗信息,以便能够root 身份连接到应用程序.

UPDATE

为了澄清这个问题:
我在寻找该服务器发现的特定同非侵入性的方式UID/ GID.解决方案是鼓励这就需要改变内核(或取内核模块使用的)或更改服务器进程或它的加载/联过程中以任何方式(LD_PRELOAD,系统调用拦截等).

基本上,该解决方案应该在任何Linux(或一般的unix)服务器上运行时没有任何特殊要求.服务器进程可能已在运行.

Jon*_*ham -1

不会。原因是提供对等点 UID 和 GID 的机制是内核内部的,你无法欺骗内核!内核使用对等点的 PID 来推断对等点的有效凭据。当一侧connect在套接字上执行 a 操作时,就会发生这种情况。copy_peercred()请参阅对fromunix_stream_connect()的调用net/unix/af_unix.c。没有任何方法可以让对等方更改其发送的数据或套接字,从而使内核相信对等方的 PID 不是原来的 PID。这与 AF_INET 套接字不同,在 AF_INET 套接字中,内核对对等方的进程没有内部了解,只能看到对等方发送的 IP 数据包标头中的数据。

要获得此效果,您唯一能做的就是将对等进程的有效 UID 设置为 root 或您想要的任何 UID/GID,为此您需要 root 密码或sudo权限。

  • 但是您*可以*欺骗内核 - 作为 root,您可以通过加载模块来修改正在运行的内核的行为。 (2认同)
  • 你**严重**错误地相信了这一点。最简单的方法是制作一个模块,该模块将在进入内核后在调度点重定向系统调用,但修改 unix 域套接字实现的内部结构最终也是一种选择。请记住,未导出的内容不受“保护”,它只是“更难定位” - 当源代码开放并且构建设置可能已知时,并不是那么困难。 (2认同)
  • 除了其他可能性之外,是的。但那篇文章提出了一个严重错误的假设,即必须首先修改内核以导出系统调用表。这不是真的——有许多已知的属性可以让它被发现。 (2认同)