第12节:安全事故2-OP代币重放攻击

小白入门:https://github.com/dukedaily/solidity-expert ,欢迎star转发,文末加V入群。

当前的区块链系统中,用户对交易的签名有两种形式:

  1. 包含6个字段信息(RLP编码元素):nonce, gasprice, startgas, to, value, data
  2. 包含9个字段信息(RLP编码元素)nonce, gasprice, startgas, to, value, data, chainid, 0, 0,多了后面三个字段。(主要区别是chainid)

对于第一种交易,签名v值为:{0,1} + 27,第二种交易形式(符合EIP1155标准):签名v值为:{0,1} + chainid * 2 + 35

根据ECDSA签名原理我们知道(r,s,v):在v值不相同的时候,即使r和s相同,还原出来的公钥也是不相同的。所以满足EIP1155标准的交易可以阻止重放攻击。

当前的区块链世界是一个多链并存的世界,并且很多链都是EVM兼容的,对于不带chainid的签名交易,我们可以把这条链上的交易信息读取出来,然后在另外一条链上执行,这样就会导致交易被再次执行(因为签名都是有效的),这就是所谓的重放攻击,所以使用chainid可以保证无法被重放,因为每条链的chainid不同。

重放方法:

  1. 在A链上直接获取data数据
  2. 在B链上调用方法:eth_sendRawTransaction直接发送交易即可,点击查看手册

案例分析

OP代币被重放攻击案例分析:点击查看

安全牛分析:点击查看攻击交易