2017-11-17 2 views
1

드라이버에서 작업 중이므로 커널에서 UDP 패킷을 보내야합니다. VM에서 실행하면 모든 것이 잘되고 패킷이 발송됩니다. 그러나 하드웨어에서 직접 실행할 때 sock_sendmsg()는 -1을 반환합니다.커널 모듈에서 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? 모듈이 permssion에 UDP 패킷을 보내지 않는 방법은 무엇입니까? VM이 다르게 동작하는 이유는 무엇입니까?

+0

무엇이'my_inet_pton'과'sock_create' 함수를 반환 했습니까? – purplepsycho

+0

sock_create는 0을 반환하고 my_inet_pton은 1을 반환합니다. – charlesw

답변

1

나는 내 트래픽을 차단하고있는 아웃 바운드 IP 테이블 규칙을 가지고있다. 규칙을 삭제하고 문제가 해결되었습니다.

관련 문제