CVE-2023-53642CVE-2023-53642是Linux内核x86架构中的一个异常处理标注错误漏洞。该漏洞位于`clear_user_rep_good()`函数中,具体问题在于函数末尾`rep movsb`指令的异常表(exception table)标注位置不正确。异常表标注指向了实际用户空间访问指令之前的寄存器移动指令,而非执行用户空间访问的`rep movsb`指令本身。这导致当用户空间访问发生异常(如页面缺失)时,内核的异常处理程序无法在异常表中找到对应的指令条目,从而无法正确修复异常并返回-EFAULT错误码,反而触发了内核oops(kernel oops)崩溃报告。从CVSS向量来看,该漏洞需要本地低权限触发,无需用户交互,机密性和完整性影响较低,但可用性影响为高,表明其主要危害在于导致系统崩溃或拒绝服务。该漏洞影响所有使用x86架构的Linux内核版本中包含`clear_user_rep_good()`函数的稳定分支。
在x86架构的Linux内核中,`clear_user_rep_good()`函数使用`rep movsb`指令来清除用户空间内存。该函数利用了x86的REP_GOOD优化特性。Linux内核使用异常表机制来处理用户空间访问可能产生的异常(如页面错误),通过在异常表中注册指令地址与修复代码的映射关系,当用户空间访问触发异常时,内核可以查找异常表并跳转到修复代码以安全地返回错误码。
该漏洞的根本原因在于:异常表标注(`_ASM_EXTABLE`宏)放置在了`rep movsb`指令之前的寄存器移动指令(如`mov %rcx, %rdx`)上,而非实际的`rep movsb`指令上。这虽然在代码流角度是合理的,但从实际使用角度来看是错误的——当`rep movsb`执行用户空间访问并触发异常时,内核异常处理程序在异常表中查找的是寄存器移动指令的地址,而非`rep movsb`的地址,导致查找失败。
结果,异常处理程序无法执行预设的修复操作(如设置返回值为-EFAULT并跳转到错误处理路径),而是将异常升级为内核oops,输出类似"BUG: unable to handle page fault"的错误信息,并打印完整的调用栈。调用栈显示问题源于`clear_user_rep_good()`,经过`__clear_user`、`iov_iter_zero`、`iomap_dio_rw`等调用路径,最终由`preadv2`系统调用触发。
攻击者可以通过构造特殊的I/O操作(如通过preadv/pwritev系统调用对已关闭的文件描述符或特殊映射区域执行读取操作)来触发此漏洞,导致系统出现内核oops,实现本地拒绝服务攻击。