开源=安全?RVN盗币事件复盘
開源=安全?RVN盜幣事件復盤
ACce1er4t0r@知道創宇404區塊鏈安全研究團隊
2020年7月22日
原文地址:https://paper.seebug.org/1275/
在7月15號,v2ex上突然出現了一個這樣標題的帖子:三行代碼就賺走 4000w RMB,還能這么玩?
帖子內容里,攻擊者僅僅只用了短短的幾行代碼,就成功的獲利千萬RMB,那么他是怎么做到的呢?
讓我們來回顧一下這次事件。
事件回顧
2020年1月16日,開源項目Ravencoin接到這么一則pull request
代碼中,提交者將原本定義模糊的報錯細分,讓人們能夠更直觀的了解究竟出了什么錯誤,看起來是在優化項目,但是,事實真是這樣么?
2020年6月29日,Solus Explorer開發團隊一位程序員在修bug后同步數據時發現了一個suspected transactions with unbalanced VOUTs被Explorer標記出,之后他檢查RVN時發現RVN大約被增發了約275,000,000,并發現了大量可疑地reissue asset Transaction,這些交易不僅僅有Asset Amount,而且獲得了RVN。在他發現這一事件后,馬上和他的團隊一起將事件報告給Ravencoin團隊。
2020年7月3日,Ravencoin團隊向社區發布緊急更新
2020年7月4日,13:26:27 (UTC),Ravencoin團隊對區塊強制更新了新協議,并確認總增發量為 301,804,400 RVN,即為3.01億RVN.
2020年7月5月,Ravencoin團隊宣布緊急事件結束
2020年7月8日,Ravencoin團隊公布事件
事件原理
在解釋原理前,我們不妨先重新看看WindowsCryptoDev提交的代碼
這是一段Ravencoin中用于驗證的邏輯代碼。
簡單來說,提交者改變了CheckTransaction對Asset驗證的判斷,將原本isAsset && txout.nValue != 0的條件更改為下面的條件:
這段代碼本身利用了開源社區PR的風格(在開源社區中,如果開發者發現提交的PR無關實際邏輯,則不會過度關注代碼影響),看似只是細化了交易過程中返回的報錯,使得正常使用功能的交易者更容易定位到錯誤,實則,通過忽略else語句,導致一個通用的限制條件被細化到了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 */ };由于代碼的改變,當nType == TX_REISSUE_ASSET時,txout.nValue可以不為0。
通過對比正常的交易和存在問題的交易,我們也能驗證這一觀點。
在正常的Reissue操作中,我們需要向 Address RXReissueAssetXXXXXXXXXXXXXXVEFAWu支付100RVN,之后我們可以得到一個新的Amount為0的Address,如果新的Address的Amount不為0,那么將會返回bad-txns-asset-tx-amount-isn't-zero的錯誤信息(代碼被更改前,修復后會返回bad-txns-asset-reissued-amount-isn't-zero的錯誤信息)
而攻擊者修改了判斷條件,導致了在CheckTransaction時并不會檢測TX_REISSUE_ASSET,所以能夠在Address的Amount不為0的情況下通過判斷,最終實現增發RVN。
看完代碼后,我們點開這位叫做WindowsCryptoDev的用戶的GitHub主頁
這是個在2020年1月15日新建的賬號,為了偽造身份,起了個WindowsCryptoDev的id,并且同天建了個叫Windows的repo,最后的活動便是在1月16號向Ravencoin提交PR。
而對于這個PR,項目團隊的反饋也能印證我們的猜測。
整個攻擊流程如下:
至此,事件結束,最終,攻擊者增發了近3億的RVN。
總結
隨著互聯網時代的發展,開源文化逐漸從小眾文化慢慢走向人們的視野中,人們漸漸開始認為開源社區給項目帶來源源不斷的活力,開源使得人人都可以提交請求、人人都可以提出想法,可以一定層度上提高代碼的質量、增加社區的活躍度,形成一種正反饋,這使開源社區活力無限。
但也因此,無數不懷好意的目光也隨之投向了開源社區,或是因為攻擊者蓄謀已久,抑或是因為貢獻者無心之舉,一些存在問題的代碼被加入到開源項目中,他們有的直接被曝光被發現被修復,也有的甚至還隱藏在核心代碼中深遠著影響著各種依賴開源項目生存著的軟件、硬件安全。
開源有利亦有弊,攻擊者也在滲透著越來越多開發過程中的不同維度,在經歷了這次事件之后,你還能隨意的接受開源項目中的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
總結
以上是生活随笔為你收集整理的开源=安全?RVN盗币事件复盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 她的梦想是买一台新的计算机的英语,关于梦
- 下一篇: 计算机视觉学习(三):仿射变换将一幅图像