7

是否有(兼容的)方法来欺骗(以 root身份)可以通过选项获得的unix 套接字(文件系统套接字)对等凭据getsockopt()SO_PEERCRED

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

更新

为了澄清这个问题
我正在寻找一种服务器查看特定对等点UID/的非侵入性方式GID。不鼓励需要更改内核(或使用内核模块)或以任何方式更改服务器进程或其加载/链接进程LD_PRELOAD(系统调用拦截等)的解决方案。

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

4

2 回答 2

4

你在正确的路线上。根进程有权欺骗这样的事情,问题只是 SO_PEERCRED 没有为进程提供任何机制或 API 来指定应该向对等方提供什么身份。

你可以做两件事:

  1. setreuid(desired,-1)拨打电话时暂时放弃 root ( ) connect。一个 unix-domain 连接在进程调用时被标记了对等方的凭据connectlisten反之亦然)。SO_PEERCRED 不会告诉您当前对等方的凭据。然后你可以恢复root。

  2. 更好的是,使用另一个 API。消息传递 API 允许进程选择要呈现给对等方的标识。sendmsg使用struct cmsg包含您要发送的凭据的调用。内核将忽略非特权用户指定的凭据,并始终确保对方看到实际身份,但特权进程可以伪装成其他任何人。这更符合您的需求,因为删除和重新获得根是一项危险的活动,在这种情况下是不必要的。谷歌搜索“SCM_CREDENTIALS”(或“man -K”在你的系统上)来获取代码示例。

于 2013-04-13T21:25:07.383 回答
-1

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

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

于 2013-04-12T15:26:27.053 回答