EOS节点远程代码执行漏洞细节
这是一个缓冲区溢出越界写漏洞
漏洞存在于在 libraries/chain/webassembly/binaryen.cpp文件的78行,
Function binaryen_runtime::instantiate_module:
for (auto& segment : module->table.segments) {
Address offset = ConstantExpressionRunner<TrivialGlobalManager>(globals).visit(segment.offset).value.geti32();
assert(offset + segment.data.size() <= module->table.initial);
for (size_t i = 0; i != segment.data.size(); ++i) {
table[offset + i] = segment.data[i]; <= OOB write here !
}
}
这里的table是一个std :: vector包含在函数表中的名称,在将元素存储到table中时,|offset| 字段没有被正确检查。注意在设置该值之前是有一个assert 断言的,它会检查偏移量,但不幸的是assert 仅适用于Debug版本,不适用于发布版本。
table.resize(module->table.initial);
|module->table.initial| 这个代码片段读取的值是根据函数表声明,在WASM文件中的读取的,该字段的有效值为0〜1024。
|offset| 字段的值是根据数据段从WASM文件中读取的,它是一个带符号的32位值。
所以通过这个漏洞,我们可以在table向量之后的内存,越界写入一定范围的内容。
重现漏洞过程
1.编译最新的EOS代码release版本
./eosio-build.sh
2.启动EOS节点Start EOS node, 完成如下所有必要的配置
https://github.com/EOSIO/eos/wiki/Tutorial-Getting-Started-With-Contracts
3.设置一个漏洞合约
我们提供了一个会造成程序崩溃的WASM漏洞验证文件(POC)
在这个PoC中, 我们简单的设置了 |offset| 字段引用 0xfffffff地址,所以会触发越界写造成程序崩溃
开始测试 PoC:
cd poc
cleos set contract eosio ../poc -p eosio
顺利的话我们会看到 nodeos 进程出现 segment fault错误
崩溃信息:
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000a32f7c in eosio::chain::webassembly::binaryen::binaryen_runtime::instantiate_module(char const*, unsigned long, std::vector<unsigned char, std::allocator<unsigned char> >) ()
(gdb) x/i $pc
=> 0xa32f7c <_ZN5eosio5chain11webassembly8binaryen16binaryen_runtime18instantiate_moduleEPKcmSt6vectorIhSaIhEE+2972>: mov %rcx,(%rdx,%rax,1)
(gdb) p $rdx
$1 = 59699184
(gdb) p $rax
$2 = 34359738360
Here |rdx| points to the start of the |table| vector,
And |rax| is 0x7FFFFFFF8, which holds the value of |offset| * 8.
利用漏洞实现远程代码执行
利用此漏洞可以在nodeos进程中实现远程代码执行,漏洞利用方法是将恶意合约上传到受害节点,并让节点解析恶意合约。而在真正的攻击中,攻击者可能会向EOS主网络发布恶意合约。
EOS超级节点解析恶意合约触发漏洞后,攻击者将可以完全控制这个节点。
攻击者可以窃取超级节点的私钥或控制新区块的内容,更重要的是攻击者可以将恶意合约打包成一个新块并发布进行攻击,最终整个网络中的所有节点都将受到攻击并被控制。
我们完成了概念性的漏洞验证程序,并在基于64位Ubuntu系统的nodeos上进行了测试。这个漏洞的攻击过程是这样的:
1.攻击者将恶意合约上传到nodeos服务器。
2.服务器nodeos进程解析引发漏洞的恶意合约。
3.使用越界写入的原生代码,我们可以覆盖WASM模块实例的WASM内存缓冲区,在恶意WASM代码的帮助下,最终可以在nodeos进程中实现了任意内存读/写操作,并绕过了64位操作系统上的DEP / ASLR等常见的攻击缓解技术。
4.漏洞利用一旦成功,会启动一个反向shell连接攻击者。
EOS节点远程代码执行漏洞细节的更多相关文章
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- Struts 2再曝远程代码执行漏洞S2-037
导读今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来.其利用代码很快就在短时间内迅速传播.而且官方针对这个高危漏洞的修复方案还是无效的. 悲剧 ...
- IBM WebSphere 远程代码执行漏洞安全预警通告
近日,IBM发布安全通告称修复了一个WebSphere Application Server中一个潜在的远程代码执行漏洞(CVE-2018-1567).攻击者可以构造一个恶意的序列化对象,随后通过SO ...
- SMBv3远程代码执行漏洞复现(CVE-2020-0796)
漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...
- Apache log4j2 远程代码执行漏洞复现👻
Apache log4j2 远程代码执行漏洞复现 最近爆出的一个Apache log4j2的远程代码执行漏洞听说危害程度极大哈,我想着也来找一下环境看看试一下.找了一会环境还真找到一个. 漏洞原理: ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- Apache Struts 远程代码执行漏洞(CVE-2013-4316)
漏洞版本: Apache Group Struts < 2.3.15.2 漏洞描述: BUGTRAQ ID: 62587 CVE(CAN) ID: CVE-2013-4316 Struts2 是 ...
- MongoDB ‘conn’Mongo 对象远程代码执行漏洞
漏洞名称: MongoDB ‘conn’Mongo 对象远程代码执行漏洞 CNNVD编号: CNNVD-201307-497 发布时间: 2013-07-25 更新时间: 2013-07-25 危害等 ...
- Struts2再爆远程代码执行漏洞
Struts又爆远程代码执行漏洞!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction ...
随机推荐
- SQL读取注册表值
最近写一个自动检查SQL Serve安全配置的检查脚本,需要查询注册表,下面是使用SQL查询注册表值的方法. ) ) ) ) --For Named instance --SET @Instance ...
- [翻译] ABCIntroView
ABCIntroView ABCIntroView is an easy to use onboarding which allows you to introduce your users to t ...
- Java获取中文拼音、中文首字母缩写和中文首字母
获取中文拼音(如:广东省 -->guangdongsheng) /** * 得到中文全拼 * @param src 需要转化的中文字符串 * @return */ public static S ...
- OC基础数据类型-NSValue
1.NSValue:将指针等复杂的类型存储为对象 struct sct { int a; int b; }sctt; NSValue * value = [[NSValue alloc] initWi ...
- PetaPoco轻量级ORM框架 - 对Database类的进行扩展,可以返回Table格式数据
一.有时我们需要将常用的功能添加到PetaPoco中的Database类中 实现方式有2种,以下以查询字段为例 1.通过扩展方式实现,此方式不改变被调用(Database)类名(只能增加方法) pub ...
- kernel3.13 针对 Vmware安装存在的问题解决
vthread-3| W110: Failed to build vmnet. Failed to execute the build command VMware module patches an ...
- AESUtil 加密
package com.hxqc.basic.dependency.util; import org.apache.commons.lang.StringUtils; import sun.misc. ...
- 马克飞象markdown用法
目录 markdown用法 ### 根据标题生成目录 `` 快捷键 ctrl+k 代码区域 ctrl+2 二级标题 ctrl+b/i 粗体/斜体 ctrl+l 插入链接 ctrl+g 插入图片 ctr ...
- gdbt与adboost(或者说boosting)区别
boosting 是一种将弱分类器转化为强分类器的方法统称,而adaboost是其中的一种,或者说AdaBoost是Boosting算法框架中的一种实现 https://www.zhihu.com/q ...
- SDN测量论文粗读(二)9.21
Monocle: Dynamic,Fine-Grained Data Plane Monitoring 论文来源:CoNext 发表时间:2015 解决问题及所做贡献:Monocle:检测交换机中硬件 ...