重放(Replay)也稱為重播、回放,即某個消息或數(shù)據(jù)原封不動的重新發(fā)送給接收方一次,而接收方會接受這消息或數(shù)據(jù),當(dāng)這個動作是成立時,表示接收方無法有效辨識該數(shù)據(jù)是已經(jīng)收過,這將會是重放漏洞。
重放攻擊主要是在有區(qū)塊鏈發(fā)生分叉之后,因為分叉后之兩方都共同還保有分叉之前的數(shù)據(jù),因此分叉之后在兩邊都可以做一樣的交易。例如有一間蛋糕店A但是因為理念不同而分家成蛋糕店B和蛋糕店C,分家之后兩家共同擁有之前客戶資料與交易信息且用的系統(tǒng)還是一樣的包含驗證付款信息系統(tǒng),接著各自經(jīng)營客戶與交易并不會互相交換信息。
現(xiàn)在Alice拿著付款信息給蛋糕店B的服務(wù)員后,蛋糕店C的服務(wù)員用電腦確認(rèn)信息后將蛋糕給Alice。拿到之后Alice又拿相同付款信息給蛋糕店C的服務(wù)員后,蛋糕店C的服務(wù)員用電腦確認(rèn)信息后又將蛋糕給Alice,因此Alice得到兩個蛋糕,如果蛋糕店B和蛋糕店C能夠有確認(rèn)付款信息,就不會發(fā)生重放漏洞,沒有漏洞就沒有被攻擊的可能,也就不會損失蛋糕了。
而在區(qū)塊鏈上就是分叉之后,就可以做重放攻擊,以比特幣(BTC)和比特幣現(xiàn)金(BCH)為例,BCH是從BTC中分叉出來的,但是兩者在所有基本的功能上是一樣的,只有BCH比BTC增大了區(qū)塊大小。這個時候Alice從B處購買了10BTC,Alice把這交易信息交給BTC的礦工,獲取10BTC,但是Alice復(fù)制了交易信息交給了BCH的礦工,這樣下礦工在驗證簽名之后放在BTC又放到BCH里,最后Alice就可以獲得到10BTC也擁有10BCH。
最佳案子:以太坊重放攻擊
重放攻擊最佳的案例就是以太坊硬分叉的時候。以太坊硬分叉出現(xiàn)了ETH和ETC兩條鏈,兩條鏈上的交易數(shù)據(jù)結(jié)構(gòu)是完全一樣的,因此一筆交易在ETH上是有效的,那它在ETC上同樣會被接受,反之亦然。因為當(dāng)時所有人都認(rèn)為ETC將不會再存在,所以分叉前沒人意識到兩條鏈會產(chǎn)生相互重放問題。后來還有許多礦工繼續(xù)在維持ETC鏈時,大家發(fā)現(xiàn)在ETH鏈上的交易拿到ETC鏈繼續(xù)重放仍然是有效的。
以太坊分叉時幾乎所有交易所也都沒發(fā)現(xiàn)到這個問題,這時候只要有人從交易所提取ETH幣,就有可能得到同等數(shù)量的ETC幣。許多人利用這個漏洞,不斷在交易所充幣和提幣(ETH),從而獲取額外的ETC。這就是云幣、BTC-e等交易所發(fā)布說自己被重放攻擊了,被騙取了幾乎所有ETC?!爸胤殴簟币簿痛寺劽趲湃?。