Skip to content

Commit 497c829

Browse files
Remove DNS probes and associated code (#231)
* Remove DNS probes and associated code * Fix pruning mistake
1 parent 3338dfc commit 497c829

File tree

6 files changed

+2
-393
lines changed

6 files changed

+2
-393
lines changed

GPL/Events/EbpfEventProto.h

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@
1111
#define EBPF_EVENTPROBE_EBPFEVENTPROTO_H
1212

1313
#define TASK_COMM_LEN 16
14-
// The theoretical max size of DNS packets over UDP is 512.
15-
// Like so many things in DNS this number probaby isn't 100% accurate.
16-
// DNS extensions in RFC2671 and RFC6891 mean the actual size can be larger.
17-
#define MAX_DNS_PACKET 4096
1814

1915
#ifndef __KERNEL__
2016
#include <stdint.h>
@@ -44,7 +40,6 @@ enum ebpf_event_type {
4440
EBPF_EVENT_PROCESS_SHMGET = (1 << 17),
4541
EBPF_EVENT_PROCESS_PTRACE = (1 << 18),
4642
EBPF_EVENT_PROCESS_LOAD_MODULE = (1 << 19),
47-
EBPF_EVENT_NETWORK_DNS_PKT = (1 << 20),
4843
};
4944

5045
struct ebpf_event_header {
@@ -72,7 +67,6 @@ enum ebpf_varlen_field_type {
7267
EBPF_VL_FIELD_SYMLINK_TARGET_PATH,
7368
EBPF_VL_FIELD_MOD_VERSION,
7469
EBPF_VL_FIELD_MOD_SRCVERSION,
75-
EBPF_VL_FIELD_DNS_BODY,
7670
};
7771

7872
// Convenience macro to iterate all the variable length fields in an event
@@ -374,11 +368,6 @@ enum ebpf_net_udp_info {
374368
EBPF_NETWORK_EVENT_IP_SEND_UDP = 2,
375369
};
376370

377-
enum ebpf_net_packet_direction {
378-
EBPF_NETWORK_DIR_EGRESS = 1,
379-
EBPF_NETWORK_DIR_INGRESS = 2,
380-
};
381-
382371
struct ebpf_net_info_tcp_close {
383372
uint64_t bytes_sent;
384373
uint64_t bytes_received;
@@ -410,20 +399,10 @@ struct ebpf_net_event {
410399
char comm[TASK_COMM_LEN];
411400
} __attribute__((packed));
412401

413-
struct ebpf_dns_event {
414-
struct ebpf_event_header hdr;
415-
uint32_t tgid;
416-
uint32_t cap_len;
417-
uint32_t orig_len;
418-
enum ebpf_net_packet_direction direction;
419-
struct ebpf_varlen_fields_start vl_fields;
420-
} __attribute__((packed));
421-
422402
// Basic event statistics
423403
struct ebpf_event_stats {
424-
uint64_t lost; // lost events due to a full ringbuffer
425-
uint64_t sent; // events sent through the ringbuffer
426-
uint64_t dns_zero_body; // indicates that the dns body of a sk_buff was unavailable
404+
uint64_t lost; // lost events due to a full ringbuffer
405+
uint64_t sent; // events sent through the ringbuffer
427406
};
428407

429408
#endif // EBPF_EVENTPROBE_EBPFEVENTPROTO_H

GPL/Events/Network/Probe.bpf.c

Lines changed: 0 additions & 226 deletions
Original file line numberDiff line numberDiff line change
@@ -197,229 +197,3 @@ int BPF_KPROBE(kprobe__tcp_close, struct sock *sk, long timeout)
197197
{
198198
return tcp_close__enter(sk);
199199
}
200-
201-
#ifdef notyet
202-
/*
203-
* XXX naive, only handles ROUTING and DEST, untested, ipv6 needs more work to
204-
* be enabled.
205-
*/
206-
int skb_peel_nexthdr(struct __sk_buff *skb, u8 wanted)
207-
{
208-
struct ipv6hdr ip6;
209-
int off;
210-
u16 next;
211-
212-
off = 0;
213-
if (bpf_skb_load_bytes(skb, off, &ip6, sizeof(ip6)))
214-
return (-1);
215-
off += sizeof(ip6);
216-
next = ip6.nexthdr;
217-
218-
for (;;) {
219-
if (next == wanted)
220-
return (off);
221-
switch (next) {
222-
case NEXTHDR_ROUTING: /* FALLTHROUGH */
223-
case NEXTHDR_DEST:
224-
if (bpf_skb_load_bytes(skb, off, &next, sizeof(next)))
225-
return (-1);
226-
off += ((next >> 8) + 1) * 8;
227-
next = next & 0xff;
228-
continue;
229-
default:
230-
return (-1);
231-
}
232-
}
233-
234-
return (-1); /* NOTREACHED */
235-
}
236-
#endif
237-
238-
int skb_in_or_egress(struct __sk_buff *skb, int ingress)
239-
{
240-
struct udphdr udp;
241-
struct bpf_sock *sk;
242-
u32 *tgid, cap_len, zero = 0;
243-
u64 *sk_addr;
244-
struct ebpf_dns_event *event;
245-
struct ebpf_varlen_field *field;
246-
247-
if (skb->family != AF_INET && skb->family != AF_INET6)
248-
goto ignore;
249-
if ((sk = skb->sk) == NULL)
250-
goto ignore;
251-
if ((sk = bpf_sk_fullsock(sk)) == NULL)
252-
goto ignore;
253-
if (sk->protocol != IPPROTO_UDP)
254-
goto ignore;
255-
256-
if (sk->family == AF_INET) {
257-
struct iphdr ip;
258-
259-
if (bpf_skb_load_bytes(skb, 0, &ip, sizeof(ip)))
260-
goto ignore;
261-
if (ip.protocol != IPPROTO_UDP)
262-
goto ignore;
263-
if (bpf_skb_load_bytes(skb, ip.ihl << 2, &udp, sizeof(udp)))
264-
goto ignore;
265-
} else {
266-
goto ignore;
267-
}
268-
#ifdef notyet /* ipv6 needs further work */
269-
else if (sk->family == AF_INET6)
270-
{
271-
int t_off;
272-
273-
t_off = skb_peel_nexthdr(skb, NEXTHDR_UDP);
274-
if (t_off == -1)
275-
goto ignore;
276-
277-
if (bpf_skb_load_bytes(skb, t_off, &udp, sizeof(udp)))
278-
goto ignore;
279-
}
280-
#endif
281-
282-
if (bpf_ntohs(udp.dest) != 53 && bpf_ntohs(udp.source) != 53)
283-
goto ignore;
284-
285-
/*
286-
* Needed for kernels prior to f79efcb0075a20633cbf9b47759f2c0d538f78d8
287-
* bpf: Permits pointers on stack for helper calls
288-
*/
289-
sk_addr = bpf_map_lookup_elem(&scratch64, &zero);
290-
if (sk_addr == NULL)
291-
goto ignore;
292-
*sk_addr = (u64)sk;
293-
tgid = bpf_map_lookup_elem(&sk_to_tgid, sk_addr);
294-
if (tgid == NULL)
295-
goto ignore;
296-
297-
cap_len = skb->len;
298-
/*
299-
* verifier will complain, even with a skb->len
300-
* check at the beginning.
301-
*/
302-
if (cap_len > MAX_DNS_PACKET)
303-
cap_len = MAX_DNS_PACKET;
304-
305-
/*
306-
* Yes this code is weird, but it convinces old verifiers (5.10), don't
307-
* blame me, be sure to test 5.10 if you change it. The minimal packet
308-
* should be iphlen + udphlen + 12(dns header size). Old verifiers
309-
* (5.10) are very sensitive here and a non constant right expression
310-
* (since iphlen is not constant due to options) fails. Do what we can
311-
* and filter the remaining bad packets in userland, same applies to
312-
* ipv6. Also be careful with `if cap_len > 0`, as clang will compile it
313-
* to a JNZ, which doesn't adjust umin, causing the
314-
* bpf_skb_load_bytes() down below to think cap_len can be zero.
315-
*/
316-
if (cap_len >= (sizeof(struct iphdr) + sizeof(udp) + 12)) {
317-
event = get_event_buffer();
318-
if (event == NULL)
319-
goto ignore;
320-
321-
event->hdr.type = EBPF_EVENT_NETWORK_DNS_PKT;
322-
event->hdr.ts = bpf_ktime_get_ns();
323-
event->hdr.ts_boot = bpf_ktime_get_boot_ns_helper();
324-
event->tgid = *tgid;
325-
event->cap_len = cap_len;
326-
event->orig_len = skb->len;
327-
event->direction = ingress ? EBPF_NETWORK_DIR_INGRESS : EBPF_NETWORK_DIR_EGRESS;
328-
329-
ebpf_vl_fields__init(&event->vl_fields);
330-
field = ebpf_vl_field__add(&event->vl_fields, EBPF_VL_FIELD_DNS_BODY);
331-
if (bpf_skb_load_bytes(skb, 0, field->data, cap_len))
332-
goto ignore;
333-
ebpf_vl_field__set_size(&event->vl_fields, field, cap_len);
334-
335-
ebpf_ringbuf_write(&ringbuf, event, EVENT_SIZE(event), 0);
336-
}
337-
338-
ignore:
339-
return (1);
340-
}
341-
342-
SEC("cgroup_skb/egress")
343-
int skb_egress(struct __sk_buff *skb)
344-
{
345-
return skb_in_or_egress(skb, 0);
346-
}
347-
348-
SEC("cgroup_skb/ingress")
349-
int skb_ingress(struct __sk_buff *skb)
350-
{
351-
return skb_in_or_egress(skb, 1);
352-
}
353-
354-
int sk_maybe_save_tgid(struct bpf_sock *sk)
355-
{
356-
u32 tgid, zero = 0;
357-
u64 *sk_addr;
358-
359-
if (sk->protocol != IPPROTO_UDP)
360-
return (1);
361-
362-
tgid = bpf_get_current_pid_tgid() >> 32;
363-
364-
/*
365-
* Needed for kernels prior to f79efcb0075a20633cbf9b47759f2c0d538f78d8
366-
* bpf: Permits pointers on stack for helper calls
367-
*/
368-
sk_addr = bpf_map_lookup_elem(&scratch64, &zero);
369-
if (sk_addr == NULL)
370-
return (1);
371-
*sk_addr = (u64)sk;
372-
bpf_map_update_elem(&sk_to_tgid, sk_addr, &tgid, BPF_ANY);
373-
374-
return (1);
375-
}
376-
377-
/*
378-
* We save tgid again in send/recv/connect as the file descriptor might have
379-
* been passed to another process.
380-
*/
381-
SEC("cgroup/sendmsg4")
382-
int sendmsg4(struct bpf_sock_addr *sa)
383-
{
384-
return sk_maybe_save_tgid(sa->sk);
385-
}
386-
387-
SEC("cgroup/recvmsg4")
388-
int recvmsg4(struct bpf_sock_addr *sa)
389-
{
390-
return sk_maybe_save_tgid(sa->sk);
391-
}
392-
393-
SEC("cgroup/connect4")
394-
int connect4(struct bpf_sock_addr *sa)
395-
{
396-
return sk_maybe_save_tgid(sa->sk);
397-
}
398-
399-
SEC("cgroup/sock_create")
400-
int sock_create(struct bpf_sock *sk)
401-
{
402-
return sk_maybe_save_tgid(sk);
403-
}
404-
405-
SEC("cgroup/sock_release")
406-
int sock_release(struct bpf_sock *sk)
407-
{
408-
u32 zero = 0;
409-
u64 *sk_addr;
410-
411-
if (sk->protocol != IPPROTO_UDP)
412-
return (1);
413-
414-
/*
415-
* Needed for kernels prior to f79efcb0075a20633cbf9b47759f2c0d538f78d8
416-
* bpf: Permits pointers on stack for helper calls
417-
*/
418-
sk_addr = bpf_map_lookup_elem(&scratch64, &zero);
419-
if (sk_addr == NULL)
420-
return (1);
421-
*sk_addr = (u64)sk;
422-
bpf_map_delete_elem(&sk_to_tgid, sk_addr);
423-
424-
return (1);
425-
}

GPL/Events/State.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,6 @@ static long ebpf_events_scratch_space__set(enum ebpf_events_state_op op,
174174
return bpf_map_update_elem(&elastic_ebpf_events_scratch_space, &key, ss, BPF_ANY);
175175
}
176176

177-
/* Scratch 64bits as an array, as bpf_get_current_pid_tgid is not always available */
178-
struct {
179-
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
180-
__type(key, u32);
181-
__type(value, u64);
182-
__uint(max_entries, 1);
183-
} scratch64 SEC(".maps");
184-
185177
/* Trusted Apps - list of trusted pids */
186178
struct {
187179
__uint(type, BPF_MAP_TYPE_HASH);

non-GPL/Events/EventsTrace/EventsTrace.c

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ enum cmdline_opts {
6363
NETWORK_CONNECTION_ATTEMPTED,
6464
NETWORK_CONNECTION_ACCEPTED,
6565
NETWORK_CONNECTION_CLOSED,
66-
NETWORK_DNS_PKT,
6766
CMDLINE_MAX
6867
};
6968

@@ -90,7 +89,6 @@ static uint64_t cmdline_to_lib[CMDLINE_MAX] = {
9089
x(NETWORK_CONNECTION_ATTEMPTED)
9190
x(NETWORK_CONNECTION_ACCEPTED)
9291
x(NETWORK_CONNECTION_CLOSED)
93-
x(NETWORK_DNS_PKT)
9492
#undef x
9593
// clang-format on
9694
};
@@ -116,7 +114,6 @@ static const struct argp_option opts[] = {
116114
{"process-load-module", PROCESS_LOAD_MODULE, NULL, false, "Print kernel module load events", 0},
117115
{"net-conn-accept", NETWORK_CONNECTION_ACCEPTED, NULL, false,
118116
"Print network connection accepted events", 0},
119-
{"net-conn-dns-pkt", NETWORK_DNS_PKT, NULL, false, "Print DNS events", 0},
120117
{"net-conn-attempt", NETWORK_CONNECTION_ATTEMPTED, NULL, false,
121118
"Print network connection attempted events", 0},
122119
{"net-conn-closed", NETWORK_CONNECTION_CLOSED, NULL, false,
@@ -176,7 +173,6 @@ static error_t parse_arg(int key, char *arg, struct argp_state *state)
176173
case NETWORK_CONNECTION_ACCEPTED:
177174
case NETWORK_CONNECTION_ATTEMPTED:
178175
case NETWORK_CONNECTION_CLOSED:
179-
case NETWORK_DNS_PKT:
180176
g_events_env |= cmdline_to_lib[key];
181177
break;
182178
case ARGP_KEY_ARG:
@@ -1084,43 +1080,6 @@ static void out_network_connection_accepted_event(struct ebpf_net_event *evt)
10841080
out_network_event("NETWORK_CONNECTION_ACCEPTED", evt);
10851081
}
10861082

1087-
static void out_network_dns_event(struct ebpf_dns_event *event)
1088-
{
1089-
out_object_start();
1090-
out_event_type("DNS_PKT");
1091-
out_comma();
1092-
1093-
out_int("tgid", event->tgid);
1094-
out_comma();
1095-
1096-
out_int("cap_len", event->cap_len);
1097-
out_comma();
1098-
1099-
out_int("orig_len", event->orig_len);
1100-
out_comma();
1101-
1102-
out_string("direction", event->direction == EBPF_NETWORK_DIR_INGRESS ? "in" : "out");
1103-
out_comma();
1104-
1105-
printf("\"data\":");
1106-
out_array_start();
1107-
struct ebpf_varlen_field *field;
1108-
FOR_EACH_VARLEN_FIELD(event->vl_fields, field)
1109-
{
1110-
for (size_t i = 0; i < field->size; i++) {
1111-
uint8_t part = field->data[i];
1112-
printf("%d", part);
1113-
if (i < field->size - 1) {
1114-
printf(", ");
1115-
}
1116-
}
1117-
}
1118-
out_array_end();
1119-
1120-
out_object_end();
1121-
out_newline();
1122-
}
1123-
11241083
static void out_network_connection_attempted_event(struct ebpf_net_event *evt)
11251084
{
11261085
out_network_event("NETWORK_CONNECTION_ATTEMPTED", evt);
@@ -1200,9 +1159,6 @@ static int event_ctx_callback(struct ebpf_event_header *evt_hdr)
12001159
case EBPF_EVENT_NETWORK_CONNECTION_CLOSED:
12011160
out_network_connection_closed_event((struct ebpf_net_event *)evt_hdr);
12021161
break;
1203-
case EBPF_EVENT_NETWORK_DNS_PKT:
1204-
out_network_dns_event((struct ebpf_dns_event *)evt_hdr);
1205-
break;
12061162
}
12071163

12081164
return 0;

0 commit comments

Comments
 (0)