据我所知,Netlink是在Linux中进行内核和用户空间通信的现代正确方法.
我有一个需要配置的内核模块,所以我使用Netlink让它与用户空间应用程序通信.
一切都有奇效,但在我看来,任何用户都可以与我的模块交谈.我可以使用权限等锁定应用程序,但项目是开源的,因此任何用户都可以轻松编译用户空间应用程序.因此,任何用户都可以配置我的内核.这并不适合我.
看来我在这里遗漏了一些非常重要的东西,但我发现的Netlink文档都是关于如何让它运行,而不是它如何适应现实世界.
如何限制对模块的Netlink套接字的访问?如果这是不可能的,还有什么可以做的呢?
解决方法:
捂脸
来自RFC 3549:
Netlink lives in a trusted environment of a single host separated by kernel and user space. Linux capabilities ensure that only someone with CAP_NET_ADMIN capability (typically, the root user) is allowed to open sockets.
内核应该是告诉模块是否应该让用户继续进行的内核,而不是Netlink.明显.
只是通过在kernelspace中编码来阻止
/* If the current thread of execution doesn't have the proper privileges... */
if (!capable(CAP_NET_ADMIN)) { /* Or CAP_SYS_ADMIN or whatever */
/* Throw this request away. */
return -EPERM;
,完成了.