RedHat8环境下Janus 0.9.2异常崩溃疑似与libmicrohttpd相关问题咨询
问题根因分析
该崩溃是glibc检测到堆内存结构被破坏后主动触发abort,出错点为libmicrohttpd处理新连接时申请内存的逻辑,属于堆内存越界、野指针访问或双重释放类问题,和libmicrohttpd 0.9.69版本的已知内存安全漏洞高度匹配。
#0 0x00007f02abb6c37f in raise () at /lib64/libc.so.6 #1 0x00007f02abb56db5 in abort () at /lib64/libc.so.6 #2 0x00007f02abbaf4e7 in __libc_message () at /lib64/libc.so.6 #3 0x00007f02abbb65ec in .annobin_top_check.start () at /lib64/libc.so.6 #4 0x00007f02abbb97f4 in _int_malloc () at /lib64/libc.so.6 #5 0x00007f02abbbb8d6 in calloc () at /lib64/libc.so.6 #6 0x00007f0272bd415a in internal_add_connection (daemon=daemon@entry=0x18fbd70, client_socket=client_socket@entry=23, addr=addr@entry=0x7f02723c84a0, addrlen=28, external_add=external_add@entry=false, non_blck=non_blck@entry=true) at daemon.c:2498 connection = <optimized out> i = <optimized out> eno = 0 #7 0x00007f0272bd4ce5 in MHD_accept_connection (daemon=daemon@entry=0x18fbd70) at daemon.c:3317
排查思路
- 优先验证版本问题:libmicrohttpd 0.9.69版本存在多个已公开的内存安全漏洞,包含处理HTTP连接时的堆溢出、连接对象释放后复用问题,完全匹配当前崩溃场景。可在测试环境将libmicrohttpd升级至0.9.73及以上稳定版,复现验证崩溃是否消失。
- 内存问题定位:编译Janus时添加
-fsanitize=address编译选项,复现崩溃后AddressSanitizer会直接输出内存破坏的具体触发位置,明确是libmicrohttpd本身的问题还是Janus自定义HTTP回调的内存操作问题。 - 并发场景验证:如果崩溃仅在高并发HTTP请求时触发,先确认进程的最大文件句柄限制,可通过
ulimit -n 65535调整上限后观察,过高的并发连接会放大内存问题的触发概率。
解决方案
- 版本升级(推荐):将libmicrohttpd升级至0.9.76最新稳定版,同时将Janus升级至0.10.x及以上版本,该版本组合已在大量生产环境验证,完全修复该类内存崩溃问题。
- 临时规避:如果暂时无法升级版本,可关闭Janus非必要的HTTP admin接口、限制HTTP服务的访问并发量,降低崩溃触发概率。
- 补丁回编:如果必须保留当前版本,可提取libmicrohttpd官方仓库中0.9.69版本之后所有和
internal_add_connection、连接内存分配相关的修复补丁,手动打入当前libmicrohttpd源码重新编译使用。
内容的提问来源于stack exchange,提问作者zhanglinjian21
相关产品推荐
相关产品推荐

