iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 29
0

前言

KRACK 是一個在去年十月左右公開的漏洞。各廠家在知悉這個訊息之後,紛紛動起來趕快做一些修正,然後把這些修正丟給大家用。
這個問題的根源並不在任何廠家實作 Wi-Fi 的過程中出了瑕疵,也不是晶片廠腦殘寫了有 bug 的驅動,這問題的根源是在 _Wi-Fi- 標準裡面,

講古

從前,我們有個科學家老兄,叫 Nicola Tesla。特斯拉先生想要找出一個方法,能夠用無線的方式,把電力從美國紐約傳到英國倫敦去。
不過,很不幸的,他在做完之前,先餓死了。

但他的發明促進了無線電、行動電話等技術的誕生,然後到上世紀末的 90 年代左右,開始有人想要搞「無線網路」。於是,IEEE 就提出了一標準,叫做 802.11。這個名字因為太難唸了,所以又改叫 Wi-Fi。

一開始 802.11 就有加密標準,稱為 WEP。WEP 不久過後就被破了,所以又有人寫了修正案 802.11i,提出 WPA 加密標準,也提出了「四向交握」的協定。

當這份修正案寫到一半的時候,Wi-Fi 聯盟偷跑,先拿他們的草稿當標準,就先推出了 WPA。直到他們寫完草稿之後,完整版的標準才叫做 WPA2。因為是同一份文件出來的,所以 WPA 和 WPA2 的原理是類似的,也都支持「四向交握」的協定。

Wifi 認證/關聯機制

Screen Shot 2018-01-17 at 15.35.07.png

當一台裝置想要連上一個 Wi-Fi 網路的時候,會經過幾個步驟。

  1. 掃描
  2. 認證
  3. 關聯
  4. 四向交握
  5. Group key handshake

一個裝置要連線,首先要掃到那個網路,再做認證。因為通常都是用「開放系統認證」,任何人都可以連線,都可以過,根本不做檢查,根本沒用。為了提高安全保障,在使用這種模式的狀況下,後面都會再做一次檢查。(註:有另一種認證方式,叫做「共享金鑰認證」。)
在通過「認證」之後,裝置就會送「關聯」的請求,關聯成功之後就去做四向交握等等。

四向交握

在認證的過程中,客戶端叫做 請求者,AP 叫做 認證者
四向交握也是一種用共享金鑰來交換金鑰的方式。基本上,雙方先議定好 PMK (Pairwise Master Key),然後用這個 PMK 去議定之後要使用的 PTK (Pairwise Transient Key)。PMK 是以 Wi-Fi 基站密碼組成的,PTK 則是以雙方的 MAC 地址、PMK 和雙方的 nonce 所組成的。nonce 是一組只能使用一次的亂數,每次使用時都會重新產生,所以可以防止 replay 的攻擊。PTK 成功產生之後,就會被分成:

  • KCK,金鑰驗證碼
  • KEK,金鑰加密碼
  • TK,暫時金鑰

KCK/KEK 是用來保護交握過程中的訊息,TK 則是用來在一般的狀況下拿來加密資料。另外,在使用 WPA2 的狀況下,四向交握也會帶「群組暫時金鑰」(GTK)給 請求者

GTK 是一把拿來解密「廣播」訊息的金鑰,所有的認證者都共用這把金鑰。

攻擊原理

KRACK 主要的攻擊點是「打流程」,使「流程」出錯。

流程問題

802.11i 其實沒有把流程講清楚。雖然裡面有寫 psuedo code,但是並沒有提到說,在某個狀況下,遇到什麼事情,應該要做什麼。

Screen Shot 2018-01-17 at 17.30.03.png

實際上,當第一次連到一個網路的時候,會發生這些事情:

四向交握的流程如下:

  1. 請求者進入 PTK-INIT 狀態,產生 PMK
  2. 認證者把自己算出的 nonce 給請求者,稱為 aNonce。收到之後,請求者進入 PTK-START 狀態
  3. 在 PTK-START 中,請求者自己也算一把 nonce,稱為 sNonce,然後就可以算出 PTK,然後把 sNonce/PTK 發給認證者,順便帶上檢查碼 MIC
  4. 認證者收到 sNonce,也可以產 PTK 了,然後把 GTK 加密之後,連著 MIC 和 GTK 一起發給請求者
  5. 請求者收到訊息,先檢查合法性。如果合法,就進入 PTK-NEGOTIATING,
  6. PTK-NEGOTIATING 中,安裝 PTK/GTK ,和認證者說裝好了,然後進入 PTK-DONE。認證者收到裝好的訊息之後,安裝這個請求者的 PTK。
  7. 完成之後,雙方就可以用 802.1x 做通訊。

配合上上一張圖,有標記訊息編號 (msg1, msg2) 等等。
這流程圖其實有考慮到「重傳」的狀況,若「傳送 sNonce」(#2) 或「安裝完 PTK」 (#4) 的訊息沒傳成功,就會重傳 #1 或 #3。

明顯的問題

可是,流程裡面沒有講到「重傳 #3 會發生什麼事情」。所以,即使現在是在 PTK-DONE 的狀態裡面,攻擊方還是可以想辦法觸發「重裝 PTK」的動作。

所以假設攻擊方有能力做中間人攻擊的話,可以這樣做:

  1. 先用蓋台等方式,防止認證者收到 #4 的訊息,所以認證者會瘋狂重傳 #3 給請求者
  2. 因為瘋狂重傳 #3,所以請求者會一直重裝 PTK
  3. 由於 PTK 重裝了(這邊記得:PTK 是以 nonce 算出來的),所以 nonce 會被重用

因為 nonce 重用了,所以第三方就可以開始收一波訊號,然後慢慢解訊息,也能夠開始偽造訊息了。

數學課:nonce 重用帶來的問題

由於 802.11 的加密模式都是依靠 串流加密 的算法來做加密。明文資料每次都和金鑰資料流做順次加密,然後就拿到密文資料流。

用簡單的算式來表示,就是:

m = 明文; c = 密文; k = 種子; PRG = 算法
c1 = m1 xor PRG(k)
c2 = m2 xor PRG(k)

假設在 nonce (k) 重用的狀況下,攻擊者拿到 c1 和 c2,就可以計算 c1 xor c2 的結果。因為 xor 符合交換率,又是自反函數 (X xor X = 0),所以還是可以倒推回去原本的明文。

結論

KRACK 主要是打四向交握的流程,不是打 AP 本身,是打客戶端。所以 AP 不需要更新,而是各個終端裝置。這次的問題,顯示出「即使是用了一陣子的協定,驗證過了,也還是可能會有瑕疵」的殘酷事實。
因為 KRACK 本身的問題是在不照流程應有的順序去做事情,所以,即使不刻意做攻擊,平常傳輸資料的時候,收訊超級爛,剛好 #4 掉包了,也有可能發生這次 KRACK 攻擊的狀況。
這比較算是沒有想好偶然性(例:A 動作失敗後應該去哪裡?)的狀況。
WPA2 本身也沒有被打,而是打「實作」。

參考資訊

KRACK Attacks


上一篇
談「交通號誌系統」:整體系統的安全
下一篇
epilogue: 「實體層攻擊」
系列文
網路安全概述31

尚未有邦友留言

立即登入留言