智能合约审计中的一些攻击特点介绍

智能合约它利用了对以太坊公开地址、格式、引用对象、衍生方法及其它属性的认知偏差和误认。这一部分提出了三种社会工程攻击:L1,A2,A3。这次攻击使用类似的智能合约地址秘密替换了EOA地址,使得攻击者能够阻止提取并随后获得资金。对于L1攻击,攻击者将具有两个次序的以太转移智能合约部署到一个事务的调用堆栈中。首次转帐看上去像收费,第二次转帐看上去像用户的资金转移。黑客欺骗受害者,让他们相信EOA是第一次转账,而真正的目的是一个不需要支付支持功能的智能合约。这样,转账失败后,资金(由用户提前存入)仍然存在恶意合同中,攻击者可以通过合同进行自毁、贬值或类似的机制来提取。


实际上,攻击者利用了这样一个事实:即使对40位十六进制数的对应私钥未知,但EOA地址几乎仍然是有效的。具体地说,如果地址中的一些符号被替换或交换,生成的地址仍然是有效的以太坊EOA,该EOA可以接受传入的以太坊传输。如下图所显示,在L1攻击中,攻击者部署了一个恶意的智能合约。合同中的变量FeeAddress以EOA地址Sequence1开始。类似地,每次将资金转移给用户之前,都要向FeeAddress中存储的地址再转移一小笔费用。由此产生了一个完美的幻觉,即智能合约已经被运用来从服务费中获利。然而,合约的真正目的是吸引用户存款,防止任何试图提取现金的行为。


为了达到这个目的,引入了另一个公共地址,它是通过改变一个符号或交换相邻符号来派生出的,目的是使两个地址外观相似。所操作的地址必须保持一个有效的校验和,而这个校验和与原地址相冲突,这样用户就可以确定这个地址是在构造函数中看到的。寻找这样一个地址对的过程只需要几秒钟,因此证明了M2的不正确。Default2属于一个预先存在的智能合约,它不具有应付付款回退功能。进攻者将feeAddress的值设为2。因为这些地址看起来很相似,所以用户将假定费用为1英镑的金额存入资金。然而,提取失败了,因为试图将费用发送到无法支付的智能合约。要进一步进行欺骗,攻击者可以生成一个从智能合约成功转移到地址“1”的历史记录,从而让用户相信智能合约是主动接受成功付款的。这样就加深了用户的确认偏差,从而与攻击者的欺骗性叙述一致。

分享: