您尚未登录。

#1 2019-12-09 20:33:15

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

监听Unix domain socket的进程可以拒绝特定credential的对端连接吗?

我在知乎上看见依云你这么说,https://www.zhihu.com/answer/30167345,
有点好奇所以想问下。

我查了http://man7.org/linux/man-pages/man7/unix.7.html

如果是pathname socket这种绑定到一个inode的可以取消某个UID对该socket的写入权限,导致对端无法connect,但是对CAP_DAC_OVERRIDE的进程有用吗?
而且如果我要监听abstract地址是不是这法子就不行了?
还有就是SO_PEERCRED这个socket option可以查到对端连接时的crendential,但是这个时候已经连上了,即使是查到了,想拒绝也只能关掉对吧,可是这也防不住人家已经成功connect 啊?
还有其他法子吗?你当时究竟是想说什么方法阻止别人连接呢?


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2019-12-09 21:06:34

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 监听Unix domain socket的进程可以拒绝特定credential的对端连接吗?

就是关掉、不提供服务啊。

离线

#3 2019-12-11 19:32:15

Idiotist
会员
注册时间: 2019-12-11
帖子: 17

Re: 监听Unix domain socket的进程可以拒绝特定credential的对端连接吗?

pathname UDS 同普通的 file 一樣,RW permission check 事有 file system 提供的唷。CAP_DAC_OVERRIDE 可以 bypass file system 的 permission check。
但係如果您使用的係 SOCK_STREAM 的話 accept 後可以得到 client address。如果 client 的 socket 在 connect 之間也 bind 到一個 pathname, sockaddr_un 裡會有那個 path 唷。
當然了,您也可以通過 SO_PEERCRED 獲取 client 的 pid uid 和 gid。但係需要 client 啓用 SO_PASSCRED 才行唷。更常見的驗證方法是 COOKIES 或者 PSK。當然直接搞一個證書認證也不是不行哦。

离线

页脚