售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
根据以太网节点的最新数据,以太坊平价客户端占整个以太坊网络的30%,而Geth客户端占40%。
今年2月3日,客户正式宣布它已经修复了远程拒绝服务的严重漏洞。此漏洞会影响2.2.9之前的版本和2.3.2-beta之前的版本,而2.2.9和2.3.2-beta已经是最新版本。从官方通知中,可以理解为:目前,此漏洞用于在修复错误之前杀死所有版本。
虽然漏洞影响许多版本,但影响范围有限。原因是该漏洞需要攻击者访问目标Parity客户端的JSONRPC,并且Parity默认情况下不会打开JSONRPC端口。
漏洞的具体范围可由FOFA计算:
从上图中,我们可以看到公共网络上有1195个奇偶校验节点打开JSONRPC端口。因此,该漏洞影响许多版本,但影响范围有限。
二,什么是UTF-8编码?
在我们研究此漏洞之前,我们需要了解UTF-8编码,以帮助我们更好地为漏洞研究做好准备。
Unicode是一种字符编码,是计算机行业中相对常见的编码。由于Unicode将所有语言统一为单一编码,因此它解决了业界语言不一致导致的乱码问题。
UTF-8(8位Unicode转换格式)是Unicode的可变长度字符编码,也称为高仿万国代码。
在此漏洞分析中,您只需要了解以下知识点:在UTF-8编码中,一个英文字符占用一个字节,一个中文(包括繁体中文)占用三个字节。
三,锈危险的串切片
在前一章中引入UTF-8编码的原因是Rust是使用的UTF-8编码,而以太坊奇偶校验客户端使用的编程语言是Rust。
字符串切片很好理解,即拦截字符串中的一串字符串,但Rust的字符串切片存在问题:
剪切是一个字节,而不是一个字符
我将简单地测试它,如下所示:
通过显示图像内容,我们可以看到当str1字符串的0-3元素被切片时,“DVP”3字符被剪切掉,但是当切割3-6个元素时,如果字符被剪切,它应该被剪掉“是最好的”,但不是。
为什么会这样?
原因是Rust以字节为单位进行切片。正如本文前面提到的那样:在UTF-8中英文和中文占1个字节,中文占3个字节,所以我们减少了3-6,只剪出了“是”这个词。
这种情况恰好将3个字节切成完整的中文字符。想象一下:如果切片被切成2个字节?
- 会显示半个中文吗?
- 答案是:当然不是。
当切片不是完整字符时,Rust不会删除任何字符,但会报告错误。
只需测试一下
通过图片我们可以看到,当切片3-5时,程序报告错误,因为它不是一个完整的汉字。
以太坊奇偶校验客户端犯了这个错误,这是我们今天文章中漏洞分析的关键。
四,漏洞分析
在撰写本文时,DVP安全团队没有透露任何漏洞细节。可能是因为某些节点尚未更新到新版本的漏洞,并且在搜索之后,发现没有人在讨论网络上的漏洞,所以只有我可以去Parity的github检查提交记录,尝试找到此漏洞的修复程序,并通过修补程序分析漏洞。最后我们看到了提交:https://github.com/paritytech/parity-ethereum/commit/3b23c2e86d09a8a8b8cd99dfa02390177498e6b7
可能看一下,基本上你可以确认这是一个补丁,补丁在补丁的多个地方用starts_with函数替换:
从上图中可以看出,在上一次写入中,首先剪切了字符串的0到2个元素,并判断它是否以“0x”开头。如果长度小于2并且前两个元素的字符串不是“0x”则返回错误。在本文中,我们理解Rust的切片是危险的。如果切片的字符串是可控的,则会导致程序报告错误。
那么,这些使用字符串切片的地方可以远程使用吗?
仔细观察该图,我们可以看到图中修改的两个文件位于rpc目录的types目录中。我们猜测JSONRPC接口应该有一些类型的数据定义。图中有哈希和uint。
然后检查以下官方RPC文档:
原始的官方文档实际上有说明。由于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
实际演示:
您可以看到节点在请求接口后确实收到异常并崩溃。
五,维修计划和总结
前面提到了官方修复,即修改字符串[a..b]的切片。
但是,这只是一个临时修复。如果我们想长期防止此类漏洞,我们认为公共链开发人员应该比传统软件开发人员更了解语言功能,因为许多代码使用传统的编程思想来看问题并不大,但语言本身可能有一些开发人员不理解的功能。在此功能的帮助下生成漏洞。在公共链使用go语言来滥用make函数之前,参数控制是不正确的,然后是OOM引起的拒绝服务漏洞。
因此,DVP安全团队希望通过此漏洞分析来警告每个人。区块链开发人员需要了解未来发展道路上的语言特征,以便区块链生态系统更加稳定和安全。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!