CVE-2022-50529CVE-2022-50529是Linux内核中test_firmware模块存在的一个内存泄漏漏洞。该漏洞位于test_firmware_init()函数中,当misc_register()函数调用失败时,test_fw_config->name指向的内存未能被正确释放,导致内存泄漏。test_firmware是Linux内核中用于测试固件加载机制的模块,主要用于开发和调试目的。
该漏洞的CVSS评分为5.5,属于中等严重等级。其攻击向量为本地攻击(AV:L),攻击复杂度低(AC:L),需要低权限(PR:L),无需用户交互(UI:N)。漏洞对机密性无影响(C:N),对完整性无影响(I:N),但对可用性影响较高(A:H)。这意味着攻击者可以利用该漏洞导致系统内存资源耗尽,从而影响系统稳定性。
根据内核日志显示,该漏洞会在insmod加载test_firmware模块时触发。泄漏的内存对象大小为32字节,其中存储的是字符串"test-firmware.bin"。该内存通过kstrndup函数分配,在misc_register失败时未能正确释放,最终导致内核内存泄漏。攻击者可以通过反复触发该漏洞来持续消耗内核内存资源。
该漏洞的根本原因在于test_firmware_init()函数中缺少对错误处理路径的内存释放逻辑。具体技术细节如下:
1. 在__test_firmware_config_init()函数中,通过kstrndup()函数分配内存用于存储test_fw_config->name字符串(值为"test-firmware.bin")。
2. 随后调用misc_register()函数注册misc设备。如果misc_register()调用成功,一切正常;但如果调用失败,函数直接返回错误码,而没有释放之前分配的test_fw_config->name内存。
3. 这就形成了一个典型的错误处理路径内存泄漏问题。泄漏的内存对象大小为32字节(sizeof(struct) + 字符串长度),通过kmalloc分配。
4. 从调用栈可以看出完整的触发路径:do_one_initcall -> load_module -> __test_firmware_config_init -> kstrndup -> __kmalloc_node_track_caller。
利用方式方面,攻击者可以通过以下方式触发该漏洞:
1. 编写一个简单的内核模块或使用现有工具尝试加载test_firmware模块
2. 通过某种方式使misc_register()失败(例如占用必要的设备号)
3. 反复执行上述操作以持续消耗内核内存
虽然单个泄漏只有32字节,但通过反复触发可以导致大量内存泄漏,最终可能导致内核内存耗尽,影响系统稳定性。