欺骗(以root身份) unix socket (文件系统套接字)对等凭据是否有(兼容)方式可以由getsockopt()
获得,选项SO_PEERCRED
?
背景:
我需要连接到一个服务器应用程序(我无法修改),它检查通过UID
连接到它的进程的SO_PEERCRED
。我想欺骗这些信息,以便能够以
更新
澄清问题:
我正在寻找服务器看到特定同行UID
/ GID
的非侵入性方式。
需要改变内核(或使用内核模块)或更改服务器进程或加载/链接进程的解决方案气馁 >以任何方式(LD_PRELOAD
,系统调用拦截等。)。
基本上,该解决方案应该在任何Linux(或一般的unix)服务器上运行时没有任何特殊要求。服务器进程可能已在运行。
答案 0 :(得分:3)
你说的是正确的。根进程具有欺骗这样的特权的权限,问题只是SO_PEERCRED没有为进程提供任何机制或API来指定应该向对等方呈现什么标识。
你可以做两件事:
进行setreuid(desired,-1)
通话时暂时放弃根(connect
)。在进程调用connect
(而listen
以另一种方式进行)时,unix-domain连接会标记对等方的凭据。 SO_PEERCRED在当前时刻不会告诉您对等方的凭据。然后你可以恢复root。
更好,请使用其他API。消息传递API允许进程选择要向对等方呈现的标识。使用包含您要发送的凭据的sendmsg
来呼叫struct cmsg
。内核将忽略非特权用户指定的凭据,并始终确保对方看到实际身份,但特权进程可以伪装成其他任何人。这可以更好地满足您的需求,因为丢弃和重新获得root是一项危险的活动,在这种情况下是不必要的。 Google为“SCM_CREDENTIALS”(或系统上的“man -K”)获取代码示例。
答案 1 :(得分:-1)
没有。原因是提供对等体的UID和GID的机制内核,你不能欺骗内核!内核使用对等体的PID来推断对等体的有效凭证。当一方在套接字上执行connect
时会发生这种情况。在copy_peercred()
中查看来自unix_stream_connect()
的{{1}}来电。对等体没有任何方式可以更改它发送的数据或套接字,它会说服内核对等体的PID不是它的原样。这与AF_INET套接字不同,后者内核没有对等进程的内部知识,只能看到对等体发送的IP包头中的数据。
您可以做的唯一一件事就是将对等进程的有效UID设置为root或您想要的任何UID / GID,为此您需要root密码或net/unix/af_unix.c
权限。