程 飛,沈 波
(北京交通大學(xué) 通信與信息系統(tǒng)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100044)
隨著網(wǎng)絡(luò)架構(gòu)研究的不斷深入,表述性狀態(tài)轉(zhuǎn)移(REST,Representational State Transfer)技術(shù)日益成熟,REST架構(gòu)不但能提高Web應(yīng)用的運(yùn)行效率,還可以簡(jiǎn)化開發(fā)過程,已經(jīng)在電子政務(wù)、電子商務(wù)等領(lǐng)域得到廣泛的應(yīng)用。但這些新技術(shù)在給社會(huì)發(fā)展帶來便利的同時(shí),也帶來了巨大的安全風(fēng)險(xiǎn)。
針對(duì)REST應(yīng)用的攻擊手段與破壞程度,其被關(guān)注程度越來越高,已經(jīng)超過了對(duì)傳統(tǒng)安全問題的關(guān)注度[1]。文獻(xiàn)[2]中闡述了構(gòu)造REST的Web服務(wù)接口,同時(shí)針對(duì)REST安全性將其與WS-*技術(shù)進(jìn)行比較。文獻(xiàn)[3]中闡述了REST APIs可能存在的安全隱患并給出防范建議。
本文通過對(duì)REST安全性的分析與總結(jié),找出常見的安全問題及安全策略。根據(jù)REST安全問題在應(yīng)用中的作用原理,給出應(yīng)對(duì)策略。最后建立REST的安全模型及安全檢測(cè)系統(tǒng),通過攻擊演示證明系統(tǒng)的可用性。
REST并不是一種協(xié)議或標(biāo)準(zhǔn),而HTTP是一種應(yīng)用協(xié)議,REST經(jīng)常作為傳輸協(xié)議詮釋HTTP協(xié)議的設(shè)計(jì)初衷?;ヂ?lián)網(wǎng)上的各種資源就是通過HTTP協(xié)議的4種基本操作實(shí)現(xiàn)類似數(shù)據(jù)庫中增刪查改功能,REST規(guī)定了定位資源的規(guī)則,并對(duì)資源通過 HTTP協(xié)議實(shí)現(xiàn)操作[4]。
(1)REST風(fēng)格API的快速發(fā)展?,F(xiàn)在很多基于REST風(fēng)格的API已經(jīng)由只讀模式轉(zhuǎn)變成讀寫模式,這極大的促進(jìn)了人機(jī)和機(jī)器之間的交互性,但權(quán)限的增加意味著安全性的降低。(2)認(rèn)證和授權(quán)方式不夠完善。例如密鑰沒有加密或是靜態(tài)加密;一些基于HTTP的認(rèn)證授權(quán)沒有使用安全套接層(SSL,Secure Sockets Layer);自定義的權(quán)限文件AuthZ存在缺陷等。(3)API設(shè)計(jì)者對(duì)Web基本應(yīng)用安全的忽視及對(duì)API的不合理調(diào)用。開發(fā)人員對(duì)安全風(fēng)險(xiǎn)考慮不足,尤其是對(duì)新安全問題缺乏足夠認(rèn)識(shí),或?qū)赡艽嬖诎踩[患的危險(xiǎn)函數(shù)或程序使用不當(dāng)。(4)Mashup的廣泛應(yīng)用使REST安全性降低。不同API聚集使安全風(fēng)險(xiǎn)升高,向Mashup添加新工件或數(shù)據(jù)源會(huì)增加安全漏洞,不同API之間的匿名請(qǐng)求可能存在安全隱患;同源策略無法給予網(wǎng)絡(luò)保護(hù)。
通過對(duì)REST架構(gòu)和常見安全隱患的分析發(fā)現(xiàn),與REST密切相關(guān)的安全問題包括注入攻擊、跨站腳本攻擊、跨站請(qǐng)求偽造和會(huì)話固定攻擊等。其中跨站腳本攻擊、注入式攻擊在發(fā)生時(shí)有一個(gè)共同點(diǎn),即攻擊者都是通過偽造URL參數(shù)或輸入數(shù)據(jù)來實(shí)現(xiàn)對(duì)基于REST的應(yīng)用程序的攻擊;另外,中斷認(rèn)證和會(huì)話固定以及跨站腳本偽造等攻擊手段都是通過與服務(wù)器傳遞給用戶的會(huì)話ID實(shí)現(xiàn)的,而很多基于REST應(yīng)用的會(huì)話ID都會(huì)保存在cookie中,所以,會(huì)話類攻擊可以通過對(duì)cookie進(jìn)行處理加以防范。
本文采取的防范策略結(jié)構(gòu)如圖1所示。
圖1 策略方案基本框架結(jié)構(gòu)
(1)參數(shù)化查詢。設(shè)計(jì)與數(shù)據(jù)庫鏈接或訪問數(shù)據(jù)時(shí),使用參數(shù)給的值填入需要添加的地方,這樣就將執(zhí)行代碼與數(shù)據(jù)分離。(2)輸入信息檢測(cè)。輸入信息檢測(cè)會(huì)在服務(wù)器與用戶端進(jìn)行,用戶端會(huì)檢測(cè)用戶輸入信息,服務(wù)器端則檢測(cè)HTTP請(qǐng)求頭中的Content-Type、Host、Content-Length等信息,以及報(bào)文體的用戶輸入信息,檢測(cè)輸入的格式、地址、長度等。為確保檢測(cè)效果,本文采用客戶端和服務(wù)器端雙重檢測(cè)的策略。(3)屏蔽返回的出錯(cuò)信息。輸入錯(cuò)誤時(shí),響應(yīng)報(bào)文要使瀏覽器只顯示一種錯(cuò)誤信息。(4)過濾危險(xiǎn)字符。服務(wù)器端要過濾掉敏感字符,同時(shí)可使用白名單機(jī)制,只允許名單內(nèi)的用戶通過。
(1)對(duì)輸入進(jìn)行驗(yàn)證??稍诜?wù)器與用戶端進(jìn)行,檢測(cè)的內(nèi)容與注入式攻擊的檢測(cè)相似,除了檢測(cè)HTTP請(qǐng)求頭中的Content-Type、Host、Content-Length等信息外,服務(wù)器端還要檢測(cè)報(bào)文體中用戶輸入的語法。(2)對(duì)輸出進(jìn)行檢查并指定編碼方式。字符串過濾過程中API需要把過濾規(guī)則和數(shù)據(jù)庫及前臺(tái)共享。對(duì)輸出進(jìn)行編碼必不可少,HTTP響應(yīng)報(bào)文頭的charset對(duì)此做了規(guī)定。(3)對(duì)字符串過濾。本文采用白名單機(jī)制,也就是只允許指定語法的輸入信息通過,這樣對(duì)安全性更有保障。
(1)會(huì)話超時(shí)機(jī)制。瀏覽器與服務(wù)器建立通信時(shí)不使用長連接,使HTTP請(qǐng)求與響應(yīng)報(bào)文的Connection項(xiàng)是close狀態(tài)。(2)同步令牌機(jī)制。典型的是使用一次性令牌策略,要求服務(wù)器對(duì)每個(gè)響應(yīng)報(bào)文都重新發(fā)送會(huì)話令牌Set-Cookie。(3)雙向認(rèn)證機(jī)制。檢測(cè)報(bào)文體的用戶輸入,發(fā)現(xiàn)相關(guān)事務(wù)會(huì)要求用戶端的再次確認(rèn)。(4)挑戰(zhàn)應(yīng)答機(jī)制。需要服務(wù)器端增加挑戰(zhàn)應(yīng)答引擎,在響應(yīng)報(bào)文中增加一項(xiàng)給用戶傳送“挑戰(zhàn)”字符串,用戶的請(qǐng)求報(bào)文也要增加一項(xiàng)“應(yīng)答”字符串。(5)驗(yàn)證請(qǐng)求來源。就是驗(yàn)證HTTP請(qǐng)求報(bào)文頭的Referer字段。
(1)拒絕用戶指定會(huì)話標(biāo)識(shí)。即Cookie項(xiàng)由服務(wù)器端賦值,通過響應(yīng)報(bào)文的Set-Cookie進(jìn)行賦值。(2)使用更安全的會(huì)話標(biāo)識(shí)。要求服務(wù)器產(chǎn)生Set-Cookie項(xiàng)的引擎更加強(qiáng)大,使用更復(fù)雜的算法產(chǎn)生更難破解的隨機(jī)數(shù)。(3)會(huì)話標(biāo)識(shí)綁定網(wǎng)絡(luò)地址。要求Set-Cookie項(xiàng)與用戶的IP地址相關(guān),服務(wù)器端要增加一個(gè)檢測(cè)會(huì)話標(biāo)識(shí)與IP地址相關(guān)度的引擎。
本文使用SQL injection中的1‘or’1‘=’1方式來演示注入式攻擊,這里注入下列攻擊代碼:Fei' OR '1'='1。
系統(tǒng)檢測(cè)到敏感字段,發(fā)出注入式攻擊的警報(bào)并生成日志對(duì)這次攻擊進(jìn)行了記錄,如圖2所示。采用本文的REST安全模型,系統(tǒng)對(duì)用戶進(jìn)行輸入檢測(cè)及過濾并使用參數(shù)化查詢等策略有效防范了這次攻擊。
圖2 SQL注入攻擊警報(bào)檢測(cè)記錄
本文使用存儲(chǔ)型XSS攻擊,在頁面代碼中添加一個(gè)惡意的JavaScript腳本,被攻擊者在點(diǎn)擊被注入的腳本時(shí)瀏覽器執(zhí)行腳本中的惡意代碼,完成XSS攻擊。示例演示通過惡意腳本獲取被攻擊用戶的cookie,添加的腳本代碼為:
系統(tǒng)在檢測(cè)到敏感字段后產(chǎn)生的XSS攻擊記錄如圖3所示。
圖3 XSS攻擊檢測(cè)記錄
對(duì)CSRF攻擊檢測(cè)示例中攻擊者編寫一個(gè)帶惡意請(qǐng)求的HTML文件,例如惡意請(qǐng)求為轉(zhuǎn)移5000資金,在REST中具體實(shí)現(xiàn)的過程是先創(chuàng)建一個(gè)轉(zhuǎn)賬交易資源transferFunds,然后加入?yún)?shù)。本文采用如下代碼:
被攻擊者通過驗(yàn)證產(chǎn)生cookie,攻擊者利用上面的惡意請(qǐng)求使用此cookie訪問信任網(wǎng)站,實(shí)現(xiàn)轉(zhuǎn)移資金的操作,完成CSRF攻擊。系統(tǒng)檢測(cè)到輸入會(huì)造成CSRF攻擊產(chǎn)生的記錄,同時(shí)系統(tǒng)發(fā)出警報(bào),如圖4所示。系統(tǒng)采用會(huì)話超時(shí)機(jī)制、令牌同步機(jī)制、雙向認(rèn)證機(jī)制策略有效防范了這種攻擊。
圖4 CSRF攻擊檢測(cè)記錄
對(duì)會(huì)話固定攻擊的檢測(cè)里攻擊者在郵件中加入如下代碼:
其中SID表示要被用來固定的會(huì)話令牌,服務(wù)器端通過rewrite規(guī)則實(shí)現(xiàn)REST風(fēng)格。收信者按照郵件的鏈接登錄基于REST應(yīng)用后,攻擊者得到收信者的權(quán)限,實(shí)施會(huì)話固定攻擊。系統(tǒng)采用會(huì)話超時(shí)機(jī)制、令牌同步機(jī)制、雙向認(rèn)證機(jī)制策略避免這種攻擊。
檢測(cè)結(jié)果表明本系統(tǒng)能有效識(shí)別并防范注入式攻擊、XSS攻擊、CSRF攻擊及會(huì)話固定攻擊等REST常見安全問題,同時(shí)能給出詳細(xì)攻擊信息。
本文通過對(duì)REST安全性的分析與總結(jié),找出REST常見的安全問題及可以使用的安全策略。建立了REST安全檢測(cè)系統(tǒng),并通過攻擊演示證明系統(tǒng)的可用性。測(cè)試結(jié)果表明,采用本文的安全檢測(cè)系統(tǒng)能有效檢測(cè)并防御REST常見安全問題。下一步的工作是增強(qiáng)系統(tǒng)檢測(cè)庫的自我學(xué)習(xí)能力,使其能自主分析問題,更新檢測(cè)規(guī)則,提高檢測(cè)效率。同時(shí)提出更高效的實(shí)現(xiàn)機(jī)制,并且通過仿真過程驗(yàn)證系統(tǒng)的科學(xué)性、算法的復(fù)雜度、實(shí)現(xiàn)機(jī)制的可行性。
[1]馮新?lián)P,沈建京.REST和RPC:兩種Web服務(wù)架構(gòu)風(fēng)格比較分析[J].小型微型計(jì)算機(jī)系統(tǒng),2010,12(7):1393-1395.
[2]Joe Gregorio. REST and WS[OL]. http://bitworking.org/news/125/REST-and-WS,2007.
[3]Pete Soderling, Chris Comerford. Why REST Security Doesn’t Exist(and What to Do About It)[C]. RSA CONFERENCE ,2010.
[4]陳 磊. REST的真諦[J].軟件世界,2007(17).