苹果黑客技术:对 libssh2 整数溢出缝隙 (CVE-2019-17498)的剖析

访客4年前关于黑客接单708

苹果黑客技术:对 libssh2 整数溢出缝隙 (CVE-2019-17498)的剖析

0x01 缝隙发掘
在2019年3月18日,Canonical Ltd.的Chris Coulson披露了libssh2中的九个缝隙(CVE-2019-3855至CVE-2019-3863)。这些缝隙已在libssh2 v1.8.1中修正。其时,我的搭档Pavel Avgustinov注意到,修正缝隙的陈述在LGTM上引进了多个新告警。这些告警是因为像下面的代码:
 if((p_len = _libssh2_get_c_string(&buf, &p))
问题出现在_libssh2_get_c_string回来 -1是一个error code,可是p_len没有符号,因而过错条件将被疏忽。libssh2团队现已在后面的的陈述中修正了这些问题,可是它促进我们细心检查代码以检查其包含显着过错的缝隙。我们很快发现了这个用于鸿沟检查的函数:
 int _libssh2_check_length(struct string_buf *buf, size_t len)
 {
     return ((int)(buf->dataptr - buf->data) len - len)) ? 1 : 0;
 }
此函数的问题在于强制转化int或许会溢出。左边的强制转化是安全的,因为的字段buf是受信赖的值,可是右侧的强制转化是不安全的,因为的值len是不受信赖的。创立缝隙运用exp并非难事,该缝隙运用使值len大于绕过此溢出检查buf->len + 0x80000000。可以在GitHub上找到PoC 。
我后来了解到,该问题_libssh2_check_length是在1.8.2版发布后在首要开发分支上引进的,因而缝隙规模检查在1.8.2版中不存在。不幸的是,版别1.8.2不包含任何鸿沟检查,因而PoC依然有用。在1.8.2版中,缝隙的源方位是kex.c:1675。问题在于其间p_len包含一个不受信赖的值,因而后续的读取s或许会超出规模。因为_libssh2_check_length在1.8.2版中不存在,所以不需求将值p_len大于0x80000000触发缝隙。这意味着较小的值len可以触发越界读取,该缝隙更有或许被运用来完成长途信息走漏。
0x02  negative error codes 转化为 unsigned
当我和我的搭档正在检查缝隙补丁陈述时,我们注意到一种常见的过错模式,其间将negative error回来值强制转化为unsigned。这是一个十分简略犯的过错,并且它没有被编译器正告所](https://godbolt.org/z/CvqwDm)捕获。所以我写了这个简略的查询来查找缝隙实例:
 import cpp
 import semmle.code.cpp.dataflow.DataFlow
 import semmle.code.cpp.range *** ysis.SimpleRangeAnalysis
 
 from Function f, FunctionCall call, ReturnStmt ret, DataFlow::Node source, DataFlow::Node sink
 where call.getTarget() = f
 and ret.getEnclosingFunction() = f
 and ret.getExpr().getValue().toInt()
查询代码如下:
 r_len = _libssh2_get_c_string(&buf, &r);
 if(r_len
该查询会回来负整数常量的函数。例如,_libssh2_get_c_string在773行上实行此操作,然后,它将查找对该函数的调用,这些调用回来值并将其转化为无符号类型。
0x03 触发缝隙
缝隙的源方位是packet.c:480:
 if(message_len
值datalen不受信赖,因为它是由长途SSH服务器控制的。例如,假如运用datalen == 11,则减法将溢出并且的鸿沟检查message_len无效。message_len是一个32位无符号整数,它也由长途SSH服务器控制,因而这或许导致在第485行上越界读取:
 language_len =
     _libssh2_ntohu32(data + 9 + message_len);
越界读取一般只会导致分段过错,可是LIBSSH2_DISCONNECT在 第499行的调用中也有或许导致其他类型的问题:
 if(session->ssh_msg_disconnect) {
     LIBSSH2_DISCONNECT(session, reason, message,
                        message_len, language, language_len);
 }
取决于libssh2库的运用 *** ,因为session->ssh_msg_disconnect是一个回调函数,默许状况下为null,但可以由该库的用户设置(经过调用libssh2_session_callback_set)。
我编写在sshd_config文件中有两个参数,分别是ClientAliveInterval和ClientAliveCountMax。 了一个 缝隙PoC ,其间歹意SSH服务器运用datalen == 11和回来断开衔接音讯message_len == 0x41414141,会导致libssh2因分段过错而溃散。
0x04 libss

相关文章

张国荣怎么死的,张国荣为什么会跳楼!

张国荣怎么死的,张国荣为什么会跳楼!

在这一天,张国荣因抑郁症病情失控从香港东方文华酒店二十四楼健身中心坠下,紧急送往玛丽医院,经医生检验入院前已死亡(18时45分),玛丽医院于19点06分宣告抢救无效,终年46岁。 纵观张国荣的一生,...

网络游戏短视频宣传打造最温暖的网页,短视频

网络游戏短视频宣传怎么样才能够打造的?越来越温馨了,其实当我们在选择不同的市场进行了解的过程当中,你就会发现,如果想让我们得到一个更好的市场发展机会,首先就必须要懂得全国的营销型视频平台打造的方法,那...

魅族手机怎么样?看看粉丝的真实评价

魅族手机怎么样?看看粉丝的真实评价

魅族16发布之后,凭借着2698元的起步售价,被大家称为新一代“真香机”,一度供不应求,作为目前热度最高的骁龙845机型,魅族16到底怎么样?值得购买吗?来看看用户的真实评论,你就全明白了!...

《金色的鱼钩》原文作者(金色的鱼钩课文解析)

  1935年秋季,红四方面军进到草坪,很多朋友得了胃肠疾病。我与2个小朋友病得确实跟不上团队了,教导员派炊事班长照料大家,让走在后面。   炊事班长快四十岁了,个子挺高,背有点驼,四方脸,颧骨高,脸...

最适合上班族的四款车,顶配只要八万,省油耐用颜值高

最适合上班族的四款车,顶配只要八万,省油耐用颜值高

现在月光族要想买辆汽车,其实并不容易。身处职场,首先要高颜值有面子,其次必须省油耐用。虽然汽车种类多,但还满足年轻人挑剔口味的却是少之又少。预算10万以内的汽车,有4款销量火爆的汽车,正适合现在的年轻...

手机指南针怎么用?手机指南针的原理你知道吗

手机指南针怎么用?手机指南针的原理你知道吗

其实手机上的电子指南针又称作电子罗盘(e-compass),一般来说有两种大类的材料来实现,一种就是霍尔材料,一种就是磁阻材料 首先讲讲霍尔原理,简单的归纳为当恒定的电流通过一段导体时,其侧面的...