智能合约漏洞的修复以及防止攻击方案

前面已经证明,智能合中的所有语法模式都正确地匹配了这些社会工程攻击,而在3855个合约中,只有1,027个实际上可以使用,还不到27%。针对这一特点,本研究针对智能合约使用者提出了一系列建议,包括为其客户提供安全审核以验证智能合约的安全性。这两项建议的目的是以最小的努力有效识别和防止社会工程袭击。


推荐1[谨防地址更改]:为了防止A1被使用,智能合约用户不应参与作为转移接收方地址允许关键操作更改的调用堆栈中的合同。该分析发现很多智能合约都有这种模式,但是没有一个有恶意或者有可疑的历史。然而,它为所有者提供了潜在的后门,使他们能够阻止重要操作,如取款。


推荐2[检查EOA是否有外向交易]:为了防止A2的发生,智能合约用户应该确认所有硬编码的EOA至少有一个外向交易。当EOA进行外向交易(被Etherscan标记为“OUT”)时,表示智能合约拥有者知道EOA的私钥,这意味着拥有者不知道可交易账户的私钥。将智能合约部署到此地址。事实上,某人知道EOA的私钥的概率与将合约用于同一地址的帐户的概率相等,因为每个公共地址都是一个Keccak256哈希,因此可能发生160位哈希冲突。公开密钥调整到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选项对调用合约和可调用合约进行编译,以验证函数选择器是否匹配。在参数为可变变量的情况下,合约不能视为安全合同。

分享: