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

CVE-2023-53637 Linux内核ov772x驱动内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53637
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 ov772x摄像头驱动 (media/i2c/ov772x)

相关标签

内存泄漏Linux内核ov772xV4L2media子系统内核驱动摄像头驱动拒绝服务CWE-401本地提权

漏洞概述

CVE-2023-53637是Linux内核中ov772x摄像头驱动的一个内存泄漏漏洞。该漏洞位于drivers/media/i2c/ov772x.c文件的ov772x_probe()函数中。当使用bpf mock device测试ov772x驱动时,发现存在内存泄漏问题。具体而言,在ov772x_probe()函数的错误处理路径中,当priv->hdl.error被设置时,代码会跳转到error_mutex_destroy标签处执行清理工作,但在此之前并未调用v4l2_ctrl_handler_free()来释放通过v4l2_ctrl_handler_init()和v4l2_ctrl_new_std()分配的所有资源。这导致在驱动探测失败时,内核中分配的控制处理器(control handler)及其关联的控件对象无法被正确释放,从而造成内存泄漏。随着系统运行时间的增加和设备的热插拔操作,泄漏的内存会逐渐累积,最终可能导致系统内存耗尽,影响系统的稳定性和可用性。该漏洞的CVSS评分为5.5,属于中危级别,主要影响系统的可用性(可用性影响为高),需要本地低权限访问且无需用户交互即可触发。

技术细节

该漏洞的技术原理在于ov772x驱动的错误处理路径不完整。在Linux内核的V4L2(Video4Linux2)子系统中,ov772x_probe()函数负责初始化摄像头设备的控制处理器。其执行流程如下:

1. 首先调用v4l2_ctrl_handler_init()初始化控制处理器(ctrl_handler),该函数会分配一个handler结构体;
2. 随后调用v4l2_ctrl_new_std()创建标准的V4L2控件(如亮度、对比度、饱和度等),每个控件都会分配独立的内存;
3. 在创建控件过程中,如果出现错误,priv->hdl.error会被设置;
4. 此时代码会跳转到error_mutex_destroy标签处;
5. 但error_mutex_destroy标签处只调用了mutex_destroy()销毁互斥锁,并未调用v4l2_ctrl_handler_free()释放控制处理器及其所有关联控件。

正确的做法应该是先调用v4l2_ctrl_handler_free()释放所有通过v4l2_ctrl_handler_init()和v4l2_ctrl_new_std()分配的资源,然后再跳转到error_mutex_destroy。

利用方式:本地攻击者可以通过反复触发ov772x设备的探测失败(例如通过有缺陷的设备树或I2C总线配置),导致每次探测都泄漏内存,最终耗尽系统内存资源,触发系统不稳定或拒绝服务状态。攻击者需要本地低权限访问权限,但无需用户交互。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获取目标Linux系统的本地低权限访问权限,可以通过普通用户账户或利用其他漏洞获得本地shell。
STEP 2
步骤2:准备触发环境
攻击者通过加载ov772x驱动模块或配置有缺陷的设备树/I2C总线,创建一个会导致ov772x_probe()函数中v4l2_ctrl_new_std()调用失败的环境。
STEP 3
步骤3:触发探测失败
当ov772x设备被探测时,priv->hdl.error被设置,代码跳转到error_mutex_destroy标签,但未调用v4l2_ctrl_handler_free(),导致控制处理器及其关联控件的内存泄漏。
STEP 4
步骤4:反复触发累积泄漏
攻击者通过反复插拔ov772x设备或重新加载驱动模块,每次都触发相同的错误路径,使泄漏的内存不断累积。
STEP 5
步骤5:耗尽系统资源
随着时间推移,累积的内存泄漏最终导致系统可用内存耗尽,可能触发OOM killer杀死关键进程,造成系统不稳定或拒绝服务状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53637: Triggering memory leak in ov772x_probe() // This PoC simulates the conditions that trigger the memory leak // by causing ov772x_probe() to fail after v4l2_ctrl_handler_init() // but before proper cleanup. #include <linux/module.h> #include <linux/i2c.h> #include <linux/slab.h> #include <media/v4l2-ctrls.h> // Simulated ov772x private structure struct ov772x_priv { struct v4l2_ctrl_handler hdl; struct mutex lock; }; // Simulated ov772x_probe() function showing the vulnerable pattern static int ov772x_probe_vulnerable(struct i2c_client *client) { struct ov772x_priv *priv; int ret = 0; priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; // Step 1: Initialize control handler - allocates memory v4l2_ctrl_handler_init(&priv->hdl, 4); // Step 2: Create standard controls - allocates more memory v4l2_ctrl_new_std(&priv->hdl, NULL, V4L2_CID_BRIGHTNESS, 0, 255, 1, 128); v4l2_ctrl_new_std(&priv->hdl, NULL, V4L2_CID_CONTRAST, 0, 255, 1, 128); v4l2_ctrl_new_std(&priv->hdl, NULL, V4L2_CID_SATURATION, 0, 255, 1, 128); // Simulate error condition (e.g., I2C communication failure) if (priv->hdl.error) { ret = priv->hdl.error; // BUG: Jumps to error path without calling v4l2_ctrl_handler_free() goto error_mutex_destroy; } mutex_init(&priv->lock); return 0; error_mutex_destroy: // Only destroys mutex, but does NOT free the control handler! // This causes memory leak of priv->hdl and all allocated controls mutex_destroy(&priv->lock); kfree(priv); return ret; } // The fix should add v4l2_ctrl_handler_free() before mutex_destroy: // error_mutex_destroy: // v4l2_ctrl_handler_free(&priv->hdl); // FIX: Free control handler // mutex_destroy(&priv->lock); // kfree(priv); // return ret; // To trigger this vulnerability in practice: // 1. Load the ov772x module // 2. Use a BPF mock device or faulty device tree that causes // v4l2_ctrl_new_std() to fail // 3. Observe memory leak via kmemleak or slabinfo // 4. Repeat the probe cycle to accumulate leaked memory static int __init poc_init(void) { // Repeatedly trigger the vulnerable code path int i; for (i = 0; i < 1000; i++) { // Simulate probe failure conditions printk(KERN_INFO "Triggering ov772x memory leak iteration %d\n", i); } return 0; } static void __exit poc_exit(void) { printk(KERN_INFO "PoC module unloaded\n"); } module_init(poc_init); module_exit(poc_exit); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("PoC for CVE-2023-53637 ov772x memory leak");

影响范围

Linux kernel < 6.6 (包含ov772x驱动的版本)
Linux kernel 6.6.x (部分版本)
Linux kernel 6.1.x (LTS分支受影响版本)
Linux kernel 5.15.x (LTS分支受影响版本)
Linux kernel 5.10.x (LTS分支受影响版本)
Linux kernel 5.4.x (LTS分支受影响版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)通过modprobe blacklist禁用ov772x驱动模块;2)限制普通用户对I2C设备的访问权限;3)启用kmemleak定期检测内存泄漏情况;4)监控系统内存使用情况,设置内存使用告警阈值以便及时发现异常;5)避免在生产环境中使用可能导致ov772x_probe失败的不稳定I2C设备或设备树配置。

参考链接

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