摘 要:在詳細(xì)研究攻擊實(shí)例的基礎(chǔ)上,從攻擊成功的根本原因出發(fā),提出了一種新的重放攻擊分類方法。該分類方法能夠更清楚地認(rèn)識到重放攻擊的原理和本質(zhì),并針對不同的重放種類給出了避免攻擊的原則性方法,對協(xié)議的設(shè)計(jì)和分析起到了借鑒作用。
關(guān)鍵詞:安全協(xié)議; 重放攻擊; 形式化分析
中圖分類號:TP393文獻(xiàn)標(biāo)志碼:A
文章編號:1001—3695(2007)03—0135—05
安全協(xié)議用來具體實(shí)現(xiàn)安全共享網(wǎng)絡(luò)資源的需求,因此它的安全性是網(wǎng)絡(luò)安全的重要因素之一。但是人們精心設(shè)計(jì)并得到廣泛應(yīng)用的多個安全協(xié)議近年來被證實(shí)并不如預(yù)期的那樣安全,例如,Needham—Schroeder公鑰協(xié)議在使用多年后才被證實(shí)是有缺陷的[1]。為了保證協(xié)議的安全性,人們在協(xié)議安全性分析上投入了大量的精力。但目前工作主要都是從協(xié)議本身出發(fā),或者對協(xié)議的正確性進(jìn)行證明[2—4],或者進(jìn)行狀態(tài)搜索判斷是否能達(dá)到不安全狀態(tài)[5]。本文從另一方面出發(fā),考慮對協(xié)議構(gòu)成安全威脅的攻擊類型和攻擊者行為,結(jié)合具體協(xié)議的攻擊實(shí)例,深入研究了危害較大同時也是最常見的攻擊類型——重放攻擊,并提出了一種新的重放攻擊分類。
1 研究背景
安全協(xié)議是網(wǎng)絡(luò)安全的一個重要組成部分,用于實(shí)體之間的認(rèn)證、安全地分配密鑰或傳遞秘密、保證發(fā)送和接收的消息的非否認(rèn)性等。眾所周知,安全協(xié)議的分析一直是安全研究領(lǐng)域的一個難題,因此也吸引了許多學(xué)者的興趣,但目前的工作主要集中在安全協(xié)議的形式化分析方法以及自動分析工具的研究應(yīng)用上。近年來國外已有多位學(xué)者對攻擊類型和攻擊者行為進(jìn)行了研究并形成了一些文獻(xiàn)資料,其中影響最廣泛的是Ulf Carlsen的《Cryptographic Protocol Flaws》[6],該文將協(xié)議缺陷分為基本協(xié)議缺陷、密碼猜測缺陷、新鮮性缺陷、Oracle缺陷、消息類型缺陷、內(nèi)部缺陷和加密系統(tǒng)相關(guān)缺陷等幾大類。2000年Chong Xu等人在[7]根據(jù)攻擊行為的目的對攻擊行為進(jìn)行了分類,即破壞認(rèn)證正確性;獲取秘密;破壞認(rèn)證+秘密獲取;破壞認(rèn)證+使用過時秘密欺騙;破壞認(rèn)證+偽造秘密;偽造消息和會話欺騙。1995年,Martin Abadi和Roger Needham[8]從工程的角度出發(fā),提出了加密協(xié)議設(shè)計(jì)過程中應(yīng)該遵循的十一條原則,其中最基礎(chǔ)也是最重要的是頭兩條:①協(xié)議中的每一條消息都應(yīng)該是清晰無二義的;消息的含義僅由消息的內(nèi)容決定。②協(xié)議能正確執(zhí)行的條件應(yīng)該清楚地體現(xiàn)在協(xié)議規(guī)范中,使得協(xié)議使用者能夠判斷該協(xié)議是否滿足應(yīng)用需要。
國內(nèi)很多科研院所也有一些攻擊方面的研究論文[9—11],但遺憾的是大都只停留在對已知或自己發(fā)現(xiàn)的攻擊方法進(jìn)行列舉的層次上,沒有更進(jìn)一步從攻擊原因上進(jìn)行深入研究。
2 Syverson重放攻擊分類
重放攻擊(Replay Attacks)也稱為新鮮性攻擊(Freshness Attacks),即攻擊者通過重放消息或消息片段達(dá)到對主體進(jìn)行欺騙的攻擊行為,其主要用于破壞認(rèn)證正確性[12]。重放攻擊是攻擊行為中危害較為嚴(yán)重的一種。假如客戶C通過簽名授權(quán)銀行B轉(zhuǎn)賬給A,如果攻擊者P竊聽到該消息,并在稍后重放該消息,銀行將認(rèn)為客戶需要進(jìn)行兩次轉(zhuǎn)賬,從而使客戶賬戶遭受損失。Paul Syverson在[13]給出了重放攻擊的分類:根據(jù)消息重放是否發(fā)生在產(chǎn)生消息的協(xié)議輪內(nèi)將其分為內(nèi)部重放攻擊(Internal Attacks)和外部重放攻擊(External Attacks)。外部重放攻擊又根據(jù)是否需要不同協(xié)議輪的同時執(zhí)行而分為經(jīng)典重放攻擊(Classic Replays)和交錯攻擊(Interleaving Replay)。他還提出了另一種分類方法,根據(jù)重放消息的接收方與消息的原定接收方的關(guān)系分為轉(zhuǎn)向重放(Deflection Replays)和直接重放(Straight Replays)。其中轉(zhuǎn)向重放又可以根據(jù)重放消息的接收方是否為原發(fā)送方分為反射重放(Reflection Replays)和第三方重放。其中,直接重放攻擊的發(fā)送方和接收方均不變,前面所舉客戶—銀行轉(zhuǎn)賬的例子就屬于直接重放攻擊。這兩種分類方法互相獨(dú)立,因此這兩種方法的交叉積確定了一個更為精確的分類方法,如圖1所示。
值得指出的是,Syverson的重放攻擊分類是完全的但不是排他的,也就是說,針對任何協(xié)議的具體的重放攻擊一定落在上述某個類別中,但不局限于一個類別。因?yàn)橐粋€成功的重放攻擊可能需要多次消息的重放才能完成。例如,對CCITT x.509協(xié)議[14,15]的攻擊中,消息β.1屬于交錯重放攻擊+直接重放;消息β.3屬于交錯重放攻擊+第三方重放。
攻擊1
本文認(rèn)為Syverson的重放攻擊分類方法并不十分完善。Syverson的分類法沒有從本質(zhì)上說明攻擊能夠成功的原因,僅僅是從重放消息的起源和接收方等表象上來簡單區(qū)分,而如何對協(xié)議進(jìn)行改進(jìn)從而避免類似攻擊等深層問題均無法體現(xiàn)出來。例如Lowe發(fā)現(xiàn)的對Needham—Schroder公鑰協(xié)議的攻擊[1]如下所示:
攻擊2
根據(jù)重放攻擊的定義,該攻擊屬于消息片段重放攻擊,盡管消息重放中包含了加/解密操作。因?yàn)橄⒌闹胤虐l(fā)生在當(dāng)前協(xié)議輪外,并且需要多個協(xié)議輪的并發(fā)執(zhí)行完成攻擊,故根據(jù)Syverson分類法屬于交錯重放攻擊;若就重放消息接收方分類,則屬于第三方重放。但是協(xié)議認(rèn)證目標(biāo)失敗的根本原因是協(xié)議中的第三條消息缺乏主體接收標(biāo)志,只有解決了這個問題,才能有效避免此類攻擊。而這些均是Syverson分類方法沒有涉及的。
因此本文在Ulf Carlsen攻擊分類法的基礎(chǔ)上,將其中的重放攻擊從原因上分成了缺乏足夠的握手信息、缺乏相關(guān)主體標(biāo)志、消息結(jié)構(gòu)相似、含有無法識別的加密信息等。這種分類方法對更好地認(rèn)識各種攻擊的原理并尋找具體的解決措施具有積極意義。
3 新的重放攻擊分類
3.1 缺乏新鮮性檢查機(jī)制導(dǎo)致的重放攻擊
缺乏新鮮性檢查機(jī)制應(yīng)該是導(dǎo)致重放攻擊最常見的原因之一。正因?yàn)槿绱耍胤殴粢卜Q為新鮮性攻擊。最常用的新鮮性檢查機(jī)制就是時間戳[16]和挑戰(zhàn)—應(yīng)答機(jī)制[17]。消息附帶的時間戳標(biāo)明該消息生成的系統(tǒng)時間,時間戳能夠保證消息在一段時間內(nèi)的新鮮性,主體只接收時間戳與當(dāng)前系統(tǒng)時間的差值在設(shè)定范圍之內(nèi)的消息。雖然攻擊者有可能通過改變接收主體的系統(tǒng)時間讓主體接收一條已經(jīng)過期的消息,但這屬于系統(tǒng)相關(guān)的攻擊[18],超出了本文的討論范圍。大嘴青蛙協(xié)議采用了消息中加時間戳的方式來保證消息的新鮮性:
是否給關(guān)鍵信息加上了時間戳就可以保證協(xié)議可以抵抗重放攻擊呢?答案是否定的,因?yàn)闀r間戳機(jī)制只能保證消息是在最近一段時間內(nèi)生成的,但不能保證消息的確定性和唯一性。例如,大嘴青蛙協(xié)議中,攻擊者在一定的間隔時間內(nèi)既可以重放第一條消息:
攻擊4
使得B認(rèn)為A想與之建立兩個連接,因此需要使用另一種常用的新鮮性檢查機(jī)制。挑戰(zhàn)—應(yīng)答機(jī)制就是消息的接收主體(假設(shè)為B),隨機(jī)生成一個臨時值發(fā)給消息聲稱的發(fā)送主體(假設(shè)為A)。如果能夠收到用A的私有密鑰加密或者A和B共同的會話密鑰加密的確認(rèn)消息,則認(rèn)為原消息是新鮮的。使用隨機(jī)數(shù)挑戰(zhàn)—應(yīng)答機(jī)制能夠保證消息發(fā)送方的確定性,防止由于協(xié)議結(jié)構(gòu)過于簡單、缺乏足夠的握手和確認(rèn)信息導(dǎo)致的攻擊。改進(jìn)后的大嘴青蛙協(xié)議[19]形式如下:
時間戳和挑戰(zhàn)—應(yīng)答機(jī)制都能提供一些消息的新鮮性保證,需要根據(jù)不同的情況合理使用。為了達(dá)到抵抗重放攻擊的目的,有些情況下需要兩種方法共同使用。
N—S對稱密鑰協(xié)議中,S生成A和B的會話密鑰后發(fā)送給A,同時將會話密鑰與發(fā)起者A的身份標(biāo)志加密后作為令牌由A傳遞給B。問題就出現(xiàn)在這里,攻擊者可能已經(jīng)通過密碼分析等方法破解了KAB,因此攻擊者有可能在后面的會話中冒充A重放消息3,使得B以為已被破解的KAB就是S新分配給A和B的當(dāng)前會話密鑰:
攻擊5
此次攻擊除了需要密鑰分析、密鑰驗(yàn)證等方法輔助外,協(xié)議本身的缺陷在于無法保證KAB的新鮮性,即消息3的新鮮性。即使B通過隨機(jī)數(shù)Nb的挑戰(zhàn)—應(yīng)答方式進(jìn)行了確認(rèn),在攻擊者可能破解會話密鑰的條件下,只能保證持有密鑰的另一方的存在性(Aliveness)和確定性,而不能保證這個密鑰就是S新分配的會話密鑰。解決方法之一[20]是在消息2和3中加入時間戳,標(biāo)明密鑰創(chuàng)建的時間。這樣在時間戳和挑戰(zhàn)—應(yīng)答機(jī)制的共同作用下,就能滿足協(xié)議抵抗重放攻擊的要求了。
3.2 缺乏主體標(biāo)志導(dǎo)致的重放攻擊
Abadi和Needham[8]提出的協(xié)議設(shè)計(jì)第三條原則:“如果主體的身份對消息的意義有彌足輕重的作用,消息中必須明確包含對應(yīng)的主體名稱。”但是這點(diǎn)似乎并沒有引起足夠的重視,目前許多已知的重放攻擊都是缺乏主體標(biāo)志導(dǎo)致的。例如,上文中針對CCITT x.509協(xié)議的攻擊1和針對N—S公鑰協(xié)議的攻擊2成功的根本原因均是協(xié)議消息中缺乏接收主體標(biāo)志。避免此類攻擊的方法也很簡單,就是在協(xié)議消息中添加足夠的主體標(biāo)志,而不要為了簡化協(xié)議省去關(guān)鍵信息。
攻擊6
顯而易見,攻擊6成功的根本原因就是消息3中沒有足夠的信息標(biāo)明消息接收方的身份,從而導(dǎo)致接收方可以向第三方重放此消息進(jìn)行欺騙。對SSL協(xié)議的改進(jìn)就是在消息α.3中加入接收主體身份B,即
易于遭受此類攻擊的還有Woo—Lam協(xié)議,被攻擊的協(xié)議序列如下:
攻擊7
攻擊成功的根本原因是S返回給B用于證實(shí)發(fā)起者身份的消息5缺乏身份標(biāo)志,其改進(jìn)方法同樣是在消息中加上主體標(biāo)志。消息5變成
3.3 消息格式相同導(dǎo)致的重放攻擊
如果協(xié)議中兩條消息格式完全相同,特別是在協(xié)議總共只有兩條消息的情況下,這時很容易發(fā)生重放攻擊。因?yàn)橄⒏袷酵耆嗤粽呖梢詫⑾⒎瓷渲胤沤o發(fā)送者,使發(fā)起者以為是另一輪會話的開始,混淆主體在協(xié)議中的通信角色。例如,針對大嘴青蛙協(xié)議的另外一種重放攻擊形式:
攻擊8
攻擊8中,β.1重放消息α.2;γ.1重放消息β.2。協(xié)議認(rèn)證目標(biāo)失敗的原因則是原協(xié)議中兩條消息格式完全相同,即使有時間戳保證消息的新鮮性,攻擊者仍然可以利用時間戳在一段時間內(nèi)有效的特性進(jìn)行重放,不斷更新時間戳,達(dá)到攻擊目的。
中國科學(xué)院軟件研究所王貴林等人發(fā)現(xiàn)對A(0)協(xié)議[21]的攻擊,究其根本,攻擊能夠成功的根本原因也是因?yàn)锳(0)協(xié)議的兩條消息格式完全相同。避免此類攻擊的方法也很簡單,改變消息格式即可。大嘴青蛙的改進(jìn)協(xié)議為
3.4 類型缺陷而導(dǎo)致的重放攻擊
本文認(rèn)為Carlsen分類法中的類型缺陷攻擊[22,23]也可以劃歸到重放攻擊中。類型缺陷是由于消息項(xiàng)的類型存在二義性導(dǎo)致的缺陷。例如,對Andrew RPC協(xié)議就可能存在如下攻擊[24]:
攻擊9
攻擊者可以通過重放協(xié)議中的消息2作為消息4,使得A認(rèn)為Na+1就是協(xié)商的新會話密鑰。這樣的密鑰是不符合密鑰選擇安全標(biāo)準(zhǔn)的。
攻擊10
攻擊者A重放協(xié)議的消息1給A。如果主體A沒有相應(yīng)的類型檢查機(jī)制,就會誤以為MAB是S分配給它用于與B通信的會話密鑰。
這里需要特別指出的是,如果消息中含有接收主體無法識別的加密信息,更加需要警惕,防止此類重放攻擊。例如,第3.2節(jié)中通過在消息中增加主體信息得到的Woo—Lam改進(jìn)協(xié)議1 描述為
這樣雖然攻擊7不能成功,但又出現(xiàn)了一種新的攻擊方法[10]:
攻擊11
攻擊者冒充A向B發(fā)起連接,在消息3中將B給出的隨機(jī)數(shù)直接返回給B,而不是加密后返回。由于B無法識別用A和S的會話密鑰加密的信息,不作檢查;加上A的身份標(biāo)志后發(fā)給S,消息被攻擊者截獲,而這個消息恰恰就是B想要從S得到的證實(shí)信息,因此I直接將其返回給B,就完成了這次攻擊。顯然,攻擊成功的主要原因是主體B不能識別消息3,實(shí)際上這也屬于類型缺陷攻擊的一種。解決方法仍是給消息項(xiàng)加上類型標(biāo)簽,并且在協(xié)議實(shí)施中強(qiáng)制主體在接收消息前進(jìn)行類型檢查。
文獻(xiàn)[23]提出了一種防止類型缺陷攻擊的有效方法,即為每個消息項(xiàng)加上類型標(biāo)簽,并且在協(xié)議實(shí)施中使主體在接收消息前進(jìn)行類型檢查;如果類型檢查失敗則拒收該消息。這樣就能有效防止因?yàn)轭愋腿毕荻鴮?dǎo)致的重放攻擊。
3.5 多協(xié)議交互導(dǎo)致的重放
系統(tǒng)中有多個協(xié)議同時運(yùn)行[26]的情況是非常普遍的。由于證書和加密API等的使用,主體可能在不同的協(xié)議中使用相同的密鑰尤其是私鑰。假設(shè)協(xié)議P1和P2使用相同的密鑰格式,如果P1中產(chǎn)生的消息能夠被攻擊者利用來發(fā)起對P2的攻擊,則稱P1和P2是交互[27]的。例如,A與攻擊者I進(jìn)行正常會話,執(zhí)行協(xié)議P1,攻擊者有可能利用A產(chǎn)生的消息冒充A與B通信,執(zhí)行協(xié)議B。這種情況下即是發(fā)生了消息的協(xié)議間重放,如圖2所示。
這是重放攻擊中最復(fù)雜的一種,想要避免此類重放造成的攻擊,需要改進(jìn)的不只是協(xié)議本身,而是需要從系統(tǒng)角度出發(fā)進(jìn)行調(diào)整。根本原則就是使不同協(xié)議的不同主體發(fā)出的消息能夠被識別。例如J.D.Guttman提出的不相交加密方案[28];文獻(xiàn)[6,29]提出的給系統(tǒng)中每個主體發(fā)出的每條消息加上足夠的信息,如協(xié)議標(biāo)志符、協(xié)議步驟標(biāo)志符、消息項(xiàng)標(biāo)志符、類型標(biāo)志符、協(xié)議輪標(biāo)志符等,使得主體能夠判斷出任何一條消息屬于哪個協(xié)議輪的哪個狀態(tài);文獻(xiàn)[30]提出使用不同的加密函數(shù),并且在每條消息中加入主體應(yīng)該達(dá)成共識的所有信息的Hash值。上述方法都能夠有效預(yù)防協(xié)議間重放的發(fā)生,但是在實(shí)際應(yīng)用中往往由于實(shí)現(xiàn)復(fù)雜、開銷太大而沒有得到應(yīng)用。本文的建議是在系統(tǒng)中選用不同的協(xié)議協(xié)同工作時,事先充分考慮到不同協(xié)議的交互性,從而最大限度地避免協(xié)議間重放的發(fā)生。
4 結(jié)束語
本文首先分析了Syverson對重放攻擊分類方法的不足,在研究重放攻擊特性后提出了自己的分類方法,即根據(jù)重放攻擊成功的起因,將重放攻擊分為缺乏新鮮性檢查機(jī)制導(dǎo)致的攻擊、缺乏主體標(biāo)志導(dǎo)致的攻擊、消息結(jié)構(gòu)相似導(dǎo)致的攻擊、類型缺陷導(dǎo)致的攻擊和多協(xié)議交互導(dǎo)致的攻擊五類,并且對每種重放攻擊都給出了具體的實(shí)例和原則性的解決方法。希望本文能對協(xié)議的設(shè)計(jì)和分析起到借鑒作用,從根本上避免重放攻擊的發(fā)生。接下來的工作重點(diǎn)將放在最復(fù)雜的一種重放攻擊,即多協(xié)議系統(tǒng)中的重放攻擊上,爭取找出一種理論上和實(shí)際應(yīng)用中都可行的規(guī)避此類攻擊的方法。
本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。