c - UNIX 套接字 : Is it possible to spoof getsockopt() SO_PEERCRED?

标签 c security sockets unix unix-socket

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

背景:
我需要连接到服务器应用程序(我无法修改),它检查通过 SO_PEERCRED 连接到它的进程的 UID。我想伪造这些信息,以便能够连接到应用程序也作为根用户

更新

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

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

最佳答案

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

您可以做两件事:

  1. 当您进行 connect 调用时,暂时删除 root (setreuid(desired,-1))。 unix 域连接在调用 connect 的进程(和 listen 以另一种方式)时标记有对等方的凭据。 SO_PEERCRED 不会告诉您当前节点的凭据。然后就可以恢复root了。

  2. 最好使用另一个 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/

相关文章:

c# - Aspnet_regiis 会加密存储在外部配置文件中的连接字符串信息吗?

c getaddrinfo 没有这样的主机是已知的

c - 使用 char* 与字符串上的值进行比较

c - GeoLiteCityv6.dat 里面有城市和地区数据吗?

c - 在特定内存位置嵌入常量

php - 使用 htaccess 使 PHP 文件上传安全

angular - 在 Angular 中处理用户输入时,我在多大程度上担心安全性(XSS)?

sockets - 在Cloud Functions for Firebase上运行Web套接字?

python - 使用 boost-asio 的 C++ 和 Python 程序之间的客户端服务器

python - 我看到最大位失败并且错误率没有改变