【问题标题】:Listening for netlink broadcasts in a kernel module在内核模块中监听 netlink 广播
【发布时间】:2015-02-04 00:43:36
【问题描述】:

SELinux 模块向任何监听套接字发送一个 netlink 广播。我想知道是否可以从另一个内核模块中监听 netlink 广播?

来自 SELinux 网络链接代码:

netlink_broadcast(selnl, skb, 0, SELNLGRP_AVC, GFP_USER);

【问题讨论】:

  • 您必须像在用户空间中一样:打开一个套接字,将其绑定到 SENLLGRP_AVC 组并监听 nl 消息。如果你愿意,我可以写一些代码。
  • 我想出了一种在内核空间中执行此操作的方法。请参阅我发布的答案。

标签: linux-kernel kernel-module netlink


【解决方案1】:

我发现您可以通过使用常规套接字来监听 netlink 数据。而且,是的,在内核空间中是可能的。

您基本上需要创建并绑定到一个套接字:

struct sock *sock = NULL;
struct sockaddr_nl addr = { 0 };

/* Create a netlink socket for SELinux traffic */
int rc = sock_create_kern(AF_NETLINK, SOCK_RAW, NETLINK_SELINUX,
              &ctx.sock);

if (rc)
    return rc;

addr.nl_family  = AF_NETLINK;
addr.nl_pid     = 0;
addr.nl_groups  = SELNLGRP_AVC;

rc = kernel_bind(ctx.sock, (struct sockaddr *) &addr, sizeof(addr));
if (rc)
    return rc;

/* Setup socket callback */
sock = ctx.sock->sk;
sock->sk_data_ready = netlink_data_ready;
sock->sk_allocation = GFP_KERNEL;

接收数据:

static void netlink_data_ready(struct sock *sk, int bytes)
{
    struct sk_buff *skb = NULL;
    struct nlmsghdr *nlh = NULL;
    int rc = 0;

    /* Receive the data packet (blocking) */
    skb = skb_recv_datagram(sk, 0, 0, &rc);
    if (rc) {
        printk(KERN_ERROR "Failed on skb_recv_datagram(). rc=%d.", -rc);
        return;
    }

    nlh = (struct nlmsghdr *) skb->data;
    if (!nlh || !NLMSG_OK(nlh, bytes)) {
        printk(KERN_ERROR "Invalid netlink header data.");
        return;
    }

    if (nlh->nlmsg_type == SELNL_MSG_POLICYLOAD ||
        nlh->nlmsg_type == SELNL_MSG_SETENFORCE) {

        /* Insert code here */
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多