这是一个缓冲区溢出越界写漏洞

漏洞存在于在 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节点远程代码执行漏洞细节的更多相关文章

  1. thinkphp5.0.22远程代码执行漏洞分析及复现

    虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...

  2. Struts 2再曝远程代码执行漏洞S2-037

    导读今年4月份,Apache Stuts 2之上发现的S2-033远程代码执行漏洞,以迅雷不及掩耳之势席卷而来.其利用代码很快就在短时间内迅速传播.而且官方针对这个高危漏洞的修复方案还是无效的. 悲剧 ...

  3. IBM WebSphere 远程代码执行漏洞安全预警通告

    近日,IBM发布安全通告称修复了一个WebSphere Application Server中一个潜在的远程代码执行漏洞(CVE-2018-1567).攻击者可以构造一个恶意的序列化对象,随后通过SO ...

  4. SMBv3远程代码执行漏洞复现(CVE-2020-0796)

    漏洞基本信息 服务器消息块(SMB),是一个网络通信协议,用于提供共享访问到文件,打印机和串行端口的节点之间的网络上.它还提供了经过身份验证的进程间通信机制.SMB的大多数用法涉及运行Microsof ...

  5. Apache log4j2 远程代码执行漏洞复现👻

    Apache log4j2 远程代码执行漏洞复现 最近爆出的一个Apache log4j2的远程代码执行漏洞听说危害程度极大哈,我想着也来找一下环境看看试一下.找了一会环境还真找到一个. 漏洞原理: ...

  6. Spring框架的反序列化远程代码执行漏洞分析(转)

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  7. Apache Struts 远程代码执行漏洞(CVE-2013-4316)

    漏洞版本: Apache Group Struts < 2.3.15.2 漏洞描述: BUGTRAQ ID: 62587 CVE(CAN) ID: CVE-2013-4316 Struts2 是 ...

  8. MongoDB ‘conn’Mongo 对象远程代码执行漏洞

    漏洞名称: MongoDB ‘conn’Mongo 对象远程代码执行漏洞 CNNVD编号: CNNVD-201307-497 发布时间: 2013-07-25 更新时间: 2013-07-25 危害等 ...

  9. Struts2再爆远程代码执行漏洞

    Struts又爆远程代码执行漏洞!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction ...

随机推荐

  1. [翻译] AJProgressPanel

    AJProgressPanel Animated progress panel 可做动画的进度条 No images needed, all CoreGraphics code 不需要图片,使用Cor ...

  2. Stop-VM

    stop-vm vm01 -force  正常关机,留给Guest 5分钟保存数据,然后关闭 stop-vm vm02 -turnoff 断电关机 Windows Server 2008 R2默认没有 ...

  3. oracle sql练习 菜鸟入门!

    进入公司 ,首先是进行SQL培训 一下是针对oracle的emp与dept表进行的基础查询 --1.选择部门30中的所有员工: ; --2.列出所有办事员(CLERK)的姓名,编号和部门编号: sel ...

  4. Linux命令--系统管理

    shutdown命令 Linux shutdown命令可以用来进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序,shutdown 也可以用来重开机. 使用权限:系统管理者. 语法 shu ...

  5. [T-ARA][한겨울의 숨바꼭질/숨바꼭질][深冬的捉迷藏/捉迷藏]

    歌词来源: 深冬的捉迷藏:http://music.163.com/#/song?id=28111190 捉迷藏:http://music.163.com/#/song?id=28111189 作曲 ...

  6. Spring JPA 主键

    JPA主键生成器和主键生成策略 JPA中创建实体时,需要声明实体的主键及其主键生成策略.我们有一个实体类叫做Email,其主键上声明如下: @Id @Column(name = "EMAIL ...

  7. BZOJ2004:[HNOI2010]Bus 公交线路(状压DP,矩阵乘法)

    Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定 ...

  8. hctf2018wp复现

    1.bottle 登陆网站后存在提交url的地方 测试发生存在如下paload,知识点:1.crlf 2.写一个网站开发的端口小于80,浏览器就不会跳转能执行js(payload只能在火狐浏览器执行) ...

  9. 使用Apache HttpClient 4.5设置超时时间

    使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为了防止访问其他http服务时,由于超时导致自己的应用受影响. 4.5版本中,这两个参数的设置都抽象到了 ...

  10. HDU 1233 还是畅通工程(Kruskal算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)   ...