我编写了一个发送通用Netlink多播的内核模块,并使用libmnl编写了一个接收它们的用户态客户端。
这一切工作正常,但我的客户端工作,即使它不是根用户,我想要阻止。
男人7 netlink说:
Only processes with an effective UID of 0 or the CAP_NET_ADMIN capability may send or listen to a netlink multicast group.
很明显,听这部分是不正确的。 我试过CentOS 5(2.6.18),CentOS 6(2.6.32)和Ubuntu 14.04(3.13)。
有可能有2个内核模块链接到相同的/ dev /设备?
为什么堆栈必须是页面alignment的?
在Linux内核中从path获取inode
当用户空间中的系统调用被调用时,设备驱动程序fn不被调用
全局偏移表结构
我知道限制接收到的内核通用netlink命令只能从根目录可能与GENL_ADMIN_PERM标志,但是有可能发送多播从内核只能被根接收?
编辑:我分享了一些内核模块的代码发送netlink多播,和客户端接收它们,在https://github.com/craig65535/mcast-exmpl 。 构build说明在README.md中,但是我将在这里粘贴它们。
在一个terminal:
$ make $ sudo insmod mcast-exmpl.ko $ cd client $ make $ ./client genl ctrl msg Family ID: 26 Mcast group ID: 4
(ID可能不同)
在另一个terminal中,运行将执行TCP连接的命令。 mcast-exmpl钩子通过jprobe连接,这样做会导致它发送一个netlink多播。
$ nc yahoo.com 80 ^C $
在第一个terminal中,即使您没有以root身份运行客户端,您也会看到已收到netlink多播:
mcast-exmpl msg SEND_NUM 55555
我想修改这个,所以只有当client以root用户身份运行时,才能接收到多播,否则,确认我发现Linux文档或Linux本身存在bug。
如何使用tc和cgroup修改数据包
WDK 10 – 无法安装SDK7的目标Windows 7
内核模块:hrtimer_start“模块中的未知符号”
per-cpuvariables的地址
操作系统如何知道缺页的磁盘地址?
首先,我不熟悉netlink IPC机制。 不过,我相信我有一些有用的信息可以分享。
尽管是非root用户,但能够接收的原因还是因为内核的某些改变 ,使得非root用户能够读取uevent。
通过C中的Netlink查看从内核到用户空间的多播 ,看起来内核模块可以/应该指定一个struct netlink_kernel_cfg 。
从LXR ,它似乎被定义为
struct netlink_kernel_cfg { unsigned int groups; unsigned int flags; void (*input)(struct sk_buff *skb); struct mutex *cb_mutex; int (*bind)(struct net *net,int group); void (*unbind)(struct net *net,int group); bool (*compare)(struct net *net,struct sock *sk); };
谷歌搜索flags属性产生了这个结果说
标志成员可以是NL_CFG_F_NONROOT_RECV或NL_CFG_F_NONROOT_SEND 。 当设置NL_CFG_F_NONROOT_RECV ,非超级用户可以绑定到多播组。