开源=安全?RVN盗币事件复盘
開源=安全?RVN盜幣事件復(fù)盤
ACce1er4t0r@知道創(chuàng)宇404區(qū)塊鏈安全研究團(tuán)隊(duì)
2020年7月22日
原文地址:https://paper.seebug.org/1275/
在7月15號(hào),v2ex上突然出現(xiàn)了一個(gè)這樣標(biāo)題的帖子:三行代碼就賺走 4000w RMB,還能這么玩?
帖子內(nèi)容里,攻擊者僅僅只用了短短的幾行代碼,就成功的獲利千萬(wàn)RMB,那么他是怎么做到的呢?
讓我們來回顧一下這次事件。
事件回顧
2020年1月16日,開源項(xiàng)目Ravencoin接到這么一則pull request
代碼中,提交者將原本定義模糊的報(bào)錯(cuò)細(xì)分,讓人們能夠更直觀的了解究竟出了什么錯(cuò)誤,看起來是在優(yōu)化項(xiàng)目,但是,事實(shí)真是這樣么?
2020年6月29日,Solus Explorer開發(fā)團(tuán)隊(duì)一位程序員在修bug后同步數(shù)據(jù)時(shí)發(fā)現(xiàn)了一個(gè)suspected transactions with unbalanced VOUTs被Explorer標(biāo)記出,之后他檢查RVN時(shí)發(fā)現(xiàn)RVN大約被增發(fā)了約275,000,000,并發(fā)現(xiàn)了大量可疑地reissue asset Transaction,這些交易不僅僅有Asset Amount,而且獲得了RVN。在他發(fā)現(xiàn)這一事件后,馬上和他的團(tuán)隊(duì)一起將事件報(bào)告給Ravencoin團(tuán)隊(duì)。
2020年7月3日,Ravencoin團(tuán)隊(duì)向社區(qū)發(fā)布緊急更新
2020年7月4日,13:26:27 (UTC),Ravencoin團(tuán)隊(duì)對(duì)區(qū)塊強(qiáng)制更新了新協(xié)議,并確認(rèn)總增發(fā)量為 301,804,400 RVN,即為3.01億RVN.
2020年7月5月,Ravencoin團(tuán)隊(duì)宣布緊急事件結(jié)束
2020年7月8日,Ravencoin團(tuán)隊(duì)公布事件
事件原理
在解釋原理前,我們不妨先重新看看WindowsCryptoDev提交的代碼
這是一段Ravencoin中用于驗(yàn)證的邏輯代碼。
簡(jiǎn)單來說,提交者改變了CheckTransaction對(duì)Asset驗(yàn)證的判斷,將原本isAsset && txout.nValue != 0的條件更改為下面的條件:
這段代碼本身利用了開源社區(qū)PR的風(fēng)格(在開源社區(qū)中,如果開發(fā)者發(fā)現(xiàn)提交的PR無(wú)關(guān)實(shí)際邏輯,則不會(huì)過度關(guān)注代碼影響),看似只是細(xì)化了交易過程中返回的報(bào)錯(cuò),使得正常使用功能的交易者更容易定位到錯(cuò)誤,實(shí)則,通過忽略else語(yǔ)句,導(dǎo)致一個(gè)通用的限制條件被細(xì)化到了nType的兩種常見情況下。
而代碼中nTypt可能的值有如下:
enum txnouttype {TX_NONSTANDARD = 0,// 'standard' transaction types:TX_PUBKEY = 1,TX_PUBKEYHASH = 2,TX_SCRIPTHASH = 3,TX_MULTISIG = 4,TX_NULL_DATA = 5, //!< unspendable OP_RETURN script that carries dataTX_WITNESS_V0_SCRIPTHASH = 6,TX_WITNESS_V0_KEYHASH = 7,/** RVN START */TX_NEW_ASSET = 8,TX_REISSUE_ASSET = 9,TX_TRANSFER_ASSET = 10,TX_RESTRICTED_ASSET_DATA = 11, //!< unspendable OP_RAVEN_ASSET script that carries data/** RVN END */ };由于代碼的改變,當(dāng)nType == TX_REISSUE_ASSET時(shí),txout.nValue可以不為0。
通過對(duì)比正常的交易和存在問題的交易,我們也能驗(yàn)證這一觀點(diǎn)。
在正常的Reissue操作中,我們需要向 Address RXReissueAssetXXXXXXXXXXXXXXVEFAWu支付100RVN,之后我們可以得到一個(gè)新的Amount為0的Address,如果新的Address的Amount不為0,那么將會(huì)返回bad-txns-asset-tx-amount-isn't-zero的錯(cuò)誤信息(代碼被更改前,修復(fù)后會(huì)返回bad-txns-asset-reissued-amount-isn't-zero的錯(cuò)誤信息)
而攻擊者修改了判斷條件,導(dǎo)致了在CheckTransaction時(shí)并不會(huì)檢測(cè)TX_REISSUE_ASSET,所以能夠在Address的Amount不為0的情況下通過判斷,最終實(shí)現(xiàn)增發(fā)RVN。
看完代碼后,我們點(diǎn)開這位叫做WindowsCryptoDev的用戶的GitHub主頁(yè)
這是個(gè)在2020年1月15日新建的賬號(hào),為了偽造身份,起了個(gè)WindowsCryptoDev的id,并且同天建了個(gè)叫Windows的repo,最后的活動(dòng)便是在1月16號(hào)向Ravencoin提交PR。
而對(duì)于這個(gè)PR,項(xiàng)目團(tuán)隊(duì)的反饋也能印證我們的猜測(cè)。
整個(gè)攻擊流程如下:
至此,事件結(jié)束,最終,攻擊者增發(fā)了近3億的RVN。
總結(jié)
隨著互聯(lián)網(wǎng)時(shí)代的發(fā)展,開源文化逐漸從小眾文化慢慢走向人們的視野中,人們漸漸開始認(rèn)為開源社區(qū)給項(xiàng)目帶來源源不斷的活力,開源使得人人都可以提交請(qǐng)求、人人都可以提出想法,可以一定層度上提高代碼的質(zhì)量、增加社區(qū)的活躍度,形成一種正反饋,這使開源社區(qū)活力無(wú)限。
但也因此,無(wú)數(shù)不懷好意的目光也隨之投向了開源社區(qū),或是因?yàn)楣粽咝钪\已久,抑或是因?yàn)樨暙I(xiàn)者無(wú)心之舉,一些存在問題的代碼被加入到開源項(xiàng)目中,他們有的直接被曝光被發(fā)現(xiàn)被修復(fù),也有的甚至還隱藏在核心代碼中深遠(yuǎn)著影響著各種依賴開源項(xiàng)目生存著的軟件、硬件安全。
開源有利亦有弊,攻擊者也在滲透著越來越多開發(fā)過程中的不同維度,在經(jīng)歷了這次事件之后,你還能隨意的接受開源項(xiàng)目中的PR嗎?
REF
[1] 三行代碼就賺走 4000w RMB,還能這么玩?
https://s.v2ex.com/t/690286
[2] commit
https://github.com/RavenProject/Ravencoin/commit/d23f862a6afc17092ae31b67d96bc2738fe917d2
[3] Solus Explorer - Address: Illegal Supply
https://rvn.cryptoscope.io/address/?address=Illegal%20Supply
[4] Ravencoin — Emergency Update
https://medium.com/@tronblack/ravencoin-emergency-update-dece62255fd9
[5] Ravencoin — Emergency Ended
https://medium.com/@tronblack/ravencoin-emergency-ended-3f3181a0f6d2
[6] The anatomy of Ravencoin exploit finding
https://medium.com/@cryproscope/the-anatomy-of-ravencoin-exploit-finding-8fa4fe7547a9
[7] RavencoinVulnerability — WTF Happened?
https://medium.com/@tronblack/ravencoin-post-vulnerability-fix-fb3a4bd70b7b
總結(jié)
以上是生活随笔為你收集整理的开源=安全?RVN盗币事件复盘的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 她的梦想是买一台新的计算机的英语,关于梦
- 下一篇: 计算机视觉学习(三):仿射变换将一幅图像