• app_navCreated with Sketch.app_navCreated with Sketch.

    App

    扫码下载APP

  • tougao_navCreated with Sketch.tougao_navCreated with Sketch.

    投稿

  • Sign in_navCreated with Sketch.Sign in_navCreated with Sketch.

    登录

  • register_navCreated with Sketch.register_navCreated with Sketch.

    注册

挖链独家 | EOS节点上出现的远程代码执行漏洞——EOS智能合约界外函数表数列
宋宋 05-30 10:2521986

挖链网5月30日讯 昨日奇虎360伏尔甘团队发现EOS漏洞的消息犹如向币圈投入了一枚重磅炸弹,人们对此议论纷纷,各位大佬也争相发表见解。这一消息将会对EOS产生什么样的影响我们尚未可知,但它无疑让奇虎360高调的进入了区块链领域。昨日奇虎360更是在博客中详细阐述了团队发现以及修复漏洞,并告知EOS创始人的过程,除此之外,还包括了一些关于漏洞的技术性问题。以下为博客内容:

漏洞发现者

360奇虎伏尔甘团队 Yuki Chen

360奇虎核心安全中心 Zhiniang Peng

漏洞说明

在解析一个EOS智能合约文件时,我们发现了一个带有漏洞的界外缓冲器。通过这个漏洞,攻击者可以向节点服务器上传恶意智能合约,在合约被节点服务器解析之后,这个恶意的有效载荷就可以在服务器上执行并且进一步控制服务器。当控制了节点服务器之后,攻击者就可以将这个恶意合约打包到新的区块之中,最后控制EOS网络上的所有节点。

漏洞报告时间轴

2018-5-11    发现EOS界外漏洞

2018-5-28    EOS超级节点漏洞全部移除演示完成

2018-5-28    漏洞细节告知EOS供应商

2018-5-29    供应商修复代码漏洞,并关闭这个问题

2018-5-29    通知供应商修复没有完成

我们试着把这个漏洞通过电报告知Daniel Larimer(EOS创始人),他表示在修复这个问题之前,不会将EOS上线,并要求我们将这个漏洞的细节私下发给他以防有人在公共测试网上运行。以下是与Daniel Larimer所发的一些电报内容。

电报1

360:你好,Daniel,我是奇虎360伏尔甘团队的领导,我们是一个著名的网络安全研究团队。刚刚我们的程序员在EOS生产节点上发现了一个严重的漏洞,攻击者可以通过它在节点上远程执行代码。我们已经检测到了这个漏洞的最新版本,要如何将漏洞的细节告知EOS公司?可以发邮件吗?

D:你好,在没有修复这个漏洞前,EOS不会重新上线。您可以将这些细节直接发给我就好,因为有的人会在公共测试网上运行。

360:那我发邮件可以吗?我认为这个漏洞很容易修复。

D:邮箱xxxx。

360:好的,我尽快发给您。

D:谢谢。

邮件内容

你好,Daniel,我是奇虎360的安全研究员,我们在EOS节点上发现了一个高危漏洞,只要有人解析这上面的恶意可约,攻击者就可以通过远程代码占有这个节点。

之后,Daniel承诺漏洞一经修复就会向我们发致谢。

电报2

360:360奇虎伏尔甘团队 Yuki Chen  360奇虎核心安全中心 Zhiniang Peng

我刚刚检查了代码,漏洞已经用问题3498修复,反应也很好。在解决这个漏洞的问题上,我认为我们团队是有功劳的,不知道您是否愿意给我们发一个致谢?

D:可以。

360:太好了,我们期待着。

漏洞的技术细节

这是一个带有漏洞的界外缓冲器,以下是代码:

for (auto& segment : module->table.segments) {

Address offset = ConstantExpressionRunner(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 !
}
}

这里的数据表名为std::vector,包含在函数表之中。当向这个表中存储元素时,|偏移|文件并不会被正确的检查。原本在这一操作之前系统会进行一个维护过程,以检查这个偏移文件,然而不幸的是,维护过程只发生在调试版本中,却不会发生在发行版本中。

这个表早先被进行了初始化:

table.resize(module->table.initial);

这里的 |module->table.initial| 在智能合约文件函数表声明部分被读取,区域的有效值为 0 ~ 1024。

偏移文件也是在智能合约文件中被读取,不过是在数据部分,这是一个已经署名的32位值。

所以,本质上讲,通过这个漏洞,表向量的内存具有了一个相当大的范围编写范围。

如何再次生成这个漏洞

1.构建最新的EOS代码的发布版本。

./eosio-build.sh

2.启动EOS节点,完成所有必要的设置。

https://github.com/EOSIO/eos/wiki/Tutorial-Getting-Started-With-Contracts

3.设置一个漏洞合约

在测试这个过程时,我们把偏移文件放在了0xffffffff上,这样当出现界外编写时,这个文件就会立即瘫痪。

利用漏洞实现远程代码执行

通过将恶意合约上传到目标节点并让节点解析它,就可以利用此漏洞在节点上远程执行代码。在真正发起攻击时,攻击者可以向EOS主网发布恶意合约。

恶意合约首先被EOS超级节点解析,然后漏洞被触发,通过这一过程,攻击者就可以控制EOS超级节点。

攻击者可以窃取超级节点的私钥或控制新区块的内容。并且,攻击者可以将这个恶意合约打包到新的区块中再进行上传,这样攻击者就可以一步一步的控制整个网络的所有节点。

我们已经完成了概念验证的方案,并且在64位的Ubuntu系统上做了测试。完成过程如下:

1.攻击者将恶意合约上传至节点服务器;

2.节点服务器解析合约并触发漏洞;

3.在此基础上,我们可以重新编写智能合约模块范例中合约存储器的内存。在恶意智能合约节点的帮助下,我们可以任意地在节点进程中进行读取或改写,也可以不使用那些常见的漏洞缓解技术如DEP/ASLR;

4.一旦该操作被成功执行,节点处就会生成一个保护系统,并将恶意合约回弹到发送者的电脑上。

漏洞的修复

对于这个漏洞,EOS的程序员用问题3498来解决:

之后修复了相关的代码。

然而,Yuki对此作出了评价,他认为这个漏洞的修复仍不完善,还存在着问题。

相关推荐
网信办主管《网络传播》刊发区块链专题组稿探讨技术发展
由中央网信办主管、中国网络空间研究院主办的全国网信工作指导性刊物《网络传播》,在其11月刊中刊发8篇稿件,专题探讨区块链技术的特性、应用和发展。
听说有1W个BCH不安全?好像是媒体过度解读了
近日,有媒体将矛头指向BCH存在重大安全威胁,这对于熊市本就如履薄冰的“观战者”们无异于又一颗深水炸弹。
密码学是区块链的信任之源
密码学是区块链的底层技术,没有密码学就没有区块链,没有密码学支撑的区块链不可能安全。