共用方式為


實作攔截式攻擊 (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 的通訊,並變更他們傳送給彼此的訊息。這裡說明他是如何達成這項替代:

  1. Alice 以伺服器模式開啟 PublicChannel 管道,並等候 Bob 的連接。

  2. Mallory 以用戶端模式連接 PublicChannel 管道,並接收來自 Alice 的第二個管道名稱 (AliceAndBobChannel)。

  3. Alice 和 Mallory 關閉 PublicChannel 管道。

  4. Alice 以伺服器模式開啟 AliceAndBobChannel 管道,而 Mallory 以用戶端模式連接該管道。

  5. Mallory 以伺服器的角色透過 PublicChannel 管道與 Bob 連接,而 Bob 則以用戶端的角色進行連接。

  6. Mallory 傳送管道名稱 AliceAndBobChannel1 (也就是,他稍微變更過該名稱) 給 Bob。Bob 以為他所收到的這項訊息是來自 Alice。

  7. Mallory 和 Bob 中斷與 PublicChannel 管道的連接。

  8. Mallory 以伺服器的角色開啟 AliceAndBobChannel1 管道,而 Bob 則以用戶端的角色連接該管道。

Mallory 現在已成功讓自己介入 Alice 和 Bob 之間。

Mallory 繼續做為 Alice 的用戶端角色 (透過 AliceAndBobChannel 管道),同時也做為 Bob 的伺服器角色 (透過 AliceAndBobChannel1 管道)。現在,他可以如願讀取、變更和傳輸訊息。不管是 Alice 還是 Bob,都不知道有人正在攔截和變更他們的訊息。

成功的攔截式攻擊通常都設計得很精湛。為了避開偵測,Mallory 會保持低調,並只對銷售連絡資訊進行些微的變更。他不希望他的變更會引起他人的疑竇。

結論

探索攔截式攻擊需要耗費許多時間、耐心和非常謹慎的態度。這個範例只是關係到一個 200 毫秒的等候,這五分之一秒就足以讓整個銷售部門的機密外洩。

請參閱

概念

密碼編譯服務

.NET Framework 密碼編譯模型

密碼編譯服務

其他資源

密碼編譯工作