From 14107d71699683cf567a05587e596a5025fdc04b Mon Sep 17 00:00:00 2001 From: "M. Mert Yildiran" Date: Thu, 2 Jun 2022 08:14:49 +0300 Subject: [PATCH] Add a tracepoint for `sys_enter_close` to detect socket closes --- tap/tlstapper/bpf/fd_tracepoints.c | 20 ++++++++++ tap/tlstapper/bpf/golang_uprobes.c | 15 -------- tap/tlstapper/bpf/include/headers.h | 1 + tap/tlstapper/bpf/include/maps.h | 19 ++++++++++ tap/tlstapper/golang_connection.go | 16 ++++++++ tap/tlstapper/syscall_hooks.go | 11 ++++++ tap/tlstapper/tls_poller.go | 55 +++++++++++++++++++++++----- tap/tlstapper/tls_tapper.go | 2 +- tap/tlstapper/tlstapper_bpfeb.go | 8 ++++ tap/tlstapper/tlstapper_bpfeb.o | Bin 126008 -> 127872 bytes tap/tlstapper/tlstapper_bpfel.go | 8 ++++ tap/tlstapper/tlstapper_bpfel.o | Bin 126008 -> 127872 bytes 12 files changed, 130 insertions(+), 25 deletions(-) diff --git a/tap/tlstapper/bpf/fd_tracepoints.c b/tap/tlstapper/bpf/fd_tracepoints.c index 88add7f44..4f8c2871e 100644 --- a/tap/tlstapper/bpf/fd_tracepoints.c +++ b/tap/tlstapper/bpf/fd_tracepoints.c @@ -90,3 +90,23 @@ void sys_enter_write(struct sys_enter_write_ctx *ctx) { log_error(ctx, LOG_ERROR_PUTTING_FILE_DESCRIPTOR, id, err, ORIGIN_SYS_ENTER_WRITE_CODE); } } + +struct sys_enter_close_ctx { + __u64 __unused_syscall_header; + __u32 __unused_syscall_nr; + + __u64 fd; +}; + +SEC("tracepoint/syscalls/sys_enter_close") +void sys_enter_close(struct sys_enter_close_ctx *ctx) { + __u64 id = bpf_get_current_pid_tgid(); + + if (!should_tap(id >> 32)) { + return; + } + + struct sys_close event; + event.fd = ctx->fd; + bpf_perf_event_output(ctx, &sys_closes, BPF_F_CURRENT_CPU, &event, sizeof(event)); +} diff --git a/tap/tlstapper/bpf/golang_uprobes.c b/tap/tlstapper/bpf/golang_uprobes.c index f28c149dd..8fd151abe 100644 --- a/tap/tlstapper/bpf/golang_uprobes.c +++ b/tap/tlstapper/bpf/golang_uprobes.c @@ -4,25 +4,10 @@ SPDX-License-Identifier: GPL-2.0 Copyright (C) UP9 Inc. */ -#include - #include "include/headers.h" #include "include/maps.h" -struct golang_read_write { - __u32 pid; - __u32 fd; - __u32 conn_addr; - bool is_request; - __u32 len; - __u32 cap; - __u8 data[CHUNK_SIZE]; -}; - -const struct golang_read_write *unused __attribute__((unused)); - - SEC("uprobe/golang_crypto_tls_write") static __always_inline int golang_crypto_tls_write_uprobe(struct pt_regs *ctx) { void* stack_addr = (void*)ctx->rsp; diff --git a/tap/tlstapper/bpf/include/headers.h b/tap/tlstapper/bpf/include/headers.h index 8078051af..cea3dad96 100644 --- a/tap/tlstapper/bpf/include/headers.h +++ b/tap/tlstapper/bpf/include/headers.h @@ -8,6 +8,7 @@ Copyright (C) UP9 Inc. #define __HEADERS__ #include +#include #include #include #include diff --git a/tap/tlstapper/bpf/include/maps.h b/tap/tlstapper/bpf/include/maps.h index 43493fad0..084a559dd 100644 --- a/tap/tlstapper/bpf/include/maps.h +++ b/tap/tlstapper/bpf/include/maps.h @@ -53,6 +53,10 @@ struct fd_info { __u8 flags; }; +struct sys_close { + __u32 fd; +}; + struct socket { __u32 pid; __u32 fd; @@ -60,6 +64,20 @@ struct socket { __u64 conn_addr; }; +struct golang_read_write { + __u32 pid; + __u32 fd; + __u32 conn_addr; + bool is_request; + __u32 len; + __u32 cap; + __u8 data[CHUNK_SIZE]; +}; + +const struct golang_read_write *unused1 __attribute__((unused)); +const struct sys_close *unused2 __attribute__((unused)); + + #define BPF_MAP(_name, _type, _key_type, _value_type, _max_entries) \ struct bpf_map_def SEC("maps") _name = { \ .type = _type, \ @@ -93,5 +111,6 @@ BPF_PERF_OUTPUT(log_buffer); BPF_LRU_HASH(golang_dial_to_socket, __u64, struct socket); BPF_LRU_HASH(golang_socket_to_write, __u64, struct socket); BPF_RINGBUF(golang_read_writes); +BPF_PERF_OUTPUT(sys_closes); #endif /* __MAPS__ */ diff --git a/tap/tlstapper/golang_connection.go b/tap/tlstapper/golang_connection.go index 7ac084ad7..86f6790c8 100644 --- a/tap/tlstapper/golang_connection.go +++ b/tap/tlstapper/golang_connection.go @@ -4,8 +4,10 @@ import "github.com/up9inc/mizu/tap/api" type golangConnection struct { pid uint32 + fd uint32 connAddr uint32 addressPair addressPair + addressIsSet bool stream *tlsStream clientReader *golangReader serverReader *golangReader @@ -28,10 +30,24 @@ func NewGolangConnection(pid uint32, connAddr uint32, extension *api.Extension, } func (c *golangConnection) setAddressBySockfd(procfs string, pid uint32, fd uint32) error { + if c.addressIsSet { + return nil + } + addrPair, err := getAddressBySockfd(procfs, pid, fd) if err != nil { return err } c.addressPair = addrPair + c.addressIsSet = true return nil } + +func (c *golangConnection) close() { + if c.clientReader != nil { + c.clientReader.close() + } + if c.serverReader != nil { + c.serverReader.close() + } +} diff --git a/tap/tlstapper/syscall_hooks.go b/tap/tlstapper/syscall_hooks.go index 0fa621496..294ef7ab1 100644 --- a/tap/tlstapper/syscall_hooks.go +++ b/tap/tlstapper/syscall_hooks.go @@ -8,6 +8,7 @@ import ( type syscallHooks struct { sysEnterRead link.Link sysEnterWrite link.Link + sysEnterClose link.Link sysEnterAccept4 link.Link sysExitAccept4 link.Link sysEnterConnect link.Link @@ -29,6 +30,12 @@ func (s *syscallHooks) installSyscallHooks(bpfObjects *tlsTapperObjects) error { return errors.Wrap(err, 0) } + s.sysEnterClose, err = link.Tracepoint("syscalls", "sys_enter_close", bpfObjects.SysEnterClose) + + if err != nil { + return errors.Wrap(err, 0) + } + s.sysEnterAccept4, err = link.Tracepoint("syscalls", "sys_enter_accept4", bpfObjects.SysEnterAccept4) if err != nil { @@ -67,6 +74,10 @@ func (s *syscallHooks) close() []error { errors = append(errors, err) } + if err := s.sysEnterClose.Close(); err != nil { + errors = append(errors, err) + } + if err := s.sysEnterAccept4.Close(); err != nil { errors = append(errors, err) } diff --git a/tap/tlstapper/tls_poller.go b/tap/tlstapper/tls_poller.go index d7fa0ac5b..05473f875 100644 --- a/tap/tlstapper/tls_poller.go +++ b/tap/tlstapper/tls_poller.go @@ -38,6 +38,7 @@ type tlsPoller struct { chunksReader *perf.Reader golangReader *ringbuf.Reader golangReadWriteMap *orderedmap.OrderedMap + sysCloses *perf.Reader extension *api.Extension procfs string pidToNamespace sync.Map @@ -81,6 +82,12 @@ func (p *tlsPoller) init(bpfObjects *tlsTapperObjects, bufferSize int) error { return errors.Wrap(err, 0) } + p.sysCloses, err = perf.NewReader(bpfObjects.SysCloses, bufferSize) + + if err != nil { + return errors.Wrap(err, 0) + } + p.golangReadWriteMap = orderedmap.New() return nil @@ -113,6 +120,7 @@ func (p *tlsPoller) pollSsllib(emitter api.Emitter, options *api.TrafficFilterin func (p *tlsPoller) pollGolang(emitter api.Emitter, options *api.TrafficFilteringOptions, streamsMap api.TcpStreamMap) { go p.pollGolangReadWrite(p.golangReader, emitter, options, streamsMap) + go p.pollSysClose(p.sysCloses) } func (p *tlsPoller) pollGolangReadWrite(rd *ringbuf.Reader, emitter api.Emitter, options *api.TrafficFilteringOptions, @@ -139,15 +147,7 @@ func (p *tlsPoller) pollGolangReadWrite(rd *ringbuf.Reader, emitter api.Emitter, if p.golangReadWriteMap.Len()+1 > golangMapLimit { pair := p.golangReadWriteMap.Oldest() - c := pair.Value.(*golangConnection) - clientReader := c.clientReader - if clientReader != nil { - clientReader.close() - } - serverReader := c.serverReader - if serverReader != nil { - serverReader.close() - } + pair.Value.(*golangConnection).close() p.golangReadWriteMap.Delete(pair.Key) } @@ -171,6 +171,8 @@ func (p *tlsPoller) pollGolangReadWrite(rd *ringbuf.Reader, emitter api.Emitter, } if b.IsRequest { + connection.fd = b.Fd + err := connection.setAddressBySockfd(p.procfs, b.Pid, b.Fd) if err != nil { log.Printf("Error resolving address pair from fd: %s", err) @@ -200,6 +202,41 @@ func (p *tlsPoller) pollGolangReadWrite(rd *ringbuf.Reader, emitter api.Emitter, } } +func (p *tlsPoller) pollSysClose(rd *perf.Reader) { + nativeEndian := p.getByteOrder() + // tlsTapperSysClose is generated by bpf2go. + var b tlsTapperSysClose + for { + record, err := rd.Read() + if err != nil { + if errors.Is(err, perf.ErrClosed) { + return + } + log.Printf("reading from perf event reader: %s", err) + continue + } + + if record.LostSamples != 0 { + log.Printf("perf event ring buffer full, dropped %d samples", record.LostSamples) + continue + } + + if err := binary.Read(bytes.NewBuffer(record.RawSample), nativeEndian, &b); err != nil { + log.Printf("parsing perf event: %s", err) + continue + } + + // Close and remove the connection from map if its socket file descriptor is closed. + for pair := p.golangReadWriteMap.Oldest(); pair != nil; pair = pair.Next() { + connection := pair.Value.(*golangConnection) + if connection.fd == b.Fd { + connection.close() + p.golangReadWriteMap.Delete(pair.Key) + } + } + } +} + func (p *tlsPoller) pollChunksPerfBuffer(chunks chan<- *tlsChunk) { logger.Log.Infof("Start polling for tls events") diff --git a/tap/tlstapper/tls_tapper.go b/tap/tlstapper/tls_tapper.go index c898d5dd9..65e442de7 100644 --- a/tap/tlstapper/tls_tapper.go +++ b/tap/tlstapper/tls_tapper.go @@ -14,7 +14,7 @@ import ( const GLOABL_TAP_PID = 0 -//go:generate go run github.com/cilium/ebpf/cmd/bpf2go@0d0727ef53e2f53b1731c73f4c61e0f58693083a -type golang_read_write tlsTapper bpf/tls_tapper.c -- -O2 -g -D__TARGET_ARCH_x86 +//go:generate go run github.com/cilium/ebpf/cmd/bpf2go@0d0727ef53e2f53b1731c73f4c61e0f58693083a -type golang_read_write -type sys_close tlsTapper bpf/tls_tapper.c -- -O2 -g -D__TARGET_ARCH_x86 type TlsTapper struct { bpfObjects tlsTapperObjects diff --git a/tap/tlstapper/tlstapper_bpfeb.go b/tap/tlstapper/tlstapper_bpfeb.go index f22a5ad65..ff61a8d51 100644 --- a/tap/tlstapper/tlstapper_bpfeb.go +++ b/tap/tlstapper/tlstapper_bpfeb.go @@ -24,6 +24,8 @@ type tlsTapperGolangReadWrite struct { Data [4096]uint8 } +type tlsTapperSysClose struct{ Fd uint32 } + type tlsTapperTlsChunk struct { Pid uint32 Tgid uint32 @@ -90,6 +92,7 @@ type tlsTapperProgramSpecs struct { SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` + SysEnterClose *ebpf.ProgramSpec `ebpf:"sys_enter_close"` SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` @@ -113,6 +116,7 @@ type tlsTapperMapSpecs struct { PidsMap *ebpf.MapSpec `ebpf:"pids_map"` SslReadContext *ebpf.MapSpec `ebpf:"ssl_read_context"` SslWriteContext *ebpf.MapSpec `ebpf:"ssl_write_context"` + SysCloses *ebpf.MapSpec `ebpf:"sys_closes"` } // tlsTapperObjects contains all objects after they have been loaded into the kernel. @@ -146,6 +150,7 @@ type tlsTapperMaps struct { PidsMap *ebpf.Map `ebpf:"pids_map"` SslReadContext *ebpf.Map `ebpf:"ssl_read_context"` SslWriteContext *ebpf.Map `ebpf:"ssl_write_context"` + SysCloses *ebpf.Map `ebpf:"sys_closes"` } func (m *tlsTapperMaps) Close() error { @@ -162,6 +167,7 @@ func (m *tlsTapperMaps) Close() error { m.PidsMap, m.SslReadContext, m.SslWriteContext, + m.SysCloses, ) } @@ -182,6 +188,7 @@ type tlsTapperPrograms struct { SslWrite *ebpf.Program `ebpf:"ssl_write"` SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` + SysEnterClose *ebpf.Program `ebpf:"sys_enter_close"` SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` @@ -204,6 +211,7 @@ func (p *tlsTapperPrograms) Close() error { p.SslWrite, p.SslWriteEx, p.SysEnterAccept4, + p.SysEnterClose, p.SysEnterConnect, p.SysEnterRead, p.SysEnterWrite, diff --git a/tap/tlstapper/tlstapper_bpfeb.o b/tap/tlstapper/tlstapper_bpfeb.o index 1d128f91a3a5f24d30bf43d0abbbe962edaa3b16..9ca5f54f7e25d7ba2643d782a9810d64a2867d3d 100644 GIT binary patch literal 127872 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

WJTCsClS1U3S6&e7 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 literal 126008 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 IPdNVn0e~QZe*gdg diff --git a/tap/tlstapper/tlstapper_bpfel.go b/tap/tlstapper/tlstapper_bpfel.go index 13ff4f792..f98174e49 100644 --- a/tap/tlstapper/tlstapper_bpfel.go +++ b/tap/tlstapper/tlstapper_bpfel.go @@ -24,6 +24,8 @@ type tlsTapperGolangReadWrite struct { Data [4096]uint8 } +type tlsTapperSysClose struct{ Fd uint32 } + type tlsTapperTlsChunk struct { Pid uint32 Tgid uint32 @@ -90,6 +92,7 @@ type tlsTapperProgramSpecs struct { SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` + SysEnterClose *ebpf.ProgramSpec `ebpf:"sys_enter_close"` SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` @@ -113,6 +116,7 @@ type tlsTapperMapSpecs struct { PidsMap *ebpf.MapSpec `ebpf:"pids_map"` SslReadContext *ebpf.MapSpec `ebpf:"ssl_read_context"` SslWriteContext *ebpf.MapSpec `ebpf:"ssl_write_context"` + SysCloses *ebpf.MapSpec `ebpf:"sys_closes"` } // tlsTapperObjects contains all objects after they have been loaded into the kernel. @@ -146,6 +150,7 @@ type tlsTapperMaps struct { PidsMap *ebpf.Map `ebpf:"pids_map"` SslReadContext *ebpf.Map `ebpf:"ssl_read_context"` SslWriteContext *ebpf.Map `ebpf:"ssl_write_context"` + SysCloses *ebpf.Map `ebpf:"sys_closes"` } func (m *tlsTapperMaps) Close() error { @@ -162,6 +167,7 @@ func (m *tlsTapperMaps) Close() error { m.PidsMap, m.SslReadContext, m.SslWriteContext, + m.SysCloses, ) } @@ -182,6 +188,7 @@ type tlsTapperPrograms struct { SslWrite *ebpf.Program `ebpf:"ssl_write"` SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` + SysEnterClose *ebpf.Program `ebpf:"sys_enter_close"` SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` @@ -204,6 +211,7 @@ func (p *tlsTapperPrograms) Close() error { p.SslWrite, p.SslWriteEx, p.SysEnterAccept4, + p.SysEnterClose, p.SysEnterConnect, p.SysEnterRead, p.SysEnterWrite, diff --git a/tap/tlstapper/tlstapper_bpfel.o b/tap/tlstapper/tlstapper_bpfel.o index f7dceb125c32e04fe5cff7d8f353d0e0490b4752..b8f59f0f7c5e861872ab63bf88cc727abe40ea8e 100644 GIT binary patch literal 127872 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 IE)M_y1G7NRV*mgE literal 126008 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 If#LZ7KQ2PVc>n+a