gpt4 book ai didi

在内核模块中调用 sock_sendmsg 返回 (-1) 权限被拒绝

转载 作者:行者123 更新时间:2023-12-03 11:52:57 32 4
gpt4 key购买 nike

我正在开发一个驱动程序,我需要从内核发送 UDP 数据包。当我在 VM 中运行它时,一切都很好,并且数据包已发送出去。但是,当我直接在硬件上运行时 sock_sendmsg() 返回 -1。

我在两种环境中都在内核版本 4.13.0-kali1-amd64 的 Kali Linux 上运行。它们是从 Kali Linux 2017.2 构建的,所有软件包都是最新的。

sockDenied.c:

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/version.h>


#include <linux/uaccess.h> // for get_fs, get_ds, set_fs
#include <linux/inet.h> // for in4_pton
#include <net/sock.h> // for IPPROTO_IP, SOCK_DGRAM, AF_INET
#include <linux/net.h> // for sock_create, sock_alloc_file


MODULE_AUTHOR("helpme");
MODULE_DESCRIPTION("sock_sendmsg recieving permission denied");
MODULE_LICENSE("GPL");



//////////////////////////////////////////////////////////////////////////////
// Global Variables
//////////////////////////////////////////////////////////////////////////////

static mm_segment_t _oldfs;

int my_inet_pton(int af, const char *src, void *dst) {
printk("In %s", __FUNCTION__);
if (AF_INET == af) {
return in4_pton(src, strlen(src), (u8*) dst, '\0', NULL);
} else if (AF_INET6 == af) {
return in6_pton(src, strlen(src), (u8*) dst, '\0', NULL);
} else {
printk("uknown af value = %d", af);
return -1;
}
}

//////////////////////////////////////////////////////////////////////////////
//
// Static Functions : UDP
//
//////////////////////////////////////////////////////////////////////////////

static int __init sockdenied_init(void) {
int retval = 0;
struct msghdr msg = {};
struct iovec iov = {};
char data[2] = {0x01, 0x02};
static struct sockaddr_in txaddr = {};

struct socket* sock = NULL;
struct file* fp = NULL;
u32 dstip;

_oldfs = get_fs();
set_fs(KERNEL_DS);

retval = my_inet_pton(AF_INET, "1.1.1.1", &dstip);

retval = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_IP, &sock);
fp = sock_alloc_file(sock, 0, NULL);

txaddr.sin_family = AF_INET;
txaddr.sin_addr.s_addr = dstip;
txaddr.sin_port = htons(50000);

iov.iov_base = data;
iov.iov_len = 2;

iov_iter_init(&msg.msg_iter, READ, &iov, 1, 1);

msg.msg_flags = 0;
msg.msg_name = &(txaddr);
msg.msg_namelen = sizeof (struct sockaddr_in);
msg.msg_control = NULL;
msg.msg_controllen = 0;

retval = sock_sendmsg(sock, &msg);

printk(KERN_INFO"sock_sendmsg returned: %d", retval);

sock_release(sock);

return 0;
}

static void __exit sockdenied_exit(void) {

set_fs(_oldfs);

return;
}

module_init(sockdenied_init);
module_exit(sockdenied_exit);

生成文件:
obj-m+=sockDenied.o
MY_CFLAGS+= -g -DDEBUG
ccflags-y+= ${MY_CFLAGS}
CC += ${MY_CFLAGS}

all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
EXTRA_CFLAGS="$(MY_CFLAGS)"
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean

为什么我会收到 -EPERM?我的模块没有权限怎么能发送 UDP 数据包?为什么虚拟机的行为不同。

最佳答案

原来我在不知不觉中有一个出站 IP 表规则阻止了我的流量。我删除了规则,问题得到了解决。

关于在内核模块中调用 sock_sendmsg 返回 (-1) 权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47342157/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com