Manticore发现ENS漏洞 - 智能合约安全分析实战

本文详细分析了Manticore符号执行工具如何发现以太坊域名服务(ENS)的关键漏洞(CVE-2020-5232),展示了从合约字节码逆向到自动化漏洞利用生成的完整技术流程,涉及LLL语言合约分析与EVM层级的漏洞检测方法。

Manticore发现ENS漏洞

以太坊域名服务(ENS)合约近期出现了一个关键漏洞(CVE-2020-5232),促使官方发布安全公告并迁移至新合约。ENS允许用户将在线资源与人类可读的名称相关联,自然也包括域名转让和销售功能。

关于该漏洞的具体细节公开信息很少。当我们听说即将发布的修复时不禁思考:Manticore能否发现这个漏洞?

简而言之,如果某人以特定方式转让ENS名称,之后就能从新所有者手中重新夺回该名称。而正常转让流程则不会出现此问题。换句话说,利用此漏洞需要转让方从一开始就故意设置特定条件。

技术分析过程

我们决定深入研究,尝试用Manticore对原始合约进行分析:

  1. 通过etherscan.io获取合约代码
  2. 发现代码并非Solidity编写,而是采用LLL语言
  3. 利用Manticore的EVM层级分析能力,逆向找到合约创建交易
  4. 提取初始化字节码进行分析

根据安全公告,漏洞可通过四个交易步骤利用:

  1. 攻击者购买ENS节点
  2. 攻击者进行未知的漏洞利用准备
  3. 攻击者将节点出售给受害者
  4. 攻击者重新夺回节点所有权

通过审查合约导出的函数接口,我们确定了关键操作:

1
2
3
4
;; 预计算函数ID
(def 'get-node-owner 0x02571be3)   ; owner(bytes32)
(def 'set-subnode-owner 0x06ab5923) ; setSubnodeOwner(bytes32,bytes32,address)
(def 'set-node-ttl 0x14ab9038)     ; setTTL(bytes32,uint64)

自动化漏洞挖掘

将这些信息整合到Manticore脚本后,符号执行引擎在几分钟内就自动发现了两种利用方式:

完整利用轨迹显示,攻击者需要在出售节点前发送setTTL或setResolver交易。以下是Manticore生成的两种利用路径:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[+] 账户模拟:
     合约地址: 3c90ec8304b1da72f2e336d19336e9046d71e981
     所有者地址: d77e14a2801273ab0a1da75f43585d3e32f0bd1d
     攻击者地址: 911c639393f0ca8eed3a1dbebf740053b7fb8ce8
     受害者地址: a21337d4001af93c16ee19b8ebb210b714ed92bb

[*] 漏洞利用路径1
     setSubnodeOwner(...)
     setTTL(...)
     setOwner(...)
     setResolver(...)
     owner(...)

[*] 漏洞利用路径2
     setSubnodeOwner(...)
     setResolver(...)
     setOwner(...)
     setTTL(...)
     owner(...)

安全建议

新版ENS合约API已进行重大修改,这些利用方式不再适用。我们建议:

  1. 合约开发者应将关键安全属性的测试纳入开发流程
  2. 读者可尝试编写Manticore脚本来验证新合约的安全性

Manticore能帮助开发者在无需深入理解合约内部逻辑的情况下,进行代码推理、安全测试和漏洞利用生成。这个ENS案例特别有趣,因为它展示了Manticore处理非Solidity合约和底层EVM代码的能力。

如需了解更多Manticore使用技巧,请参考我们的《构建安全合约》指南,其中包含符号执行教程和使用技巧。截至2020年3月3日,ENS已完成合约迁移并发布了事件分析报告。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计