區塊鏈RPC攻擊借“鏈”還魂,小蟻幣持有者警惕盜幣風險
前言
近日,騰訊安全湛瀘實驗室監測到著名區塊鏈專案NEO(對應數字貨幣“小蟻幣”,總市值1.8億美元)存在遠端盜幣風險。使用者在利用預設配置啟動帶有RPC功能的NEO網路節點並啟用錢包時,其數字貨幣可能慘遭遠端盜幣。該攻擊場景與今年年初被廣泛披露的以太坊RPC攻擊極為相似,嚴重危害了NEO使用者的數字資產安全。
騰訊安全湛瀘實驗室對於該安全問題開展了緊急的研究分析,發現NEO節點確實存在著RPC介面暴露問題。該問題在 ofollow,noindex" target="_blank">neo-cli客戶端 v2.9.0版本之前廣泛存在。此版本之後的節點在配置不當的情況下同樣面臨著一定的安全威脅。
因此,騰訊安全湛瀘實驗室特此釋出此安全預警,提醒 NEO 節點維護者及小蟻幣持有者警惕遠端盜幣攻擊,並給出相應的安全防範建議以規避此類攻擊帶來的風險。
一、重溫以太坊RPC介面安全事件
在開始對於NEO節點RPC攻擊開展研究分析之前,有必要對於以太坊RPC介面安全進行重溫,以類比分析此次爆出的NEO RPC安全問題的形成原因和可能帶來的安全危害。
以太坊是當前著名的區塊鏈公鏈專案。以太坊節點的RPC介面以JSON-RPC的形式對外提供呼叫,其底層為Http協議。以太坊網路中RPC攻擊是針對於對外暴露了RPC介面的以太坊節點開展的。一般情況下,節點維護者可以利用節點的RPC介面控制節點的行為,如簽署和釋出交易信息。然而,以太坊各種版本的客戶端實現有效的RPC介面呼叫者的身份驗證機制。這為攻擊者開展遠端攻擊提供了便利。
以太坊上最為典型的RPC攻擊是遠端盜幣。要想成功實現攻擊,需要:
獲知節點維護錢包中的賬戶資訊,攻擊者可以通過呼叫eth_account等RPC介面獲知。
在賬戶被解鎖的狀態下觸發轉賬。要想實現轉賬,需使用者使用正確密碼解鎖相應賬戶。賬戶解鎖後,賬戶預設有300秒的時間視窗處於解鎖狀態。攻擊者可以利用該時間窗搶先進行數字資產的竊取。
在以太坊網路中,已知的最早進行遠端竊幣的攻擊發生於2016年2月14日。截至目前,該攻擊者賬戶共竊取了4萬5千餘以太幣,其市場價值超過5百萬美金。僅此一個攻擊者賬戶就證明了以太坊RPC攻擊帶來的嚴重的安全威脅。騰訊安全湛瀘實驗室於今年TSec安全會議上分享的名為《看好你的錢包!從攻擊和防禦角度分析以太坊RPC攻擊》的安全研究報告中,利用蜜罐技術和脆弱節點掃描技術對於這一問題進行了深入的研究、分析。筆者認為,此研究手法同樣適用於NEO節點上的RPC安全問題。
二、NEO區塊鏈RPC介面安全問題
2.1 NEO節點的RPC介面是如何暴露的
NEO區塊鏈的常用客戶端之一neo-cli支援RPC介面,其實現形式同樣採用的是JSON-RPC的方式。我們以存在安全問題的v2.9.0版本為例,在使用neo-cli –rpc啟動節點時,所使用的預設RPC相關配置檔案如下:
"RPC": {
"Port" : 10332 ,
"SslCert" : "" ,
"SslCertPassword" : ""
},
可以看出:
1. 該配置將SSL相關配置設定為空字串,因此整個JSON-RPC介面底層基於Http而非Https實現,缺少了對於RPC呼叫者的身份驗證; 2. 給定了RPC埠資訊,但沒有設定其將要繫結的IP地址。
利用該配置啟動測試程式後,檢視neo-cli開啟的IP埠,可得到如下結果:
可以看出,neo-cli在預設情況下將RPC介面直接繫結到了0.0.0.0地址,從而導致了RPC介面的對外暴露。實際上,在v2.9.0及其之前版本,並沒有提供配置RPC介面繫結IP地址的方式,只要開啟了RPC功能,就會被繫結到0.0.0.0地址;而在之後的版本中,開發者增加了新的RPC配置項BindAddress,其預設配置為127.0.0.1,這一配置能確保其介面安全性。但如果節點配置人員修改了該選項為0.0.0.0或其公網IP地址,也將使其面臨著RPC攻擊的威脅。
2.2 暴露RPC介面的NEO節點面臨著怎樣的安全威脅
neo-cli的諸多RPC介面均需要該節點所操作的錢包處於開啟狀態。通常情況下,節點本地操作者可以在neo-cli提供的本地命令介面中輸入open wallet指令以開啟相應錢包。
值得注意的是,目前neo-cli並未設定錢包自動關閉時間視窗。因此,使用者的錢包在開啟之後會長期出於開啟狀態,我們對於neo-cli提供的RPC介面進行了分析,篩選出了可能被攻擊者實施攻擊的相應介面:
方法 | 引數 | 說明 |
---|---|---|
listaddress | 列出當前錢包內的所有地址 | |
getaccountstate | 根據賬戶地址,查詢賬戶資產資訊 | |
dumpprivkey | 匯出指定地址的私鑰 | |
sendrawtransaction | 廣播交易 | |
sendfrom | <asset_id> [fee=0] | 從指定地址,向指定地址轉賬 |
sendtoaddress | <asset_id> [fee=0] | 向指定地址轉賬 |
sendmany | <outputsarray> [fee=0] [changeaddress] | 批量轉賬命令 |
invoke | <sciript_hash> | 使用給定的引數以雜湊值呼叫智慧合約 |
invokefunction | <script_hash> | 以指定的指令碼雜湊值呼叫智慧合約,傳入操作及引數 |
invokescript | <script> | 通過虛擬機器執行指令碼並返回結果 |
可以看出,攻擊者依次呼叫listaddress和getaccountstate介面即可獲知目標節點所維護的錢包及賬戶資產資訊,而後可以採用的共計手段有:
1. 呼叫dumpprivkey,竊取受害者的私鑰; 2. 呼叫sendXXX,竊取數字貨幣; 3. 呼叫invokeXXX,以受害者身份呼叫NEO上的智慧合約。
2.3 攻擊行為監測
在發現NEO RPC攻擊存在後,騰訊安全湛瀘實驗室緊急部署了蜜罐系統對攻擊者行為進行檢測,並捕獲到如下圖所示的典型攻擊行為。根據蜜罐日誌我們可以看出,攻擊者的攻擊流程為:
1. 利用listaddress命令獲取了我們的錢包地址; 2. 呼叫getaccountstate獲取了錢包的asset資訊; 3. 利用asset資訊獲取賬戶餘額,確認有攻擊價值; 4. 呼叫dumpprivakey,盜取賬戶私鑰。 5. 當攻擊者成功盜取使用者的私鑰之後,就可以攻擊者名義簽署交易,盜取貨幣。
2.4 脆弱節點掃描
在確認 NEO 網路中依然潛伏著 RPC 攻擊者之後,騰訊安全湛瀘實驗室對於其網路規模及存在安全風險的節點進行了掃描。首先基於 NEO 節點 P2P 通訊協議實現的網路節點探測介面發現了公網範圍內的所有 NEO 節點。而後,騰訊安全湛瀘實驗室對這些節點的預設 RPC 埠( 10332 )進行了掃描,經測試發現有 13.6% 的節點暴露了其 RPC 介面,響應了我們傳送的獲取節點版本資訊的 RPC 請求。在兩天時間段內觀察,發現其中有 13.1% 的節點會開啟錢包,洩露錢包資訊。
三、安全防禦建議
下面分別從NEO節點維護者和neo-cli開發者的角度提出一些安全建議,以提高其安全效能。
給NEO節點維護者的建議:
1. 升級到最高版本的neo-cli客戶端程式; 2. 避免使用遠端RPC功能,修改配置檔案中BindAddress的地址為127.0.0.1; 3. 如有特殊需求,不得不使用遠端RPC功能,應採取修改RPC埠號、啟用基於Https的JSON-RPC介面、設定防火牆策略等方式保障節點安全。
給neo-cli開發者的建議:
1. 通知其社群成員及節點維護者儘快完成客戶端更新; 2. 完全廢棄基於Http的JSON-RPC功能,以Https為底層協議;
修改程式碼邏輯,將錢包的 “ 開啟(解鎖) – 操作 – 關閉(上鎖) ” 作為一個互斥的原子性事務進行處理,從而確保賬戶的安全敏感視窗期不被攻擊者所利用。
*本文作者:王凱(Kame Wang)、陳楠(Abnern Chen)@騰訊安全湛瀘實驗室,轉載請註明來自FreeBuf.COM