aarch64环境Valgrind报libcrypto无效读取问题,无法升级库求解决方案
可行的修复方案(无需升级全量libcrypto)
- 调整清理时序避免重复调用
该问题的根因是同线程内ERR_remove_thread_state被重复调用:第一次调用已经释放了错误状态哈希表节点,第二次调用时访问已释放内存触发无效读取。你可以在调用soap_free前,先主动执行一次ERR_remove_state(0)清理当前线程的libcrypto错误状态,同时修改原有逻辑中其他主动调用ERR_remove_thread_state的位置,保证每个线程生命周期内仅执行一次错误状态清理即可。 - 局部替换打过补丁的libcrypto库
无需升级系统全局libcrypto包,你可以拉取当前使用的1.0.0版本libcrypto源码,针对该lh_delete UAF漏洞打上对应修复补丁后编译,将生成的libcrypto.so.1.0.0放在程序的专属lib目录下,启动程序时通过LD_LIBRARY_PATH=./your_lib_path ./your_program的方式优先加载局部补丁版本,不会影响系统其他模块的依赖兼容性。 - 添加Valgrind屏蔽规则
如果该漏洞仅触发Valgrind报错、实际运行无崩溃/逻辑异常,可添加Valgrind suppressions规则过滤该特定报错,不影响其他内存问题的检测:
运行Valgrind时加上{ libcrypto_1.0.0_lh_delete_uaf Memcheck:Addr8 fun:lh_delete fun:ERR_remove_thread_state fun:soap_free }--suppressions=你的规则文件名参数即可。 - 重新编译gsoap关闭隐式SSL清理
你使用的gsoap编译时默认开启了SSL支持,所以soap_free会隐式调用libcrypto的清理逻辑。你可以重新编译gsoap,配置关闭内置SSL清理逻辑,由你的上层代码统一管理libcrypto的资源生命周期,从根源避免重复清理。
内容的提问来源于stack exchange,提问作者badri
相关产品推荐
相关产品推荐

