From 12f46da5c6b25c00973f2a95065b5e2ab96d8caa Mon Sep 17 00:00:00 2001 From: David Levanon Date: Wed, 23 Mar 2022 11:27:06 +0200 Subject: [PATCH] Support TLS big buffers (#893) --- tap/tlstapper/bpf-builder/build.sh | 5 + tap/tlstapper/bpf/fd_to_address_tracepoints.c | 4 +- tap/tlstapper/bpf/fd_tracepoints.c | 4 +- tap/tlstapper/bpf/include/maps.h | 17 +- tap/tlstapper/bpf/openssl_uprobes.c | 299 +++++++++++------- tap/tlstapper/chunk.go | 17 +- tap/tlstapper/tls_poller.go | 4 +- tap/tlstapper/tlstapper_bpfeb.o | Bin 61720 -> 66824 bytes tap/tlstapper/tlstapper_bpfel.o | Bin 61720 -> 66824 bytes 9 files changed, 222 insertions(+), 128 deletions(-) diff --git a/tap/tlstapper/bpf-builder/build.sh b/tap/tlstapper/bpf-builder/build.sh index 7de745d96..1a6b56ef3 100755 --- a/tap/tlstapper/bpf-builder/build.sh +++ b/tap/tlstapper/bpf-builder/build.sh @@ -1,5 +1,7 @@ #!/bin/bash +pushd "$(dirname "$0")" || exit 1 + MIZU_HOME=$(realpath ../../../) docker build -t mizu-ebpf-builder . || exit 1 @@ -7,6 +9,7 @@ docker build -t mizu-ebpf-builder . || exit 1 docker run --rm \ --name mizu-ebpf-builder \ -v $MIZU_HOME:/mizu \ + -v $(go env GOPATH):/root/go \ -it mizu-ebpf-builder \ sh -c " go generate tap/tlstapper/tls_tapper.go @@ -15,3 +18,5 @@ docker run --rm \ chown $(id -u):$(id -g) tap/tlstapper/tlstapper_bpfel.go chown $(id -u):$(id -g) tap/tlstapper/tlstapper_bpfel.o " || exit 1 + +popd diff --git a/tap/tlstapper/bpf/fd_to_address_tracepoints.c b/tap/tlstapper/bpf/fd_to_address_tracepoints.c index cc9ee81c6..12effa18d 100644 --- a/tap/tlstapper/bpf/fd_to_address_tracepoints.c +++ b/tap/tlstapper/bpf/fd_to_address_tracepoints.c @@ -69,7 +69,7 @@ void sys_exit_accept4(struct sys_exit_accept4_ctx *ctx) { struct accept_info *infoPtr = bpf_map_lookup_elem(&accept_syscall_context, &id); - if (infoPtr == 0) { + if (infoPtr == NULL) { return; } @@ -175,7 +175,7 @@ void sys_exit_connect(struct sys_exit_connect_ctx *ctx) { struct connect_info *infoPtr = bpf_map_lookup_elem(&connect_syscall_info, &id); - if (infoPtr == 0) { + if (infoPtr == NULL) { return; } diff --git a/tap/tlstapper/bpf/fd_tracepoints.c b/tap/tlstapper/bpf/fd_tracepoints.c index 7a18948c9..345d258f3 100644 --- a/tap/tlstapper/bpf/fd_tracepoints.c +++ b/tap/tlstapper/bpf/fd_tracepoints.c @@ -28,7 +28,7 @@ void sys_enter_read(struct sys_enter_read_ctx *ctx) { struct ssl_info *infoPtr = bpf_map_lookup_elem(&ssl_read_context, &id); - if (infoPtr == 0) { + if (infoPtr == NULL) { return; } @@ -71,7 +71,7 @@ void sys_enter_write(struct sys_enter_write_ctx *ctx) { struct ssl_info *infoPtr = bpf_map_lookup_elem(&ssl_write_context, &id); - if (infoPtr == 0) { + if (infoPtr == NULL) { return; } diff --git a/tap/tlstapper/bpf/include/maps.h b/tap/tlstapper/bpf/include/maps.h index 6a25450f6..1110f5ca0 100644 --- a/tap/tlstapper/bpf/include/maps.h +++ b/tap/tlstapper/bpf/include/maps.h @@ -10,6 +10,12 @@ Copyright (C) UP9 Inc. #define FLAGS_IS_CLIENT_BIT (1 << 0) #define FLAGS_IS_READ_BIT (1 << 1) +#define CHUNK_SIZE (1 << 12) +#define MAX_CHUNKS_PER_OPERATION (8) + +// One minute in nano seconds. Chosen by gut feeling. +#define SSL_INFO_MAX_TTL_NANO (1000000000l * 60l) + // The same struct can be found in chunk.go // // Be careful when editing, alignment and padding should be exactly the same in go/c. @@ -18,16 +24,18 @@ struct tlsChunk { __u32 pid; __u32 tgid; __u32 len; + __u32 start; __u32 recorded; __u32 fd; __u32 flags; __u8 address[16]; - __u8 data[4096]; // Must be N^2 + __u8 data[CHUNK_SIZE]; // Must be N^2 }; struct ssl_info { void* buffer; __u32 fd; + __u64 created_at_nano; // for ssl_write and ssl_read must be zero // for ssl_write_ex and ssl_read_ex save the *written/*readbytes pointer. @@ -53,10 +61,13 @@ struct fd_info { #define BPF_PERF_OUTPUT(_name) \ BPF_MAP(_name, BPF_MAP_TYPE_PERF_EVENT_ARRAY, int, __u32, 1024) + +#define BPF_LRU_HASH(_name, _key_type, _value_type) \ + BPF_MAP(_name, BPF_MAP_TYPE_LRU_HASH, _key_type, _value_type, 16384) BPF_HASH(pids_map, __u32, __u32); -BPF_HASH(ssl_write_context, __u64, struct ssl_info); -BPF_HASH(ssl_read_context, __u64, struct ssl_info); +BPF_LRU_HASH(ssl_write_context, __u64, struct ssl_info); +BPF_LRU_HASH(ssl_read_context, __u64, struct ssl_info); BPF_HASH(file_descriptor_to_ipv4, __u64, struct fd_info); BPF_PERF_OUTPUT(chunks_buffer); diff --git a/tap/tlstapper/bpf/openssl_uprobes.c b/tap/tlstapper/bpf/openssl_uprobes.c index c6bbf27c1..e449dd114 100644 --- a/tap/tlstapper/bpf/openssl_uprobes.c +++ b/tap/tlstapper/bpf/openssl_uprobes.c @@ -18,16 +18,166 @@ struct { __type(value, struct tlsChunk); } heap SEC(".maps"); -static __always_inline int ssl_uprobe(void* ssl, void* buffer, int num, struct bpf_map_def* map_fd, size_t *count_ptr) { - __u64 id = bpf_get_current_pid_tgid(); +static __always_inline int get_count_bytes(struct pt_regs *ctx, struct ssl_info* info, __u64 id) { + int returnValue = PT_REGS_RC(ctx); - if (!should_tap(id >> 32)) { + if (info->count_ptr == NULL) { + // ssl_read and ssl_write return the number of bytes written/read + // + return returnValue; + } + + // ssl_read_ex and ssl_write_ex return 1 for success + // + if (returnValue != 1) { return 0; } + // ssl_read_ex and ssl_write_ex write the number of bytes to an arg named *count + // + size_t countBytes; + long err = bpf_probe_read(&countBytes, sizeof(size_t), (void*) info->count_ptr); + + if (err != 0) { + char msg[] = "Error reading bytes count of _ex (id: %ld) (err: %ld)"; + bpf_trace_printk(msg, sizeof(msg), id, err); + return 0; + } + + return countBytes; +} + +static __always_inline void add_address_to_chunk(struct tlsChunk* chunk, __u64 id, __u32 fd) { + __u32 pid = id >> 32; + __u64 key = (__u64) pid << 32 | fd; + + struct fd_info *fdinfo = bpf_map_lookup_elem(&file_descriptor_to_ipv4, &key); + + if (fdinfo == NULL) { + return; + } + + int err = bpf_probe_read(chunk->address, sizeof(chunk->address), fdinfo->ipv4_addr); + chunk->flags |= (fdinfo->flags & FLAGS_IS_CLIENT_BIT); + + if (err != 0) { + char msg[] = "Error reading from fd address %ld - %ld"; + bpf_trace_printk(msg, sizeof(msg), id, err); + } +} + +static __always_inline void send_chunk_part(struct pt_regs *ctx, __u8* buffer, __u64 id, + struct tlsChunk* chunk, int start, int end) { + size_t recorded = MIN(end - start, sizeof(chunk->data)); + + if (recorded <= 0) { + return; + } + + chunk->recorded = recorded; + chunk->start = start; + + // This ugly trick is for the ebpf verifier happiness + // + long err = 0; + if (chunk->recorded == sizeof(chunk->data)) { + err = bpf_probe_read(chunk->data, sizeof(chunk->data), buffer + start); + } else { + recorded &= (sizeof(chunk->data) - 1); // Buffer must be N^2 + err = bpf_probe_read(chunk->data, recorded, buffer + start); + } + + if (err != 0) { + char msg[] = "Error reading from ssl buffer %ld - %ld"; + bpf_trace_printk(msg, sizeof(msg), id, err); + return; + } + + bpf_perf_event_output(ctx, &chunks_buffer, BPF_F_CURRENT_CPU, chunk, sizeof(struct tlsChunk)); +} + +static __always_inline void send_chunk(struct pt_regs *ctx, __u8* buffer, __u64 id, struct tlsChunk* chunk) { + // ebpf loops must be bounded at compile time, we can't use (i < chunk->len / CHUNK_SIZE) + // + // https://lwn.net/Articles/794934/ + // + // If we want to compile in kernel older than 5.3, we should add "#pragma unroll" to this loop + // + for (int i = 0; i < MAX_CHUNKS_PER_OPERATION; i++) { + if (chunk->len <= (CHUNK_SIZE * i)) { + break; + } + + send_chunk_part(ctx, buffer, id, chunk, CHUNK_SIZE * i, chunk->len); + } +} + +static __always_inline void output_ssl_chunk(struct pt_regs *ctx, struct ssl_info* info, __u64 id, __u32 flags) { + int countBytes = get_count_bytes(ctx, info, id); + + if (countBytes <= 0) { + return; + } + + if (countBytes > (CHUNK_SIZE * MAX_CHUNKS_PER_OPERATION)) { + char msg[] = "Buffer too big %d (id: %ld)"; + bpf_trace_printk(msg, sizeof(msg), countBytes, id); + return; + } + + struct tlsChunk* chunk; + int zero = 0; + + // If other thread, running on the same CPU get to this point at the same time like us (context switch) + // the data will be corrupted - protection may be added in the future + // + chunk = bpf_map_lookup_elem(&heap, &zero); + + if (!chunk) { + char msg[] = "Unable to allocate chunk (id: %ld)"; + bpf_trace_printk(msg, sizeof(msg), id); + return; + } + + chunk->flags = flags; + chunk->pid = id >> 32; + chunk->tgid = id; + chunk->len = countBytes; + chunk->fd = info->fd; + + add_address_to_chunk(chunk, id, chunk->fd); + send_chunk(ctx, info->buffer, id, chunk); +} + +static __always_inline void ssl_uprobe(void* ssl, void* buffer, int num, struct bpf_map_def* map_fd, size_t *count_ptr) { + __u64 id = bpf_get_current_pid_tgid(); + + if (!should_tap(id >> 32)) { + return; + } + + struct ssl_info *infoPtr = bpf_map_lookup_elem(map_fd, &id); struct ssl_info info = {}; - info.fd = -1; + if (infoPtr == NULL) { + info.fd = -1; + info.created_at_nano = bpf_ktime_get_ns(); + } else { + long err = bpf_probe_read(&info, sizeof(struct ssl_info), infoPtr); + + if (err != 0) { + char msg[] = "Error reading old ssl context (id: %ld) (err: %ld)"; + bpf_trace_printk(msg, sizeof(msg), id, err); + } + + if ((bpf_ktime_get_ns() - info.created_at_nano) > SSL_INFO_MAX_TTL_NANO) { + // If the ssl info is too old, we don't want to use its info because it may be incorrect. + // + info.fd = -1; + info.created_at_nano = bpf_ktime_get_ns(); + } + } + info.count_ptr = count_ptr; info.buffer = buffer; @@ -36,163 +186,90 @@ static __always_inline int ssl_uprobe(void* ssl, void* buffer, int num, struct b if (err != 0) { char msg[] = "Error putting ssl context (id: %ld) (err: %ld)"; bpf_trace_printk(msg, sizeof(msg), id, err); - return 0; } - - return 0; } -static __always_inline int ssl_uretprobe(struct pt_regs *ctx, struct bpf_map_def* map_fd, __u32 flags) { +static __always_inline void ssl_uretprobe(struct pt_regs *ctx, struct bpf_map_def* map_fd, __u32 flags) { __u64 id = bpf_get_current_pid_tgid(); if (!should_tap(id >> 32)) { - return 0; + return; } struct ssl_info *infoPtr = bpf_map_lookup_elem(map_fd, &id); - if (infoPtr == 0) { + if (infoPtr == NULL) { char msg[] = "Error getting ssl context info (id: %ld)"; bpf_trace_printk(msg, sizeof(msg), id); - return 0; + return; } struct ssl_info info; long err = bpf_probe_read(&info, sizeof(struct ssl_info), infoPtr); - bpf_map_delete_elem(map_fd, &id); + // Do not clean map on purpose, sometimes there are two calls to ssl_read in a raw + // while the first call actually goes to read from socket, and we get the chance + // to find the fd. The other call already have all the information and we don't + // have the chance to get the fd. + // + // There are two risks keeping the map items + // 1. It gets full - we solve it by using BPF_MAP_TYPE_LRU_HASH with hard limit + // 2. We get wrong info of an old call - we solve it by comparing the timestamp + // info before using it + // + // bpf_map_delete_elem(map_fd, &id); if (err != 0) { char msg[] = "Error reading ssl context (id: %ld) (err: %ld)"; bpf_trace_printk(msg, sizeof(msg), id, err); - return 0; + return; } if (info.fd == -1) { char msg[] = "File descriptor is missing from ssl info (id: %ld)"; bpf_trace_printk(msg, sizeof(msg), id); - return 0; + return; } - int countBytes = PT_REGS_RC(ctx); - - if (info.count_ptr != 0) { - // ssl_read_ex and ssl_write_ex return 1 for success - // - if (countBytes != 1) { - return 0; - } - - size_t tempCount; - long err = bpf_probe_read(&tempCount, sizeof(size_t), (void*) info.count_ptr); - - if (err != 0) { - char msg[] = "Error reading bytes count of _ex (id: %ld) (err: %ld)"; - bpf_trace_printk(msg, sizeof(msg), id, err); - return 0; - } - - countBytes = tempCount; - } - - if (countBytes <= 0) { - return 0; - } - - struct tlsChunk* c; - int zero = 0; - - // If other thread, running on the same CPU get to this point at the same time like us - // the data will be corrupted - protection may be added in the future - // - c = bpf_map_lookup_elem(&heap, &zero); - - if (!c) { - char msg[] = "Unable to allocate chunk (id: %ld)"; - bpf_trace_printk(msg, sizeof(msg), id); - return 0; - } - - size_t recorded = MIN(countBytes, sizeof(c->data)); - - c->flags = flags; - c->pid = id >> 32; - c->tgid = id; - c->len = countBytes; - c->recorded = recorded; - c->fd = info.fd; - - // This ugly trick is for the ebpf verifier happiness - // - if (recorded == sizeof(c->data)) { - err = bpf_probe_read(c->data, sizeof(c->data), info.buffer); - } else { - recorded &= sizeof(c->data) - 1; // Buffer must be N^2 - err = bpf_probe_read(c->data, recorded, info.buffer); - } - - if (err != 0) { - char msg[] = "Error reading from ssl buffer %ld - %ld"; - bpf_trace_printk(msg, sizeof(msg), id, err); - return 0; - } - - __u32 pid = id >> 32; - __u32 fd = info.fd; - __u64 key = (__u64) pid << 32 | fd; - - struct fd_info *fdinfo = bpf_map_lookup_elem(&file_descriptor_to_ipv4, &key); - - if (fdinfo != 0) { - err = bpf_probe_read(c->address, sizeof(c->address), fdinfo->ipv4_addr); - c->flags |= (fdinfo->flags & FLAGS_IS_CLIENT_BIT); - - if (err != 0) { - char msg[] = "Error reading from fd address %ld - %ld"; - bpf_trace_printk(msg, sizeof(msg), id, err); - } - } - - bpf_perf_event_output(ctx, &chunks_buffer, BPF_F_CURRENT_CPU, c, sizeof(struct tlsChunk)); - return 0; + output_ssl_chunk(ctx, &info, id, flags); } SEC("uprobe/ssl_write") -int BPF_KPROBE(ssl_write, void* ssl, void* buffer, int num) { - return ssl_uprobe(ssl, buffer, num, &ssl_write_context, 0); +void BPF_KPROBE(ssl_write, void* ssl, void* buffer, int num) { + ssl_uprobe(ssl, buffer, num, &ssl_write_context, 0); } SEC("uretprobe/ssl_write") -int BPF_KPROBE(ssl_ret_write) { - return ssl_uretprobe(ctx, &ssl_write_context, 0); +void BPF_KPROBE(ssl_ret_write) { + ssl_uretprobe(ctx, &ssl_write_context, 0); } SEC("uprobe/ssl_read") -int BPF_KPROBE(ssl_read, void* ssl, void* buffer, int num) { - return ssl_uprobe(ssl, buffer, num, &ssl_read_context, 0); +void BPF_KPROBE(ssl_read, void* ssl, void* buffer, int num) { + ssl_uprobe(ssl, buffer, num, &ssl_read_context, 0); } SEC("uretprobe/ssl_read") -int BPF_KPROBE(ssl_ret_read) { - return ssl_uretprobe(ctx, &ssl_read_context, FLAGS_IS_READ_BIT); +void BPF_KPROBE(ssl_ret_read) { + ssl_uretprobe(ctx, &ssl_read_context, FLAGS_IS_READ_BIT); } SEC("uprobe/ssl_write_ex") -int BPF_KPROBE(ssl_write_ex, void* ssl, void* buffer, size_t num, size_t *written) { - return ssl_uprobe(ssl, buffer, num, &ssl_write_context, written); +void BPF_KPROBE(ssl_write_ex, void* ssl, void* buffer, size_t num, size_t *written) { + ssl_uprobe(ssl, buffer, num, &ssl_write_context, written); } SEC("uretprobe/ssl_write_ex") -int BPF_KPROBE(ssl_ret_write_ex) { - return ssl_uretprobe(ctx, &ssl_write_context, 0); +void BPF_KPROBE(ssl_ret_write_ex) { + ssl_uretprobe(ctx, &ssl_write_context, 0); } SEC("uprobe/ssl_read_ex") -int BPF_KPROBE(ssl_read_ex, void* ssl, void* buffer, size_t num, size_t *readbytes) { - return ssl_uprobe(ssl, buffer, num, &ssl_read_context, readbytes); +void BPF_KPROBE(ssl_read_ex, void* ssl, void* buffer, size_t num, size_t *readbytes) { + ssl_uprobe(ssl, buffer, num, &ssl_read_context, readbytes); } SEC("uretprobe/ssl_read_ex") -int BPF_KPROBE(ssl_ret_read_ex) { - return ssl_uretprobe(ctx, &ssl_read_context, FLAGS_IS_READ_BIT); +void BPF_KPROBE(ssl_ret_read_ex) { + ssl_uretprobe(ctx, &ssl_read_context, FLAGS_IS_READ_BIT); } diff --git a/tap/tlstapper/chunk.go b/tap/tlstapper/chunk.go index d8b0c2659..d88d350da 100644 --- a/tap/tlstapper/chunk.go +++ b/tap/tlstapper/chunk.go @@ -16,14 +16,15 @@ const FLAGS_IS_READ_BIT uint32 = (1 << 1) // Be careful when editing, alignment and padding should be exactly the same in go/c. // type tlsChunk struct { - Pid uint32 - Tgid uint32 - Len uint32 - Recorded uint32 - Fd uint32 - Flags uint32 - Address [16]byte - Data [4096]byte + Pid uint32 // process id + Tgid uint32 // thread id inside the process + Len uint32 // the size of the native buffer used to read/write the tls data (may be bigger than tlsChunk.Data[]) + Start uint32 // the start offset withing the native buffer + Recorded uint32 // number of bytes copied from the native buffer to tlsChunk.Data[] + Fd uint32 // the file descriptor used to read/write the tls data (probably socket file descriptor) + Flags uint32 // bitwise flags + Address [16]byte // ipv4 address and port + Data [4096]byte // actual tls data } func (c *tlsChunk) getAddress() (net.IP, uint16, error) { diff --git a/tap/tlstapper/tls_poller.go b/tap/tlstapper/tls_poller.go index 6fd43ff3b..50acf40e6 100644 --- a/tap/tlstapper/tls_poller.go +++ b/tap/tlstapper/tls_poller.go @@ -225,8 +225,8 @@ func (p *tlsPoller) logTls(chunk *tlsChunk, ip net.IP, port uint16) { str := strings.ReplaceAll(strings.ReplaceAll(string(chunk.Data[0:chunk.Recorded]), "\n", " "), "\r", "") - logger.Log.Infof("PID: %v (tid: %v) (fd: %v) (client: %v) (addr: %v:%v) (fdaddr %v:%v>%v:%v) (recorded %v out of %v) - %v - %v", + logger.Log.Infof("PID: %v (tid: %v) (fd: %v) (client: %v) (addr: %v:%v) (fdaddr %v:%v>%v:%v) (recorded %v out of %v starting at %v) - %v - %v", chunk.Pid, chunk.Tgid, chunk.Fd, flagsStr, ip, port, srcIp, srcPort, dstIp, dstPort, - chunk.Recorded, chunk.Len, str, hex.EncodeToString(chunk.Data[0:chunk.Recorded])) + chunk.Recorded, chunk.Len, chunk.Start, str, hex.EncodeToString(chunk.Data[0:chunk.Recorded])) } diff --git a/tap/tlstapper/tlstapper_bpfeb.o b/tap/tlstapper/tlstapper_bpfeb.o index 2eebb8d55871b9ae1567d4f77141352c8dc29b6a..7c62172b056fd114dbbae8ace2b4a7d0300ef33f 100644 GIT binary patch literal 66824 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 diff --git a/tap/tlstapper/tlstapper_bpfel.o b/tap/tlstapper/tlstapper_bpfel.o index 08f430c03ff11a8f5863b0743e58816806c4e278..b1686bd39ad22d36b5de0254419e88409323e99b 100644 GIT binary patch literal 66824 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 z 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 literal 61720 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