前面兩天談的防火牆跟網路協定,防的是「有人直接闖進來」。今天要談的中間人攻擊(Man-in-the-Middle,常縮寫成 MITM)是另一種性質完全不同的威脅:攻擊者不闖進任何一端的系統,而是想辦法插在你跟你要通訊的對象之間,讓雙方都以為自己在跟對方直接對話,實際上每一句話都先經過攻擊者的手。
為什麼這個攻擊模式會成立
回到 Day 5 談過的東西:封包從你的裝置送到目的地,中間會經過好幾個節點,如果傳輸過程沒有加密,任何一個中繼點理論上都看得到內容。中間人攻擊利用的正是這個結構性的信任問題——通訊的兩端通常只驗證「我收到的資料是不是完整的、看起來合理」,卻很難單靠自己確認「這條路徑上,有沒有人正在偷看或篡改」。
最直觀的比喻是傳紙條。假設你要透過同學傳一張紙條給坐在教室另一頭的朋友,中間經手的每一位同學,理論上都可以偷看內容,甚至把紙條的內容改掉再往下傳,只要改得夠自然,你跟朋友都不會發現紙條被動過手腳。中間人攻擊做的就是這件事,只是發生在網路封包的層級,速度快到人完全感覺不到。
幾種常見的插入方式
同一個網路內的攻擊是最常見的入門情境。如果你連上一個公共 Wi-Fi(咖啡廳、機場),而這個網路沒有做好內部隔離,同網段的攻擊者可以透過偽造 ARP 訊息(告訴你的裝置「去某個目的地的資料應該先經過我」)的方式,把自己插進你跟路由器之間,這種手法叫做 ARP 欺騙(ARP Spoofing)。這也是為什麼資安建議普遍不鼓勵在公共 Wi-Fi 上做涉及帳密、金流的操作——不是公共 Wi-Fi 本身有問題,而是你無法確認同網段裡有沒有人在做這件事。
偽造憑證的攻擊針對的是 HTTPS。正常情況下,HTTPS 透過憑證機制讓你的瀏覽器可以驗證「我現在連的真的是銀行的伺服器,不是別人假冒的」。中間人攻擊如果想在加密連線上動手腳,必須想辦法讓你的裝置相信一張偽造的憑證,這通常需要攻擊者能在你的裝置上安裝一個惡意的信任根憑證,或是利用瀏覽器、系統對憑證驗證邏輯的疏漏。這也是為什麼瀏覽器跳出「憑證不受信任」警告時,不該一鍵略過——那個警告存在的目的,就是在提示你眼前這個連線可能正在被動手腳。
DNS 層級的攻擊則是從另一個角度介入:如果攻擊者能夠竄改你查詢網域名稱得到的結果,讓 www.example.com 這個名稱指向他控制的伺服器,而不是真正的目的地,你根本不需要被插進網路路徑中間,因為從一開始你就被導去了錯誤的地方。這個主題明天會有專篇細談,因為 DNS 本身的信任模型也有不少值得展開的地方。
中間人攻擊能做到什麼程度
單純竊聽是最基本的傷害——攻擊者看得到你傳輸的內容,如果沒有加密,帳號密碼、聊天內容都可能外洩。但更麻煩的是竄改:攻擊者不只是看,還能修改傳輸中的內容再放行。設想一個情境,你在網路銀行輸入轉帳的收款帳號,如果傳輸過程被竄改,銀行實際收到的收款帳號可能跟你輸入的不一樣,而你完全沒有察覺,因為介面上顯示的、你自己輸入的資料看起來都正常。
還有一種進階型態叫做 SSL 剝離(SSL Stripping),攻擊者在你跟網站之間,把原本應該用 HTTPS 的連線偷偷降級成不加密的 HTTP,你的瀏覽器網址列可能還是顯示正常的網域,但底層的保護已經被拿掉了。現代瀏覽器跟網站透過強制使用 HTTPS 的機制(例如要求瀏覽器記住某個網站永遠只能用加密連線)來對抗這種手法,但這個攻防拉扯到今天都還在持續。
防禦的思路
中間人攻擊防不勝防的地方在於,它攻擊的是「通訊路徑」而不是「你的系統」,所以單靠把自己的裝置顧好是不夠的,防禦重點多半落在確保通訊過程本身的完整性跟機密性,而不是信任路徑上的每一個節點。端到端加密是核心手段——就算資料經過再多中繼節點,只要中間任何一個節點都無法解密內容,竊聽就失去意義。憑證驗證機制、留意瀏覽器的安全警告、避免在未知網路環境輸入敏感資訊,都是在補強這條防線。
理解中間人攻擊之後,回頭看 HTTPS、憑證這些平常可能覺得「反正瀏覽器都幫我處理好了」的東西,會更清楚它們存在的意義——不是為了讓網址列多一個鎖頭圖示好看,而是在對抗一種結構上真實存在、而且技術上並不困難的威脅。