PicasoTheDeal/ZeroShadow
GitHub: PicasoTheDeal/ZeroShadow
ZeroShadow 是一个基于 ptrace 的 Linux 用户态控制流完整性监控器,通过单步执行和动态内存边界校验来检测并阻断未授权的代码执行跳转。
Stars: 0 | Forks: 0
[](https://github.com/PicasoTheDeal/ZeroShadow/actions/workflows/codeql.yml)
# ZeroShadow
ZeroShadow 是一个低级别的 Linux 用户态监控器,用于实施粗粒度的控制流完整性(CFI)。它使用 `ptrace` 对目标线程进行单步执行,并根据从 `/proc/[pid]/maps` 动态提取的已知可执行内存边界来验证指令指针(`RIP`)。任何针对未授权区域(栈、堆、未映射)的执行跳转都将导致立即终止。
## 核心引擎
- **执行追踪:** 统一的 `waitpid` 循环对所有活跃线程进行单步执行(`PTRACE_SINGLESTEP`)。每个指令边界都会被验证。
- **动态 Maps:** 在附加时解析 `/proc/[pid]/maps`。通过 `PTRACE_O_TRACESYSGOOD` 拦截 `mmap`/`mprotect` 系统调用,以实时追踪 `PROT_EXEC` 状态的变化。
- **线程谱系:** 强制执行 `PTRACE_O_TRACECLONE | FORK | VFORK`。新生成的线程会在用户态代码执行之前被自动捕获并添加到监控循环中。
## 强化版系统调用拦截(缓解 TOCTOU)
恶意利用通常会尝试通过 `rt_sigprocmask` 阻塞 `SIGTRAP` 或 `SIGSEGV` 来致盲调试器。ZeroShadow 会拦截此系统调用,并关闭检查时间到使用时间(TOCTOU)的时间窗口:
1. 在入口处捕获 `rt_sigprocmask`。
2. 使用原子操作 `process_vm_readv` 直接从内存中提取被追踪者的待处理信号掩码。
3. 在本地剥离 `SIGTRAP` 和 `SIGSEGV` 位。
4. 通过 `process_vm_writev` 将清理后的掩码推回被追踪者。
5. 恢复系统调用。内核消耗干净的掩码。没有竞态条件,没有盲区。
## 集成指南
### 方法 A:被动附加
热附加到已经在运行的生产进程中。提取当前的内存边界并立即开始单步执行。
```
# 附加到活动 PID
./ZeroShadow
```
### 方法 B:主动启动
受监督的生成。ZeroShadow 执行 fork,子进程调用 PTRACE_TRACEME 并执行目标二进制文件。在任何用户态代码运行之前,在第一条指令处捕获进程。
```
# 启动并 trace
./ZeroShadow /path/to/binary
```
## 构建与项目结构
需要 C++17 编译器以及支持 process_vm_writev 的 Linux 内核(4.11+)。
```
make
```
## 安全架构与权限
ZeroShadow 作为低级别的插桩引擎运行。为了维持一个可验证的信任环,系统边界和权限在下面进行了严格的映射。
### 所需的 Linux Capabilities
* **`CAP_SYS_PTRACE`**:如果追踪外部的、已经在运行的进程,则需要此权限。ZeroShadow 使用标准的 Linux 进程追踪机制来读取内存映射(`/proc/[pid]/maps`)并 hook 执行向量。
* **Root 权限**:仅当被分析的目标二进制文件本身需要 root 权限,或者附加到另一个用户拥有的进程时,才需要 `sudo`。
### 引擎不会执行的操作
* **无网络 I/O**:核心引擎(`libzeroshadow.so`)不包含任何网络库。它无法进行外部调用;回传数据在结构上是不可能的。
* **无任意持久化**:ZeroShadow 不会写入系统目录、修改初始化脚本或创建后台守护进程。
### 模块化结构
代码库被解耦为相互隔离的、单一职责的模块,以确保透明的代码审计:
1. `src/elf_parser.cpp`:纯粹地将 ELF 结构读取并映射到内存中。它不包含任何执行或追踪逻辑。
2. `src/tracer.cpp`:处理低级别的断点放置和寄存器追踪。它完全依赖于解析器解析出的数据。
3. `src/main.cpp`:驱动底层模块的 CLI 接口包装器。
```
.
├── include
│ ├── elf_parser.hpp # PT_LOAD execution extraction
│ └── tracer.hpp # supervisor architecture and state management
├── Makefile
├── README.md
└── src
├── elf_parser.cpp
├── main.cpp # entry point and argument routing
└── tracer.cpp # ptrace loop, syscall interception, and CFI enforcement
```
## 历程 / 构建过程
* **构建开始:** [帖子 #313](https://t.me/Tetstack/313)
* **完成 Alpha 版:** [帖子 #437](https://t.me/Tetstack/437)
标签:内存保护, 控制流完整性, 系统工具, 进程追踪