USENIX Security 2021 Evil Under the Sun : Understanding and Discovering Attacks on Ethereum Decentralized Applications
Evil Under the Sun 发表在 Usenix Security 2021 Summer,是一篇十分优秀的工作。论文地址 https://www.usenix.org/system/files/sec21summer_su.pdf
论文题目 Evil Under the Sun 与著名的英国女侦探小说家阿加莎克里斯汀的小说同名,其名翻译为“阳光下的罪恶”,讲述了一位极其引人注目的美丽女性被谋杀的案件,凶手看似无辜且似乎最不可能的人。笔者借此题目讲述了针对时下热门的以太坊中去中心化应用(Decentralized Applications, dapp)的攻击。
摘要
本文从以太坊去中心化应用(Dapps)在流行的背景展开,关注其带来了新的安全风险:据报道,网络罪犯为了获利已经对Dapps进行了各种攻击。而目前还没有研究工作对这类新型网络犯罪进行分析,没有对其犯罪范围、指纹信息和攻击行动意图等进行研究,更不用说对这些攻击事件实现自动化大规模调查分析。
本文工作首先对真实世界的 Dapp 攻击实例进行了首次测量研究以恢复关键威胁情报(例如杀伤链和攻击模式)。利用这些威胁情报,提出了第一个自动调查大规模攻击事件的技术 DE-FIER。通过在 104 个以太坊链上 Dapp 的 230 万笔交易运行 DEFIER,在 85 个目标 Dapps 上识别出 476342 笔漏洞利用交易,其中有 75 个 Dapps 是 0-day 攻击的受害者,还有 17K 没有披露过的攻击者 EOAs。
理解本文所需的背景知识
以太坊(Ethereum):一个基于区块链的公用区块链分布式计算平台和操作系统。账户是状态对象,所有账户的状态集合构成整个以太坊网络的状态。
平台有两种类型的账户:
- 外部账户(Externally Owned Accounts,EOAs):用户创建,私钥控制,无关联代码,有账户余额,能触发交易(转账或执行智能合约);
- 合约账户(Contract Accounts,CAs):由外部账户创建和所有,但只受合约中的代码控制,有账户余额和存储功能,能被触发执行智能合约代码,在智能合约创建后自动运行。
nonce:用于确定每笔交易只能被处理一次的随机数。如果账户是一个外部拥有账户,nonce代表从此账户地址发送的交易序号;如果账户是一个合约账户,nonce代表此账户创建的合约序号
balance:账户目前的以太币余额
当前余额(balance)、交易次数(nonce)、合约代码(code)、存储(storage 数据结构是MPT,合约的执行数据保存在这里)
交易(Transaction):一个账户向另外一个账户发送一笔被签名的消息数据包的过程。
- 以太币转账
- 合约创建
- 合约调用
去中心化应用程序(Decentralized Applications, Dapp):以太坊社区把基于智能合约的应用称为去中心化的应用程序
Dapps = 智能合约 + 友好前端 + else
在区块链上引入的新型去中心化应用程序可以在没有第三方的情况下更方便地促进用户之间的价值转移。目前Dapps已经在以太坊上被广泛部署,用于提供各种服务,如赌博、在线投票、代币系统、加密货币交换等。
Dapp 上的攻击:
目前网络犯罪分子已将目光锁定在 Dapp 上,并时不时地对它们进行攻击,尤其是它们的区块链后端。2016 年的 DAO 攻击,它造成了超过 5000 万美元的损失并导致了以太坊的硬分叉。
不法分子可以对 Dapps 的合约漏洞进行多种类型的攻击,例如利用赌博 Dapp 中伪随机数生成器 (PRNG)的弱随机性来中奖,或执行整数上溢/下溢来操纵汇款等。
一个例子
Fomo3D 是一款非常受欢迎的以太坊赌博游戏,在 2018 年,每天超过 15 万笔交易,奖池约为 300 万美元。
- 基本游戏规则:通过
buyXid()
购买钥匙时,有机会从 airdrop potairDropPot_
中赢得奖品。 - 基本调用图:
伪随机数生成器(PRNG) airdrop()
方法利用参数 airDropTracker_
、消息发送者地址和块信息(例如,时间戳、难度、gaslimit、数量等)来生成伪随机数。
isHuman()
:根据与地址相关的代码的大小来判断一个地址是 EOAs 还是合约账户。
攻击:构造合同绕过 isHuman()
的保护,通过合约而不是 EOA 购买密钥。
攻击 Fomo3D
- 从不同发送端创建多个合约(⑤)
- 调用
airdrop()
获取 PRNG 参数 - 重现
airdrop()
,探测找出会获胜的合约0xf7*
- 购买钥匙(⑥),获得奖品(⑧)
- 运行
suicide()
,转移奖金给攻击者0x73*
(⑨)
论文工作
- 利用以太坊区块链保存的公开和不可更改的交易记录来恢复关键的威胁情报(CTI),对真实世界的 Dapp 攻击进行了首次度量研究和取证分析。
- 提出了一种方法来补充 Dapp 攻击报告丢失的攻击信息,利用更全面的攻击交易信息和执行痕迹,恢复 Dapp 网络犯罪者的端到端足迹,以及相应的杀伤链和攻击模式。
- 自动大规模调查 Dapp——DEFIRE 工具的开发,发现新的攻击和 0-day 威胁。
数据收集和推导
数据收集
- 从技术博客、新闻帖子、区块链安全公司的年度安全报告搜索真实世界的以太坊Dapp攻击事件
- 手动挑选与以太坊Dapp攻击相关的事件,回顾事件信息,确定不可篡改的攻击相关信息,包括受害者 Dapp 地址、漏洞利用合约地址、攻击者 EOA以及漏洞利用交易哈希值,得到种子攻击集 Ds
基础数据集 Ds:确定了 2016 年至 2018 年的 42 起 Dapp 攻击事件,其中包括 25 个受害 Dapp 、20 个漏洞利用合约地址、48 个攻击者 EOA 和 77 个漏洞利用交易哈希值
数据推导:补充 Dapp 攻击报告丢失的攻击信息
扩展数据集 De:收集了从 2016/01/29 至 2019/01/07 的 58555 个漏洞利用交易,共涉及 56 名受害者 Dapps(其中 29 个之前从未报道过)
交易执行建模
定义:把交易在时间 t 上的执行轨迹集合 e_t 建模为4元组的序列 (I,O,B,T) 即 e = {(I_i,O_i,B_i,T_i) | i = 1…n}
- $I_i$:发送端地址
- $O_i$:接收端地址
- $B_i$:被调用的函数及其参数
- $T_i$:转移的钱款转移
该交易①从 0x73*
发出,调用合约 0x54*
的函数执行,转账金额为 0.01 ETH。该交易触发了一系列的执行痕迹,例如从 0x54*
到 0xa6*
(②)的内部调用 airDropPot_()
,之后是从 0x54*
到 0xa6*
调用 airDropTracker_()
(③)。
TG 距离 D(g_1,g_2) 是两个交易图 g_1 和 g_2 之间的距离,用来测量它们的结构相似性和时序接近性:
O(g_1,g_2) 是一组将 g_1 转化为 g_2 的图形编辑(如点或边的插入、删除和替换),c(oi) 是每个编辑的成本,Δt 是两个图形的时间差(以小时为单位),α,β 是权重。
杀伤链和攻击模式
典型 Dapp 攻击生命周期:
- Preparation 攻击准备
- Exploitation 漏洞利用
- Propagation 攻击传播
- Completion 任务完成
准备:为了寻找和测试 Dapp 易受攻击的函数,杀伤链首先会从各种渠道对目标 Dapp 进行反复探测尝试,也就是说对手会通过测试、调试攻击代码来确保它可以成功利用特定目标 Dapp。
- V1.0:只是创建了许多新的合约,在调用前使用区块信息和
airdrop
的公共逻辑预测函数的输出。 - V2.0:通过
nonce()
评估现有合约的区块,并利用获胜区块上的合约生成一个临时合约来触发airdrop
,从而节省合约创建的成本。 - V3.0:收集现有合约的所有信息,在链外进行预测,然后命令最有希望的合约来调用
airdrop
。
自动大规模分析——DEFIRE
- 预处理:将一组与 Dapp 直接交互的交易作为其输入,自动扩展到包括那些与 Dapp 间接相关的交易
- 基于序列的分类:
- 将交易根据其执行轨迹的相似性以图的形式进行聚类,并组织成几个时间序列。
- 通过图嵌入将每笔交易的执行轨迹转换为向量后,我们运行一个长短期记忆 (LSTM) 神经网络对每个时间序列进行分类。