今年六月中資安研究員 Carl Schou發現他的 iPhone 只要連上名為 %p%s%s%s%s%n 的 Wi-Fi,iPhone Wi-Fi 功能就會被強制關閉,如果要重新開啟 Wi-Fi,就只能重置手機網路設定。
https://twitter.com/vm_call/status/1405937492642123782
Carl 接著在這個月初發現,如果 iOS 手機連上名稱為 %secretclub%power 的 Wi-Fi 的話,手機的 Wi-Fi 就會完全不能用,而且這次的情況更糟,重置手機的網路設定也不一定能修復手機的 Wi-Fi 功能。
https://twitter.com/vm_call/status/1411630091038203909
那麼為什麼把 iOS 裝置連接到一些有奇怪 Wi-Fi 名稱的網路會影響手機的 Wi-Fi 連線功能呢?這是因為 iOS 系統上的字串格式化漏洞(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 等等的字串的佯裝,讓我們的程式把他們誤以為是合法的變數而回傳對應的資料,透過這樣的方式攻擊者就有辦法從我們的程式中取得機密資訊和控制權。
眼尖的讀者應該會發現,在資安研究員 Carl 發現的兩個有問題的 Wi-Fi 名稱中都包含了 %s 以及 %p ,再加上 iOS 作業系統的底層是由C語言所寫的,因此大家推斷 iOS 的 Wi-Fi 功能中存在著字串格式化漏洞。當我們連上了一個名稱中有 %s 或是 %p 的 Wi-Fi 時,很高機率是觸發了漏洞導致 iOS 手機無法正確地處理這些 Wi-Fi 名稱。
目前從網友提供的資訊來看,此次字串格式化漏洞的影響只限於影響 iOS 裝置的 Wi-Fi 功能導致無法使用 Wi-Fi 連線,沒有造成其他更危險的影響。但我們並不知道攻擊者會不會在得知這個漏洞,經過更多的研究後找到危險性更高的攻擊手法,因此大家還是要多多留意。
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 關鍵評論網