實作攔截式攻擊 (CNG 範例)
Cryptography Next Generation (CNG) 安全通訊範例將示範攔截式攻擊 (Man-in-the-middle Attack),其中的第三方 (Mallory) 讓自己可以介入兩個通訊端點 (Alice 和 Bob) 之間。
CNG 範例是使用具名管道提供處理序間的通訊。這裡的 Alice 一定是扮演具名管道伺服器的角色,而 Bob 則一定是扮演具名管道用戶端的角色。Mallory 則會假裝為 Alice 的用戶端角色 (也就是模擬成 Bob),並假裝為 Bob 的伺服器角色 (也就是模擬成 Alice)。這稱為替代,是典型的攔截式攻擊。
如需這個案例的詳細資訊,請參閱金鑰和訊息的逐步交換 (CNG 範例)。
CNG 範例中的「模擬」一詞,是用來表示以 Mallory 替代 Bob,或者是以 Mallory 替代 Alice。然而,模擬在有關具名管道方面也具有特定意義,如 NamedPipeServerStream.RunAsClient(PipeStreamImpersonationWorker) 方法的說明文件中所討論。
數位簽章
數位簽章通常是用來防止攔截式攻擊的。一般而言,簽章金鑰是由公開金鑰基礎結構 (PKI) 所提供和維護的。PKI 很少是屬於電腦本機的,通常是由安全性或系統管理員群組或者是憑證授權單位所支援。這類基礎結構的使用並不在本範例所討論的範圍內。相反地,本範例會顯示如何使用 CNG 類別建立本機的數位簽章金鑰。
插入點
攔截式攻擊在信號鏈結中需要有個插入點。當處理訊息的實體硬體裝置遭受破壞時,就可能發生這個情況。例如,在線路被更換過或重設路徑過的情況下,還有電信伺服器遭到破壞並可能發生電路重設時。然而,比較可能的技巧是有關將用於維護網路的軟體進行重新設定。例如,通訊埠發生重新指派或重設路徑,還有在通訊應用程式中建立軟體插入點。
小漏洞
當檔案是以撰寫模式開啟時,其鎖定工作是針對其他應用程式的使用。同樣地,當管道用戶端連結到管道伺服器時,會鎖定該管道供該用戶端所專用,一直到該用戶端中斷連接前,都會維持鎖定狀態。
完成建立的用戶端/伺服器通道是很難闖入的。然而,在 CNG 範例中,Mallory 卻可以輕鬆攔截到並變更 Alice 和 Bob 間的訊息。實際上,Mallory 並沒有闖入建立好的管道通道,而是改為利用公司通訊協定所忽略的小漏洞。
Alice 和 Bob 接獲指示要使用 PublicChannel 管道共用私用通道名稱,然後再使用該私用通道交換銷售連絡資訊。這些指示讓 Mallory 得以取得私用通道名稱,並讓自己介入 Alice 和 Bob 間。接下來的兩個小節會說明這是如何發生的。
計時
通常,成功的攔截式攻擊取決於某個微妙的小地方,例如時間安排。CNG 範例將會示範這個概念。
Mallory 知道公司開發的新即時訊息 (IM) 軟體需仰賴具名管道,並知道 Alice 和 Bob 會開啟名為 PublicChannel 的管道,還知道 Alice 會傳送第二個管道名稱給 Bob。Alice 和 Bob 將關閉 PublicChannel 管道,然後再開啟並使用第二個管道,以交換有關銷售連絡的資訊。
為了竊取銷售連絡資訊,Mallory 必須從 Alice 處取得第二個管道名稱,並防止 Bob 得到該名稱。若要達到這個目的,他所必須做的就是在 Bob 前,先開啟 PublicChannel 管道的用戶端端點。
Bob 的 Run 方法原始程式碼中,使用 System.Threading.Thread.Sleep(200) 陳述式允許 200 毫秒的等候,讓這個欄截工作得以發生。您可以很容易看到刻意安排的 wait 陳述式,因為本範例的目的在於示範攔截式攻擊。在實際的情況下,安全性案例的分析就難的多了。其中牽涉到軟體應用程式、傳輸通訊協定、網路驗證、使用者帳戶、登入、權限、使用者訓練、流量監視和其他分析技巧的混合運用。
先不論這些複雜的方法,光是網路伺服器中簡單的 200 毫秒傳用延遲,就可以輕鬆躲過好幾個月而不被察覺。這也就是在 CNG 範例中,為什麼要建立 5 個個別的版本,最後才能終止資料竊取的原因。
替代
藉由攔截第二個管道名稱 (AliceAndBobChannel),Mallory 能夠竊聽 Alice 和 Bob 的通訊,並變更他們傳送給彼此的訊息。這裡說明他是如何達成這項替代:
Alice 以伺服器模式開啟 PublicChannel 管道,並等候 Bob 的連接。
Mallory 以用戶端模式連接 PublicChannel 管道,並接收來自 Alice 的第二個管道名稱 (AliceAndBobChannel)。
Alice 和 Mallory 關閉 PublicChannel 管道。
Alice 以伺服器模式開啟 AliceAndBobChannel 管道,而 Mallory 以用戶端模式連接該管道。
Mallory 以伺服器的角色透過 PublicChannel 管道與 Bob 連接,而 Bob 則以用戶端的角色進行連接。
Mallory 傳送管道名稱 AliceAndBobChannel1 (也就是,他稍微變更過該名稱) 給 Bob。Bob 以為他所收到的這項訊息是來自 Alice。
Mallory 和 Bob 中斷與 PublicChannel 管道的連接。
Mallory 以伺服器的角色開啟 AliceAndBobChannel1 管道,而 Bob 則以用戶端的角色連接該管道。
Mallory 現在已成功讓自己介入 Alice 和 Bob 之間。
Mallory 繼續做為 Alice 的用戶端角色 (透過 AliceAndBobChannel 管道),同時也做為 Bob 的伺服器角色 (透過 AliceAndBobChannel1 管道)。現在,他可以如願讀取、變更和傳輸訊息。不管是 Alice 還是 Bob,都不知道有人正在攔截和變更他們的訊息。
成功的攔截式攻擊通常都設計得很精湛。為了避開偵測,Mallory 會保持低調,並只對銷售連絡資訊進行些微的變更。他不希望他的變更會引起他人的疑竇。
結論
探索攔截式攻擊需要耗費許多時間、耐心和非常謹慎的態度。這個範例只是關係到一個 200 毫秒的等候,這五分之一秒就足以讓整個銷售部門的機密外洩。