趙娟娟 劉昌華
(武漢輕工大學(xué)數(shù)學(xué)與計(jì)算機(jī)學(xué)院 武漢 430023)
(zhaojj0228@163.com)
隨著互聯(lián)網(wǎng)的快速發(fā)展,Web應(yīng)用已成為我們生活中必不可少的一部分.在實(shí)時通信方面一般對于即時性有較高的要求,目前針對實(shí)時性問題主要有輪詢以及其他的服務(wù)器推送技術(shù)等方法[1],但這些方法都是基于Http請求的,使用Http協(xié)議需要不斷向服務(wù)器發(fā)出請求,然而Http請求會包含較長的頭部,這樣會浪費(fèi)很多資源.在這種情況下,W3C定義了WebSocket協(xié)議[2],相比較Http協(xié)議,WebSocket能更好地節(jié)省服務(wù)器資源和帶寬,并且能夠更實(shí)時地進(jìn)行通信.
近年來隨著WebSocket被廣泛使用,也出現(xiàn)了一些關(guān)于WebSocket的安全漏洞[3].Wireshark1.8.7之前的1.8.x版本中WebSocket解析器中的epandissectorspacket-websocket.c的tvb_unmasked函數(shù)中存在多個整數(shù)符號錯誤,遠(yuǎn)程攻擊者可通過惡意的數(shù)據(jù)包利用這些漏洞造成拒絕服務(wù)攻擊.2013年德國的白帽黑客 Christian Schneider 發(fā)現(xiàn)并公開了發(fā)現(xiàn)跨站劫持漏洞(cross site WebSocket hijacking).跨站點(diǎn)WebSocket劫持相對危害較大,也更容易被開發(fā)人員忽視.針對WebSocket漏洞問題,近年來也有一些學(xué)者作了研究,朱軍[4]基于Node平臺提出使用自定義子協(xié)議Wsguard防御跨站劫持的策略;曾德愚[5]提出在服務(wù)器端代碼中增加Origin檢查機(jī)制修復(fù)漏洞,如果瀏覽器發(fā)送的Origin信息來源不同,則服務(wù)器端拒絕請求并發(fā)回拒絕連接403錯誤;Karlstr?m[6]提出2次驗(yàn)證Origin防御跨站劫持,限制連接數(shù)量緩解DoS攻擊,使用內(nèi)容深度檢測抵御注入攻擊等策略.
本文在總結(jié)前人研究的基礎(chǔ)上,針對WebSocket跨站劫持漏洞提出WebSocket子協(xié)議“Security-WebSocket”.該子協(xié)議使用typescript語言完成系統(tǒng)實(shí)現(xiàn),協(xié)議要求每次在WebSocket連接建立完成之后,需要使用WebSocket通道進(jìn)行2次身份認(rèn)證,認(rèn)證通過之后,服務(wù)端使用AES(advanced encryption standard)加密算法隨機(jī)生成密鑰后發(fā)送給客戶端,客戶端收到后按照約定的密鑰進(jìn)行數(shù)據(jù)加密并攜帶認(rèn)證信息和加密算法使用的偏移量一起發(fā)送到服務(wù)器.以后的每次通信都是需要將消息加密傳輸,并且每次發(fā)送消息都需要攜帶2次加密的認(rèn)證憑證和偏移量,否則WebSocket連接將被中斷.
WebSocket于2008年誕生,2011年成為國際標(biāo)準(zhǔn),目前所有的瀏覽器都已支持該協(xié)議.它是HTML5 開始提供的一種在單個TCP 連接上進(jìn)行全雙工通信的協(xié)議,WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)[7].在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以直接創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸.客戶端和服務(wù)器間建立連接示意圖如圖1所示:
圖1 WebSocket連接握手
密碼學(xué)中的高級加密標(biāo)準(zhǔn),又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)[8].AES為分組密碼,即把明文分成多組,每組長度相等,每次加密1組數(shù)據(jù),直到加密完成整個明文.用初始向量和密鑰加密第1組數(shù)據(jù),然后把第1組數(shù)據(jù)加密后的密文重新賦值給IV(初始偏移量),再進(jìn)行第2組加密,循環(huán)進(jìn)行直到結(jié)束.具體分組加密過程如圖2所示:
圖2 AES算法加密過程
本文在研究WebSocket協(xié)議的基礎(chǔ)上設(shè)計(jì)了子協(xié)議Security-WebSocket,該子協(xié)議可以預(yù)防跨站劫持漏洞,完成客戶端身份認(rèn)證,實(shí)現(xiàn)數(shù)據(jù)加密傳輸?shù)裙δ?為了預(yù)防跨站劫持攻擊,該子協(xié)議實(shí)現(xiàn)了在客戶端和服務(wù)端建立連接時首先通過約定的身份認(rèn)證標(biāo)識驗(yàn)證客戶端身份,在身份驗(yàn)證無誤后方可進(jìn)行協(xié)商密鑰,最后通過協(xié)商的密鑰進(jìn)行加密數(shù)據(jù)進(jìn)行通信.大致過程如下:
1) 客戶端和服務(wù)端建立WebSocket連接;
2) 客戶端發(fā)送約定的標(biāo)識信息;
3) 服務(wù)器確認(rèn)收到標(biāo)識信息后發(fā)送加密密鑰;
4) 客戶端確認(rèn)收到密鑰后進(jìn)行數(shù)據(jù)加密并攜帶身份標(biāo)識以及隨機(jī)生成的偏移量發(fā)送到服務(wù)端;
5) 服務(wù)端收到信息后首先根據(jù)身份標(biāo)識確認(rèn)是對應(yīng)的客戶端后再解密信息;
6) 依次循環(huán)4)5)步直到通信結(jié)束.
客戶端和服務(wù)器連接時,會在發(fā)送Http請求時在請求頭中攜帶Upgrade字段發(fā)送到服務(wù)端,服務(wù)器收到請求后發(fā)現(xiàn)該請求要求將Http協(xié)議更新為WebSocket協(xié)議,服務(wù)器返回相應(yīng)碼101表示協(xié)議升級成功[9].從以上可以看出WebSocket只有在建立連接的過程中需要進(jìn)行身份認(rèn)證,在連接建立成功后再無身份認(rèn)證過程.也就是我們只要復(fù)制請求就可以直接連接服務(wù)器,這樣就會導(dǎo)致惡意網(wǎng)頁冒充客戶端竊取服務(wù)器發(fā)來的消息進(jìn)行通信.子協(xié)議Security-WebSocket的設(shè)計(jì)主要是防御WebSocket 跨站劫持漏洞,主要的作用就是增加了傳輸過程中身份認(rèn)證,加密傳輸,這樣就會確定數(shù)據(jù)來源,從而很大程度上提高了傳輸?shù)陌踩?子協(xié)議是基于客戶端和服務(wù)端共同實(shí)現(xiàn)的,客戶端主要功能有規(guī)定子協(xié)議標(biāo)識、規(guī)定認(rèn)證信息、加密傳輸數(shù)據(jù).服務(wù)端主要功能有確認(rèn)協(xié)議標(biāo)識和認(rèn)證信息、動態(tài)生成密鑰、接收解密數(shù)據(jù).子協(xié)議系統(tǒng)整體結(jié)構(gòu)如圖3所示:
圖3 子協(xié)議系統(tǒng)整體架構(gòu)圖
1) 首先在WebSocket 連接建立成功后,客戶端和服務(wù)器端會協(xié)商一個子協(xié)議Security-WebSocket在請求頭中作為Sec-WebSocket-Protocol字段的值.并且約定在3 s內(nèi)客戶端需要發(fā)送身份標(biāo)識信息給服務(wù)器,標(biāo)識信息如下:
[″auth″, ″I am client″].
2) 當(dāng)客戶端接收到服務(wù)端生成的密鑰后,根據(jù)aes-128-cbc加密算法加密數(shù)據(jù)[10],該算法有3個參數(shù):第1個是需要加密的明文,第2個是密鑰,第3個是初始偏移向量IV,其中IV是每次動態(tài)生成的.下面是一個客戶端根據(jù)密鑰加密后將信息發(fā)送到服務(wù)器的例子:
[″data″,″pilpmplyf5wvvj31″,″EDpbyVNj676 IuS4nz8WbM88jjK3R_hXpax%2BywC748gQKtk XAg6HtrkcRm_5npucMyiuNgPR%2B8xPo0Zivt BPM7MV%2B4CR_ZWoAwCSLjYiGQZs%3D″].
3) 當(dāng)客戶端加密完成后會攜帶認(rèn)證信息和加密數(shù)據(jù)一起在3s內(nèi)發(fā)送到服務(wù)端,每次傳輸過程都攜帶認(rèn)證信息,目的是讓服務(wù)端知道發(fā)送方的來源,避免惡意攻擊.
1) 在建立連接時首先判斷子協(xié)議標(biāo)識是否正確,若錯誤則直接斷開連接,在驗(yàn)證子協(xié)議標(biāo)識正確后會生成16 b的密鑰并且將其發(fā)送到客戶端,其數(shù)據(jù)格式如下:
[″secret″, ″HYJSHYDHXIDUYHDN″].
2) 發(fā)送完密鑰后在3 s內(nèi)會接收到客戶端發(fā)送的加密數(shù)據(jù),首先驗(yàn)證認(rèn)證信息,若認(rèn)證信息驗(yàn)證無誤,則使用協(xié)商的密鑰解密得到數(shù)據(jù).
會話管理部分主要的功能是在用戶登錄成功后服務(wù)器自動創(chuàng)建session,服務(wù)器為每個用戶創(chuàng)建一個隨機(jī)生成的seesionid來標(biāo)識是哪個用戶在發(fā)送信息,服務(wù)器和客戶端每次都是通過cookie完成seesionid的傳送,session在一定時間內(nèi)有效,失效后服務(wù)器會銷毀之前的session并創(chuàng)建新的[11].當(dāng)遇到跨站劫持漏洞時,黑客可能會竊取cookie偽造請求,本文作了2次身份驗(yàn)證標(biāo)識,這樣會在標(biāo)識用戶身份時除了seesionid之外還有auth的值,雙重身份信息認(rèn)證,很大程度上提高了通信的安全性.
本文使用typescript語言在本地完成WebSocket安全子協(xié)議系統(tǒng)的代碼實(shí)現(xiàn),對該系統(tǒng)使用子協(xié)議和未使用子協(xié)議作對比測試,主要從連接請求認(rèn)證、連接超時認(rèn)證、數(shù)據(jù)加密結(jié)果、數(shù)據(jù)解密結(jié)果等方面作了測試.實(shí)驗(yàn)結(jié)果是在軟件vscode 1.41中使用typescript語言,版本為v3.9編寫的,電腦硬件配置為:MacBook Pro (Retina, 13-inch, Early 2015) 、主頻為2.7 GHz 雙核Intel Core i5、內(nèi)存為16 GB.
客戶端和服務(wù)端連接成功后Security-WebSocket子協(xié)議信息如圖4所示,其中Sec-WebSocket-Protocol”字段的值就是規(guī)定的子協(xié)議標(biāo)識.
圖4 子協(xié)議標(biāo)識
客戶端添加認(rèn)證信息后和服務(wù)端正常通信過程如圖5所示.
當(dāng)客戶端未按規(guī)定發(fā)送身份認(rèn)證信息或未在3 s內(nèi)成功發(fā)送數(shù)據(jù),則服務(wù)器會中斷連接,為了不暴露更多的錯誤信息,服務(wù)器只會中斷連接但不返回錯誤信息.服務(wù)端對數(shù)據(jù)解密后的明文信息以及多次實(shí)驗(yàn)后WebSocket協(xié)議和Security-WebSocket子協(xié)議建立連接和數(shù)據(jù)傳輸平均時間對比如圖6所示.
圖5 客戶端與服務(wù)器通信過程
圖6 2種協(xié)議性能對比結(jié)果
從上面的結(jié)果可以看出Security-WebSocket子協(xié)議從連接成功開始增加了雙重認(rèn)證功能,每次在數(shù)據(jù)傳輸過程中都是攜帶認(rèn)證信息并且加密傳輸,而且限定了傳輸時間,如果超時就會斷開連接.通過對子協(xié)議和WebSocket協(xié)議進(jìn)行性能對比,可以發(fā)現(xiàn)在建立連接時子協(xié)議耗時比WebSocket協(xié)議多耗時1 ms,在數(shù)據(jù)傳輸時子協(xié)議比WebSocket協(xié)議會多耗時50 ms左右.雖然子協(xié)議耗時比WebSocket協(xié)議多一點(diǎn),但它的安全性比WebSocket協(xié)議高了很多,而且Security-WebSocket子協(xié)議在一定程度上可以預(yù)防跨站劫持漏洞.
本文通過分析和研究WebSocket協(xié)議,了解到該協(xié)議不受同源策略的限制,這就可能會存在跨站劫持漏洞.針對該漏洞設(shè)計(jì)并使用typescript 語言實(shí)現(xiàn)了一個簡單的子協(xié)議系統(tǒng),該子協(xié)議在通信時使用雙重身份認(rèn)證以及數(shù)據(jù)加密技術(shù)來預(yù)防不法分子的惡意劫持并偽造假身份竊取數(shù)據(jù).最后在性能測試方面通過對WebSocket協(xié)議和子協(xié)議傳輸時間對比發(fā)現(xiàn)子協(xié)議會耗時多一點(diǎn),但是在可控范圍之內(nèi).Security-WebSocket可以很好地預(yù)防跨站劫持漏洞.
Security-WebSocket子協(xié)議還存在以下不足,該協(xié)議功能比較單一,只可以預(yù)防跨站劫持漏洞,還有許多其他漏洞都不能防御.在性能方面由于使用了雙重認(rèn)證和數(shù)據(jù)加密,所以在提升安全性的同時傳輸速度受到了一定的影響,這些不足之處還有待改善.