
區塊鍊技術的迅速發展,使得加密資産逐漸成為大衆的投資方式之一。全球加密資産規模的高速增長使得錢包成為每一個加密資産擁有者不可或缺的資産管理工具。
加密領域裡,數字錢包和資金息息相關,越來越多的人意識到了數字錢包安全的至關重要性。
2020年8月9日,CertiK的安全工程師王沛宇(Peiyu Wang)與何敏之(Minzhi He)在DEF CON區塊鍊安全大會上發表了演講主題為:Exploit Insecure Crypto Wallet(加密錢包漏洞利用與分析)的主題報告。
加密錢包是一種存儲私鑰和/或公鑰的裝置、程式或服務。因為加密貨币是虛拟的,是以加密錢包不能用來存放現實中的錢币。但當我們進行交易時,加密錢包可以使用使用者的私鑰來為交易簽名,并在區塊鍊上進行廣播。
加密錢包有不同的種類,比如軟體錢包和硬體錢包。本次演講将重點關注網頁錢包和桌面錢包。
點選連結觀看加密錢包科普演講視訊:https://v.qq.com/x/page/v3135cz0g73.html
網頁錢包
這是一個典型的網頁錢包界面,它就是我們CertiK的Deepwallet錢包。使用者可以在這個界面中看到賬戶餘額以及發送貨币的選項,因為這是一個基于COSMOS的錢包,是以具有委托功能。
當談論到網頁應用安全問題時,我們最先想到的就是“開放式Web應用程式安全項目(OWASP)”的十大安全漏洞。
以下是CertiK安全工程師調查的27款網頁錢包中“OWASP Top 10”的十大安全漏洞的一些統計資料。CertiK安全工程師在3款錢包中發現了跨站腳本攻擊(XSS),在此選取2例進行案例研究。
我們在一個去中心化錢包裡發現了一個SqI注入漏洞。但是它的資料庫隻包含了交易資料,由于區塊鍊中的交易資料已經公開,利用Sql注入來偷取資料并沒有什麼意義。由于也沒有辦法利用SqI注入實作背景代碼執行,在這種情況下,這個SqI注入攻擊是沒有多少實際影響的。
此外,這個去中心化錢包内的某個API的通路權限存在漏洞,未經授權的使用者可以篡改其他人的2FA設定,但是沒辦法利用這個漏洞去盜取别人的賬戶裡面的資産。
有很多網頁錢包都缺少安全标頭(header),例如Content Security Policy (CSP) 和“X-Frame-Options”的标頭,這會使得錢包容易遭到點選劫持(Clickjacking)攻擊。
一些錢包還在用早已過時的JavaScript庫和存在CVE的Nginx/Apache伺服器,這些漏洞同樣無法直接被利用。
CertiK安全工程師暫未發現任何處理XML格式資料的錢包,也沒有發現有錢包進行了任何反序列化操作,是以沒有發現XXE以及反序列相關的漏洞。關于日志和監控方面,也暫時沒有更多資訊。
①
案例一:去中心化網頁錢包的DOM XSS漏洞
這是一個去中心化的網頁錢包的DOM XSS漏洞案例。這個錢包支援單一協定,并擁有網頁錢包的所有基本功能。
- 存在漏洞的功能
此應用程式會儲存上次的通路位置:使用者用密碼解鎖錢包後,會重新跳轉到解鎖之前的頁面,下圖是實作此功能的代碼。如果你有測試網頁應用程式的經驗,就知道這種情況很有可能存在DOM XSS漏洞,本案例就是如此。
- DOM XSS
DOM XSS需要Source和Sink。Source是應用程式收到非可信資料(使用者輸入)的位置,然後會将其傳遞給Sink。當使用者通路此連結時,“window.location.search” 将傳回 "?returnTo=/validators",然後“{returnTo}”會包含"/validators"。
Sink是處理來自Source的非可信資料的地方,是以Sink在這裡是:“window.location.href”,如果使用者輸入“returnTo=/validators”。錢包傳回到“/validators”, 即轉到驗證者頁面。如果輸入“returnTo=javascript:alert(1)”,将在浏覽器中彈出alert視窗。
- Keystore和Password
這個錢包屬于去中心化的網頁錢包。使用者建立帳戶或導入帳戶後,Keystore和Password都存儲在本地存儲中。
- 使用JavaScript讀取本地存儲
JavaScript能夠讀取本地存儲中的資訊。在本案例中,鍵值資料顯示為存儲在本地存儲中的“Hello World”。JavaScript就可以執行LocalStorage.getItem(“Hello”)擷取“World”。
- 利用DOM XSS
那如何利用所發現的DOM XSS漏洞來竊取本地存儲中的Keystore和Password呢?
在下面的這個URL中,它可以讀取Keystore和Password的内容,并将其發送到黑客的伺服器。在黑客的伺服器日志中,可以直接看到Keystore内容和Password。一旦掌握了這些資訊,就相當于控制了使用者的賬戶,可以登入到他們的錢包并将錢轉出。
- 修複方法
該網頁錢包廠商的修複方法為,每當使用者解鎖錢包,網頁錢包總會重定向到個人首頁,進而不給攻擊者任何插入惡意代碼的機會。
②
案例二:托管網頁錢包中的反射型XSS漏洞
第二個案例研究是關于某個托管網頁錢包中的反射型XSS漏洞。托管網頁錢包是由伺服器管理所有私鑰。如果要登入錢包應用,使用者要通過電子郵件接收一次性密碼。此案例中的錢包支援16種不同貨币,具備所有錢包的基礎功能以及一個附加功能,稱作“推特贈送”。
- API操作
API的URL格式類似于“/API/{endpoint}”,例如擷取使用者交易資訊的API即為“/apiUser/cloudTrans”。
如果通路一個不存在的API端點,如“/api/test”,伺服器将傳回帶有錯誤消息的頁面,如下圖“無法解析請求”。此外,我們發現連結中的内容出現在了伺服器傳回的頁面中。
這代表着一個信号:如果背景不對使用者輸入進行任何處理或編碼,就有可能遭到反射型跨站點腳本(Reflected XSS)攻擊。
- alert(document.domain)
在此錢包的API請求後面加上以下内容:
應用程式會彈出視窗。這是一個托管的的網頁錢包,私鑰歸伺服器管理,是以無法像第一個案例那樣直接竊取使用者資訊。在這個案例中,我們的計劃是嘗試利用這個漏洞來劫持使用者賬戶。
- Cookie
使用者登入後,其會話令牌存儲在“PHPSESSID”cookie中,而這個錢包的特殊之處在于這個令牌并沒有“HttpOnly”。如果Cookie設定了HttpOnly,浏覽器将阻止JavaScript通路這個cookie。換句話說,它可以抵禦攻擊者通過跨站點腳本攻擊(XSS)竊取cookie中的會話令牌。
- 擷取會話令牌
由于本案例的會話令牌中沒有HttpOnly,是以可以通過跨站腳本攻擊(XSS),讀取cookie内容并且發送到自己的伺服器。擷取會話令牌後,就可以用它來登入受害者的帳戶。既然有了會話令牌,就是時候來一波洗劫一空了。
入侵錢包的最終目标大部分情況下是竊取使用者資金,但還存在一個問題,因為在進行貨币交易時還需要2FA驗證。在這一點上,黑客既不能重置2FA,也不能禁用2FA,是以,攻擊者需要想辦法繞過2FA驗證。
- 繞過2FA驗證
前面提到,這個錢包有一個推特贈送功能:當使用者進入此功能界面時,它會詢問使用者想要贈送什麼類型的貨币、贈送多少貨币以及贈送多少人。
通過這個截圖可以看到,使用者最多可以贈送2個比特币。
當使用者設定好了贈送活動,其他人需要先點選關注,艾特3個朋友并轉發此贈送推文,隻要完成這些步驟,就可以去領獎了。
但問題就出在這個功能不需要2FA!攻擊者可以通過反射型XSS,盜取受害者會話,登入受害者賬戶,建立很多贈送活動,然後自己去申領獎勵。這樣就可以把受害者的賬戶餘額全部取出。
- 修複方法
廠商對輸出進行HTML編碼,這樣解決了XSS漏洞。同時為含有會話令牌的“PHPSESSID”Cookie設定“HttpOnly”。
這樣一來,即便應用程式受到跨站點腳本攻擊,攻擊者也無法直接竊取賬戶的會話令牌。
桌面錢包
桌面錢包是一種在蘋果作業系統、Windows和Linux上運作的應用程式。桌面錢包都使用了什麼架構呢?
CertiK安全工程師研究了18款桌面錢包,其中QT(C++)、Dot Net(C#),Java各一個,其餘15個使用了Electron架構。這部分的案例研究将探讨Dot Net桌面錢包的伺服器遠端代碼執行漏洞,以及Electron錢包的用戶端遠端代碼執行漏洞。
①
案例一:Dot Net桌面錢包的伺服器遠端代碼執行漏洞
下文分析在桌面錢包中發現的一個遠端代碼執行漏洞。
首先介紹一下背景:這個錢包是一個去中心化的單一協定錢包,用C#語言編寫,使用了Dot Net架構。它包含許多常見的錢包功能,如帳戶管理、交易轉賬和部署/調用智能合約等。
比較有趣的是,它還允許使用者上傳檔案到伺服器。這功能在錢包中并不常見,是以我們決定進一步研究這個功能。如前所述,這個錢包是基于Dot Net的,如果沒有對代碼進行混淆,就很容易通過反編譯來擷取源代碼。此案例錢包正是這種情況,是以我們能夠恢複其源代碼來進行進一步的分析。
- 靜态源碼分析
在對可執行檔案進行反編譯之後,我們找到了實作檔案上傳的源代碼,如下面的代碼片段所示。
錢包向伺服器發送一個HTTP POST請求并傳回檔案上傳URL,“upload.php”是伺服器上的處理檔案上傳的代碼。現在我們知道伺服器背景使用了PHP,是以,如果可以上傳一個PHP Webshell到伺服器并在浏覽器中打開它,我們可能就能夠在伺服器上遠端執行代碼。
- 檔案上傳
在成功地用錢包上傳了一個PHP webshell檔案之後,CertiK安全工程師嘗試着在浏覽器通路上傳的檔案。成功的通路了上傳的Webshell, 并能在Webshell中執行指令。
我們同時發現該錢包的伺服器是在“administrator”使用者下運作的,是以能夠以“administrator”權限執行指令。在這種情況下攻擊者能夠完全地控制這台伺服器,并且能夠操縱其他使用者上傳的檔案。但是,由于這是一個去中心化的錢包,伺服器不會存儲任何使用者私鑰,是以此漏洞無法被利用來直接危害使用者帳戶。
- 修複方法
修複是非常簡單的,開發人員直接删除了檔案上傳功能,這樣就不必再擔心這個安全問題了。這是一個很好的辦法,因為加密錢包應該盡可能地保持功能上的簡潔,以此來避免安全問題。接下來,再來談談Electron錢包的安全問題。
②
案例二:桌面錢包用戶端遠端代碼執行漏洞
Electron是什麼?為什麼要用Electron?
Electron是一個開源軟體架構,它讓開發人員能夠使用HTML、CSS和JavaScrip來建構跨平台的桌面應用程式。
使用Electron的好處是開發人員可以重複利用網頁應用程式代碼來建構桌面應用程式,也就是說不需要找另外的代碼庫,也不需要學習新的程式設計語言。
在調試Electron應用程式時,使用谷歌浏覽器的DevTools會非常容易。Electron應用程式可直接在作業系統上運作,因為它可以通路Node.js子產品,是以也就可以建構比網頁應用程式更強大的桌面應用程式。
今年六月,CertiK安全團隊在Symbol桌面錢包中發現了一個遠端執行代碼漏洞,并将該漏洞送出到了Symbol漏洞賞金計劃。詳情請點選https://mp.weixin.qq.com/s?
總結
無論是由内部安全團隊還是第三方公司執行安全審計和滲透測試,對于確定系統的安全性都是至關重要的。專業的安全人員會試圖從“惡意黑客”的角度來破壞系統,幫助在真正的黑客利用漏洞之前識别和補救漏洞。