以太坊parity客户端全版本远程DoS漏洞分析

2019-02-14 19:13 栏目:经验之谈 来源: 查看()
前言:本文由五章组成,涉及奇偶校验,什么是UTF-8编码,Rust危险字符串切片,漏洞分析,修复方案和摘要。今天,我们将向您展示Equity客户端奇偶校验客户端从浅层到深层的远程DoS漏洞分析的完整版本。

首先,与Parity相关

除了Geth之外,以太坊奇偶校验客户端是最常用的以太坊客户端,使用Rust语言。

根据以太网节点的最新数据,以太坊平价客户端占整个以太坊网络的30%,而Geth客户端占40%。

以太坊parity客户端全版本远程DoS漏洞分析

今年2月3日,客户正式宣布它已经修复了远程拒绝服务的严重漏洞。此漏洞会影响2.2.9之前的版本和2.3.2-beta之前的版本,而2.2.9和2.3.2-beta已经是最新版本。从官方通知中,可以理解为:目前,此漏洞用于在修复错误之前杀死所有版本。

虽然漏洞影响许多版本,但影响范围有限。原因是该漏洞需要攻击者访问目标Parity客户端的JSONRPC,并且Parity默认情况下不会打开JSONRPC端口。

漏洞的具体范围可由FOFA计算:

以太坊parity客户端全版本远程DoS漏洞分析

从上图中,我们可以看到公共网络上有1195个奇偶校验节点打开JSONRPC端口。因此,该漏洞影响许多版本,但影响范围有限。

二,什么是UTF-8编码?

在我们研究此漏洞之前,我们需要了解UTF-8编码,以帮助我们更好地为漏洞研究做好准备。

Unicode是一种字符编码,是计算机行业中相对常见的编码。由于Unicode将所有语言统一为单一编码,因此它解决了业界语言不一致导致的乱码问题。

UTF-8(8位Unicode转换格式)是Unicode的可变长度字符编码,也称为高仿万国代码。

在此漏洞分析中,您只需要了解以下知识点:在UTF-8编码中,一个英文字符占用一个字节,一个中文(包括繁体中文)占用三个字节。

三,锈危险的串切片

在前一章中引入UTF-8编码的原因是Rust是使用的UTF-8编码,而以太坊奇偶校验客户端使用的编程语言是Rust。

字符串切片很好理解,即拦截字符串中的一串字符串,但Rust的字符串切片存在问题:

剪切是一个字节,而不是一个字符

我将简单地测试它,如下所示:

以太坊parity客户端全版本远程DoS漏洞分析

通过显示图像内容,我们可以看到当str1字符串的0-3元素被切片时,“DVP”3字符被剪切掉,但是当切割3-6个元素时,如果字符被剪切,它应该被剪掉“是最好的”,但不是。

为什么会这样?

原因是Rust以字节为单位进行切片。正如本文前面提到的那样:在UTF-8中英文和中文占1个字节,中文占3个字节,所以我们减少了3-6,只剪出了“是”这个词。

这种情况恰好将3个字节切成完整的中文字符。想象一下:如果切片被切成2个字节?

-  会显示半个中文吗?
-  答案是:当然不是。

当切片不是完整字符时,Rust不会删除任何字符,但会报告错误。

只需测试一下

以太坊parity客户端全版本远程DoS漏洞分析

通过图片我们可以看到,当切片3-5时,程序报告错误,因为它不是一个完整的汉字。

以太坊奇偶校验客户端犯了这个错误,这是我们今天文章中漏洞分析的关键。

四,漏洞分析

在撰写本文时,DVP安全团队没有透露任何漏洞细节。可能是因为某些节点尚未更新到新版本的漏洞,并且在搜索之后,发现没有人在讨论网络上的漏洞,所以只有我可以去Parity的github检查提交记录,尝试找到此漏洞的修复程序,并通过修补程序分析漏洞。最后我们看到了提交:https://github.com/paritytech/parity-ethereum/commit/3b23c2e86d09a8a8b8cd99dfa02390177498e6b7

可能看一下,基本上你可以确认这是一个补丁,补丁在补丁的多个地方用starts_with函数替换:

以太坊parity客户端全版本远程DoS漏洞分析

从上图中可以看出,在上一次写入中,首先剪切了字符串的0到2个元素,并判断它是否以“0x”开头。如果长度小于2并且前两个元素的字符串不是“0x”则返回错误。在本文中,我们理解Rust的切片是危险的。如果切片的字符串是可控的,则会导致程序报告错误。

那么,这些使用字符串切片的地方可以远程使用吗?

仔细观察该图,我们可以看到图中修改的两个文件位于rpc目录的types目录中。我们猜测JSONRPC接口应该有一些类型的数据定义。图中有哈希和uint。

然后检查以下官方RPC文档:

以太坊parity客户端全版本远程DoS漏洞分析

原始的官方文档实际上有说明。由于json只有两种类型的字符串和值,因此整数,字节和散列等数据类型由前缀为0x的字符串编码。

根据官方文档的描述,我们可以非常方便地测试漏洞。文档给出的请求示例中的任何人都有一个0x前缀,这节省了查看函数调用链的时间。

这是一个比较常见的eth_getTransactionByHash接口,请求如下:


Curl --data'{'method':'eth_getTransactionByHash','params': ['transaction hash'],'id': 1,'jsonrpc':'2.0'}'-H'Content-Type: application/json '-X POST localhost: 8545

它使用起来也很简单,只需用中文字符串替换“事务哈希”,例如:

Curl --data'{'method':'eth_getTransactionByHash','params': ['Hello DVP'],'id': 1,'jsonrpc':'2.0'}'-H'Content-Type: application/Json '-X POST localhost: 8545

实际演示:

以太坊parity客户端全版本远程DoS漏洞分析


您可以看到节点在请求接口后确实收到异常并崩溃。

五,维修计划和总结

前面提到了官方修复,即修改字符串[a..b]的切片。

但是,这只是一个临时修复。如果我们想长期防止此类漏洞,我们认为公共链开发人员应该比传统软件开发人员更了解语言功能,因为许多代码使用传统的编程思想来看问题并不大,但语言本身可能有一些开发人员不理解的功能。在此功能的帮助下生成漏洞。在公共链使用go语言来滥用make函数之前,参数控制是不正确的,然后是OOM引起的拒绝服务漏洞。

因此,DVP安全团队希望通过此漏洞分析来警告每个人。区块链开发人员需要了解未来发展道路上的语言特征,以便区块链生态系统更加稳定和安全。


微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发