以太坊智能合约中的社会工程攻击
2021-05-16 23:34:46 Author: mp.weixin.qq.com(查看原文) 阅读量:105 收藏

笔记作者:CDra90n
原文作者:Jin Li,Qiben Yan
原文标题:Targeting the Weakest Link: Social Engineering Attacks in Ethereum Smart Contracts
发表会议:AsiaCCS 2021
原文地址:https://arxiv.org/pdf/2105.00132.pdf

以太坊以加密货币和ERC-20 Token的形式持有数十亿美元,其中有数以百万计已部署的智能合约以算法的方式操作这些资金。毋庸置疑,以太坊智能合约的安全性受到严格审查。近年来,已经开发了许多防御工具来检测不同类型的智能合约代码漏洞。当利用代码漏洞的机会减少时,攻击者便开始求助于旨在影响人类的社会工程攻击,这通常是系统中最薄弱的环节。以太坊中唯一已知的社会工程攻击类别是蜜罐,蜜罐会为试图利用现有漏洞的攻击者植入隐藏的陷阱,而仅针对一小部分潜在的受害者。

在这项工作中,探索了智能合约蜜罐之外新的社会工程攻击的可能性和存在。介绍了两种新型的以太坊社会工程攻击-地址操纵(Address Manipulation)和同形异义词(Homograph),并发现了六种0-day社会工程攻击。为了显示攻击如何在流行的编程模式中使用,对五个热门的智能合约进行了案例研究,这些智能合约的总市值超过290亿美元,并将攻击模式集成到其源代码中而不更改其现有功能。此外,研究表明这些攻击在测试阶段保持休眠状态,但仅在最终生产部署时才激活其恶意逻辑。进一步分析了85,656个开源智能合约,发现其中1,027个可用于本文发现的社会工程攻击。与来自七个智能合约审计公司的专家进行了专业意见调查,证实了暴露的社会工程攻击对智能合约系统构成了重大威胁。

0x01 Introduction

十年来,区块链技术已经从鲜为人知的加密货币分类账发展成为拥有数千亿美元市值的整个行业。其广泛扩展的主要原因是支持智能合约的能力-分散的程序,可以在没有任何第三方或相互信任的情况下强制执行协议。此外,智能合约用于存储和转移金融资产。例如,截至2020年12月,Tether USD智能合约拥有超过210万用户,每日交易量约为360亿美元。

像任何其他软件一样,智能合约也具有安全漏洞,最近的黑客攻击造成了数百万美元的损失。此外,Zhou等人最近对4.2亿个以太坊交易进行了分析。揭示了智能合约中漏洞和攻击的持续发展。为了避免智能合约黑客的破坏性后果,已经开发了许多安全审核工具来检测智能合约漏洞,例如重入,整数溢出等,其中大多数是智能合约代码。漏洞。但是,智能合约是由人类开发人员设计和实现的,以与人类用户进行交互,其中人是智能合约生态系统的核心组成部分。但是,现有的智能合约安全性研究并未考虑人为因素。本文旨在提供第一个以人为中心的智能合约安全性研究。

社会工程攻击不是针对已知的代码漏洞,而是利用人类思维的认知偏差。认知偏差是人脑的一种优化功能,可以根据概率,期望,先前的经验,信念或情感反应得出结论,尤其是在输入数据不完整和/或决策时间有限的情况下。利用认知偏差的一种常见技术是视觉欺骗,它已被广泛用于电子邮件网络钓鱼,例如通过模仿流行网站的外观或国际域名(IDN)同形异义词攻击。认知偏差的另一个方面是确认偏差,其特征是拒绝与最初建立的信念或叙述相异的证据。智能合约蜜罐就是确认偏差利用的一个例子,在该范例中,关于智能合约易受攻击的既定叙述使即使是经验丰富的黑客也忽略了隐藏的陷阱。

蜜罐是以太坊中唯一已知和有记载的社会工程攻击类型。蜜罐是一种智能合约,可诱使黑客利用已知漏洞,但该合约中的隐蔽陷阱却使黑客成为受害者。尽管蜜罐是非常有效的攻击类别,但潜在的蜜罐受害者范围很窄,即熟练的黑客试图窃取未受保护的资金。

在这项工作中证明了以太坊平台和最流行的智能合约编程语言Solidity拥有规避社会工程学攻击的潜力。从固定电话到公司网络,已经通过多种技术进行了社会工程学攻击。当现有的软件和硬件防御减少了攻击面时,攻击者便诉诸于利用人类的认知偏差-这是许多安全系统中最薄弱的环节。本文提出了对智能合约中社会工程学攻击的可能性,媒介和影响的首次调查,以及针对这些攻击的防御措施。具体来说,尝试回答以下三个研究问题。

RQ1: 以太坊的社会工程学攻击媒介是什么本文分析了人类认知偏差的确切方面,可以利用这些方面在智能合约中进行社会工程学攻击。具体来说,发现以太坊平台的几种常见误解和未记录的行为,为一系列0-day社会工程攻击创造了机会。

RQ2: 智能合约中的社会工程攻击是否可行?通过分析确定了社会工程欺骗的两类-地址操纵和同形异义词。在这两个类别中,开发了六种社会工程攻击。通过将这些攻击的模式集成到具有大量用户和数十亿美元市值的现有合约的源代码中,进一步表明,这些攻击可能潜在地针对大量受害者。

RQ3: 在以太坊中,针对社会工程攻击的有效防御措施是什么?人类不仅是社会工程攻击的主要目标,而且是抵御这些攻击的不可替代的防御要素。这促使制定具体的安全建议,以识别和防止用户和审核员对社会工程学的攻击。

0x02 Background

智能合约和EVM: 智能合约是部署在区块链上的程序,提供了一系列函数,可通过交易调用这些函数,并由区块链的虚拟机(VM)执行。大多数智能合约均以高级专用编程语言(例如Solidity或Vyper)编写,并编译为区块链VM字节码。以太坊虚拟机(EVM)是用于执行以太坊智能合约的区块链VM。

外部拥有帐户: 以太坊区块链有两种类型的账户,智能合约账户和外部拥有账户(EOA)。EOA和智能合约帐户均可通过其160位公共地址进行引用。EOA可用于通过已签名的交易调用智能合约的函数。

ERC-20 Token: ERC-20是在以太坊智能合约中实现Token的最受欢迎的标准。一些交易量最高的替代加密货币是部署在以太坊主网上的ERC-20兼容智能合约,例如ChainLink和Binance Coin。ERC-20标准定义了智能合约应实现的接口,以便成为与兼容ERC-20的客户端进行交互的ERC-20 Token。

OpenZeppelin合约: OpenZeppelin Contracts是一个智能合约库,该合约经过了严格的最佳安全实践测试。这些智能合约被认为是流行的智能合约代码模式的事实上的标准化实现。OpenZeppelin项目为ERC-20 Token开发人员提供了丰富的代码库。

EIP-55校验和: 区块链客户的开发人员使用校验和来验证公共地址。校验和是地址的数字指纹,以确保其有效性和正确性。在以太坊(Ethereum)中,校验和通过大写某些十六进制字母的形式嵌入地址中,如EIP-55标准中所述。具体来说,如果EIP-55地址字符串的Keccak256哈希摘要的第i个十六进制数字≥8,则该地址的第i个十六进制数字为大写。EIP-55错误检查的准确性接近99.986%。

智能合约地址: 以太坊中的智能合约地址使用确定性函数 𝜒(𝐴𝑑,𝜂)生成,其中𝐴𝑑是部署合约的帐户的公共地址,而𝜂是部署交易的现时始终等于从部署的EOA发送的事务数。结果可以确定性地计算将由某个用户部署的未来智能合约的地址。

EVM函数选择器: 在EVM中,当EOA或另一个智能合约调用智能合约函数时,调用函数由其选择器识别标识,如下所示:

1621158555472

其中𝑃32是32bit前缀,𝐻𝑘是Keccak256哈希函数,𝑓是函数名,𝛼1,...,𝛼𝑛是参数类型列表(0≤𝑛≤16)。例如,具有单个256bit无符号整数参数的函数𝑓的选择器为𝑃32(𝐻𝑘(“𝑓𝑜𝑜(𝑢𝑖𝑛𝑡256)”))= 0x2fbebd38。

0x03 Threat Model

A.参与者

以太坊智能合约中最常见的攻击(蜜罐)涉及黑客利用智能合约漏洞。但是,在社会工程学攻击中,会发生相反的配置:恶意智能合约的所有者是攻击者,智能合约的受害者是与该智能合约进行交互的个人或组织。

B.攻击向量

在这里揭露了许多可能被利用的社会工程学攻击向量。本质上,所有这些向量都是对以太坊平台的属性或行为的误解(错误假设)。将这些误解分为两大类:1)关于以太坊地址的错误认识,以及2)与EVM和Solidity中的字符串和字符有关的错误认识。

关于地址的错误认识: 以太坊公共地址是一个160位数字,使用40位十六进制表示形式。分析表明,可以在社会工程攻击中利用以下有关以太坊公共地址的四个错误假设。

•M1: 对地址的轻微修改(例如,替换一位数字)对攻击者没有用,因为没人知道与修改后的地址相关联的私钥。本研究证明了成功进行社会工程攻击不一定总是需要知道地址的私钥。

•M2: EIP-55校验和为防止地址伪造提供了可靠的保护。本研究表明使用零售笔记本电脑或台式计算机上的暴破攻击可能会伪造EIP-55。

•M3: 以太坊地址与EOA或智能合约相关联,并且不会更改其状态。本研究证明了EOA可以转变为智能合约,反之亦然。

•M4: 所有以太坊账户同样安全,只要它们的私钥是随机的和秘密的即可。本研究展示了以太坊账户的一小部分具有特殊属性,从而使其更容易受到特定的社会工程攻击。

Solidity中的同形异义词后门: 网络钓鱼诈骗中使用了伪造印刷符号,称为同形异义字或Unicode攻击。这些攻击主要是伪造域名,程序源代码中没有记录的同形异义词攻击。令人惊讶的是,对Solidity的分析揭示了以下三个错误认识,这些错误认识为以太坊智能合约中的同形异义词攻击打开了危险的后门。

•M5: 由于ERC-20 symbol()函数返回的字符串是可选的,并且在设计上具有参考意义,因此不会造成任何危险。研究表明,通过伪造ERC-20 Token的符号,攻击者可以执行社会工程攻击。

•M6: call()或delegatecall()的两个相同参数始终导致相同的32位函数选择器。研究证明了两个相同的参数能够产生不同的函数选择器,由于缺少引用的函数,这导致执行意外的函数或事务返回。

•M7: Solidity编译器的函数选择器冲突防止功能消除了智能合约函数的伪造。在智能合约中,具有冲突选择器的两个函数不能共存于一个合约中。研究表明可以使用视觉上相同的call()或delegatecall()例程的参数来挖掘两个函数的名称,这些例程生成不同的选择器,从而允许这两个函数在协定中共存。因此,对于事务发送方来说未知的是,可能会调用一个不存在的函数,从而导致事务逆转。否则可能会调用错误的函数,从而导致意外的代码执行。

C.攻击目标和结果

尽管一些以太坊攻击者可能将故意破坏作为主要目标(例如,通过"funds freeze”),但在这项工作中,假设攻击者的最终目标是从受害者那里窃取资金。本研究涵盖的所有社会工程攻击都基于这样一个前提,即攻击者是智能合约的所有者或特权用户,这为窃取资金创造了广泛的可能性。例如,许多合约执行selfdestruct程序,该程序允许所有者通过提交单个交易来占用合约的全部余额。

此外,截至2020年12月上旬,Etherscan报告了超过342,000份ERC-20智能合约,这些合约可以使用Token化资金进行多种操作,例如minting,burning,approved transfer等。例如,使用Tether USD稳定币Token,合约价值超过190亿美元,所有者可以调用该合约的deprecate函数,从而将智能合约的函数有效地替换为任意代码。随后,合约所有者只需几分钟即可窃取所有Token并将其交换为以太币,此时,现有防御都无法恢复资金的盗窃。本质上,当攻击者是智能合约的所有者时,没有必要在受害者提交的交易的调用堆栈内实施资金的恶意转移。相反,攻击者可能更喜欢通过阻止资金提取来累积足够的金额,然后再获得全部余额。与立即转移被盗资金相比,这种方法使恶意模式更加隐蔽。

0x04 Social Engineering Attacks

在本节中介绍六种以太坊社会工程攻击,分为两类,如下表所示。Address Manipulation类允许攻击者从策略上利用以太坊公共地址,从而增强攻击A1,A2和A3的能力。Homograph类利用许多字体具有不同代码的外观相同的符号这一事实,该类包括攻击A4,A5和A6。所有这六种攻击的实现均可在https://nick-ivanov.github.io/se-info/ 中获得。

1621158539654

Base Token: 通过更改称为Base Token的智能合约的实现来演示所有六种攻击(请参见下图)。该合约是以太币抵押的ERC-20 Token,这意味着合约中的Token供应以其以太币余额为后盾,从而允许用户使用以太币交换(即购买和出售)Token。使用OpenZeppelin ERC-20原型通过两种其他方法实现Base Token:

•buyToken方法将以太币存入智能合约,并铸造与发行量相对应的Token(发行);

•sellToken方法将烧毁(破坏)用户Token并将相应数量的以太币转移给调用方。

1621158527861

A.地址操纵

地址操纵攻击利用了对以太坊公共地址的相等性,格式,引用的对象,派生方法和其他属性的认知偏差和错误认识。在本节中,提出了三种社会工程攻击:A1,A2和A3。

(1)A1攻击

该攻击将EOA地址秘密地替换为类似的智能合约地址,从而使攻击者可以阻止取款并随后获取资金。在A1攻击中,攻击者在一个事务的调用堆栈内部署具有两个顺序的以太转移的智能合约。第一次转帐看起来像是收费,而第二次转帐是向用户的资金转帐。攻击者欺骗受害者,使他们相信第一笔转账去了EOA,而真正的目的地是没有付款后备函数的智能合约。因此,转移失败,资金(由用户更早存入)保留在恶意合约中,攻击者可以通过合约自毁,贬值或类似机制将其提取。

从本质上讲,攻击者利用了一个事实,即即使未知的40位十六进制数字的对应私钥都是未知的,它几乎也是有效的EOA地址。特别是,如果替换或交换了地址中的一些符号,则生成的地址仍将是有效的以太坊EOA,它可以接受传入的以太坊传输。如下图所示,在A1攻击中,攻击者部署了恶意的智能合约𝐶𝐴。该合约中的变量FeeAddress以EOA地址𝐴1开头。同样,每次向用户进行资金转账之前,都要先向存储在FeeAddress中的地址再转账一小笔费用。这就产生了一个完美的幻想,即智能合约已被部署以从服务费中获利。但是,合约的真正目的是吸引用户进行存款,并阻止任何尝试取款的尝试。

1621158511662

为此,引入了另一个公共地址𝐴2,该公共地址是通过更改一个符号或交换相邻符号以使两个地址在视觉上相似而从地址𝐴1派生的。被操纵的地址必须保持与原始地址的校验和相冲突的有效校验和,从而使用户确信该地址是在构造函数中看到的地址。发现挖掘这样一个地址对仅需几秒钟,从而证明了M2的不正确性。地址𝐴2属于一个预先存在的智能合约𝐶𝑎𝑢𝑥,它不具有应付款回退函数。攻击者将feeAddress的值设置为𝐴2。由于地址的视觉相似性,因此用户在假定费用为1英镑的情况下存入资金。但是,由于尝试将费用发送给不可付款的智能合约,提款失败。为了进一步欺骗,攻击者可以生成从智能合约成功转账到地址𝐴1的历史记录,从而使用户相信智能合约正在积极地接收成功的费用支付。这会加深用户的确认偏差,使其符合攻击者的欺骗性叙述。

上图中的攻击工作流程包括四层欺骗,它们为受害者提供了与同一叙述一致的若干线索(即合约是一种公平的营利计划),从而利用了受害者的确认偏差。欺骗的第一层是,智能合约不会在测试部署期间揭示其欺骗性质-如果用户编译并部署此智能合约进行测试,则该方案将支持欺骗性叙述,因为测试部署无法预测所有者会将feeAddress的值更改为不可支付的智能合约的地址。欺骗的第二层来自于feeAddress变量的部署时初始化:通过检查该地址,受害者找到了公平交易的历史。欺骗的第三层是通过将feeAddress变量保持私有来实现的,这防止了受害方轻松检索其当前值,因为这需要费力的解析二进制交易数据的工作。欺骗的第四层以设法检索FeeAddress的当前值的用户为目标。由于此值在视觉上类似于初始化地址,因此受害者可能会得出结论,认为原始地址正在使用中。

(2)A2攻击

该攻击将拦截客户存款事件,并立即在EOA地址处部署辅助恶意智能合约,以窃取通过阻止提款产生的资金。关键思想是通过运行时替换地址指向的内容来误导用户。攻击利用一种更复杂的方法来动态更改地址引用的对象。在这里,发现导致以太坊M3错误的关于以太坊的两个事实的特殊组合:a)未来尚未部署的智能合约的地址是可预测的;b)在部署之前,未来智能合约的地址具有合法的EOA状态。智能合约地址是由部署EOA的地址和此EOA中的交易记录生成的。

1621158498839

上图说明了A2攻击的工作流程。智能合约A被伪装成公平的营利计划,其中所有者每次提取资金都要收取费用。收款人地址在智能合约中进行了硬编码,并设置为常量,这加剧了支持该地址永久性概念的确认偏差。对于正常操作,此地址应接受入款,这意味着它应该是EOA或具有应付款回退函数的智能合约。当用户进行存款时,会发出一个事件,该事件会被属于攻击者(智能合约A的所有者)的服务器拦截。检测到事件后,攻击者将智能合约B部署在地址𝐴𝑓处。收费者地址𝐴𝑓的设计方式是,攻击者知道帐户the的对应私钥,根据该私钥部署合约B,即𝐴𝑓= 𝜒(𝐴𝑑,𝜂)。由于智能合约B没有应付款回退函数,因此到地址address的费用转账现在失败了。结果,先前存放的资金保留在合约中,以供攻击者随后获取。

(3)A3攻击

攻击利用小写和混合大小写的EIP-55地址之间的重叠来误导用户将其资金锁定在智能合约中,以供攻击者随后获取。在攻击A3中,攻击者为用户提供了个人智能合约和看似随机的测试以太坊账户。当智能合约具有硬编码的地址或其他特定于帐户的值时,通常的做法是为用户提供测试帐户以演示智能合约的功能。由于假定所有帐户都具有相同的属性集,因此用户认为任何帐户都将具有与测试帐户相同的行为,研究发现并非总是如此。本质上,攻击A3利用M4,即认为私钥的保密性完全决定了以太坊账户的安全性。攻击的关键是生成带有所有小写EIP-55校验和的帐户。验证了使用随机猜测方法生成带有小写校验和的EIP-55地址的可能性约为0.0246%。

1621158480720

一次性密码验证是智能合约中一种常见的补充授权技术。智能合约所有者可以生成用户地址和相应用户密码的身份验证哈希,并将此哈希存储在智能合约中。在这种攻击中,攻击者在智能合约中创建了这样的密码验证例程,并为用户提供了多个测试帐户以验证功能。但是,测试集仅包含所有小写EIP-55校验和的有意开采的帐户。在该智能合约中,资金转移函数之前是密码验证,该密码验证将调用地址转换函数,该函数将交易发送方的地址转换为全小写的字符串(例如,上图中的strAddrHash)。使用测试帐户,智能合约可以按预期工作。测试之后,用户通过将他/她的公共地址(从钱包中复制)和秘密密码进行连接来创建生产认证哈希。无法测试此生产帐户,以避免通过公共区块链的开放网络泄露密码。出乎意料的是,由于地址大小写不符而导致密码验证失败,因此尝试取款失败。上图演示了A3攻击的示例。

authHash常量变量存储与密码ASIACCS2021关联的用户地址0𝑥𝑒6𝑐700856796524501438𝑑7197497𝑐14𝑏𝑐𝑒𝑎𝑐297的Keccak256摘要。攻击者为用户提供了几个测试帐户的私钥,这些帐户的公共地址的EIP-55校验和都是小写的。这些测试帐户按预期方式工作。但是,当用户使用其真实地址启动事务时,密码验证将失败,因为authHash将带有校验和的地址合并为大小写字母,而strAddrHash使用具有所有小写校验和的相同地址来生成哈希。验证失败会阻止用户出售Token。此攻击表明,某些帐户比其他帐户更容易受到攻击,可以有效地克服误解M4。

B.同形异义词视觉认知欺骗

智能合约中的同形异义词攻击是通过存在看起来相同或非常相似的符号来实现的,而大多数文本编辑器(十六进制查看器除外)无法揭示差异。本研究对来自七个智能合约审计公司的安全专家进行了调查,以了解十六进制查看器在审计过程中的使用频率。调查结果显示,七分之一的公司通常使用十六进制查看器,其中两家有时使用十六进制查看器,其余公司则从未或很少使用过。在这里将两个单词或字母定义为一对同形异义词对,它们包含外观相同但符号不同的符号。社会工程学攻击的Homograph类利用了以下事实:尽管Solidity禁止在函数和变量的名称中使用Unicode符号,但它允许这些符号出现在确定分支和合约间调用的字符串文字中。在本节中介绍三种同形异义词攻击:A4,A5和A6。

(1)A4攻击

该攻击利用字符串匹配模式中的同形异义词对来制作恶意的智能合约。具体来说,攻击者设计了一个智能合约,其中在分支条件下使用了同形异义字串,这导致意外的代码执行。

1621158462376

上图演示了A4攻击,其攻击代码嵌入在sellTokens()函数中。stringsEqual()函数通过比较两个字符串的哈希值来执行字符串匹配。文字BT由两个ASCII字符组成,但是symbol()返回值虽然在视觉上与文字BT相同,但是用西里尔符号集中的同形异义词对替换了符号T。由于symbol()的值是可变的,因此智能合约不包含任何明确的恶意代码,但是,当更改Token符号值时,它会变得恶意。结果,分支条件变为假,并且从未发生Token出售,这证明了Token符号的重要性,从而驳斥了误解M5。

(2)A5攻击

此攻击将函数的标头替换为其同形异义词对,从而导致意外的合约间调用失败。代码重用一直是智能合约开发的最佳实践之一,可以减少实施时间和减少编程错误的频率。代码重用可以是静态的也可以是动态的。静态代码重用的典型示例是从OpenZeppelin Contracts库继承类。EVM还支持动态代码重用,其中一个智能合约调用部署在同一区块链上的另一合约的函数。动态代码重用减少了区块链存储的利用率,并实现了本机合约间通信(ICC)。众所周知,如果在ICC调用中错误地指定了函数,则将改为调用智能合约的后备函数。但是,如果不存在回退函数,则对不存在的函数的调用会触发EVM异常,随后发生事务反转,攻击A5通过伪造函数ICC选择器来利用该异常。

1621158454902

上图演示了攻击A5的一般思路。在ICC调用期间,如果未找到目标智能合约中的预期函数,并且未实施回退例程,则该调用将意外失败,并且不会执行向客户的资金转移。拟议的A5攻击将函数头字符串中的一个或多个字母替换为同形异义字对,因此,生成的函数选择器将不匹配任何现有函数,从而导致ICC调用失败。

1621158445649

上图显示了A5攻击的sellToken函数。创建并部署了另一个名为Helper的智能合约(见下图),其地址在BaseToken合约中进行了硬编码。Helper智能合约具有用于事件日志记录的日志函数。但是,字符串“ log(address)”包含用同形异义词对替换的字母,因此ICC调用失败。因此,随后的资金转移到调用者永远不会发生。此示例演示了call()和delegatecall()例程的外观相同的参数确实可以产生不同的选择器,从而证明了M6的不正确性。

1621158435648

(3)A6攻击

先前的攻击有一个主要弱点:尽管代码中没有任何东西看起来可疑,但ICC调用的状态检查可能会提示谨慎的用户进行测试部署以检查调用是否成功。下一个攻击提供了通过这种测试的欺骗性技术,A6攻击充分利用以太坊函数选择器(长度仅为32位)的潜在冲突情况,以确保从欺骗性ICC调用中获得成功状态。假设函数选择器的分布均匀,则与另一个函数(即两个函数具有相同的选择器)发生冲突的概率约为2.33·10^(-10)。进行的一项实验表明,一台办公室计算机平均只需要几个小时就能发现碰撞。在A6攻击中,攻击者制作了一个函数,该函数的选择器与预期函数的同形词对的选择器冲突。由于实际存在被调用的函数,因此交易成功,这进一步加剧了受害者对攻击者支持的欺骗性叙述的确认偏差。

1621158404218

如果Solidity编译器在一个智能合约中将两个具有相同选择器的函数合并在一起,则会以错误终止。A6攻击通过将函数标头替换为其同形异义词对来避免此问题。在上图所示的攻击工作流程中,智能合约A在智能合约B中实现了对函数的调用。编译B时,函数foo的字符串头将转换为32位选择器0𝑥𝑐2985578。但是,如果将字符串“ foo()”中的两个字母“ o”都替换为同形异义词对,则编译器会将修改后的标头转换为选择器0𝑥3293𝑓02𝑎,攻击者使用冲突搜索算法来挖掘该函数名称bar821770037,其选择器也为0𝑥3293𝑓02𝑎。因此,foo和bar821770037可以共存于合同B中,尽管它们实际上都具有委托调用的相同参数,即“ foo()”(请参阅上图的步骤❷),有效地反驳了M7。在用户不知道的同形异义替换之后,将调用bar821770037而不是foo,它将返回成功状态,但破坏了合同A中预期的代码逻辑。

上图展示了A6攻击的示例。Helper智能合约包括两个函数,accountRegistered和afterBlock29410106。由于以太坊智能合约中通常会进行区块编号检查,因此带有此名称的辅助函数的存在不太可能引起任何怀疑。字符串“ accountRegistered(address)”包含西里尔字母(替换1、2、3和16个字母)。使用强力算法来挖掘名称afterBlock29410106,其函数选择器与“ accountRegistered(address)”的同形异义字对碰撞。令人惊讶的是,发现afterBlock29410106和accountRegistered函数可以接受不同类型的参数:只要两个函数中的参数数量一致,无论参数类型如何,调用仍将成功。EVM的这种未记录的行为为攻击增加了另一层伪装。最后,调用afterBlock29410106而不是预期的函数accountRegistered。与A5攻击不同,成功变量现在为true。但是,尽管成功返回状态,用户的资金转移也不会发生,因为该函数的返回值与预期不符。

0x05 Case Study of Real-World Smart Contracts

本文最重要的问题之一是这六种社会工程学攻击是否可以在现实世界的智能合约中使用。为了回答这个问题,选择满足以下条件的五个智能合约的源代码:a)它们代表了智能合约的流行用例;b)他们有成千上万的活跃用户;c)他们的市值很高(即用户将资金委托给他们);d)合约实现了OpenZeppelin合约库中的一种标准用例。然后稍加修改这些合约的源代码,以将社会工程学攻击整合到其中,而无需更改任何函数或合并任何不安全的做法或已知漏洞。通过这种方式证明了流行的受信任智能合约能够用于社会工程攻击。

1621158368502

将攻击模式集成到五个合约的源代码中之后,将合约部署在Ropsten测试网上并验证其预期功能。然后模拟合约的生产部署,并证明由于激活攻击功能(例如,在攻击A2中在EOA广告位部署合约),在测试过程中进行的某些交易将失败。对于每种情况,都确保:a)攻击在测试阶段保持休眠状态,仅在生产部署时激活;b)攻击从视觉上隐藏了审核员;c)每次攻击都有合理的伪装(例如,假装从收取服务费中获利)。上表总结了其中集成的五个智能合约和攻击模式。有关这五个案例的视频演示,请访问https://nick-ivanov.github.io/se-info/ 。整个智能合约集的源代码文件位于https://github.com/nick-ivanov/social-engineering-big5 。

生产部署模拟: 对热门合约的源代码进行的手动分析表明,大多数合约都使用OpenZeppelin合约模板以及一些自定义添加项。在案例研究中,演示了在不破坏OpenZeppelin Contracts库提供的安全模式和函数的情况下将攻击代码集成到现有Token中的可行性。可以将操纵后的Token宣传为具有其他功能的新加密货币,例如为早期采用者提供的特殊VIP特权。出于道德方面的考虑,使用Ropsten测试网执行测试和生产部署模拟,该测试网的智能合约执行与Mainnet相同,但不涉及实际资金。为了模拟攻击者对恶意合约的生产部署,故意使用不同的构造函数自变量配置相同的合约(例如,用同形异义词替换 Token符号的字母),或提交其他交易(例如,在以下位置部署智能合约)硬编码的EOA地址。它有效地模拟了生产部署中先前处于休眠状态的恶意功能激活。在这里,提供了五种攻击模式集成的高级概述。

在Tether USD稳定币中集成A4攻击: 稳定币是与法定货币(例如美元)的市场价格挂钩的可替代Token。主流稳定币主要由加密货币交易所采用,具有很高的市值和每日交易量。Tether USD(USDT)是最受欢迎的稳定币,是部署在以太坊上的ERC-20智能合约。通过在每次转移之前添加对Token符号的看似无害的检查,将攻击模式A4集成到USDT的源代码中。通过确认传输例程的功能保持不变来测试代码。之后,通过对Token符号进行不可见的修改来模拟代码的生产部署,该修改通过构造函数传递。结果,由于被篡改的Token符号,智能合约会捕获用户Token。

Binance Token中集成A5攻击: Binance Token(BNB)是一种流行的ERC-20币,具有很高的市场资本化和每日交易量,并由大型加密货币交易所Binance的金融资产担保。通过添加看起来很纯稚的日志记录例程,将攻击模式A5集成到BNB Token的源代码中,该例程将转移记录保存在另一个智能合约中。在测试中,代码按预期执行日志记录。但是,在最终部署中,所有者用同形异义词对替换了日志记录功能ICC标头中的一个字母。日志调用引发异常,导致无法将资金转给用户。

在ChainLink Token中集成A1攻击: 区块链Oracle是一项将可靠的外部信息传递到智能合约的上下文中的服务。通过其业务资产抵押,ChainLink发行了一个带有LINK16符号的ERC-20 Token,在其源代码中集成了攻击模式A1。在此Token中,使用特殊的用户角色VIP用户,该角色可以随时转移资金,而其余用户只能在预定的截止日期之后转移资金。测试运行没有发现任何问题,但是在生产部署中,恶意智能合约所有者使用与合法VIP用户地址相同的EIP-55校验和挖掘相似的公共地址,并将此地址保存在智能合约中。结果,无法识别地址伪造的VIP用户将无法从智能合约中转移资金。

在Bitfinex Token中集成A6攻击: Bitfinex LEO Token(也称为UNUS SED LEO17)由Bitfinex加密货币交易所的资产支持。在此Token中,攻击者使用辅助助手智能合约来防范传输泛滥(即,一个用户执行太多次小型传输)。该智能合约使用预期泛滥检查函数的ICC标头的同形异义词替换。但是,由于用同形异义词替代,因此会调用辅助智能合约中的错误函数,从而导致资金转账意外失败。

CryptoKitties中集成混合社会工程攻击模式: ERC-721标准用于不可替代的(即唯一的)以太坊Token,例如收藏品,游戏,契约等。CryptoKitties可收集的游戏是最受欢迎的ERC-721 Token之一。对于此合约,结合使用了攻击A1和A2的技术。具体来说,A1组件涉及攻击者手动更改费用收集器。A2组件在EOA地址处部署了不可支付的智能合约,从而导致交易冲销。类似于先前对ERC-20 Token的四个攻击,这种对社会工程学的利用在测试过程中也不会显示出来:仅在生产环境中,当所有者部署不付费的合约时,恶意逻辑便会启用。

0x06 Evalution and Analysis

A.方法

如前文所述不可能完全自动化地检测社会工程学攻击,因为必须进行人工评估才能理解智能合约的语义。但是,手动检测社会工程学攻击需要费力,例如使用十六进制查看器检查源代码,生成ICC选择器等。为解决这种二分法,开发了一种自动化工具,可以从给出了一套智能合约,以进行进一步的手动分析。使用这种混合方法,设法过滤掉了95.4%的所有候选合约。然后手动检查每个可疑的智能合约,并将它们分为三类:不可利用,语法匹配和语义可利用。最后,与来自七家领先的智能合约安全公司的安全专家分享了发现,并要求他们以在线调查的形式分享他们对攻击的看法。

B.自动检测

所有社会工程攻击的一个特定特征是,它们的欺骗机制仅位于源代码中,因此在字节码中不可检测。结果,将智能合约的源代码视为输入。下图说明了自动过滤器的操作,该过滤器使用了双层检测,即搜索原子签名(攻击标记),然后对这些签名进行逻辑处理以匹配特定的攻击。首先,通过解析嵌入在JSON对象中的多文件协定,删除所有非Solidity智能协定,擦除所有注释并丢弃与先前处理的协定重复的智能合约来预处理源代码。然后将源代码输入到一组签名检测器中。每个签名检测器利用文本搜索和正则表达式匹配来识别源代码中的特定标记。例如,资金转移程序可以在源代码中用三个标记之一来表示:a)transfer程序;b)send例程;或c)call with value程序。然后将这些标记合并为签名,以检测资金转移。基于这些签名,通过连接一系列签名来生成合取范式(CNF)的社会工程学攻击检测规则。使用Python,ethereum.utils和Web3.py实现智能合约扫描程序,并在https://github.com/nick-ivanov/esead 上发布该工具的源代码。

1621158354772

值得注意的是,本研究不会尝试使用传统的智能合约漏洞扫描程序(例如Securify,Sereum等)来检测提议的社会工程学攻击,因为这些工具在设计上会假设其中存在智能合约的威胁模型攻击目标。符合拟议攻击的威胁模型的唯一可公开获得的工具是HoneyBadger。但是,HoneyBadger旨在检测以太坊蜜罐-由于目标受害者有限,因此研究未包括这种攻击。因此,现有工具均无法识别所提议的社会工程学攻击。

C.潜在可利用的智能合约

可以通过自动分析智能合约的字节码,源代码或交易历史记录来检测利用智能合约代码漏洞(例如重入或整数溢出)的攻击。但是,此信息不足以确定具有确定性的社会工程学攻击。例如,考虑交易0xc215b9356db58ce05412439f49a842f8a3abe6c1792ff8f2c3ee425c3501023c,通过该交易,发送方支付了大约500万美元的gas:如果没有发送方的证词,就无法知道此交易的上下文。寻找在野任何有关社会工程学攻击的现有报告,除了蜜罐开采的情况外,没有产生任何结果。因此,直到受害者的报告出现之前,只能讨论现实世界中智能合约中社会工程攻击的可能性。

为了揭示以太坊中可能存在的社会工程攻击,从Etherscan收集了所有可用的开源智能合约,总共收集了85,656个独特的智能合约,包括Mainnet中的73,933个,Ropsten测试网络的8,297个和Kovan测试网络的3,426个。下表列出了检测到的3855个候选者的细目分类,它们可能会发出社会工程攻击。然后对所有3,855个可疑案件进行手动分析,以删除2,375个不可利用的智能合约,并将剩余的1,480个合约细分为453个句法匹配(但无法利用)和1,027个语义上可以利用的合约。不可利用合约21的一个示例是通过互斥的if-else分支与关键指令隔离开来的可疑合约。接下来详细介绍如何识别语法匹配和语义可利用的合约及其含义。

1621158333138

(1)语法匹配合约

语法上匹配的智能合约符合其中一种社会工程学攻击(A1 ... A6)的特征,但没有表现出欺骗受害者的欺骗能力。例如,智能合约0xe5b288da8fb70cd58ab240f71610576657308762适合A2情况,因为它具有硬编码的收费EOA地址。但是,对智能合约的手动检查显示此地址为0xfeefeefeefeefeefeefeefeefeefeefeefeefeef。显然,极不可能有人拥有可以在此地址部署智能合约的帐户。

语法上匹配的智能合约的另一个示例是称为MyMillions的智能合约,其中费用转账与另一笔转账共享同一笔交易的调用堆栈,而费用地址既已预先初始化,又可以更改,这两者都匹配A1和A2攻击。但是,对该合约的手动分析表明,双重转移发生在功能buyFactory中,该功能是一个参与函数(即客户调用以参与智能合约方案的函数)。如果此功能由于攻击而失败,则客户存款将永远不会发生,因此,该攻击不会为攻击者带来任何收益。由于智能合约的语义各不相同,因此只有人才能明确地确定参与和解决功能。

(2)语义可利用合约

语义上可利用的智能合约不仅与社会工程攻击之一的配置文件相匹配,而且还具有欺骗功能。它表明这种合约实际上是可利用的。欺骗能力是一种内省性措施,其特征在于合约用户有很大的机会错误认识智能合约的逻辑,从而导致潜在的社会工程攻击之一被执行。欺骗能力的内省性要求人类对欺骗性进行推理,从而导致人工分析所有3855个自动选择的可疑源代码的源代码,总共花费了大约140个人工时。

1621158342475

作为语义可利用性的一个示例,分析揭示了34个智能合约,其中在关键操作之前进行了与空字符串文字的比较,如上图所示。一种方法可以将这种合约用作攻击的载体A4通过使用零宽度空间(Unicode U + 200B),它在许多流行的文本编辑器(例如VS Code)中显示为空字符串。尽管怀疑的34个合约中没有一个具有实际的零宽度空间,但是可以使用重新部署同一合约来发起社会工程A4攻击。

攻击A4的另一个有趣的可利用示例可以在0xf5615138A7f2605e382375fa33Ab368661e017ff找到。该智能合约实现了个人智能合约方案,这意味着该方案的每个用户都有相同智能合约(有时称为“wallet”)的单独部署。该合约在哈希图密钥中使用了同形异义字符号,这导致无法提取先前存入的资金。尽管合约具有明显的欺骗能力,但是代码和事务日志都不能绝对确定合约的恶意性。换句话说,映射键的同形异义词替换可能表示恶意或仅是错字。

语义可利用的地址操纵攻击的另一个特殊示例是名为JigsawGames2的游戏。在此合约中,解决函数sellEggs包含费用转移以及用户奖励转移,这使攻击者可以通过使攻击者通过使用攻击A1或A2技术使费用地址不付款来阻止用户获得奖金。合约没有实现任何自毁或放弃功能,这对需要获取合约中滞留资金的攻击者构成了挑战。巧合的是,该智能合约还向参与功能buyEggs收取开发人员费用。在这种情况下,攻击者可以创建一个伪造的玩家,并通过使用伪造的玩家多次调用buyEggs函数来使费用地址变为应付账款地址,直到通过多次费用转移耗尽合约余额为止。此示例表明,智能合约所有者通常有多种间接方式从智能合约中窃取资金。

D.观察

在对3,855个可疑智能合约进行手动分析时收集了一些有趣的观察结果,这些观察结果与以太坊中有关社会工程攻击的更广泛讨论相关。

观察1 [同一代码的多个版本]: 众所周知,绝大多数智能合约都使用了OpenZeppelin Contracts库中的安全模式,修饰符和抽象类。但是,尽管事实是在预处理阶段删除了所有重复的智能合约,但是对可疑智能合约的手动分析显示出大量的大型合约集群,其中自定义代码在稍做修改的情况下就可以重用。此类可重用的定制代码模式的集群也广泛地出现在语义可利用的集合中,这表明代码重用在智能合约中很普遍,从而导致不安全模式的传播。

观察2 [没有关于社会工程攻击的测试网试验的证据]: 为了追求社会工程攻击模式的早期试验迹象,用来自两个测试网络(Ropsten和Kovan)的开源合约对数据集进行了补充。最初的假设是,对社会工程攻击的第一个实验性开发可能首先在测试网络中流行。但是,与Mainnet相比,在3,165个可疑合约中有937个在语义上是可利用的(29.6%),在Ropsten中为11.9%,在Kovan中为16.0%。因此,测试网络表现出降低遇到语义可利用的社会工程合约的可能性。

E.安全审计公司调查

1621158319297

为了进一步评估所提议的攻击,发送了由上图中所示的两个问题组成的调查。到以下7家智能合约公司(按字母顺序排列):Audithor, CertiK, CoinFabrik, ConsenSys, Dedaub, Trail of Bits,以及一家选择匿名的公司。答复是由每个公司的实际智能合约开发人员和安全审核员(每个公司的一名参与者)提供的,其中包括6名男性和1名女性男性专业人员。上图代表专家对六种社会工程学攻击的答案。垂直的红线代表对所有六次攻击的平均响应。调查结果表明,专家们一致认为,社会工程学攻击可能会损害其客户。此外,专家们认为,社会工程攻击不太可能被人类用户发现。

0x07 Secueity Recommendations

上一节证明了智能合中的所有语法模式都正确地匹配了其中一个社会工程攻击,实际上在3855份合约中,只有1,027份合约实际上是可利用的,不到27%。为了解决社会工程攻击的这种特征,本研究为使用智能合约的人员制定了一系列建议,其中包括代表其客户验证智能合约安全性的安全审核员。这些建议旨在以最小的努力有效地识别和预防社会工程学攻击。

建议1 [谨防地址更改]: 为防止使用A1,智能合约用户不应参与允许更改关键操作的调用堆栈中作为转移接收方地址的合约。分析发现了许多具有这种模式的智能合约,但它们都没有表现出恶意或具有可疑的历史。但是,它为所有者提供了潜在的后门,使其可以阻止关键操作,例如提款。

建议2 [检查EOA是否有外向交易]: 为防止出现A2,智能合约用户应验证所有硬编码的EOA至少有一个外向交易。如果EOA进行了外向交易(被Etherscan标记为“ OUT”),则表明智能合约所有者知道EOA的私钥,这意味着所有者不知道可以进行交易的帐户的私钥。在此地址部署智能合约。实际上,某人知道EOA的私钥和用于在同一地址部署合约的帐户的私钥的概率等于160位哈希冲突的概率,因为每个公用地址都是一个Keccak256哈希。公钥调整为160位。

建议3 [避免视觉认知偏差]: 为防止A1,智能合约用户切勿目视比较地址。而是应使用文本编辑器搜索功能。在本文中,证明了EIP-55冲突碰撞攻击易于实施。结果,即使是带有未知关联私钥的稍微修改的地址也可能很危险。因此,用户应怀疑所有公共地址。

建议4 [避免确认偏差]: 为防止出现A3,智能合约用户切勿使用全小写EIP-55校验和的账户进行智能合约测试。大多数以太坊客户端(例如Metamask)都强制执行EIP-55校验和,因此公用地址始终以混合大写形式显示。验证地址的另一种方法是将其粘贴到Etherscan的搜索字段中,这也将强制执行EIP-55。如果地址全为小写,则可能是社会工程计划的一部分,因此合约应接受额外的审查。

建议5 [不信任字符串比较]: 为防止A4,智能合约用户不应参与使用字符串比较来确定转移或其他关键操作的智能合约。如果文本比较包含两个不变的值,例如常量和字符串文字,则它本质上是重言式,并且表示已废弃的智能合约。但是,执行攻击A4的一种方法是模仿重言式。无论哪种方式,都应谨慎对待通过字符串比较确定的关键操作。

建议6 [验证ICC选择器]: 为防止A5和A6,智能合约用户应使用十六进制查看器验证call()和delegatecall()的参数。智能合约用户和审核员在检查Solidity代码时无法看到与call()或 delegatecall()的函数和参数关联的选择器,因为这些选择器是在编译时计算的。如果call()或delegatecall()的参数包括字符串文字,建议使用–asm或–ir选项编译调用合约和可调用合约,以验证函数选择器是否匹配。如果参数是可变变量,则不能将合约视为安全的。

0x08 Conclusion

这项工作使以太坊智能合约中的一类被忽视的社会工程攻击浮现出来。这些攻击利用人类的认知偏差作为新的攻击媒介。本文确定了这些偏差,并进行了六个0-day社会工程攻击。通过将大多数这些攻击嵌入现有的流行Token中,证明了这些攻击有可能使一大批普通用户受害。此外,攻击在测试期间保持休眠状态,仅在生产部署后才激活。与7家智能合约安全公司合作,并确认攻击确实是危险和回避的。分析揭示了1,027个现有的智能合约,这些合约可能会实施社会工程学攻击。


文章来源: http://mp.weixin.qq.com/s?__biz=MzU5MTM5MTQ2MA==&mid=2247485831&idx=1&sn=ad4baf0cb2bd3afcf094f576b6489a27&chksm=fe2ef60cc9597f1a2736feea6540fd25ccf268dbd75d6cd3476f1bddea785f93bde92fb11188#rd
如有侵权请联系:admin#unsafe.sh