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

时间:2013-04-12 14:45:21

标签: c security sockets unix unix-socket

欺骗(以root身份) unix socket (文件系统套接字)对等凭据是否有(兼容)方式可以由getsockopt()获得,选项SO_PEERCRED

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

更新

澄清问题
我正在寻找服务器看到特定同行UID / GID的非侵入性方式。 需要改变内核(或使用内核模块)或更改服务器进程加载/链接进程的解决方案气馁 >以任何方式(LD_PRELOAD,系统调用拦截等。)。

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

2 个答案:

答案 0 :(得分:3)

你说的是正确的。根进程具有欺骗这样的特权的权限,问题只是SO_PEERCRED没有为进程提供任何机制或API来指定应该向对等方呈现什么标识。

你可以做两件事:

  1. 进行setreuid(desired,-1)通话时暂时放弃根(connect)。在进程调用connect(而listen以另一种方式进行)时,unix-domain连接会标记对等方的凭据。 SO_PEERCRED在当前时刻不会告诉您对等方的凭据。然后你可以恢复root。

  2. 更好,请使用其他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权限。