王效武,劉 英
(中國電子科技集團公司第三十研究所,四川 成都 610041)
網(wǎng)絡(luò)中運行良好的通信協(xié)議,不僅應(yīng)該具有有效性、公平性和完整性,而且應(yīng)該具有足夠高的安全性。通常我們把具有安全功能的協(xié)議稱為安全協(xié)議,其安全性質(zhì)主要有認證性、機密性、完整性、非否認性和新鮮性等。安全協(xié)議是網(wǎng)絡(luò)安全的重要組成部份,多年來,雖說安全協(xié)議的研究取得了豐碩的成果,但很多現(xiàn)在使用的安全協(xié)議都存在一些潛在的攻擊漏洞,威脅協(xié)議安全的攻擊主要有篡改攻擊、替換攻擊、假冒攻擊、重放攻擊等。重放攻擊對于協(xié)議來說是最為常見的一類攻擊,而且是危害較為嚴重的一種。如,攻擊者竊取了警務(wù)調(diào)控系統(tǒng)往年的任務(wù)調(diào)度信息,發(fā)起攻擊時,將往年的任務(wù)調(diào)度信息重發(fā)給各警務(wù)人員,讓警務(wù)人員誤以為有新的出警任務(wù),導(dǎo)致真實發(fā)生的犯罪行為無法及時應(yīng)對,使社會治安處于混亂狀態(tài)。又如,客戶通過認證授權(quán)銀行轉(zhuǎn)賬給其它客戶,如果攻擊者竊聽到該消息,并在稍后重放該消息,銀行將認為客戶需要進行兩次轉(zhuǎn)賬,從而使客戶遭受損失[1]。
重放攻擊是最基本、最常用、危害性最大的一種攻擊形式,在這里對重放攻擊防御手段進行討論,進一步完善協(xié)議的設(shè)計,使通信網(wǎng)絡(luò)更具安全性。
重放攻擊(Replay Attacks)又稱為新鮮因子攻擊(Freshness Attacks),俗稱復(fù)制攻擊,是指攻擊者竊取以前運行的協(xié)議或當(dāng)前運行的協(xié)議中的消息或消息片段用于對當(dāng)前協(xié)議運行進行欺騙的攻擊行為,其主要用于破壞認證正確性[2]。
重放攻擊按攻擊層次主要分為消息塊重放、消息塊間重放、協(xié)議步間重放和協(xié)議間重放,按攻擊對象分為直接重放(消息被轉(zhuǎn)發(fā)給預(yù)定的接收者,但具有一定的延遲)、反射重放(消息被回發(fā)給發(fā)送者)、轉(zhuǎn)移重放(消息轉(zhuǎn)發(fā)給第三者)[3]。
無論是哪一種重放攻擊類型都是對協(xié)議新鮮性的攻擊,協(xié)議缺乏新鮮性檢查機制是導(dǎo)致被重放攻擊的主要原因,其防御手段需要在協(xié)議中注入新鮮因子,并保持消息塊、協(xié)議間的新鮮性。常用的新鮮因子主要有時間戳、隨機數(shù)、序列號等。
(1)時間戳
最常用的新鮮性檢查機制就是時間戳,消息中附帶的時間戳標(biāo)明該消息生成的系統(tǒng)時間,時間戳能夠保證消息在一段時間內(nèi)的新鮮性,接收方只認可時間戳與當(dāng)前系統(tǒng)時間的差值在設(shè)定范圍之內(nèi)的消息。因為時間戳是有設(shè)定范圍的,只能保證消息是在最近一段時間內(nèi)生成的,但不能保證消息的唯一性,攻擊者可能會利用這個漏洞進行重放攻擊,甚至攻擊者有可能通過改變接收方的系統(tǒng)時間,讓接收方接收已經(jīng)過期的消息。
(2)隨機數(shù)
隨機數(shù)也是協(xié)議設(shè)計中常用的新鮮因子,是一種基于隨機數(shù)池的新鮮性檢查機制,在發(fā)方和收方都會設(shè)計一定容量的隨機數(shù)池,在每一個協(xié)議發(fā)起時,會產(chǎn)生一個與隨機數(shù)池Rs中的隨機數(shù)不重復(fù)的隨機數(shù)R,即R不屬于Rs,在消息的關(guān)鍵信息中附帶此隨機數(shù)R,收方會將此隨機數(shù)R與本地隨機池Rs’中的隨機數(shù)進行比對,如果沒有重復(fù),則認為此協(xié)議具有新鮮性,并將R存入隨機數(shù)池中。此機制中隨機數(shù)池的容量設(shè)計是關(guān)鍵,需要根據(jù)實際使用情況預(yù)設(shè)隨機數(shù)池的大小,但也因為隨機數(shù)池的容量是有上限的,累計到一定時間,隨機數(shù)池中的隨機數(shù)會重新覆蓋,攻擊者可能會利用這個漏洞進行重放攻擊,讓主體接收一些已經(jīng)過期的消息。
(3)序列號
常見的基于序列號的新鮮性檢查機制,會在協(xié)議的關(guān)鍵消息中附帶一個4字節(jié)大小的序列號,序列號與通信對像綁定則具有延續(xù)性的數(shù)值,如A與B首次交互協(xié)議時,協(xié)議中關(guān)鍵消息附帶序列號為Nab,第二次交互協(xié)議,協(xié)議中附帶序列號為Nab+1,第三次交互協(xié)議時,協(xié)議中附帶序列號為Nab+2。收方只認可序列號在預(yù)先設(shè)定的拉偏范圍之內(nèi)的消息。因為序列號存在一定的位偏,不能保證消息在拉偏范圍內(nèi)的新鮮性,攻擊者可能會利用這個漏洞發(fā)起重放攻擊。
帶方向的重放攻擊防御機制是一種基于方向的新鮮性檢查機制。經(jīng)上分析可以看出,常用的新鮮因子,都有可能被攻擊者利用的漏洞,基于這些安全隱患的思考,提出了一種基于方向的新鮮性檢查機制。
帶方向的重放攻擊防御機制是序列號與應(yīng)答機制、算法機制相結(jié)合的應(yīng)用機制,是面向雙向通信方式設(shè)計的協(xié)議新鮮性檢查機制,以用戶向打車平臺申請打車和打車平臺自動向用戶扣款兩種協(xié)議為例(用戶與打車平臺是典型的客戶端與服務(wù)端的雙向通信)。
用戶端和平臺端同時維護一個序列號對:平臺通信序列號(Serial Number of Server,SNs)和用戶通信序列號(Serial Number of Client,SNc)。SNs作為平臺主動發(fā)起的會話協(xié)議的新鮮因子,SNc作為用戶端主動發(fā)起的會話協(xié)議的新鮮因子。
也就是說平臺通信序列號SNs和用戶通信序列號SNc代表了不同的會話發(fā)起者,是帶有方向感的新鮮因子,基于協(xié)議發(fā)起的方向不同,維護不同的序列號,主要目的是為了解決傳統(tǒng)的序列號新鮮性檢查機制存在拉偏范圍較大,易被攻擊的問題,依據(jù)協(xié)議主體不同維護不同的雙向序列號對,能將拉偏值精確縮小到(-1,+1)范圍,有效的抵抗重放攻擊。
用戶向打車平臺申請打車協(xié)議,是以用戶為會話的發(fā)起方,在協(xié)議中注入用戶通信序列號SNc,此協(xié)議主要流程是用戶發(fā)起打車申請-->平臺處理申請并將派車信息發(fā)送給用戶-->用戶收到后發(fā)送確認應(yīng)答。其協(xié)議模式為“申請——應(yīng)答——確認應(yīng)答”三段式,因用戶為客戶端,所以采用三段式,如下。申請(C->S):{C,Ek[IDC,IDs,SNc,A1],H};應(yīng)答(S->C):{S,Ek[IDs,IDC, SNc++,A2],H};確 認 應(yīng) 答(C->S):{C,Ek[IDC,IDs,SNc++,A3],H}。
打車平臺自動向用戶扣款協(xié)議,是以平臺為會話的發(fā)起方,在協(xié)議中注入平臺通信序列號SNs,此協(xié)議主要流程是平臺發(fā)起扣款指令-->用戶端自動轉(zhuǎn)款并發(fā)送應(yīng)答。其協(xié)議模式為“申請——應(yīng)答”兩段式,如下。
指令(S--->C):{S,Ek[IDs,IDC,SNs,B1],H};
應(yīng) 答(C--->S):{C,Ek[IDC,IDs,SNs++,B2],H}。
(1)拉偏值分析
我們以用戶向打車平臺申請打車協(xié)議流程為例進行拉偏值分析,假設(shè)平臺端、用戶端維護的用戶通信序列號SNc、SNc’初始值為0,序列號處理流程如圖1所示。
組織協(xié)議前,先提取本地存儲的用戶通信序列號,進行累加,附帶在協(xié)議中發(fā)送到對端;收到對端發(fā)送的協(xié)議,首先進行安全性檢查,安全性檢查包括身份合法性、完整性、新鮮性、機密性等驗證,通過安全性檢查后,更新本地存儲的用戶通信序列號,即SNc=SNc'。
如圖1所示,用戶向打車平臺申請打車協(xié)議會話結(jié)束后,平臺端維護的用戶通信序列號SNc=3,用戶端維護的用戶通信序列號SNc'=2;SNc相對于SNc'拉偏值為+1,SNc'相對于SNc拉偏值為-1,這屬于三段式的協(xié)議自然拉偏,其拉偏范圍控制在(-1,+1)范圍內(nèi)。
如果因為網(wǎng)絡(luò)異常,導(dǎo)致某協(xié)議未正常接收,例如用戶端未收到確認應(yīng)答協(xié)議(c),此時,平臺端維護的用戶通信序列號SNc=1,用戶端維護的用戶通信序列號SNc'=2,SNc相對于SNc'拉偏值為-1,SNc'相對于SNc拉偏值為+1,這屬于通信異常拉偏,其拉偏范圍依然控制在(-1,+1)范圍內(nèi)。
從協(xié)議流程可以推導(dǎo)出,無論是通信異常還協(xié)議自然拉偏,平臺通信序列號SNs和用戶通信序列號SNc都能將拉偏范圍鎖定在(-1,+1)范圍內(nèi)。而傳統(tǒng)的序列號處理機制中SNs=SNc,相互交錯,在通信網(wǎng)絡(luò)不穩(wěn)定因素的影響下,其拉偏遠遠大于(-1,+1),且系統(tǒng)越復(fù)雜,其拉偏值越大。
(2)防御能力分析
協(xié)議中注入了主體雙方的ID號、序列號、傳送數(shù)據(jù)、Hash,主體雙方ID號分別為平臺IDs、IDC,傳送方向不同則存儲位置不同(確定數(shù)據(jù)流向及身份信息),采用雜湊算法對協(xié)議全字段明文進行了Hash運算(完整性保護),并對敏感數(shù)據(jù)進行加密處理(機密性保護),這樣,協(xié)議有效的抵抗住了消息塊重放、消息塊間重放、轉(zhuǎn)移重放和反射重放等多種攻擊,是否能抵制協(xié)議步間、協(xié)議間的直接重放,我們以打車平臺自動向用戶扣款協(xié)議流程為例進行分析,見圖2。
①用戶端收到平臺發(fā)來的協(xié)議,提取本地存儲的平臺通信序列號SNs,并完成累加;
②判斷SNs是否屬于(SNs'-1,SNs'+1),如果不屬于,則認為新鮮性不過關(guān),屬新鮮性檢查;
③提取本地存儲的最近收到的協(xié)議包Hash值H',判斷H'是否等于運行協(xié)議的Hash值H,如果相等,則認為新鮮性不過關(guān),屬新鮮性檢查;
④更新H'、SNs',并存儲;
⑤組織應(yīng)答協(xié)議,計算應(yīng)答協(xié)議H',SNs'累加1,并發(fā)送給平臺端。
如圖2所示:平臺端收到應(yīng)答協(xié)議處理流程⑥、⑦、⑧、⑨與①、②、③、④協(xié)議步驟同。
假 設(shè)攻擊者1和攻擊者2竊取了運行協(xié)議(a),攻擊者1進行協(xié)議步間重放攻擊,在用戶端收到協(xié)議(a)后,立即重放協(xié)議(a),企圖讓用戶進行多次扣款。如流程圖所示,在進行同一主體同一流向前后兩協(xié)議的Hash值比對時,就會檢查出協(xié)議的新鮮性不過關(guān),攻擊行為被截止。
攻擊者2進行協(xié)議間重放攻擊,在完成協(xié)議會話后,重放協(xié)議(a),如圖2所示,在進行拉偏范圍(SNs'-1,SNs'+1)比對時,就會檢查出協(xié)議的新鮮性不過關(guān),攻擊行為被截止。
基于方向的重放攻擊防御機制是一種基于雙向通信的新鮮性檢查方法,它是結(jié)合了加密機制、雜湊機制、應(yīng)答機制相結(jié)合的綜合應(yīng)用機制,采用帶方向的持續(xù)累加的序列號作為新鮮因子,并結(jié)合Hash值,用較小的代價實現(xiàn)對消息塊、消息塊間、協(xié)議步間和協(xié)議間,以及直接重放、反射重放、轉(zhuǎn)移重放等各種重放攻擊的有效防御。對通信協(xié)議的安全設(shè)計具有一定的實際應(yīng)用價值,此機制的代價小,尤其適用于窄帶通信,比如PSTN、短波通信等。