一、ATN攻击事件的回溯
2018年5月11日ATN Token遭受恶意攻击(详见:https://atn.io/resource/aareport.pdf),攻击者利用DSAuth库与ERC223搭配使用具有的混合漏洞,通过精心构造的输入,让ATN主动调用合约的setOwner函数,将攻击者的指定地址设置为ower,窃取了ATN的所有权,窃取所有权之后,攻击者进行了窃取代币操作。
二、call、callcode、delegatecall函数说明
call、callcode、delegatecall是以太坊智能合约编写语言Solidity提供的底层函数,用来与外部合约或者库进行交互。此类函数使用时需要对调用参数的安全性进行判定,建议谨慎使用。
不安全使用call函数的例子如下:
上述例子中,call函数的调用地址(如上图中的_spender参数)是可以由用户控制的,攻击者可以将其设置为合约自身的地址,同时call函数调用的参数(如上图中的_extraData参数)也是可以由用户任意输入的,攻击者可以调用任意函数。攻击者利用上述操作,伪造成合约账户进行恶意操作,可能造成如下影响:
1、绕过权限检查,调用敏感函数,例如setOwer;
2、窃取合约地址持有的代币;
3、伪装成合约地址与其他合约进行交互;
三、安全建议
为了避免此类漏洞,成都链安科技建议:
1、谨慎使用call、delegatecall等底层函数,此类函数使用时需要对调用参数的进行限定,应对用户输入的call调用发起地址、调用参数做出严格限定,比如call调用的地址不能是合约自身的账户地址,call调用的参数由合约预先限定方法选择器字符串,避免直接注入bytes可能导致的恶意call调用;
2、对于一些敏感函数,不要将合约自身的账户地址作为可信地址。
成都链安科技自主研发的VaaS平台对call、delegatecall函数存在的安全问题可一键式自动检查并精确定位,VaaS(Verification as a Service)形式化验证平台,是一套针对多个区块链平台(EOS、ETH等)智能合约形式化验证工具,采用形式化验证方法对智能合约进行“军事级”的安全审计,可有效防止代码逻辑漏洞和安全漏洞,确保智能合约程序的安全性。VaaS平台的“一键式”自动化智能合约安全审计工具可自动、快速、准确地检测出10多种已发现的以太坊合约漏洞,让区块链更安全。