关闭
当前位置:首页 - 音乐世界 - 正文

羊肉的做法,挖洞经历 | 使用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restore

admin 2019-04-15 223°c

本文叙述的是Semmle公司研究员经过Semmle QL查询言语发现的,关于Facebook Fizz项目的一个回绝效劳缝隙(DoS),缝隙运用原理在于,进犯者能够长途针对方针效劳器发送一个经过结构的歹意音讯,触发效劳器中Fizz程序逻辑完成死循环,终究构成方针效劳器的回绝效劳进犯。

Semmle属牛津大学孵化子公司,是一家安全草创企业,其公司主旨为用共同办法去寻觅代码中的缝隙,其理念为将代码当成数据,将剖析问题变成对数据库的恳求,可轻松自动化地运用于大规模代码的查看。现在,Semmle公司主要有两种产品,一种是代码变量剖析环境Semmle QL查询语羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restore言,别的一种为深层语义代码查看渠道LGTM。

2018年8月,IETF正式发布TLS1.3协议的终究版别RFC轮状病毒感染 8446,该协议在安全性、功用和隐私方面都有侧重大改善,大大提高H流影云笛加多少法伤TTPS衔接的速度功用。这并不是一次大版别更新,而是一次迭代改苏燃陆廷风进。TLS1.3增加了几项新功用,能够使互联网流量愈加安全,包含加密握手音讯以确保证书私密,从头规划密钥的派生办法,以及零往复衔接设置,这使得某些恳求比TLS1.2快。

根据巨大的用户集体和随时随地的沟通通讯机制,为了便利灵敏地在Facebook上完成TLS1.3,Facebook官方早前就在内部创立运用了一个用C++14编写的强壮、高功用的TLS库 – Fizz,除了TLS1.3顺便的协议增强功用外,Fizz还供给了许多功用,包含默许支撑异步I/O,以及涣散和搜集I/O以消除对额定数据副本的需求。

随TLS1.3的发布,Facebook也于2018年8月在Github中,协助推进TLS 1.3协议在互联网中的运用完成。能够参阅Facebook官方对Fizz的阐明。

缝隙严峻性和相关的缓解办法

该缝隙构成的影响是,歹意进犯者能够用TCP办法,针对布置了Facebook Fizz库的任何效劳器,长途发送一个歹意音讯,触发效劳器构成一个无限循环程序逻辑,终究许多耗费资源致使效劳器回绝供给效劳。因为进犯者能够运用该缝隙对效劳构成中止损坏,但不具有未授权拜访或许,所以其被界说分类为DoS类型缝隙。别的,进犯者结构发送的歹意音讯巨细仅仅仅64KB多,所以,其进犯本钱尽管十分之低,但却能对效劳器构成严峻后果。

以一般家用等级1M上传速度的互联网带宽衔接来看,其每秒就能发送两个这样的歹意结构音讯,按每个音讯打掉一个CPU来算,组合起一个小型的僵尸网络,用不了多少时刻,就能让一个数据中心瘫痪。

缝隙上报后,Facebook十分重视,在第一时刻就进行了供认修正。 2019年2月20日的缝隙上报时刻,2月25日就在Github中推出了补丁更新。别的Facebook还向我泄漏,他们在2月20日,就对一切运用了Fizz库的效劳器进行了内部缓解修正。

针对该缝隙,除了晋级Fizz库外,也没什么详细的缓解办法,主张一切Fizz库用户和企业及时更新,其最新版别为。

PoC验证测验

我用C言语写了一个简略的PoC缝隙运用羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restore代码油烟机清洗,其原理大约为:首要,敞开方针效劳器黑域上的一个TCP socket,向其发送一个64KB多一点的歹意音讯Payload。之后,待Payload发送完,这个PoC代码会当即封闭socket衔接,因为方针效劳器会堕入死循环逻辑,所以这点欠好验证。当然,我还未对任何实践网站体系进行过验证性进犯,仅只在我自己建立的布置有Fizz库的效劳器运用中进行过测验,尽管如此,因为该缝隙存在于Fizz库的中心代码程序之中,所以,我能够十分承认地以为, 网站也存在该缝隙。

尽管Facebook已对本身效劳体系进行了晋级更新,但考虑到广阔的Fizz库用户和其不定的修补速度,我会在后续几个星期内挑选发布详细的PoC缝隙运用代码周立波老婆胡洁。

缝隙剖析

该缝隙原因在于,羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restoreFizz库源码PlaintextRecordLayer.cpp文件第42行length +=,其+=会导致一个整型溢出。以下为其上下文代码片段:

auto length = cursor.readBE; if (buf.chainLength < (cursor - b心爱的英文uf.front) + length) { return folly::none; } length += sizeof(ContentType) + sizeof(ProtocolVersion) + sizeof(uint16_t); buf.trimStart(length); continu羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restoree;

以上代码从传入的网络包中读取了一个uint16_t格局数据,并把它赋值给length,换句话说,这个length值是进犯者能够操控的。接下来的第39行if句子,初看像一种鸿沟查看,但实践上它是查看是否收到满足多的数据以持续解析,这也便是咱们上述缝隙运用代码exploit需求发送64KB数据的原因地点了。也便是说,至少要接收到length传入的字节数之后,其第42行代码才会触发整数溢出。咱们的缝隙运用代码exploit会做出 length = 0xFFFB 的设置,这表明,在length +=之后,length的值为0,也能够说,在接下来对trimStart的调用不会耗费任何数据,所以,在对循环的后续迭代中不会发生其它操作流程。

对该缝隙的修补其实十分简略:运用一个比uint16_t类型更大的数据格局来核算加法+,这样,就不会导致整型溢出了。

以上描绘并不是缝隙运用代码exploit的详细作业机制,在我看来,length = 0xFFFB的设置是整个缝隙运用机理中比较简略的一点,我觉得,关于大多读者来说,要想澄清结构歹意音讯到触发代码整型溢出的进程,或许略微有点难,但为了安全考虑,待一段时刻Fizz用户更新修正后,我会发布完好的exploit代码。

用Semmle QL发现该缝隙

Facebook博客中,其工程师把Fizz描绘为“最根底的安全完成”,并列出如过错状态机传输的常见缺陷的C++程序防止技能。我也供认Fizz的全体代码质量十分好,它是盛行的底层C++风格,不会呈现传统的C程序bug,尤其是,它不触及任何手艺内存存储办理,所以,也不太简单存在常见的缓冲区溢出类问题。别的,Facebook之后还告诉我,他们曾在Fizz代码中履行过Fuzzing缺陷查找和第三方代码查看办法。因此,能够说Facebook Fizz是一个高质量的代码项目,代码团队曾按照最佳实践对其进行开发查看。那么,怎样就存在这么一个缝隙呢?我是怎么用QL(查询言语)来发现它呢?

在PlaintextRecordLayer.cpp文件中第42行,明显包含了一个整型溢出,但其难点和要害就在于怎样来发现的。Fuzzing技能当然是一种卓有成效的自动化缺陷查找手法了,但它是根据随机化生成输入的,所以,当碰到一些特别代码途径时,它的发现作用或许就不太好。(与其对应的便是,像我前述的那样,编写缝隙运用代码exploit时,最难的部份也在于要澄清怎么去结构一个输入,去触发那一行中存在的溢出缝隙)

可是用QL(查询言语)办法就显得没这种约束了,不管触发条件有多难,都能够用QL办法去发现任何整型溢出bug。尽管QL办法的bug查看成果有些在实践环境中无法触发,但这种手法总比亡羊补牢要好。当然,我也不能期望开发人员去修正成千上马其顿万个本质上仅仅假定性的“bug”,所以,这种QL办法查询查看有必要满足精确,才干得到有说服力和有用的溢出缝隙。

中心表明:( intermediate representation,IR) 指编译器关于源程序进行扫描后生成的内部表明,代表源程序的语义和语法结构,编译器的各个阶段都在IR上进行剖析或优化改换,因此它对编译器的全体结构、功率和健壮性都有着极大的影响。

一开始,我仅仅经过一种略微杂乱的QL查询办法发现了该缝隙,但我的搭档Jonas Jensen想到了一种愈加改善的七原QL查询办法,这种办法比我之前的办法愈加精确,并且还表现了咱们公司正在开发进程中的一种新式C++中心表明技能(IR, Intermediate Represe国窖1573多少钱一瓶ntation)。当同一操作具有多个源语法时,这种中心表明(IR)能够简化QL查询。例如,以下履行操作相同的三行代码:

x = x+1; x += 1; x++;

假如不必IR,那么代码中对加法的查找将会把其间触及的一切语法条目指令进行别离,但采用了IR办法后,其查询只需一个加法指令条目即可完成。运用IR办法,咱们首要来编写一个查询,该查询能够查找出一切从较大数据类型向较小数据类型的转化,这些转化进程中就或许存在溢出。代码如下:

import cpp import semmle.code.cpp.ir.IR //导入semmle IR库 from ConvertInstruction conv where conv.getResultSize < conv.getUnary.getResultSize select conv

如隐世大神医果你期望自行完成这种查询,需求下载QL for Eclipse和一个Fizz的快照,详细的QL for Eclipse用法能够点此参阅,别的,你也能够经过咱们的在线LGTM剖析渠道来进行查询发现,但这种办法的缺陷是,它只能火蓝刀锋2对最新的源码版别进行查询,因为Facebook在Github中修正了该缝隙,所以这种办法也不能复现了。

如预期所料,咱们上述结构的查询办法发现了代码中许多纤细的转化,这样发现溢出缝隙的概率就增大了,但还需进一步缩小规模。进犯者能够触发的整型溢出归于安全缝隙,所以,咱们要从查询办法中改善的是,需求去发现这些不同转化中存在的不行信输入值。

Jonas改善的查询办法在其间加入了新的IR TaintTracking.qll,用以发现表达式中的不行信用户输入。但这些不行信用户输入又从何而来呢?这一般取决于效劳端运用,所以对用户输入的界定,能协助效劳端tgp腾讯游戏客户端运用的进犯面建模。提到Fizz,终究咱们发现,能够经过Facebook中另一个名为的库来完成用户的歹意输入。

Folly库把数据存储在了一个名为I中,之后Fizz完成进程会读取这个IOBuf,所以,一种发现用户歹意输入的办法便是去查看IOBuf用于Fizz中的详细机制。可是,咱们构建了别的一种愈加简练和通用的办法,它不仅只适用于Fizz,原理大约为:当数据经过套接层socket发送时,一般是按的,所以,终究网络数据需求转化为主机字节次序办法,一般这种转化需求用到,从这个层面来说,ntohs 或 ntohl 办法能够算是不行信输入的绝佳 “署理” 了。仅有的问题是,Fizz底子没用到ntohs 或 ntohl 办法,它用到的是 ,咱们可用以下QL类来辨认Fizz字节次序转化的 Endian 类:

class EndianConvert extends Function { EndianConvert { (this.getName = "big") and this.getDeclaringType.getName.matches("Endian") } }

归纳以上的各种剖析和查询办法,咱们编写了如下查询代码,它运用了污点盯梢(taint track)手法有针对性地去发现根据用户输入的不安全的表达式转化,大大缩小了查询规模,提高了溢出缝隙查看功率。整个QL查询代码如下:

/** * @name Fizz Overflow * @deion Narrowing conversions on untrusted data could enable * an attacker to trigger an integer overflow. * @kind path-problem * @problem.severity warning */ import cpp import semmle.code.cpp.ir.dataflow.TaintTracking import semmle.code.cpp.ir.IR import DataFlow::PathGraph /** * The endianness conversion function `Endian::big`. 怎样做蛋糕* It is Folly's replacement for `ntohs` and `ntohl`. */ class EndianConvert extends Function { EndianConvert { this.getName = "big" and this.getDeclaringType.getName.matches("Endian") } } class Cfg extends TaintT羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restoreracking::Configuration { Cfg { this = "FizzOverflowIR" } /** Holds if `source` is a call to `Endian::big`. */羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restore override predicate isSource(DataFlow::Node source) { source.(CallInstruction).getCallTarget.(FunctionInstruction).getFunctionSymbol instanceof EndianConvert } /** Hold if `sink` is a narrowing conversion. */ override predicate isSink(DataFlow::No宁欢燕七爱吃鱼de sink) { sink.getResultSize < sink.(ConvertInstruction).getUnary.getResultSize } } from Cfg cfg, DataFlow::PathNode sourc文儿e, DataFlow::PathNode sink, ConvertInstruction conv, Type inputType, Type outputType where cfg.hasFlowPath(source, sink) and conv = sink.getNode and inputType = conv.getUnary.getResultType and outputType = conv.getResultType select sink, source, sink, "Conversion of untrusted data from " + inputType + " to " + outputType + "."

终究,咱们运用以上代码发现了前述的Facebook Fizz 回绝效劳缝隙。现在,再用它来对修正后的Fizz源码履行查询查看,已不能发现任何缝隙。

缝隙上报

2019年2部部来影院月20日,咱们向Facebo羊肉的做法,挖洞阅历 | 运用Semmle QL查询言语发现Facebook Fizz的DoS缝隙($10k),restoreok官方报送了这个缝隙,3月13日,咱们收到了Facebook的官方回复:

你好,Kevin Backhouse,鉴于你的上报缝隙,咱们决议给予你$10000美金的奖赏,终究Facebook会经过Bugcrowd渠道向你实现奖金。在此,咱们对该赏金奖赏做出一些解说阐明:

该缝隙假如被歹意进犯者运用,能够导致Faceb,ook网络根底设施的回绝效劳(DoS),尽管回绝效劳型缝隙不归于咱们缝隙赏金规模,但你提交的缝隙印证了咱们的架构生日蛋糕图片大全中存在严峻的危险危险。

再次感谢,等待你持续向咱们提交更多高质量缝隙!

2019-02-20 经过Facebook白帽项目提交缝隙

2019-02-20 Facebook验证缝隙存在并转交给开发团队

2019-02-20 Facebook对一切效劳器进行补丁修正

2019-02-25 Facebook在GitHub上开释修正补丁

2019-03-13 Flonginesacebook供认缝隙赏金

2019-03-19: Semmle公司发表缝隙,并被给予编号CVE-2019-3560

*参阅来历:lgtm,clouds编译,转载请注明来自FreeBuf.COM

公司 开发 Facebook
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
admin 14文章 0评论 主页

相关文章

  用户登录