看到,该代码的kyberRouter和targetData均可以被控制,意味着攻击者可以利用Spectra Protocol合约调用任意合约并传入任意参数。 我们将攻击者的inputs数据解析出来如下: 我们可以发现,kyberRouter已经被操纵为地址: 0x43e54c2e7b3e294de3a155785f52ab49d87b9922 tokenIn已经被操纵为地址: 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee tokenOut被操纵为地址: 0xba8ce86147ded54c0879c9a954f9754a472704aa 我们可以看到Constants.ETH为: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE 所以,代码进入到如下流程 其中,targetData经过解析如下: 由于,transferFrom的signature为0x23b872dd;所以,transferFrom对应的参数from为: 0x279a7dbfae376427ffac52fcb0883147d42165ff to为: 0xba8ce86147ded54c0879c9a954f9754a472704aa value为: 188,013,365,080,870,249,823,427 又因为,kyberRouter被控制为: 0x43e54c2e7b3e294de3a155785f52ab49d87b9922,即asdCRVToken。 所以,攻击者相当于操纵了Spectra Protocol从0x279a7dbfae376427ffac52fcb0883147d42165ff转了188,013,365,080,870,249,823,427asdCRV到地址0xba8ce86147ded54c0879c9a954f9754a472704aa(此地址为攻击者控制的地址)。 至此,攻击者完成攻击。 总结 本次漏洞的成因是被攻击合约对攻击者传入参数校验不严格,导致攻击者可以通过构造特殊的inputData来使受害者合约调用任意合约并传入任意参数。最终,攻击者利用特殊的参数,使得受害者合约通过transferFrom将授权给其合约的代币转入到攻击者控制的地址。建议项目方在设计代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。 来源:金色财经lg...