曲速區警惕!你的RAM可能已被EOS惡意合約吞噬區塊鏈

曲速未來安全區 2018-08-03 11:05
分享到:
導讀

曲速區:惡意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 數量,盡可能避免遭受損失。

曲速未來實驗室。

RAM EOS 合約 轉賬 賬戶
分享到:

1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。


專題報道