0
本文作者: 郭佳 | 2018-03-21 08:48 |
本篇文章原創(chuàng)者為慢霧安全團隊,雷鋒網授權轉載。
近日,慢霧安全團隊觀測到一起自動化盜幣的攻擊行為,攻擊者利用以太坊節(jié)點 Geth/Parity RPC API 鑒權缺陷,惡意調用 eth_sendTransaction 盜取代幣,持續(xù)時間長達兩年,單被盜的且還未轉出的以太幣價值就高達現價 2 千萬美金,還有代幣種類 164 種,總價值難以估計(很多代幣還未上交易所正式發(fā)行)。如下圖:
安全團隊綜合受害者情報、Reddit 資訊及蜜罐日志分析,回溯攻擊行為,可能為:
全球掃描 8545 端口(HTTP JSON RPC API)、8546 端口(WebSocket JSON RPC API)等開放的以太坊節(jié)點,發(fā)送 eth_getBlockByNumber、eth_accounts、eth_getBalance 遍歷區(qū)塊高度、錢包地址及余額
不斷重復調用 eth_sendTransaction 嘗試將余額轉賬到攻擊者的錢包
當正好碰上節(jié)點用戶對自己的錢包執(zhí)行 unlockAccount 時,在 duration 期間內無需再次輸入密碼為交易簽名,此時攻擊者的 eth_sendTransaction 調用將被正確執(zhí)行,余額就進入攻擊者的錢包里了
備注:
unlockAccount 函數介紹
該函數將使用密碼從本地的 keystore 里提取 private key 并存儲在內存中,函數第三個參數 duration 表示解密后 private key 在內存中保存的時間,默認是 300 秒;如果設置為 0,則表示永久存留在內存,直至 Geth/Parity 退出。詳見:
https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_unlockaccount
我們在 Etherscan 上對攻擊者錢包地址進行細致的分析,得到如下主要攻擊時間線:
2016/02/14 03:59:14 PM 第一次 IN(進賬),這天是情人節(jié)
2016/02/16 06:33:30 PM 第二次 IN,時隔 2 天,猜測自動化攻擊程序首次上線
2016/05/19 07:46:33 PM 第一次 OUT(出賬),此時共 IN 51 筆
2016/07/20 06:35:57 PM 第二次 OUT,此時共 IN 57筆
2017/05/11 06:34:35 PM Shapeshift(知名交易所) IN 7 筆,跨度 71 天
2017/06/10 02:39:53 AM OUT 最后一筆,此時共 IN 約 207 筆
2017/06/21 07:46:49 AM f2pool(知名礦池) IN 36 筆,跨度 4 小時
這種時間線的跟蹤可以側面輔助分析攻擊者的行為痕跡。
通過安全團隊對全球約 42 億 IPv4 空間進行掃描探測,發(fā)現暴露在公網且開啟 RPC API 的以太坊節(jié)點有 1 萬多個。這些節(jié)點都存在被直接盜幣攻擊的高風險。
更改默認的 RPC API 端口,配置方法如:--rpcport 8377 或 --wsport 8378
更改 RPC API 監(jiān)聽地址為內網,配置方法如:--rpcaddr 192.168.0.100 或 --wsaddr 192.168.0.100
配置 iptables 限制對 RPC API 端口的訪問,舉例:只允許 192.168.0.101 訪問 8545 端口:
iptables -A INPUT -s 192.168.0.101 -p TCP --dport 8545 -j ACCEPT
iptables -A INPUT -p TCP --dport 8545 -j DROP
賬戶信息(keystore)不要存放在節(jié)點上 (因為賬戶不在節(jié)點上,所以就不會用到 unlockAccount 了)
任何轉賬均用 web3 的 sendTransaction 和 sendRawTransaction 發(fā)送私鑰簽名過的 transaction
私鑰物理隔離(如冷錢包、手工抄寫)或者高強度加密存儲并保障密鑰的安全
通過這個事件的追蹤調查及攻擊手法的完整復現,我們越發(fā)意識到網絡空間遵循黑暗森林法則,這個法則參考自《三體》:“宇宙就是一座黑暗森林,每個文明都是帶槍的獵人,像幽靈般潛行于林間,輕輕撥開擋路的樹枝,竭力不讓腳步發(fā)出一點兒聲音,連呼吸都必須小心翼翼,他必須小心,因為林中到處都有與他一樣潛行的獵人,如果他發(fā)現了別的生命,能做的只有一件事,開槍消滅之?!?br/>
我們仔細復盤了這起持續(xù)兩年且現在還在活躍的攻擊的所有細節(jié),如果我們是攻擊者,我們一個腳本工程就可以輕松拿下全球數以萬計,甚至百萬千萬的數字資產。
我們需要特別提下攻擊者的手法,不知道大家有沒有注意到,攻擊的第一步為什么調用的是 eth_getBlockByNumber 來獲取區(qū)塊高度?這個調用的細節(jié)是:eth_getBlockByNumber("0x00", false),如果區(qū)塊高度不是最新的,那么這個調用就會報錯,后續(xù)也就沒必要執(zhí)行錢包地址、余額等查詢操作,因為余額不準確,且最后一步的轉賬操作肯定沒法完成。這種攻擊邏輯的設計,對于這個攻擊場景來說是一種非常暴力美學的設計。
我們從上面提到的“攻擊時間線”來看,攻擊者其實很不一般,這種潛伏的攻擊發(fā)生在以太坊歷史上第一個知名的黑客攻擊事件 The DAO 事件之前(2016/06/17),且當時是以太坊技術被市場正式認可的時期??梢钥闯?,攻擊者是非常早期的以太坊技術研究者,并且很懂黑客工程化技術。攻擊者在實戰(zhàn)過程中不斷優(yōu)化這套工程。
我們還對 RPC API 相關模塊功能進行進一步分析,發(fā)現了一些潛在的安全風險,也是需要大家注意的,比如:如果 RPC API 啟用了 personal 模塊,就可以通過 personal_unlockAccount 方法爆破賬戶密碼,假如爆破成功,就可以一次性實現解鎖 + 轉賬。如果 RPC API 啟用了 miner 模塊,就可以通過 miner_setEtherbase 方法修改挖礦的錢包地址。
在我們的墨子(MOOZ)系統(tǒng)的全網探測中,我們發(fā)現這些暴露在公網的以太坊節(jié)點開啟的 RPC API 模塊不盡相同。這為更復雜的攻擊提供了差異條件。
從防御分析角度,我們還發(fā)現,Geth 等的日志機制不完善,無法記錄 RPC API 請求的來源 IP(配置 --debug、--verbosity 5 均無效),導致直接在被攻擊的以太坊節(jié)點上取證溯源攻擊者 IP 是一件很麻煩的事。
雖然以太坊本身的健壯性已經經受住考驗,但是安全是一個整體。通過這個事件我們可以看出以太坊生態(tài)的一些安全缺陷,有的安全缺陷可能會被認為這是一種機制,需要使用者注意,但這個對使用者來說做安全的門檻太高。高門檻的安全一定是會更容易滋生這種大攻擊事件。
本篇文章原創(chuàng)為慢霧安全團隊,雷鋒網授權轉載。
雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知。