20251123-Port3 攻击事件中,如何绕过签名验证实现跨链增发代币?

摘要:20251123,攻击者利用 CATERC20 合约中签名验证过程中没有检查非零地址签名的漏洞,调用 registerChain 函数设置了其他链的代币合约。使得跨链代币增发,抛售代币进行获利。 Hacker:https:bscscan
20251123,攻击者利用 CATERC20 合约中签名验证过程中没有检查非零地址签名的漏洞,调用 registerChain 函数设置了其他链的代币合约。使得跨链代币增发,抛售代币进行获利。 Hacker:https://bscscan.com/txs?a=0xb13A503dA5f368E48577c87b5d5AeC73d08f812E Exploit tx1:https://app.blocksec.com/explorer/tx/bsc/0xfaf450571541b95f924024ac3febd5cf6c16695ce787217ca8870350309051c1 输入的参数 msg.sender:"0xb13a503da5f368e48577c87b5d5aec73d08f812e" func:"registerChain" args:{ chainId:"23" tokenContract:"0x00000000000000000000000092d7af0abac7128a5051b9a16b514e768e5b30f3" signatureArguments:[ { custodian:"0xb13a503da5f368e48577c87b5d5aec73d08f812e" validTill:"9,999,999,999" signature:"0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } ] } 当 msg.sender 不是 owner 时,会走到 else 分支验证签名情况。从输入可以看出 owner 为零地址,攻击者传入的 signature 为 0x00..00(未被使用过的签名) 在 verifySignature 函数中直接使用了 ecrecover 函数的返回值进行对比,没有检查 authority 的值是否为 0 地址。利用了验签失败的返回值为 0 地址,加上 owner 重置了为 0 地址这两个条件,绕过了签名检查。