是否有一种(兼容的)方法来欺骗(作为 root)unix 套接字(文件系统套接字)对等凭据,它可以是通过 getsockopt()
获得, 选项 SO_PEERCRED
?
背景:
我需要连接到服务器应用程序(我无法修改),它检查通过 SO_PEERCRED
连接到它的进程的 UID
。我想伪造这些信息,以便能够连接到应用程序也作为根用户。
更新
澄清问题:
我正在寻找一种让服务器看到特定对等点 UID
/GID
的非侵入性方式。
不鼓励需要更改内核(或使用内核模块)或更改服务器进程或其加载/链接进程的解决方案> 以任何方式(LD_PRELOAD
、系统调用拦截等)。
基本上,该解决方案在没有任何特殊要求的任何 linux(或一般的 unix)服务器上运行时都应该有效。服务器进程可能已经在运行。
最佳答案
您的路线是正确的。根进程有特权来欺骗这样的事情,问题只是 SO_PEERCRED 没有为进程提供任何机制或 API 来指定应该向对等方呈现什么身份。
您可以做两件事:
当您进行
connect
调用时,暂时删除 root (setreuid(desired,-1)
)。 unix 域连接在调用connect
的进程(和listen
以另一种方式)时标记有对等方的凭据。 SO_PEERCRED 不会告诉您当前节点的凭据。然后就可以恢复root了。最好使用另一个 API。消息传递 API 允许进程选择要呈现给对等方的标识。使用包含您要发送的凭据的
struct cmsg
调用sendmsg
。内核将忽略非特权用户指定的凭据,并始终确保另一方看到实际身份,但特权进程可以假装是其他任何人。这更符合您的需求,因为删除和重新获得 root 是一项危险的事件,在这种情况下是不必要的。 Google 搜索“SCM_CREDENTIALS”(或在您的系统上搜索“man -K”)以获取代码示例。
关于c - UNIX 套接字 : Is it possible to spoof getsockopt() SO_PEERCRED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15974356/