被黑 6.1 亿美金的Poly Network 事件:
黑客是利用“EthCrossChainManager 合约可以修改EthCrossChainData 合约中的中继链验证人 (即 Keeper) 的公钥以及在执行跨链交易时未进行目标合约与参数的验证”的漏洞;
关键分析:
- 中继链验证人 (即 Keeper) 的公钥存在 EthCrossChainData 合约,但该合约的 owner 为 EthCrossChainManager 合约。EthCrossChainManager 拥有调用其内部直接修改 Keeper 公钥 putCurEpochConPubKeyBytes 函数的权限。
- 利用
abi.encodePacked(bytes4(keccak256(abi.encodePacked(_method, "(bytes,bytes,uint64)")))
中的_method
参数,构造修改中继链验证人 ( Keeper) 公钥的函数签名function putCurEpochConPubKeyBytes(bytes calldata curEpochPkBytes) external returns (bool);
然后,在源链上发一笔修改目标链上的验证人的伪装跨链操作;
攻击过程:
- 发起一笔修改目标链上keeper公钥的跨链交易操作;
- 修改成功后,使用该账户进行调用EthCrossChainManager合约进行转出资产的操作 ;
总结点:
- 执行跨链操作
必须
验证目标合约是否为官方的内部合约; -
谨慎
控制一个合约调用另一个合约的函数权限;