研究人员发现libssh2中存在漏洞,但是该漏洞并不是位于openssh中,所以不影响ssh的使用。Libssh2是一个客户端C语言库,可以让应用连接到SSH服务器。但漏洞也并不位于libssh中,libssh值是一个提供与libssh2类似功能的不相关的C函数库。
该漏洞位于libssh2 v1.9.0及之前版本中,截至目前,该bug已经在master分支修复,但含有补丁的官方发布版本还没有正式发布。
该漏洞是一个越界读漏洞,可能会导致DoS或远程信息泄露。当libssh2被用于连接恶意SSH服务器时该漏洞就会被出发。当SSH服务器发送disconnect消息时,就会发生溢出。也就是说该漏洞是在认证完成之前的连接阶段的早期被触发的。
触发漏洞
该漏洞是源位置是packet.c:480:
if(message_len < datalen-13) {
datalen的值是不可信的,因为它是由远程SSH服务器控制的。如果datalen == 11,那么减就会溢出,message_len边界检查也就是无效的。message_len是远程SSH服务器控制的32位的无符号整数,所以会在第485行引发越界读:
language_len = _libssh2_ntohu32(data + 9 + message_len);
越界读只会引发segmentation fault(分段错误),但有可能在调用499行的LIBSSH2_DISCONNECT时引发其他伤害:
if(session->ssh_msg_disconnect) { LIBSSH2_DISCONNECT(session, reason, message, message_len, language, language_len);}
这取决于libssh2库如何使用,因为session->ssh_msg_disconnect是默认为空的回调函数,但库的用户可以通过调用libssh2_session_callback_set对其进行设置。
研究人员编写了一个POC漏洞利用,其中恶意SSH服务器会返回一个datalen == 11,message_len == 0x41414141的disconnect消息,导致libssh2出现分段错误。