文章列表

為什麼奇怪Wi-Fi名稱會影響手機的Wi-Fi功能?

今年六月中資安研究員 Carl Schou發現他的iPhone只要連上名為 %p%s%s%s%s%n 的Wi-Fi,iPhone Wi-Fi功能就會被強制關閉,如果要重新開啟Wi-Fi,就只能重置手機網路設定。

ioswifibug 01

https://twitter.com/vm_call/status/1405937492642123782

Carl接著在這個月初發現,如果iOS手機連上名稱為 %secretclub%power 的Wi-Fi的話,手機的Wi-Fi就會完全不能用,而且這次的情況更糟,重置手機的網路設定也不一定能修復手機的Wi-Fi功能。

ioswifibug 02

https://twitter.com/vm_call/status/1411630091038203909

那麼為什麼把iOS裝置連接到一些有奇怪Wi-Fi名稱的網路會影響手機的Wi-Fi連線功能呢?這是因為iOS系統上的字串格式化漏洞(Format String Bug)

什麼是字串格式化漏洞 Format String Bug ?

要理解什麼是字串格式化漏洞之前,我們需要先稍微了解一下在程式語言中的字串跟變數是怎麼被處理的。

以C語言為例的話,下面這段程式碼的作用是將 “Jeff“ 這個字串保存在name這個變數裡,再將變數 name 透過 printf 函式顯示出來。

int main(){
  string name="Jeff";
  printf("Hi, I am %s",name);
  return 0;
}

大家可以注意到在使用 printf 函式在輸出的時候,我們使用了 %s 來代表要輸出的變數name。

%s 是在C語言中用來代表字串的特殊字元,他會告訴像是 printf 這類型的函式說:我是一個變數不要直接把我印出來,要去後面找我對應的變數。

類似的特殊字元還有代表浮點數的%f、代表十進位數字的%d、代表pointer的%p等等的。

這樣造成什麼潛在漏洞?

如果今天,我們讓使用者可以輸入內容來與程式進行互動的話,就有可能會觸發字串格式化漏洞。

下面這段程式碼的功用是讓使用者在執行的同時附上自己的名字,接著程式會將使用者的名字輸出。

void main(int argc, char* argv[])
  printf(argv[1])
}

正常的使用者執行的話就會出現下面的結果,我輸入 Jeff 到程式裡,他就會將 Jeff 顯示出來。

C:\\example>program.exe Jeff
Jeff

但是如果今天遇到來搗亂的使用者,他不乖乖的輸入名字,而是輸入以下這種內容的話就會出現問題。

C:\\example>program.exe %s
0xffffdddd

大家可以發現原本應該是回傳 %s 的程式,現在顯示的是一串像是亂碼的東西 0xffffdddd,他其實是一段記憶體位置。之所以會回傳一段記憶體位置是因為當我們輸入 %s 到這個程式以後,在 printf 這個函式中他把 %s 認定為是一個變數了,因此 printf 會試著去尋找對應的變數所包含的資料,但是因為我們根本沒有設定一個變數給他,因此他就會回傳對應的記憶體位置給我們。

如果我們沒有針對字串格式化漏洞進行任何的防護的話,攻擊者可以透過輸入下面這種內容來進行攻擊

C:\\example>program.exe %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s

如此一來,程式就會回傳一連串的記憶體資訊,攻擊者會可以透過這種方式來讀取到一些像是機密資訊等等的攻擊者原本不該有權限讀取的內容,進階一點的話攻擊者還有可能搭配溢位攻擊(Overflow Attack)或是其他的攻擊手法來修改程式的內容,讓攻擊者取得這個程式的控制權。

等等…可不可以白話一點?

以現實生活中的事物來做舉例的話,假設家X福有個只有員工才知道的通關密語,只要在結帳的時候說出這個通關密語就可以享有員工優惠。

某天我在結帳的時候正在跟身旁的朋友聊天,過程中不小心提到了這個通關密語,結帳的員工在聽到了以後就以為我也是家X福的員工,因此主動幫我使用員工優惠打了折。

我在注意到這件事以後,開始試著每次去家X福消費的時候都說出這個通關密語,並且發現每次都會有員工優惠,因此我就理解到這個通關密語是一個只有家X福員工才知道的秘密。貪心的我並不滿足,想要透過這個通關密語獲得更多的好處,因此這天我就來到家X福的員工休息室,佯裝成是忘記帶識別證的員工請別人幫我開門,這時我就說出了通關密語想要證明自己是家X福員工,休息室內的員工因為覺得這個通關密語只有自己人會知道,因此在沒有經過更近一步的驗證之下就相信了我是家X福讓我進入員工休息室。混入了員工休息室後的我就開始各種的搜集家X福的機密資料,想辦法從中獲利。

字串格式化漏洞也是類似的概念,當我們的程式沒有好的防護機制的時候,攻擊者就會透過 %s%p 等等的字串的佯裝,讓我們的程式把他們誤以為是合法的變數而回傳對應的資料,透過這樣的方式攻擊者就有辦法從我們的程式中取得機密資訊和控制權。

這跟這次的Wi-Fi問題有什麼關聯?

眼尖的讀者應該會發現,在資安研究員 Carl 發現的兩個有問題的Wi-Fi名稱中都包含了 %s 以及 %p ,再加上iOS作業系統的底層是由C語言所寫的,因此大家推斷iOS的Wi-Fi功能中存在著字串格式化漏洞。當我們連上了一個名稱中有 %s 或是 %p 的Wi-Fi時,很高機率是觸發了漏洞導致iOS手機無法正確地處理這些Wi-Fi名稱。

目前從網友提供的資訊來看,此次字串格式化漏洞的影響只限於影響iOS裝置的Wi-Fi功能導致無法使用Wi-Fi連線,沒有造成其他更危險的影響。但我們並不知道攻擊者會不會在得知這個漏洞,經過更多的研究後找到危險性更高的攻擊手法,因此大家還是要多多留意。

應對方式

  1. 關閉iOS裝置的 自動加入熱點 功能:關閉這個功能可以避免手機自動連上別人的熱點,避免手機自動連上惡意Wi-Fi。
  2. 不要使用公開、未知的Wi-Fi:不要隨意的連接和使用公開、安全性未知的Wi-Fi,我們很難知道這個Wi-Fi是由誰提供的、對方是否有惡意。即便Wi-Fi名稱看似正常,也有可能是攻擊者偽裝的,因此建議大家不要使用公開、安全性未知的Wi-Fi。
  3. 更新手機作業系統:Apple在 7/19釋出 iOS14.7修補了這個漏洞。除了這次的更新以外,建議大家養成即時更新的好習慣,這樣未來遇到不同的漏洞時也能在第一時間修補。

相關連結/延伸閱讀

codecolorist - Quick Analysis for the SSID Format String Bug

Inside - 資安專家證實蘋果 WiFi 出現嚴重漏洞,此符號將影響 iPhone、iOS 網路連線

Bleeping Computer - iPhone bug breaks WiFi when you join hotspot with unusual name


本文同步刊載於INSIDE關鍵評論網