在字符串匹配模式下,使用同形词对进行攻击,生成恶意的智能合约。具体地说,攻击者设计了一种智能合约,它在分支条件中使用同形字串和异义字串,从而导致意外的代码执行。上面的例子说明了A4攻击,它的攻击代码嵌入在sellTokens函数中。变量stringsEqual()将两个字符串的散列值进行比较,从而执行字符串匹配。文本BT由两个ASCII字符组成,但symbol()()()的返回值尽管与文本BT在视觉上相同,但却将符号T替换为西里尔符号集中的同形异义词对。因为symbol()的值是可变的,所以智能合约不包含任何明确的恶意代码,但是当改变Token符号的值时,就变成了恶意代码。因此,分支条件为假,而Token销售从未发生过,这证明了Token符号的重要性,从而否定了M5的误解。
该攻击用变量的同形词对替换函数的标题,从而导致意外的合约间调用失败。在智能合约开发中,代码复用是最好的方法之一,它可以减少实现时间,降低编程错误的频率。代码复用可以是静态的或动态的。典型的静态代码重用的例子是继承OpenZeppelinContracts库中的类。EVM还支持动态代码重用,即一个智能合约调用同一区块链上部署的另一个合约的功能。通过动态代码重用,可以降低区块链存储的使用率,实现本地合约之间的通信(ICC)。我们都知道,如果一个变量在ICC调用中被错误地指定,那么它就会被替换为智能合约的支持变量。然而,如果回退变量不存在,那么对不存在的变量的调用将触发EVM异常,随后发生事务反转,攻击A5通过伪造变量ICC选择器利用此异常。
上面的例子说明了攻击A5的基本思想。当ICC调用时,如果没有在目标智能合约中找到预期的功能,而回退例程没有被执行,那么调用将意外失败,并且不会向客户进行资金转移。提议的A5攻击用同形异义字对替换了变量头字符串中的一个或多个字母,结果变量选择器将不匹配任何现有变量,导致ICC调用失败。
还没有评论,来说两句吧...