CVE-2023-53637CVE-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总线配置),导致每次探测都泄漏内存,最终耗尽系统内存资源,触发系统不稳定或拒绝服务状态。攻击者需要本地低权限访问权限,但无需用户交互。