區(qū)塊鏈技術(shù)的迅速發(fā)展,使得加密資產(chǎn)逐漸成為大眾的投資方式之一。全球加密資產(chǎn)規(guī)模的高速增長使得錢包成為每一個(gè)加密資產(chǎn)擁有者不可或缺的資產(chǎn)管理工具。
加密領(lǐng)域里,數(shù)字錢包和資金息息相關(guān),越來越多的人意識到了數(shù)字錢包安全的至關(guān)重要性。
2020年8月9日,CertiK的安全工程師王沛宇(Peiyu Wang)與何敏之(Minzhi He)在DEF CON區(qū)塊鏈安全大會上發(fā)表了演講主題為:Exploit Insecure Crypto Wallet(加密錢包漏洞利用與分析)的主題報(bào)告。
加密錢包是一種存儲私鑰和/或公鑰的設(shè)備、程序或服務(wù)。因?yàn)榧用茇泿攀翘摂M的,所以加密錢包不能用來存放現(xiàn)實(shí)中的錢幣。但當(dāng)我們進(jìn)行交易時(shí),加密錢包可以使用用戶的私鑰來為交易簽名,并在區(qū)塊鏈上進(jìn)行廣播。
加密錢包有不同的種類,比如軟件錢包和硬件錢包。本次演講將重點(diǎn)關(guān)注網(wǎng)頁錢包和桌面錢包。
網(wǎng)頁錢包
這是一個(gè)典型的網(wǎng)頁錢包界面,它就是我們CertiK的Deepwallet錢包。用戶可以在這個(gè)界面中看到賬戶余額以及發(fā)送貨幣的選項(xiàng),因?yàn)檫@是一個(gè)基于COSMOS的錢包,所以具有委托功能。
當(dāng)談?wù)摰骄W(wǎng)頁應(yīng)用安全問題時(shí),我們最先想到的就是“開放式Web應(yīng)用程序安全項(xiàng)目(OWASP)”的十大安全漏洞。
以下是CertiK安全工程師調(diào)查的27款網(wǎng)頁錢包中“OWASP Top 10”的十大安全漏洞的一些統(tǒng)計(jì)數(shù)據(jù)。CertiK安全工程師在3款錢包中發(fā)現(xiàn)了跨站腳本攻擊(XSS),在此選取2例進(jìn)行案例研究。
我們在一個(gè)去中心化錢包里發(fā)現(xiàn)了一個(gè)SqI注入漏洞。但是它的數(shù)據(jù)庫只包含了交易數(shù)據(jù),由于區(qū)塊鏈中的交易數(shù)據(jù)已經(jīng)公開,利用Sql注入來偷取數(shù)據(jù)并沒有什么意義。由于也沒有辦法利用SqI注入實(shí)現(xiàn)后臺代碼執(zhí)行,在這種情況下,這個(gè)SqI注入攻擊是沒有多少實(shí)際影響的。
此外,這個(gè)去中心化錢包內(nèi)的某個(gè)API的訪問權(quán)限存在漏洞,未經(jīng)授權(quán)的用戶可以篡改其他人的2FA設(shè)置,但是沒辦法利用這個(gè)漏洞去盜取別人的賬戶里面的資產(chǎn)。
有很多網(wǎng)頁錢包都缺少安全標(biāo)頭(header),例如Content Security Policy (CSP) 和“X-Frame-Options”的標(biāo)頭,這會使得錢包容易遭到點(diǎn)擊劫持(Clickjacking)攻擊。
一些錢包還在用早已過時(shí)的JavaScript庫和存在CVE的Nginx/Apache服務(wù)器,這些漏洞同樣無法直接被利用。CertiK安全工程師暫未發(fā)現(xiàn)任何處理XML格式數(shù)據(jù)的錢包,也沒有發(fā)現(xiàn)有錢包進(jìn)行了任何反序列化操作,所以沒有發(fā)現(xiàn)XXE以及反序列相關(guān)的漏洞。關(guān)于日志和監(jiān)控方面,也暫時(shí)沒有更多信息。
案例一:去中心化網(wǎng)頁錢包的DOM XSS漏洞
這是一個(gè)去中心化的網(wǎng)頁錢包的DOM XSS漏洞案例。這個(gè)錢包支持單一協(xié)議,并擁有網(wǎng)頁錢包的所有基本功能。
· 存在漏洞的功能
此應(yīng)用程序會保存上次的訪問位置:用戶用密碼解鎖錢包后,會重新跳轉(zhuǎn)到解鎖之前的頁面,下圖是實(shí)現(xiàn)此功能的代碼。如果你有測試網(wǎng)頁應(yīng)用程序的經(jīng)驗(yàn),就知道這種情況很有可能存在DOM XSS漏洞,本案例就是如此。
· DOM XSS
DOM XSS需要Source和Sink。Source是應(yīng)用程序收到非可信數(shù)據(jù)(用戶輸入)的位置,然后會將其傳遞給Sink。當(dāng)用戶訪問此鏈接時(shí),“window.location.search” 將返回 "?returnTo=/validators",然后“”會包含"/validators"。
Sink是處理來自Source的非可信數(shù)據(jù)的地方,因此Sink在這里是:“window.location.href”,如果用戶輸入“returnTo=/validators”。錢包返回到“/validators”, 即轉(zhuǎn)到驗(yàn)證者頁面。如果輸入“returnTo=javascript:alert(1)”,將在瀏覽器中彈出alert窗口。
· Keystore和Password
這個(gè)錢包屬于去中心化的網(wǎng)頁錢包。用戶創(chuàng)建帳戶或?qū)霂艉?,Keystore和Password都存儲在本地存儲中。
· 使用JavaScript讀取本地存儲
JavaScript能夠讀取本地存儲中的信息。在本案例中,鍵值數(shù)據(jù)顯示為存儲在本地存儲中的“Hello World”。JavaScript就可以執(zhí)行LocalStorage.getItem(“Hello”)獲取“World”。
· 利用DOM XSS
那如何利用所發(fā)現(xiàn)的DOM XSS漏洞來竊取本地存儲中的Keystore和Password呢?
在下面的這個(gè)URL中,它可以讀取Keystore和Password的內(nèi)容,并將其發(fā)送到黑客的服務(wù)器。在黑客的服務(wù)器日志中,可以直接看到Keystore內(nèi)容和Password。一旦掌握了這些信息,就相當(dāng)于控制了用戶的賬戶,可以登錄到他們的錢包并將錢轉(zhuǎn)出。
· 修復(fù)方法
該網(wǎng)頁錢包廠商的修復(fù)方法為,每當(dāng)用戶解鎖錢包,網(wǎng)頁錢包總會重定向到個(gè)人主頁,從而不給攻擊者任何插入惡意代碼的機(jī)會。
案例二:托管網(wǎng)頁錢包中的反射型XSS漏洞
第二個(gè)案例研究是關(guān)于某個(gè)托管網(wǎng)頁錢包中的反射型XSS漏洞。托管網(wǎng)頁錢包是由服務(wù)器管理所有私鑰。如果要登錄錢包應(yīng)用,用戶要通過電子郵件接收一次性密碼。此案例中的錢包支持16種不同貨幣,具備所有錢包的基礎(chǔ)功能以及一個(gè)附加功能,稱作“推特贈(zèng)送”。
· API操作
API的URL格式類似于“/API/”,例如獲取用戶交易信息的API即為“/apiUser/cloudTrans”。
如果訪問一個(gè)不存在的API端點(diǎn),如“/api/test”,服務(wù)器將返回帶有錯(cuò)誤消息的頁面,如下圖“無法解析請求”。此外,我們發(fā)現(xiàn)鏈接中的內(nèi)容出現(xiàn)在了服務(wù)器返回的頁面中。
這代表著一個(gè)信號:如果后臺不對用戶輸入進(jìn)行任何處理或編碼,就有可能遭到反射型跨站點(diǎn)腳本(Reflected XSS)攻擊。
· alert(document.domain)
在此錢包的API請求后面加上以下內(nèi)容:
應(yīng)用程序會彈出窗口。這是一個(gè)托管的的網(wǎng)頁錢包,私鑰歸服務(wù)器管理,因此無法像第一個(gè)案例那樣直接竊取用戶信息。在這個(gè)案例中,我們的計(jì)劃是嘗試?yán)眠@個(gè)漏洞來劫持用戶賬戶。
· Cookie
用戶登錄后,其會話令牌存儲在“PHPSESSID”cookie中,而這個(gè)錢包的特殊之處在于這個(gè)令牌并沒有“HttpOnly”。如果Cookie設(shè)置了HttpOnly,瀏覽器將阻止JavaScript訪問這個(gè)cookie。換句話說,它可以抵御攻擊者通過跨站點(diǎn)腳本攻擊(XSS)竊取cookie中的會話令牌。
· 獲取會話令牌
由于本案例的會話令牌中沒有HttpOnly,所以可以通過跨站腳本攻擊(XSS),讀取cookie內(nèi)容并且發(fā)送到自己的服務(wù)器。獲取會話令牌后,就可以用它來登錄受害者的帳戶。既然有了會話令牌,就是時(shí)候來一波洗劫一空了。
入侵錢包的最終目標(biāo)大部分情況下是竊取用戶資金,但還存在一個(gè)問題,因?yàn)樵谶M(jìn)行貨幣交易時(shí)還需要2FA驗(yàn)證。在這一點(diǎn)上,黑客既不能重置2FA,也不能禁用2FA,因此,攻擊者需要想辦法繞過2FA驗(yàn)證。
· 繞過2FA驗(yàn)證
前面提到,這個(gè)錢包有一個(gè)推特贈(zèng)送功能:當(dāng)用戶進(jìn)入此功能界面時(shí),它會詢問用戶想要贈(zèng)送什么類型的貨幣、贈(zèng)送多少貨幣以及贈(zèng)送多少人。
通過這個(gè)截圖可以看到,用戶最多可以贈(zèng)送2個(gè)比特幣。
當(dāng)用戶設(shè)置好了贈(zèng)送活動(dòng),其他人需要先點(diǎn)擊關(guān)注,艾特3個(gè)朋友并轉(zhuǎn)發(fā)此贈(zèng)送推文,只要完成這些步驟,就可以去領(lǐng)獎(jiǎng)了。
但問題就出在這個(gè)功能不需要2FA!攻擊者可以通過反射型XSS,盜取受害者會話,登錄受害者賬戶,創(chuàng)建很多贈(zèng)送活動(dòng),然后自己去申領(lǐng)獎(jiǎng)勵(lì)。這樣就可以把受害者的賬戶余額全部取出。
· 修復(fù)方法
廠商對輸出進(jìn)行HTML編碼,這樣解決了XSS漏洞。同時(shí)為含有會話令牌的“PHPSESSID”Cookie設(shè)置“HttpOnly”。
這樣一來,即便應(yīng)用程序受到跨站點(diǎn)腳本攻擊,攻擊者也無法直接竊取賬戶的會話令牌。
桌面錢包
桌面錢包是一種在蘋果操作系統(tǒng)、Windows和Linux上運(yùn)行的應(yīng)用程序。桌面錢包都使用了什么框架呢?
CertiK安全工程師研究了18款桌面錢包,其中QT(C++)、Dot Net(C#),Java各一個(gè),其余15個(gè)使用了Electron框架。這部分的案例研究將探討Dot Net桌面錢包的服務(wù)器遠(yuǎn)程代碼執(zhí)行漏洞,以及Electron錢包的客戶端遠(yuǎn)程代碼執(zhí)行漏洞。
案例一:Dot Net桌面錢包的服務(wù)器遠(yuǎn)程代碼執(zhí)行漏洞
下文分析在桌面錢包中發(fā)現(xiàn)的一個(gè)遠(yuǎn)程代碼執(zhí)行漏洞。
首先介紹一下背景:這個(gè)錢包是一個(gè)去中心化的單一協(xié)議錢包,用C#語言編寫,使用了Dot Net框架。它包含許多常見的錢包功能,如帳戶管理、交易轉(zhuǎn)賬和部署/調(diào)用智能合約等。
比較有趣的是,它還允許用戶上傳文件到服務(wù)器。這功能在錢包中并不常見,所以我們決定進(jìn)一步研究這個(gè)功能。如前所述,這個(gè)錢包是基于Dot Net的,如果沒有對代碼進(jìn)行混淆,就很容易通過反編譯來獲取源代碼。此案例錢包正是這種情況,因此我們能夠恢復(fù)其源代碼來進(jìn)行進(jìn)一步的分析。
· 靜態(tài)源碼分析
在對可執(zhí)行文件進(jìn)行反編譯之后,我們找到了實(shí)現(xiàn)文件上傳的源代碼,如下面的代碼片段所示。
錢包向服務(wù)器發(fā)送一個(gè)HTTP POST請求并返回文件上傳URL,“upload.php”是服務(wù)器上的處理文件上傳的代碼?,F(xiàn)在我們知道服務(wù)器后臺使用了PHP,因此,如果可以上傳一個(gè)PHP Webshell到服務(wù)器并在瀏覽器中打開它,我們可能就能夠在服務(wù)器上遠(yuǎn)程執(zhí)行代碼。
· 文件上傳
在成功地用錢包上傳了一個(gè)PHP webshell文件之后,CertiK安全工程師嘗試著在瀏覽器訪問上傳的文件。成功的訪問了上傳的Webshell, 并能在Webshell中執(zhí)行命令。
我們同時(shí)發(fā)現(xiàn)該錢包的服務(wù)器是在“administrator”用戶下運(yùn)行的,因此能夠以“administrator”權(quán)限執(zhí)行命令。在這種情況下攻擊者能夠完全地控制這臺服務(wù)器,并且能夠操縱其他用戶上傳的文件。但是,由于這是一個(gè)去中心化的錢包,服務(wù)器不會存儲任何用戶私鑰,所以此漏洞無法被利用來直接危害用戶帳戶。
· 修復(fù)方法
修復(fù)是非常簡單的,開發(fā)人員直接刪除了文件上傳功能,這樣就不必再擔(dān)心這個(gè)安全問題了。這是一個(gè)很好的辦法,因?yàn)榧用苠X包應(yīng)該盡可能地保持功能上的簡潔,以此來避免安全問題。接下來,再來談?wù)凟lectron錢包的安全問題。
案例二:桌面錢包客戶端遠(yuǎn)程代碼執(zhí)行漏洞
Electron是什么?為什么要用Electron?
Electron是一個(gè)開源軟件框架,它讓開發(fā)人員能夠使用HTML、CSS和JavaScrip來構(gòu)建跨平臺的桌面應(yīng)用程序。
使用Electron的好處是開發(fā)人員可以重復(fù)利用網(wǎng)頁應(yīng)用程序代碼來構(gòu)建桌面應(yīng)用程序,也就是說不需要找另外的代碼庫,也不需要學(xué)習(xí)新的編程語言。
在調(diào)試Electron應(yīng)用程序時(shí),使用谷歌瀏覽器的DevTools會非常容易。Electron應(yīng)用程序可直接在操作系統(tǒng)上運(yùn)行,因?yàn)樗梢栽L問Node.js模塊,所以也就可以構(gòu)建比網(wǎng)頁應(yīng)用程序更強(qiáng)大的桌面應(yīng)用程序。
今年六月,CertiK安全團(tuán)隊(duì)在Symbol桌面錢包中發(fā)現(xiàn)了一個(gè)遠(yuǎn)程執(zhí)行代碼漏洞,并將該漏洞提交到了Symbol漏洞賞金計(jì)劃。詳情請點(diǎn)擊https://mp.weixin.qq.com/s?__biz=MzU5OTg4MTIxMw==&mid=2247486715&idx=1&sn=6b2eae1a0caa2613123ebae9fe53938b&chksm=feaf6869c9d8e17f3424a6188824b330f7be29f31b710e377f23a1386226097a364e8e0a3e78&scene=21&token=890409175&lang=zh_CN#wechat_redirect
總結(jié)
無論是由內(nèi)部安全團(tuán)隊(duì)還是第三方公司執(zhí)行安全審計(jì)和滲透測試,對于確保系統(tǒng)的安全性都是至關(guān)重要的。專業(yè)的安全人員會試圖從“惡意黑客”的角度來破壞系統(tǒng),幫助在真正的黑客利用漏洞之前識別和補(bǔ)救漏洞。