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