Mutasem-mk4/gspy
GitHub: Mutasem-mk4/gspy
一款基于 eBPF 的 Go 二进制实时取证与威胁狩猎框架,解决无侵入协程级行为观测难题。
Stars: 0 | Forks: 0
# gspy — eBPF 取证检查器,用于 Go 二进制文件和恶意软件分析
**gspy** 是一款高度专业化的 Linux 网络安全工具,它使用 eBPF 探针(uprobes)和内核跟踪点(tracepoints)附加到正在运行的 Go 进程,将运行的协程映射到实时的系统调用和用户空间堆栈帧。它能够动态、静默且准确地隔离 Go 后门、C2 框架和生产服务器中的恶意或异常并发行为。专为安全运营中心(SOC)、逆向工程师和恶意软件分析师设计,gspy 为编译后的 Go 二进制文件提供了前所未有的可观测性。 无需重启进程(`execve`),无需暂停(`ptrace(ATTACH)` 开销),也绝对不对目标二进制文件的内存进行修改。 ## ⚡ 核心特性 - **✅ 零 `ptrace()` 暂停:** 使用 `process_vm_readv` 和 eBPF,完全绕过 `ptrace` 附加导致的暂停,确保目标进程性能严格不受影响。 - **✅ 跨架构支持:** 完全原生支持,对 `x86_64`(AMD64)和 `AArch64`(ARM64)系统进行 CO-RE 兼容编译。 - **✅ 粒度审计:** 回答关键事件响应问题:*“这个拥有 10,000 个线程的应用程序中,哪个特定的协程刚刚调用了 `execve` 或 `connect`?”* - **✅ 取证完整性模式:** 使用 `--readonly` 标志可保证进程的加密(SHA-256)指纹,并严格执行 0 写入操作保证。 ## 🚀 演示  (使用 `demo/` 中的可重现脚本生成) ## 🧠 技术架构 传统追踪工具(`strace`)通过线程 ID(TID)拦截系统调用,使响应者无法得知是哪个内部 Go 并发操作触发的。 `gspy` 通过将 eBPF 武器化以桥接操作系统与 Go 运行时,解决了这一问题: ``` graph TD classDef bpf fill:#f96,stroke:#333,stroke-width:2px; classDef user fill:#6495ED,stroke:#333,stroke-width:2px,color:#fff; classDef target fill:#4CAF50,stroke:#333,stroke-width:2px,color:#fff; A[gspy Userspace]:::user -->|Inject compiled map| BPF(eBPF VM):::bpf Target[Target Go Binary]:::target -->|Triggers| BPF BPF -->|uprobe on runtime.execute| C{Extract Goroutine ID} C -->|TID to GID Map| BPF_Map[(BPF Hash Map)]:::bpf BPF -->|raw_syscalls/sys_enter| D{Syscall Intercept} D -->|Lookup GID via TID| BPF_Map D -->|Emit Payload| RingBuf[(16MB BPF RingBuf)]:::bpf RingBuf -->|Poll| A A -->|process_vm_readv| Mem[Process Memory] Mem -->|Resolve Stack Symbols| TUI[Terminal UI]:::user ``` 1. **Uprobes:** 钩住 `runtime.execute` 以跟踪 Go 调度器上下文切换,从 `runtime.g` 结构中提取协程 ID(`goid`)。 2. **Tracepoints:** 拦截 `sys_enter`/`sys_exit`,将操作系统线程 ID(TID)与活动的协程映射关联。 3. **用户空间符号化:** 通过 `process_vm_readv` 遍历目标的 ELF 表,将原始指令指针映射为可读的 Go 函数名。 如需深入了解工程细节,请阅读:[**为何 ptrace 对 Go 取证已死**](docs/blog/why-ptrace-is-dead-for-go-forensics.md) ## 🚀 快速启动(演示) 无需手动设置即可查看 `gspy` 的运行效果: ``` # 克隆并运行自动化演示 git clone https://github.com/Mutasem-mk4/gspy cd gspy ./demo/demo.sh ``` 这将构建 `gspy`,启动一个“可疑”的目标进程并在后台运行,然后立即附加到它。 ## 📋 兼容性矩阵 gspy 严格追踪 Go 编译器的内部应用程序二进制接口(ABI)。 | Go 版本 | AMD64(`x86_64`) | ARM64(`aarch64`) | |---------|-------------------|--------------------| | **1.21.x** | ✅ 已验证 | ✅ 已验证 | | **1.22.x** | ✅ 已验证 | ✅ 已验证 | | **1.23.x** | ✅ 已验证 | ✅ 已验证 | | **1.24.x** | ✅ 已验证 | ✅ 已验证 | | *1.17 - 1.20* | ⚠️ 遗留/实验性 | ⚠️ 遗留/实验性 | ### Linux 内核约束 - Linux 内核 **>= 5.8**(BPF 环形缓冲区支持所必需) - `CONFIG_BPF_SYSCALL=y` - `CONFIG_DEBUG_INFO_BTF=y`(推荐用于 CO-RE 可移植性) ## 🛠️ 安装 ### 官方发行版(待审核) gspy 正在被打包以纳入以下核心仓库: * **BlackArch Linux**(PR #4916) * **Kali Linux**(Issue #Pending) * **Parrot OS**(Issue #Pending) ### 从源码编译 ``` git clone https://github.com/Mutasem-mk4/gspy cd gspy make generate # requires clang >= 14 & bpftool make build # requires go >= 1.21 sudo make install # installs securely to /usr/bin and generates manpages ``` ### 权限 授予 Linux 能力以安全运行,无需强制使用 `sudo`: ``` sudo setcap cap_bpf,cap_perfmon+ep /usr/bin/gspy ``` ## 💻 使用 ``` gspy # Show live goroutine→syscall mapping TUI
gspy --top # Sort by total syscall volume (default)
gspy --latency # Sort strictly by highest syscall response blockage
gspy --filter # Subselect modes: io | net | sched | all
gspy --readonly # Forensic compliance mode: strict zero-write, logs SHA256 of memory map
gspy --json # Export data as newline-delimited JSON stream for SIEM / jq pipelines
gspy --debug # Trace BPF verifier logs and map statistics
gspy --version # Print release info
```
## 🤝 贡献
我们积极欢迎 Pull Request,以解决与更新的 Go 测试版兼容性或强化 BPF C 代码。查看 [**贡献指南**](CONTRIBUTING.md) 和 [**行为准则**](CODE_OF_CONDUCT.md)。
## 📄 许可证与法律
GPL-2.0-only。详见 [LICENSE](LICENSE) 完整文本。
eBPF 内核生态系统的交互要求遵守 GPL。所有源文件均明确包含 SPDX-License-Identifier 标头,以确保 Debian `licensecheck` 和企业开箱即用合规性。
Advanced eBPF-driven Digital Forensics and Incident Response (DFIR) framework for live Golang malware analysis and threat hunting.
[](LICENSE) [](https://go.dev) [](https://kernel.org) [](https://pkg.go.dev/github.com/Mutasem-mk4/gspy) [](https://goreportcard.com/report/github.com/Mutasem-mk4/gspy) [](https://securityscorecards.dev/viewer/?uri=github.com/Mutasem-mk4/gspy) [](https://github.com/Mutasem-mk4/gspy/actions/workflows/build.yml) [](https://github.com/Mutasem-mk4/gspy/actions/workflows/build.yml)**gspy** 是一款高度专业化的 Linux 网络安全工具,它使用 eBPF 探针(uprobes)和内核跟踪点(tracepoints)附加到正在运行的 Go 进程,将运行的协程映射到实时的系统调用和用户空间堆栈帧。它能够动态、静默且准确地隔离 Go 后门、C2 框架和生产服务器中的恶意或异常并发行为。专为安全运营中心(SOC)、逆向工程师和恶意软件分析师设计,gspy 为编译后的 Go 二进制文件提供了前所未有的可观测性。 无需重启进程(`execve`),无需暂停(`ptrace(ATTACH)` 开销),也绝对不对目标二进制文件的内存进行修改。 ## ⚡ 核心特性 - **✅ 零 `ptrace()` 暂停:** 使用 `process_vm_readv` 和 eBPF,完全绕过 `ptrace` 附加导致的暂停,确保目标进程性能严格不受影响。 - **✅ 跨架构支持:** 完全原生支持,对 `x86_64`(AMD64)和 `AArch64`(ARM64)系统进行 CO-RE 兼容编译。 - **✅ 粒度审计:** 回答关键事件响应问题:*“这个拥有 10,000 个线程的应用程序中,哪个特定的协程刚刚调用了 `execve` 或 `connect`?”* - **✅ 取证完整性模式:** 使用 `--readonly` 标志可保证进程的加密(SHA-256)指纹,并严格执行 0 写入操作保证。 ## 🚀 演示  (使用 `demo/` 中的可重现脚本生成) ## 🧠 技术架构 传统追踪工具(`strace`)通过线程 ID(TID)拦截系统调用,使响应者无法得知是哪个内部 Go 并发操作触发的。 `gspy` 通过将 eBPF 武器化以桥接操作系统与 Go 运行时,解决了这一问题: ``` graph TD classDef bpf fill:#f96,stroke:#333,stroke-width:2px; classDef user fill:#6495ED,stroke:#333,stroke-width:2px,color:#fff; classDef target fill:#4CAF50,stroke:#333,stroke-width:2px,color:#fff; A[gspy Userspace]:::user -->|Inject compiled map| BPF(eBPF VM):::bpf Target[Target Go Binary]:::target -->|Triggers| BPF BPF -->|uprobe on runtime.execute| C{Extract Goroutine ID} C -->|TID to GID Map| BPF_Map[(BPF Hash Map)]:::bpf BPF -->|raw_syscalls/sys_enter| D{Syscall Intercept} D -->|Lookup GID via TID| BPF_Map D -->|Emit Payload| RingBuf[(16MB BPF RingBuf)]:::bpf RingBuf -->|Poll| A A -->|process_vm_readv| Mem[Process Memory] Mem -->|Resolve Stack Symbols| TUI[Terminal UI]:::user ``` 1. **Uprobes:** 钩住 `runtime.execute` 以跟踪 Go 调度器上下文切换,从 `runtime.g` 结构中提取协程 ID(`goid`)。 2. **Tracepoints:** 拦截 `sys_enter`/`sys_exit`,将操作系统线程 ID(TID)与活动的协程映射关联。 3. **用户空间符号化:** 通过 `process_vm_readv` 遍历目标的 ELF 表,将原始指令指针映射为可读的 Go 函数名。 如需深入了解工程细节,请阅读:[**为何 ptrace 对 Go 取证已死**](docs/blog/why-ptrace-is-dead-for-go-forensics.md) ## 🚀 快速启动(演示) 无需手动设置即可查看 `gspy` 的运行效果: ``` # 克隆并运行自动化演示 git clone https://github.com/Mutasem-mk4/gspy cd gspy ./demo/demo.sh ``` 这将构建 `gspy`,启动一个“可疑”的目标进程并在后台运行,然后立即附加到它。 ## 📋 兼容性矩阵 gspy 严格追踪 Go 编译器的内部应用程序二进制接口(ABI)。 | Go 版本 | AMD64(`x86_64`) | ARM64(`aarch64`) | |---------|-------------------|--------------------| | **1.21.x** | ✅ 已验证 | ✅ 已验证 | | **1.22.x** | ✅ 已验证 | ✅ 已验证 | | **1.23.x** | ✅ 已验证 | ✅ 已验证 | | **1.24.x** | ✅ 已验证 | ✅ 已验证 | | *1.17 - 1.20* | ⚠️ 遗留/实验性 | ⚠️ 遗留/实验性 | ### Linux 内核约束 - Linux 内核 **>= 5.8**(BPF 环形缓冲区支持所必需) - `CONFIG_BPF_SYSCALL=y` - `CONFIG_DEBUG_INFO_BTF=y`(推荐用于 CO-RE 可移植性) ## 🛠️ 安装 ### 官方发行版(待审核) gspy 正在被打包以纳入以下核心仓库: * **BlackArch Linux**(PR #4916) * **Kali Linux**(Issue #Pending) * **Parrot OS**(Issue #Pending) ### 从源码编译 ``` git clone https://github.com/Mutasem-mk4/gspy cd gspy make generate # requires clang >= 14 & bpftool make build # requires go >= 1.21 sudo make install # installs securely to /usr/bin and generates manpages ``` ### 权限 授予 Linux 能力以安全运行,无需强制使用 `sudo`: ``` sudo setcap cap_bpf,cap_perfmon+ep /usr/bin/gspy ``` ## 💻 使用 ``` gspy
标签:DAST, Docker镜像, EVTX分析, Golang, goroutine, Go语言, GPL-2.0-only, Hpfeeds, tracepoints, uprobes, 内核追踪, 安全渗透, 安全编程, 安全运营中心, 实时分析, 恶意软件分析, 数字取证, 无侵入, 日志审计, 生产环境监控, 目录遍历, 程序破解, 系统调用, 网络映射, 自动化脚本, 观测性