From c1c1673eedd2a117eba31337b40b0ddb8af347c3 Mon Sep 17 00:00:00 2001 From: "M. Mert Yildiran" Date: Thu, 9 Jun 2022 06:18:20 +0300 Subject: [PATCH] Rename everything contains Golang to Go --- tap/passive_tapper.go | 2 +- .../bpf/{golang_uprobes.c => go_uprobes.c} | 20 ++-- tap/tlstapper/bpf/include/go_abi_internal.h | 6 +- tap/tlstapper/bpf/include/go_types.h | 6 +- tap/tlstapper/bpf/include/logger_messages.h | 2 +- tap/tlstapper/bpf/tls_tapper.c | 2 +- tap/tlstapper/bpf_logger_messages.go | 2 +- tap/tlstapper/go_hooks.go | 105 ++++++++++++++++++ .../{golang_offsets.go => go_offsets.go} | 50 ++++----- tap/tlstapper/golang_hooks.go | 105 ------------------ tap/tlstapper/tls_process_discoverer.go | 2 +- tap/tlstapper/tls_tapper.go | 34 +++--- tap/tlstapper/tlstapper_bpfeb.go | 80 ++++++------- tap/tlstapper/tlstapper_bpfeb.o | Bin 156376 -> 156296 bytes tap/tlstapper/tlstapper_bpfel.go | 80 ++++++------- tap/tlstapper/tlstapper_bpfel.o | Bin 157192 -> 157112 bytes 16 files changed, 248 insertions(+), 248 deletions(-) rename tap/tlstapper/bpf/{golang_uprobes.c => go_uprobes.c} (90%) create mode 100644 tap/tlstapper/go_hooks.go rename tap/tlstapper/{golang_offsets.go => go_offsets.go} (70%) delete mode 100644 tap/tlstapper/golang_hooks.go diff --git a/tap/passive_tapper.go b/tap/passive_tapper.go index 1aa7a620d..b62ce3b40 100644 --- a/tap/passive_tapper.go +++ b/tap/passive_tapper.go @@ -287,7 +287,7 @@ func startTlsTapper(extension *api.Extension, outputItems chan *api.OutputChanne // A quick way to instrument Go `crypto/tls` without PID filtering - used for debuging and troubleshooting // if os.Getenv("MIZU_GLOBAL_GOLANG_PID") != "" { - if err := tls.GlobalGolangTap(*procfs, os.Getenv("MIZU_GLOBAL_GOLANG_PID")); err != nil { + if err := tls.GlobalGoTap(*procfs, os.Getenv("MIZU_GLOBAL_GOLANG_PID")); err != nil { tlstapper.LogError(err) return nil } diff --git a/tap/tlstapper/bpf/golang_uprobes.c b/tap/tlstapper/bpf/go_uprobes.c similarity index 90% rename from tap/tlstapper/bpf/golang_uprobes.c rename to tap/tlstapper/bpf/go_uprobes.c index e526c49a7..bc7a83bcf 100644 --- a/tap/tlstapper/bpf/golang_uprobes.c +++ b/tap/tlstapper/bpf/go_uprobes.c @@ -8,7 +8,7 @@ Copyright (C) UP9 Inc. README -Golang does not follow any platform ABI like x86-64 ABI. +Go does not follow any platform ABI like x86-64 ABI. Before 1.17, Go followed stack-based Plan9 (Bell Labs) calling convention. After 1.17, Go switched to an internal register-based calling convention. (Go internal ABI) The probes in this file supports Go 1.17+ @@ -22,7 +22,7 @@ Therefore `uretprobe` CAN'T BE USED for a Go program. `_ex_uprobe` suffixed probes suppose to be `uretprobe`(s) are actually `uprobe`(s) because of the non-standard ABI of Go. Therefore we probe `ret` mnemonics under the symbol by automatically finding them through reading the ELF binary and disassembling the symbols. -Disassembly related code located in `golang_offsets.go` file. +Disassembly related code located in `go_offsets.go` file. Example: We probe an arbitrary point in a function body (offset +559): https://github.com/golang/go/blob/go1.17.6/src/crypto/tls/conn.go#L1296 @@ -73,8 +73,8 @@ static __always_inline __u32 get_fd_from_tcp_conn(struct pt_regs *ctx) { return fd; } -SEC("uprobe/golang_crypto_tls_write") -static int golang_crypto_tls_write_uprobe(struct pt_regs *ctx) { +SEC("uprobe/go_crypto_tls_write") +static int go_crypto_tls_write_uprobe(struct pt_regs *ctx) { __u64 pid_tgid = bpf_get_current_pid_tgid(); __u64 pid = pid_tgid >> 32; if (!should_tap(pid)) { @@ -97,8 +97,8 @@ static int golang_crypto_tls_write_uprobe(struct pt_regs *ctx) { return 0; } -SEC("uprobe/golang_crypto_tls_write_ex") -static int golang_crypto_tls_write_ex_uprobe(struct pt_regs *ctx) { +SEC("uprobe/go_crypto_tls_write_ex") +static int go_crypto_tls_write_ex_uprobe(struct pt_regs *ctx) { __u64 pid_tgid = bpf_get_current_pid_tgid(); __u64 pid = pid_tgid >> 32; if (!should_tap(pid)) { @@ -125,8 +125,8 @@ static int golang_crypto_tls_write_ex_uprobe(struct pt_regs *ctx) { return 0; } -SEC("uprobe/golang_crypto_tls_read") -static int golang_crypto_tls_read_uprobe(struct pt_regs *ctx) { +SEC("uprobe/go_crypto_tls_read") +static int go_crypto_tls_read_uprobe(struct pt_regs *ctx) { __u64 pid_tgid = bpf_get_current_pid_tgid(); __u64 pid = pid_tgid >> 32; if (!should_tap(pid)) { @@ -149,8 +149,8 @@ static int golang_crypto_tls_read_uprobe(struct pt_regs *ctx) { return 0; } -SEC("uprobe/golang_crypto_tls_read_ex") -static int golang_crypto_tls_read_ex_uprobe(struct pt_regs *ctx) { +SEC("uprobe/go_crypto_tls_read_ex") +static int go_crypto_tls_read_ex_uprobe(struct pt_regs *ctx) { __u64 pid_tgid = bpf_get_current_pid_tgid(); __u64 pid = pid_tgid >> 32; if (!should_tap(pid)) { diff --git a/tap/tlstapper/bpf/include/go_abi_internal.h b/tap/tlstapper/bpf/include/go_abi_internal.h index 5303ea751..368b32679 100644 --- a/tap/tlstapper/bpf/include/go_abi_internal.h +++ b/tap/tlstapper/bpf/include/go_abi_internal.h @@ -4,8 +4,8 @@ SPDX-License-Identifier: GPL-2.0 Copyright (C) UP9 Inc. */ -#ifndef __GOLANG_ABI_INTERNAL__ -#define __GOLANG_ABI_INTERNAL__ +#ifndef __GO_ABI_INTERNAL__ +#define __GO_ABI_INTERNAL__ /* Go internal ABI specification @@ -138,4 +138,4 @@ https://github.com/golang/go/blob/go1.17.6/src/cmd/compile/internal/ssa/gen/PPC6 #endif -#endif /* __GOLANG_ABI_INTERNAL__ */ +#endif /* __GO_ABI_INTERNAL__ */ diff --git a/tap/tlstapper/bpf/include/go_types.h b/tap/tlstapper/bpf/include/go_types.h index 4eca1ed2a..b6cd1b78b 100644 --- a/tap/tlstapper/bpf/include/go_types.h +++ b/tap/tlstapper/bpf/include/go_types.h @@ -4,12 +4,12 @@ SPDX-License-Identifier: GPL-2.0 Copyright (C) UP9 Inc. */ -#ifndef __GOLANG_TYPES__ -#define __GOLANG_TYPES__ +#ifndef __GO_TYPES__ +#define __GO_TYPES__ struct go_interface { int64_t type; void* ptr; }; -#endif /* __GOLANG_TYPES__ */ +#endif /* __GO_TYPES__ */ diff --git a/tap/tlstapper/bpf/include/logger_messages.h b/tap/tlstapper/bpf/include/logger_messages.h index d581c25f7..e48a65786 100644 --- a/tap/tlstapper/bpf/include/logger_messages.h +++ b/tap/tlstapper/bpf/include/logger_messages.h @@ -26,7 +26,7 @@ Copyright (C) UP9 Inc. #define LOG_ERROR_PUTTING_CONNECT_INFO (14) #define LOG_ERROR_GETTING_CONNECT_INFO (15) #define LOG_ERROR_READING_CONNECT_INFO (16) -#define LOG_ERROR_GOLANG_READ_READING_DATA_POINTER (17) +#define LOG_ERROR_GO_READ_READING_DATA_POINTER (17) // Sometimes we have the same error, happening from different locations. // in order to be able to distinct between them in the log, we add an diff --git a/tap/tlstapper/bpf/tls_tapper.c b/tap/tlstapper/bpf/tls_tapper.c index 5bda416fb..e5388b9f8 100644 --- a/tap/tlstapper/bpf/tls_tapper.c +++ b/tap/tlstapper/bpf/tls_tapper.c @@ -15,7 +15,7 @@ Copyright (C) UP9 Inc. // #include "common.c" #include "openssl_uprobes.c" -#include "golang_uprobes.c" +#include "go_uprobes.c" #include "fd_tracepoints.c" #include "fd_to_address_tracepoints.c" diff --git a/tap/tlstapper/bpf_logger_messages.go b/tap/tlstapper/bpf_logger_messages.go index 6ab5ea509..460ecef26 100644 --- a/tap/tlstapper/bpf_logger_messages.go +++ b/tap/tlstapper/bpf_logger_messages.go @@ -20,5 +20,5 @@ var bpfLogMessages = []string{ /*0014*/ "[%d] Unable to put connect info [err: %d]", /*0015*/ "[%d] Unable to get connect info", /*0016*/ "[%d] Unable to read connect info [err: %d]", - /*0017*/ "[%d] Golang read unable to read data pointer [err: %d]", + /*0017*/ "[%d] Go read unable to read data pointer [err: %d]", } diff --git a/tap/tlstapper/go_hooks.go b/tap/tlstapper/go_hooks.go new file mode 100644 index 000000000..57881f81f --- /dev/null +++ b/tap/tlstapper/go_hooks.go @@ -0,0 +1,105 @@ +package tlstapper + +import ( + "github.com/cilium/ebpf/link" + "github.com/go-errors/errors" +) + +type goHooks struct { + goWriteProbe link.Link + goWriteExProbes []link.Link + goReadProbe link.Link + goReadExProbes []link.Link +} + +func (s *goHooks) installUprobes(bpfObjects *tlsTapperObjects, filePath string) error { + ex, err := link.OpenExecutable(filePath) + + if err != nil { + return errors.Wrap(err, 0) + } + + offsets, err := findGoOffsets(filePath) + + if err != nil { + return errors.Wrap(err, 0) + } + + return s.installHooks(bpfObjects, ex, offsets) +} + +func (s *goHooks) installHooks(bpfObjects *tlsTapperObjects, ex *link.Executable, offsets goOffsets) error { + var err error + + // Symbol points to + // [`crypto/tls.(*Conn).Write`](https://github.com/golang/go/blob/go1.17.6/src/crypto/tls/conn.go#L1099) + s.goWriteProbe, err = ex.Uprobe(goWriteSymbol, bpfObjects.GoCryptoTlsWriteUprobe, &link.UprobeOptions{ + Offset: offsets.GoWriteOffset.enter, + }) + + if err != nil { + return errors.Wrap(err, 0) + } + + for _, offset := range offsets.GoWriteOffset.exits { + probe, err := ex.Uprobe(goWriteSymbol, bpfObjects.GoCryptoTlsWriteExUprobe, &link.UprobeOptions{ + Offset: offset, + }) + + if err != nil { + return errors.Wrap(err, 0) + } + + s.goWriteExProbes = append(s.goWriteExProbes, probe) + } + + // Symbol points to + // [`crypto/tls.(*Conn).Read`](https://github.com/golang/go/blob/go1.17.6/src/crypto/tls/conn.go#L1263) + s.goReadProbe, err = ex.Uprobe(goReadSymbol, bpfObjects.GoCryptoTlsReadUprobe, &link.UprobeOptions{ + Offset: offsets.GoReadOffset.enter, + }) + + if err != nil { + return errors.Wrap(err, 0) + } + + for _, offset := range offsets.GoReadOffset.exits { + probe, err := ex.Uprobe(goReadSymbol, bpfObjects.GoCryptoTlsReadExUprobe, &link.UprobeOptions{ + Offset: offset, + }) + + if err != nil { + return errors.Wrap(err, 0) + } + + s.goReadExProbes = append(s.goReadExProbes, probe) + } + + return nil +} + +func (s *goHooks) close() []error { + errors := make([]error, 0) + + if err := s.goWriteProbe.Close(); err != nil { + errors = append(errors, err) + } + + for _, probe := range s.goWriteExProbes { + if err := probe.Close(); err != nil { + errors = append(errors, err) + } + } + + if err := s.goReadProbe.Close(); err != nil { + errors = append(errors, err) + } + + for _, probe := range s.goReadExProbes { + if err := probe.Close(); err != nil { + errors = append(errors, err) + } + } + + return errors +} diff --git a/tap/tlstapper/golang_offsets.go b/tap/tlstapper/go_offsets.go similarity index 70% rename from tap/tlstapper/golang_offsets.go rename to tap/tlstapper/go_offsets.go index 9b5835e95..2a202382f 100644 --- a/tap/tlstapper/golang_offsets.go +++ b/tap/tlstapper/go_offsets.go @@ -11,60 +11,60 @@ import ( "github.com/knightsc/gapstone" ) -type golangOffsets struct { - GolangWriteOffset *golangExtendedOffset - GolangReadOffset *golangExtendedOffset +type goOffsets struct { + GoWriteOffset *goExtendedOffset + GoReadOffset *goExtendedOffset } -type golangExtendedOffset struct { +type goExtendedOffset struct { enter uint64 exits []uint64 } const ( minimumSupportedGoVersion = "1.17.0" - golangVersionSymbol = "runtime.buildVersion.str" - golangWriteSymbol = "crypto/tls.(*Conn).Write" - golangReadSymbol = "crypto/tls.(*Conn).Read" + goVersionSymbol = "runtime.buildVersion.str" + goWriteSymbol = "crypto/tls.(*Conn).Write" + goReadSymbol = "crypto/tls.(*Conn).Read" ) -func findGolangOffsets(filePath string) (golangOffsets, error) { +func findGoOffsets(filePath string) (goOffsets, error) { offsets, err := getOffsets(filePath) if err != nil { - return golangOffsets{}, err + return goOffsets{}, err } - goVersionOffset, err := getOffset(offsets, golangVersionSymbol) + goVersionOffset, err := getOffset(offsets, goVersionSymbol) if err != nil { - return golangOffsets{}, err + return goOffsets{}, err } passed, goVersion, err := checkGoVersion(filePath, goVersionOffset) if err != nil { - return golangOffsets{}, fmt.Errorf("Checking Go version: %s", err) + return goOffsets{}, fmt.Errorf("Checking Go version: %s", err) } if !passed { - return golangOffsets{}, fmt.Errorf("Unsupported Go version: %s", goVersion) + return goOffsets{}, fmt.Errorf("Unsupported Go version: %s", goVersion) } - writeOffset, err := getOffset(offsets, golangWriteSymbol) + writeOffset, err := getOffset(offsets, goWriteSymbol) if err != nil { - return golangOffsets{}, fmt.Errorf("reading offset [%s]: %s", golangWriteSymbol, err) + return goOffsets{}, fmt.Errorf("reading offset [%s]: %s", goWriteSymbol, err) } - readOffset, err := getOffset(offsets, golangReadSymbol) + readOffset, err := getOffset(offsets, goReadSymbol) if err != nil { - return golangOffsets{}, fmt.Errorf("reading offset [%s]: %s", golangReadSymbol, err) + return goOffsets{}, fmt.Errorf("reading offset [%s]: %s", goReadSymbol, err) } - return golangOffsets{ - GolangWriteOffset: writeOffset, - GolangReadOffset: readOffset, + return goOffsets{ + GoWriteOffset: writeOffset, + GoReadOffset: readOffset, }, nil } -func getOffsets(filePath string) (offsets map[string]*golangExtendedOffset, err error) { +func getOffsets(filePath string) (offsets map[string]*goExtendedOffset, err error) { var engine gapstone.Engine engine, err = gapstone.New( gapstone.CS_ARCH_X86, @@ -74,7 +74,7 @@ func getOffsets(filePath string) (offsets map[string]*golangExtendedOffset, err return } - offsets = make(map[string]*golangExtendedOffset) + offsets = make(map[string]*goExtendedOffset) var fd *os.File fd, err = os.Open(filePath) if err != nil { @@ -114,7 +114,7 @@ func getOffsets(filePath string) (offsets map[string]*golangExtendedOffset, err } } - extendedOffset := &golangExtendedOffset{enter: offset} + extendedOffset := &goExtendedOffset{enter: offset} // source: https://gist.github.com/grantseltzer/3efa8ecc5de1fb566e8091533050d608 // skip over any symbols that aren't functinons/methods @@ -156,14 +156,14 @@ func getOffsets(filePath string) (offsets map[string]*golangExtendedOffset, err return } -func getOffset(offsets map[string]*golangExtendedOffset, symbol string) (*golangExtendedOffset, error) { +func getOffset(offsets map[string]*goExtendedOffset, symbol string) (*goExtendedOffset, error) { if offset, ok := offsets[symbol]; ok { return offset, nil } return nil, fmt.Errorf("symbol %s: %w", symbol, link.ErrNoSymbol) } -func checkGoVersion(filePath string, offset *golangExtendedOffset) (bool, string, error) { +func checkGoVersion(filePath string, offset *goExtendedOffset) (bool, string, error) { fd, err := os.Open(filePath) if err != nil { return false, "", err diff --git a/tap/tlstapper/golang_hooks.go b/tap/tlstapper/golang_hooks.go deleted file mode 100644 index 882b8a0b0..000000000 --- a/tap/tlstapper/golang_hooks.go +++ /dev/null @@ -1,105 +0,0 @@ -package tlstapper - -import ( - "github.com/cilium/ebpf/link" - "github.com/go-errors/errors" -) - -type golangHooks struct { - golangWriteProbe link.Link - golangWriteExProbes []link.Link - golangReadProbe link.Link - golangReadExProbes []link.Link -} - -func (s *golangHooks) installUprobes(bpfObjects *tlsTapperObjects, filePath string) error { - ex, err := link.OpenExecutable(filePath) - - if err != nil { - return errors.Wrap(err, 0) - } - - offsets, err := findGolangOffsets(filePath) - - if err != nil { - return errors.Wrap(err, 0) - } - - return s.installHooks(bpfObjects, ex, offsets) -} - -func (s *golangHooks) installHooks(bpfObjects *tlsTapperObjects, ex *link.Executable, offsets golangOffsets) error { - var err error - - // Symbol points to - // [`crypto/tls.(*Conn).Write`](https://github.com/golang/go/blob/go1.17.6/src/crypto/tls/conn.go#L1099) - s.golangWriteProbe, err = ex.Uprobe(golangWriteSymbol, bpfObjects.GolangCryptoTlsWriteUprobe, &link.UprobeOptions{ - Offset: offsets.GolangWriteOffset.enter, - }) - - if err != nil { - return errors.Wrap(err, 0) - } - - for _, offset := range offsets.GolangWriteOffset.exits { - probe, err := ex.Uprobe(golangWriteSymbol, bpfObjects.GolangCryptoTlsWriteExUprobe, &link.UprobeOptions{ - Offset: offset, - }) - - if err != nil { - return errors.Wrap(err, 0) - } - - s.golangWriteExProbes = append(s.golangWriteExProbes, probe) - } - - // Symbol points to - // [`crypto/tls.(*Conn).Read`](https://github.com/golang/go/blob/go1.17.6/src/crypto/tls/conn.go#L1263) - s.golangReadProbe, err = ex.Uprobe(golangReadSymbol, bpfObjects.GolangCryptoTlsReadUprobe, &link.UprobeOptions{ - Offset: offsets.GolangReadOffset.enter, - }) - - if err != nil { - return errors.Wrap(err, 0) - } - - for _, offset := range offsets.GolangReadOffset.exits { - probe, err := ex.Uprobe(golangReadSymbol, bpfObjects.GolangCryptoTlsReadExUprobe, &link.UprobeOptions{ - Offset: offset, - }) - - if err != nil { - return errors.Wrap(err, 0) - } - - s.golangReadExProbes = append(s.golangReadExProbes, probe) - } - - return nil -} - -func (s *golangHooks) close() []error { - errors := make([]error, 0) - - if err := s.golangWriteProbe.Close(); err != nil { - errors = append(errors, err) - } - - for _, probe := range s.golangWriteExProbes { - if err := probe.Close(); err != nil { - errors = append(errors, err) - } - } - - if err := s.golangReadProbe.Close(); err != nil { - errors = append(errors, err) - } - - for _, probe := range s.golangReadExProbes { - if err := probe.Close(); err != nil { - errors = append(errors, err) - } - } - - return errors -} diff --git a/tap/tlstapper/tls_process_discoverer.go b/tap/tlstapper/tls_process_discoverer.go index 7b653acd9..d55536798 100644 --- a/tap/tlstapper/tls_process_discoverer.go +++ b/tap/tlstapper/tls_process_discoverer.go @@ -32,7 +32,7 @@ func UpdateTapTargets(tls *TlsTapper, pods *[]v1.Pod, procfs string) error { LogError(err) } - if err := tls.AddGolangPid(procfs, pid, pod.Namespace); err != nil { + if err := tls.AddGoPid(procfs, pid, pod.Namespace); err != nil { LogError(err) } } diff --git a/tap/tlstapper/tls_tapper.go b/tap/tlstapper/tls_tapper.go index 12f37ddef..4e7229ab6 100644 --- a/tap/tlstapper/tls_tapper.go +++ b/tap/tlstapper/tls_tapper.go @@ -15,13 +15,13 @@ const GLOABL_TAP_PID = 0 //go:generate go run github.com/cilium/ebpf/cmd/bpf2go@0d0727ef53e2f53b1731c73f4c61e0f58693083a -type tls_chunk tlsTapper bpf/tls_tapper.c -- -O2 -g -D__TARGET_ARCH_x86 type TlsTapper struct { - bpfObjects tlsTapperObjects - syscallHooks syscallHooks - sslHooksStructs []sslHooks - golangHooksStructs []golangHooks - poller *tlsPoller - bpfLogger *bpfLogger - registeredPids sync.Map + bpfObjects tlsTapperObjects + syscallHooks syscallHooks + sslHooksStructs []sslHooks + goHooksStructs []goHooks + poller *tlsPoller + bpfLogger *bpfLogger + registeredPids sync.Map } func (t *TlsTapper) Init(chunksBufferSize int, logBufferSize int, procfs string, extension *api.Extension) error { @@ -70,13 +70,13 @@ func (t *TlsTapper) GlobalSsllibTap(sslLibrary string) error { return t.tapSsllibPid(GLOABL_TAP_PID, sslLibrary, api.UNKNOWN_NAMESPACE) } -func (t *TlsTapper) GlobalGolangTap(procfs string, pid string) error { +func (t *TlsTapper) GlobalGoTap(procfs string, pid string) error { _pid, err := strconv.Atoi(pid) if err != nil { return err } - return t.tapGolangPid(procfs, uint32(_pid), api.UNKNOWN_NAMESPACE) + return t.tapGoPid(procfs, uint32(_pid), api.UNKNOWN_NAMESPACE) } func (t *TlsTapper) AddSsllibPid(procfs string, pid uint32, namespace string) error { @@ -90,8 +90,8 @@ func (t *TlsTapper) AddSsllibPid(procfs string, pid uint32, namespace string) er return t.tapSsllibPid(pid, sslLibrary, namespace) } -func (t *TlsTapper) AddGolangPid(procfs string, pid uint32, namespace string) error { - return t.tapGolangPid(procfs, pid, namespace) +func (t *TlsTapper) AddGoPid(procfs string, pid uint32, namespace string) error { + return t.tapGoPid(procfs, pid, namespace) } func (t *TlsTapper) RemovePid(pid uint32) error { @@ -135,8 +135,8 @@ func (t *TlsTapper) Close() []error { errors = append(errors, sslHooks.close()...) } - for _, golangHooks := range t.golangHooksStructs { - errors = append(errors, golangHooks.close()...) + for _, goHooks := range t.goHooksStructs { + errors = append(errors, goHooks.close()...) } if err := t.bpfLogger.close(); err != nil { @@ -184,21 +184,21 @@ func (t *TlsTapper) tapSsllibPid(pid uint32, sslLibrary string, namespace string return nil } -func (t *TlsTapper) tapGolangPid(procfs string, pid uint32, namespace string) error { +func (t *TlsTapper) tapGoPid(procfs string, pid uint32, namespace string) error { exePath, err := findLibraryByPid(procfs, pid, "") if err != nil { return err } - hooks := golangHooks{} + hooks := goHooks{} if err := hooks.installUprobes(&t.bpfObjects, exePath); err != nil { return err } - logger.Log.Infof("Tapping TLS (pid: %v) (Golang: %v)", pid, exePath) + logger.Log.Infof("Tapping TLS (pid: %v) (Go: %v)", pid, exePath) - t.golangHooksStructs = append(t.golangHooksStructs, hooks) + t.goHooksStructs = append(t.goHooksStructs, hooks) t.poller.addPid(pid, namespace) diff --git a/tap/tlstapper/tlstapper_bpfeb.go b/tap/tlstapper/tlstapper_bpfeb.go index a0fd337e8..69cd9178d 100644 --- a/tap/tlstapper/tlstapper_bpfeb.go +++ b/tap/tlstapper/tlstapper_bpfeb.go @@ -66,24 +66,24 @@ type tlsTapperSpecs struct { // // It can be passed ebpf.CollectionSpec.Assign. type tlsTapperProgramSpecs struct { - GolangCryptoTlsReadExUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_read_ex_uprobe"` - GolangCryptoTlsReadUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_read_uprobe"` - GolangCryptoTlsWriteExUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_write_ex_uprobe"` - GolangCryptoTlsWriteUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_write_uprobe"` - SslRead *ebpf.ProgramSpec `ebpf:"ssl_read"` - SslReadEx *ebpf.ProgramSpec `ebpf:"ssl_read_ex"` - SslRetRead *ebpf.ProgramSpec `ebpf:"ssl_ret_read"` - SslRetReadEx *ebpf.ProgramSpec `ebpf:"ssl_ret_read_ex"` - SslRetWrite *ebpf.ProgramSpec `ebpf:"ssl_ret_write"` - SslRetWriteEx *ebpf.ProgramSpec `ebpf:"ssl_ret_write_ex"` - SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` - SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` - SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` - SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` - SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` - SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` - SysExitAccept4 *ebpf.ProgramSpec `ebpf:"sys_exit_accept4"` - SysExitConnect *ebpf.ProgramSpec `ebpf:"sys_exit_connect"` + GoCryptoTlsReadExUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_read_ex_uprobe"` + GoCryptoTlsReadUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_read_uprobe"` + GoCryptoTlsWriteExUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_write_ex_uprobe"` + GoCryptoTlsWriteUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_write_uprobe"` + SslRead *ebpf.ProgramSpec `ebpf:"ssl_read"` + SslReadEx *ebpf.ProgramSpec `ebpf:"ssl_read_ex"` + SslRetRead *ebpf.ProgramSpec `ebpf:"ssl_ret_read"` + SslRetReadEx *ebpf.ProgramSpec `ebpf:"ssl_ret_read_ex"` + SslRetWrite *ebpf.ProgramSpec `ebpf:"ssl_ret_write"` + SslRetWriteEx *ebpf.ProgramSpec `ebpf:"ssl_ret_write_ex"` + SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` + SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` + SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` + SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` + SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` + SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` + SysExitAccept4 *ebpf.ProgramSpec `ebpf:"sys_exit_accept4"` + SysExitConnect *ebpf.ProgramSpec `ebpf:"sys_exit_connect"` } // tlsTapperMapSpecs contains maps before they are loaded into the kernel. @@ -155,32 +155,32 @@ func (m *tlsTapperMaps) Close() error { // // It can be passed to loadTlsTapperObjects or ebpf.CollectionSpec.LoadAndAssign. type tlsTapperPrograms struct { - GolangCryptoTlsReadExUprobe *ebpf.Program `ebpf:"golang_crypto_tls_read_ex_uprobe"` - GolangCryptoTlsReadUprobe *ebpf.Program `ebpf:"golang_crypto_tls_read_uprobe"` - GolangCryptoTlsWriteExUprobe *ebpf.Program `ebpf:"golang_crypto_tls_write_ex_uprobe"` - GolangCryptoTlsWriteUprobe *ebpf.Program `ebpf:"golang_crypto_tls_write_uprobe"` - SslRead *ebpf.Program `ebpf:"ssl_read"` - SslReadEx *ebpf.Program `ebpf:"ssl_read_ex"` - SslRetRead *ebpf.Program `ebpf:"ssl_ret_read"` - SslRetReadEx *ebpf.Program `ebpf:"ssl_ret_read_ex"` - SslRetWrite *ebpf.Program `ebpf:"ssl_ret_write"` - SslRetWriteEx *ebpf.Program `ebpf:"ssl_ret_write_ex"` - SslWrite *ebpf.Program `ebpf:"ssl_write"` - SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` - SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` - SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` - SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` - SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` - SysExitAccept4 *ebpf.Program `ebpf:"sys_exit_accept4"` - SysExitConnect *ebpf.Program `ebpf:"sys_exit_connect"` + GoCryptoTlsReadExUprobe *ebpf.Program `ebpf:"go_crypto_tls_read_ex_uprobe"` + GoCryptoTlsReadUprobe *ebpf.Program `ebpf:"go_crypto_tls_read_uprobe"` + GoCryptoTlsWriteExUprobe *ebpf.Program `ebpf:"go_crypto_tls_write_ex_uprobe"` + GoCryptoTlsWriteUprobe *ebpf.Program `ebpf:"go_crypto_tls_write_uprobe"` + SslRead *ebpf.Program `ebpf:"ssl_read"` + SslReadEx *ebpf.Program `ebpf:"ssl_read_ex"` + SslRetRead *ebpf.Program `ebpf:"ssl_ret_read"` + SslRetReadEx *ebpf.Program `ebpf:"ssl_ret_read_ex"` + SslRetWrite *ebpf.Program `ebpf:"ssl_ret_write"` + SslRetWriteEx *ebpf.Program `ebpf:"ssl_ret_write_ex"` + SslWrite *ebpf.Program `ebpf:"ssl_write"` + SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` + SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` + SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` + SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` + SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` + SysExitAccept4 *ebpf.Program `ebpf:"sys_exit_accept4"` + SysExitConnect *ebpf.Program `ebpf:"sys_exit_connect"` } func (p *tlsTapperPrograms) Close() error { return _TlsTapperClose( - p.GolangCryptoTlsReadExUprobe, - p.GolangCryptoTlsReadUprobe, - p.GolangCryptoTlsWriteExUprobe, - p.GolangCryptoTlsWriteUprobe, + p.GoCryptoTlsReadExUprobe, + p.GoCryptoTlsReadUprobe, + p.GoCryptoTlsWriteExUprobe, + p.GoCryptoTlsWriteUprobe, p.SslRead, p.SslReadEx, p.SslRetRead, diff --git a/tap/tlstapper/tlstapper_bpfeb.o b/tap/tlstapper/tlstapper_bpfeb.o index 8895e07e5c5e3b6925e2d662a3ff493461003d24..9a213817ccea3d30511d41b7300f8698f538ca11 100644 GIT binary patch delta 14469 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 delta 15028 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 TDcYIZ=*(AQg=r|$&bI##!9?;+ diff --git a/tap/tlstapper/tlstapper_bpfel.go b/tap/tlstapper/tlstapper_bpfel.go index 7527af903..af222bfdf 100644 --- a/tap/tlstapper/tlstapper_bpfel.go +++ b/tap/tlstapper/tlstapper_bpfel.go @@ -66,24 +66,24 @@ type tlsTapperSpecs struct { // // It can be passed ebpf.CollectionSpec.Assign. type tlsTapperProgramSpecs struct { - GolangCryptoTlsReadExUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_read_ex_uprobe"` - GolangCryptoTlsReadUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_read_uprobe"` - GolangCryptoTlsWriteExUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_write_ex_uprobe"` - GolangCryptoTlsWriteUprobe *ebpf.ProgramSpec `ebpf:"golang_crypto_tls_write_uprobe"` - SslRead *ebpf.ProgramSpec `ebpf:"ssl_read"` - SslReadEx *ebpf.ProgramSpec `ebpf:"ssl_read_ex"` - SslRetRead *ebpf.ProgramSpec `ebpf:"ssl_ret_read"` - SslRetReadEx *ebpf.ProgramSpec `ebpf:"ssl_ret_read_ex"` - SslRetWrite *ebpf.ProgramSpec `ebpf:"ssl_ret_write"` - SslRetWriteEx *ebpf.ProgramSpec `ebpf:"ssl_ret_write_ex"` - SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` - SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` - SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` - SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` - SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` - SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` - SysExitAccept4 *ebpf.ProgramSpec `ebpf:"sys_exit_accept4"` - SysExitConnect *ebpf.ProgramSpec `ebpf:"sys_exit_connect"` + GoCryptoTlsReadExUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_read_ex_uprobe"` + GoCryptoTlsReadUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_read_uprobe"` + GoCryptoTlsWriteExUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_write_ex_uprobe"` + GoCryptoTlsWriteUprobe *ebpf.ProgramSpec `ebpf:"go_crypto_tls_write_uprobe"` + SslRead *ebpf.ProgramSpec `ebpf:"ssl_read"` + SslReadEx *ebpf.ProgramSpec `ebpf:"ssl_read_ex"` + SslRetRead *ebpf.ProgramSpec `ebpf:"ssl_ret_read"` + SslRetReadEx *ebpf.ProgramSpec `ebpf:"ssl_ret_read_ex"` + SslRetWrite *ebpf.ProgramSpec `ebpf:"ssl_ret_write"` + SslRetWriteEx *ebpf.ProgramSpec `ebpf:"ssl_ret_write_ex"` + SslWrite *ebpf.ProgramSpec `ebpf:"ssl_write"` + SslWriteEx *ebpf.ProgramSpec `ebpf:"ssl_write_ex"` + SysEnterAccept4 *ebpf.ProgramSpec `ebpf:"sys_enter_accept4"` + SysEnterConnect *ebpf.ProgramSpec `ebpf:"sys_enter_connect"` + SysEnterRead *ebpf.ProgramSpec `ebpf:"sys_enter_read"` + SysEnterWrite *ebpf.ProgramSpec `ebpf:"sys_enter_write"` + SysExitAccept4 *ebpf.ProgramSpec `ebpf:"sys_exit_accept4"` + SysExitConnect *ebpf.ProgramSpec `ebpf:"sys_exit_connect"` } // tlsTapperMapSpecs contains maps before they are loaded into the kernel. @@ -155,32 +155,32 @@ func (m *tlsTapperMaps) Close() error { // // It can be passed to loadTlsTapperObjects or ebpf.CollectionSpec.LoadAndAssign. type tlsTapperPrograms struct { - GolangCryptoTlsReadExUprobe *ebpf.Program `ebpf:"golang_crypto_tls_read_ex_uprobe"` - GolangCryptoTlsReadUprobe *ebpf.Program `ebpf:"golang_crypto_tls_read_uprobe"` - GolangCryptoTlsWriteExUprobe *ebpf.Program `ebpf:"golang_crypto_tls_write_ex_uprobe"` - GolangCryptoTlsWriteUprobe *ebpf.Program `ebpf:"golang_crypto_tls_write_uprobe"` - SslRead *ebpf.Program `ebpf:"ssl_read"` - SslReadEx *ebpf.Program `ebpf:"ssl_read_ex"` - SslRetRead *ebpf.Program `ebpf:"ssl_ret_read"` - SslRetReadEx *ebpf.Program `ebpf:"ssl_ret_read_ex"` - SslRetWrite *ebpf.Program `ebpf:"ssl_ret_write"` - SslRetWriteEx *ebpf.Program `ebpf:"ssl_ret_write_ex"` - SslWrite *ebpf.Program `ebpf:"ssl_write"` - SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` - SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` - SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` - SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` - SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` - SysExitAccept4 *ebpf.Program `ebpf:"sys_exit_accept4"` - SysExitConnect *ebpf.Program `ebpf:"sys_exit_connect"` + GoCryptoTlsReadExUprobe *ebpf.Program `ebpf:"go_crypto_tls_read_ex_uprobe"` + GoCryptoTlsReadUprobe *ebpf.Program `ebpf:"go_crypto_tls_read_uprobe"` + GoCryptoTlsWriteExUprobe *ebpf.Program `ebpf:"go_crypto_tls_write_ex_uprobe"` + GoCryptoTlsWriteUprobe *ebpf.Program `ebpf:"go_crypto_tls_write_uprobe"` + SslRead *ebpf.Program `ebpf:"ssl_read"` + SslReadEx *ebpf.Program `ebpf:"ssl_read_ex"` + SslRetRead *ebpf.Program `ebpf:"ssl_ret_read"` + SslRetReadEx *ebpf.Program `ebpf:"ssl_ret_read_ex"` + SslRetWrite *ebpf.Program `ebpf:"ssl_ret_write"` + SslRetWriteEx *ebpf.Program `ebpf:"ssl_ret_write_ex"` + SslWrite *ebpf.Program `ebpf:"ssl_write"` + SslWriteEx *ebpf.Program `ebpf:"ssl_write_ex"` + SysEnterAccept4 *ebpf.Program `ebpf:"sys_enter_accept4"` + SysEnterConnect *ebpf.Program `ebpf:"sys_enter_connect"` + SysEnterRead *ebpf.Program `ebpf:"sys_enter_read"` + SysEnterWrite *ebpf.Program `ebpf:"sys_enter_write"` + SysExitAccept4 *ebpf.Program `ebpf:"sys_exit_accept4"` + SysExitConnect *ebpf.Program `ebpf:"sys_exit_connect"` } func (p *tlsTapperPrograms) Close() error { return _TlsTapperClose( - p.GolangCryptoTlsReadExUprobe, - p.GolangCryptoTlsReadUprobe, - p.GolangCryptoTlsWriteExUprobe, - p.GolangCryptoTlsWriteUprobe, + p.GoCryptoTlsReadExUprobe, + p.GoCryptoTlsReadUprobe, + p.GoCryptoTlsWriteExUprobe, + p.GoCryptoTlsWriteUprobe, p.SslRead, p.SslReadEx, p.SslRetRead, diff --git a/tap/tlstapper/tlstapper_bpfel.o b/tap/tlstapper/tlstapper_bpfel.o index 64827d414009033493fbe6f9d44caf0a3fe4a67b..6c0b938d8d3a32c2eda102c4fdd748ae1619cddb 100644 GIT binary patch delta 12298 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