CR2 来自内核和用户空间中的 RIP 的分段错误

Segmentation fault with CR2 from kernel and RIP in userspace

提问人:user1641854 提问时间:11/10/2023 最后编辑:user1641854 更新时间:11/11/2023 访问量:58

问:

我在 Linux x86_64上有一些具有类似状态的段错误:

[pid 35742] [time 1699532462] signal caught:    Segmentation fault
si_signo:   11   
si_code:    SEGV_MAPERR
si_errno:   0
si_pid: 2166368523
si_uid: 4294967295
si_addr:    0xffffffff8120290b
si_status:  0
si_band:    0xffffffff8120290b
uc_flags:   0x1  
ss_sp:  0x7f7d25851000
ss_size:    1048576
ss_flags:   0x0  
REG_R8: 0xe76b5bc
REG_R9: 0x7f7d0743cc40
REG_R10:    0x7f7d0743b040
REG_R11:    0x0  
REG_R12:    0x0  
REG_R13:    0x0  
REG_R14:    0x7f7d25952020
REG_R15:    0x7f7d258137a8
REG_RDI:    0x7f7d258137a0
REG_RSI:    0x0  
REG_RBP:    0x7ffe5d6d86a0
REG_RBX:    0x7f7d258137a0
REG_RDX:    0x7f7c45f00000
REG_RAX:    0x0  
REG_RCX:    0x6  
REG_RSP:    0x7ffe5d6d8560
REG_RIP:    0x8af560
REG_EFL:    0x10242
REG_CSGSFS: 0x33 
REG_ERR:    0x15 
REG_TRAPNO: 0xe
REG_OLDMASK:    0xfffffffe00015a03
REG_CR2:    0xffffffff8120290b

虽然这似乎是尝试执行内核代码的页面错误,但我想知道它如何使 RIP 属于用户空间。

有趣的是,内核代码在调用指令之前有 jmp 到 CR2 地址,而用户空间在 RIP 之前有调用指令。

0x8af560附近的代码:

   0x00000000008af55b <+683>:   call   0x8adb50 <...>
   0x00000000008af560 <+688>:   mov    -0xe8(%rbp),%rdi
Linux x86 分段错误 内核

评论

1赞 Peter Cordes 11/10/2023
您没有向我们展示 RIP=0x8af560 处的错误用户空间指令。据推测,它尝试访问数据,因为这是故障地址。该地址是规范的,因此在更改 RIP 之前,跳转或调用该地址不会出错,只有在它尝试从新 RIP 获取代码(页表应映射为仅内核)之后才会出错。0xffffffff8120290b
0赞 user1641854 11/11/2023
@PeterCordes我添加了 disasm。如果是 mov - 则REG_ERR不应设置X86_PF_INSTR。除了那个rbp。RSP 和 RDI 似乎没问题。
0赞 Peter Cordes 11/11/2023
函数的作用是什么?它可能是包含此说明的页面吗?还是使其不可执行?这可以解释返回到坏页面后指令获取的页面错误。你是对的,使用该 RBP 值,不会考虑该 CR2 故障地址。RDI 是尚未写入的目标,因为 mov 未执行。(我猜这是一个非 PIE 可执行文件,因为地址不以 开头,因此即使启用了 ASLR,它也会在运行之间具有相同的地址。0x8adb50munmap()mprotectmov -0xe8(%rbp),%rdi0x000055...
0赞 Peter Cordes 11/11/2023
呃,等等,不,返回到 noexec 或未映射的页面不会解释 CR2 错误地址是内核地址。不知道这是怎么回事。
0赞 user1641854 11/11/2023
你对非 PIE 的猜测是正确的。0x8adb50函数是一种虚拟函数的调度程序 - 因此它可以做任何事情,但可以肯定的是没有恶意。我唯一的猜测是,它可能是某种 ret 小工具或返回用户空间时与中断混合的一些错误。因为相应地,/proc/kallsyms 0xffffffff8120290b指向了服务器工作负载功能的正确和有意义的。

答: 暂无答案