eBPF: как можно прочитать структуру sockaddr при подключении к security_socket_connect - PullRequest
1 голос
/ 10 июня 2019

Как предлагается в презентации Мониторинг безопасности с помощью eBPF Я пытаюсь подключиться к security_socket_connect .

В то время как мой gobpf / *Код на основе 1009 * bcc частично работает, я не могу прочитать IP-адрес в структуре sockaddr.

Соответствующая часть выглядит следующим образом:

int security_socket_connect_entry(struct pt_regs *ctx, struct socket *sock, struct sockaddr *address, int addrlen)
{    
    u32 address_family = address->sa_family;
    if (address_family == AF_INET) {
        struct ipv4_data_t data4 = {.pid = pid};

        struct sockaddr_in *addr2 = (struct sockaddr_in *)address;

После этого я пытаюсь прочитать IP-адрес в addr2.Первая попытка была:

data4.daddr = addr2->sin_addr.s_addr;

Вторая попытка была с bpf_probe_read:

bpf_probe_read(&data4.daddr, sizeof(data4.daddr), (void *)((long)addr2->sin_addr.s_addr));

Обе опции представляют одну и ту же ошибку:

R9 invalid mem access 'inv'

HINT: The invalid mem access 'inv' error can happen if you try to dereference memory without first using bpf_probe_read() to copy it to the BPF stack. Sometimes the bpf_probe_read is automatic by the bcc rewriter, other times you'll need to be explicit. 

Репосо сборочным образцом можно найти здесь: socket-connect-bpf

1 Ответ

2 голосов
/ 11 июня 2019

Я понял это благодаря ответу на вопрос № 1858 в репозитории ОЦК .

Мы должны работать с указателем, поэтому IP-адрес можно прочитать следующим образом:

bpf_probe_read(&data4.daddr, sizeof(data4.daddr), &addr2->sin_addr.s_addr);
...