曲速區警惕!你的RAM可能已被EOS惡意合約吞噬區塊鏈
曲速區:惡意EOS合約存在吞噬用戶RAM的安全風險。現將漏洞分析公布出來,供社區研究參考,以方便自查和防御。
寫在前面的話:
7月24日消息,據有消息稱收到情報:惡意 EOS 合約存在吞噬用戶 RAM 的安全風險。本次發現的漏洞,恰好會導致用戶賬戶內的RAM可能被惡意消耗,引發直接財產損失。
惡意EOS合約存在吞噬用戶RAM的安全風險,需要引起各大交易所、錢包、token空投方、DApp、用戶等的警惕,避免遭受損失。
EOS的最新消息
EOS,是專門為商用分布式應用而設計的一款高性能區塊鏈操作系統,是一種新的區塊鏈架構,旨在實現分布式應用的高性能擴展。EOS的發布,被譽為區塊鏈3.0時代的到來。
在EOS智能合約執行過程中,需要消耗EOS節點的cpu和內存資源,這些資源按照交易發生時的CPU資源和RAM資源價格,支付給EOS節點,從前一段時間被爆炒的RAM價格就可以看到RAM的稀缺性。
7月27日就有報道 EOS的內存RAM,曾一個星期漲了15倍,兩個星期漲了50倍,暴漲把EOS推到了風口浪尖,也著實讓RAM火了一把。現在EOS的RAM容量上限為64Gb,此后通過逐步增加容量到1Kb。目前,EOS交易價格約為8.79美元,該加密貨幣總市值已經達到78.75億美元,在所有加密貨幣市值排名中位列第四位。
什么是RAM?
RAM就是EOS的內存,它不是一種代幣或通證,它就是EOS的內存資源而已。它在EOS軟件平臺上對應的就是內存數據庫資源。作為DAPP開發者,RAM是一項寶貴資源,數據庫記錄需要消耗RAM。為了保持超級節點的高效運行,節點、RAM、內存總量有上限(以后會擴容),如果要保持區塊鏈數據可以隨時存儲、修改,就需要這部分數據存儲在內存中,而內存的使用需要用戶自己去EOS系統中購買,不需要的時候再賣給系統,換回EOS代幣。而隨著RAM不斷地被租用,剩余可用的RAM越來越少時,RAM所需要抵押的EOS就會越來越多,也就是說RAM的價格會越來越貴。
RAM有什么作用?
在 EOS 網絡上,大量的操作都需要消耗RAM來存儲數據,比如創建一個 EOS 賬號、創建一個 EOS 智能合約、進行 EOS 轉賬等。
經過幾天的反復調試確認溝通后,已經充分了解漏洞危害。為了避免在這段真空期內發生惡意利用攻擊,現決定將漏洞細節公布出來,供社區研究參考,以方便自查和防御。
EOS 的合約可以通過require_recipient觸發調用其他合約,設計這樣的機制給合約的開發者提供了很大的便利性, 但是也帶了新的問題,因為在測試的時候發現require_recipient 有可利用的漏洞導致RAM在不知情的情況下被濫用。
某個用戶給合約轉賬,合約可以在用戶不知情的情況下消耗用戶的RAM(下面的例子中可以消耗200多人民幣的RAM)
隨后得到了官方的回應:
這一漏洞需要引起各大交易所,錢包,空投方,以及用戶的注意
在問題沒有解決之前,用戶應避免使用有大量RAM的賬號給陌生賬號轉賬
問題分析
在DAPP 的開發過程中, 為了獲取轉賬信息, 一種方法是采用require_recipient來訂閱轉賬通知, 原理是這樣的:
在系統合約eosio.token 的transfer 中, 轉賬時會分別通知from 和 to;
如果賬戶to 本身是個合約賬戶, 并且也實現了相同的transfer 方法, 則這個to合約的transfer方法會被調用。
在自己的合約實現相同的transfer 方法:
這個流程看似沒什么問題,但是卻帶了安全隱患,可以惡意消耗賬號from 的RAM 資源。 在上面的例子中 komo::transfer 故意用賬戶from 的授權寫了很多無用的記錄到state db, 而這個操作用戶在授權eosio::transfer時是不知情的。
問題驗證
在測試網絡中分別創建3個賬號, test11111111, test22222222, komo11111111(合約賬戶, 部署了上面的合約komo)
測試之前查看 test11111111 RAM 資源
給普通賬戶 test22222222 轉賬
再次查看test11111111 RAM資源
沒有變化, 還是107.5 KiB;再給合約賬戶 komo11111111 轉賬
再次查看test11111111 RAM資源, 發現被消耗了(142.2-107.5)= 34.7K 字節! 原因是上面komo::transfer 中的for 循環用賬戶test11111111的授權寫了很多數據到state db
代碼分析
因為komo::transfer 這個handler 是被eosio.token::transfer 中的require_recipient 觸發的, 在代碼中當前action 已有賬戶 from 的授權。 所以檢查權限時不會報錯。
并且我們發現, 只要維持這個數據結構占據的字節不變,這個竊取的RAM在komo合約中是可以一直使用的。
修復辦法
曲速區建議:在require_recipient觸發action handler 執行時, 禁止被觸發的handler 使用當前action 的授權。
被觸發的 action handler 有存儲要求怎么辦? 可以使用inline actions 來解決, inline action 被執行時就不會用到原來action 的授權了。
防御手段
相關項目方在做轉賬操作時可通過命令行 “cleos get code” 判斷目標地址是否為合約地址,避免RAM被惡意吞噬導致損失。
另外在問題未解決之前,可以減少用來轉賬的賬戶持有的 RAM 數量,盡可能避免遭受損失。
曲速未來實驗室。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。