首頁 > 科技

碰上這種 Wi-Fi,iPhone 秒崩!

2021-07-07 03:11:40

整理 | 蘇宓

路由器都拔了又拔,手機重啟 N 次......最終發現,手機以及部分裝置還是連不上網。

這到底是怎麼回事?

幾周前,來自國外 secret.club 的逆向工程師、創始人 @Carl Schou 在 Twitter 揭露一個 iOS 系統中的嚴重的漏洞。該安全研究人員指出,移動裝置連不上 Wi-Fi 並非是路由器或者手機的問題,這時候需要檢查一下你的網路名稱,如果你設定的 Wi-Fi 名稱中帶有百分比(%)字元時,如「%p%s%s%s%s%n」,那麼它可能是禁用 iPhone 以及 iOS 裝置上 Wi-Fi 的元凶。

近日,Carl Schou 再次發文表示,當使用 SSID「%secretclub%power」可以禁用 iOS 裝置的 Wi-Fi 功能,即使重置網路設定也無法恢復 Wi-Fi 的使用。

究竟是什麼原因導致?

針對這一問題,不少研究人員認為,這個 Bug 因為屬於輸入解析的問題,其中百分比符號可能被 iOS 誤解為字元串格式化的操作符,即 % 符號後面的字元可能被視為變數或命令而不是純文字。

對此,有開發者@CodeColorist 對整個過程進行了快速解析(https://blog.chichou.me/2021/06/20/quick-analysis-wifid/)。在測試過程中,他也設定了一個與 Carl Schou 相同的 SSID 熱點並讓裝置加入該網路,結果發現 wifid 很快就崩了。崩潰報告如下(wifid-2021-06-20-xxxxxx.ips):

Thread 2 name:  Dispatch queue: com.apple.wifid.managerQueue
Thread 2 Crashed:
0 libsystem_platform.dylib 0x00000001ebcb9724 _platform_strlen + 4
1 CoreFoundation 0x00000001a381d84c __CFStringAppendFormatCore + 8812
2 CoreFoundation 0x00000001a381efa8 _CFStringCreateWithFormatAndArgumentsReturningMetadata + 160
3 WiFiPolicy 0x00000001d0895f8c -[WFLogger WFLog:message:] + 192
4 ??? 0x000000010692c00c 0 + 4405248012
5 wifid 0x0000000100f58a74 0x100e40000 + 1149556
6 wifid 0x0000000100f58c74 0x100e40000 + 1150068

基於以上結果顯示,證實了網路連線失敗以及 iPhone 上 Wi-Fi 無法正常使用屬於格式字元串 Bug!

通過反編譯 dyld_shared_cache 中的 -[WFLogger WFLog:message:] 函數。有兩個對 CFStringCreateWithFormatAndArguments 的引用:

v7 = j__CFStringCreateWithCString_107(0LL, a4, 0x8000100u); // the format string
if ( v7 || (v7 = j__CFStringCreateWithCString_107(0LL, a4, 0)) != 0LL )
{
if ( self->_destination == 2 )
{
v8 = j__CFStringCreateWithFormatAndArguments_26(0LL, 0LL, v7, v21);
v18[3] = (__int64)v8;
}

另一個:

      if ( self->_destination != 2
&& (!self->_wflRunningOnWatchClassDevice || self->_wflEnableDualLoggingOnWatchClassDevice) )
{
*(_QWORD *)&v16.tm_sec = 0LL;
*(_QWORD *)&v16.tm_hour = &v16;
*(_QWORD *)&v16.tm_mon = 0x2020000000LL;
*(_QWORD *)&v16.tm_wday = 0LL;
v10 = j__CFStringCreateWithFormatAndArguments_26(0LL, 0LL, v7, v21); // <-- here

@CodeColorist 表示,利用 frida,並將它加到函數中,如:frida-trace -U wifid -m '-[WFLogger WFLog:message:]' ,稍微修改自動生成的指令碼:

onEnter(log, args, state) {
const msg = '' + args[3].readUtf8String();
log(`-[WFLogger WFLog:${args[2]} message:${msg}]`);
if (msg.indexOf('%p%s%s%s%s%n') > -1) {
for (let i = 3; i < 10; i++) {
log(args[i], JSON.stringify(Process.findRangeByAddress(args[i])));
}

log('called from:n' +
Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress).join('n') + 'n');
}
},

這是崩潰前的日誌。

17863 ms -[WFLogger WFLog:0x3 message:Dequeuing command type: 「%@」 pending commands: %ld]

17863 ms -[WFLogger WFLog:0x3 message:{ASSOC+} Attempting Apple80211AssociateAsync to %p%s%s%s%s%n]

根據回溯,以下是根本原因:

v27 = sub_1000A25D4(v21);
v28 = objc_msgSend(
&OBJC_CLASS___NSString,
"stringWithFormat:",
CFSTR("Attempting Apple80211AssociateAsync to %@"),
v27);
v29 = objc_msgSend(&OBJC_CLASS___NSString, "stringWithFormat:", CFSTR("{ %@+} %@"), CFSTR("ASSOC"), v28);
v30 = objc_autoreleasePoolPush();
v31 = (void *)qword_100251888;
if ( qword_100251888 )
{
v32 = objc_msgSend(v29, "UTF8String");
objc_msgSend(v31, "WFLog:message:", 3LL, v32);
}
objc_autoreleasePoolPop(v30);

蘋果:暫未回覆

與此同時,外媒 9to5 Mac 也曾給出一個可能性的解釋:

"%[字元]"語法通在程式語言中較為常見,它的作用是對字元串進行格式化。在 C 中,"%n"標識符表示將寫入格式字元串中的字元數儲存到傳遞到字元串格式函數的變數。Wi-Fi 子系統可能會將未經處理的 Wi-Fi 網路名稱 (SSID) 傳遞給執行字元串格式的某個內部庫,這反過來又會導致緩衝器溢位。這將導致記憶體損壞,iOS 監視器將扼殺該過程,從而有效地禁用使用者的 Wi-Fi。

經過測試,這種情況僅在 iOS 裝置中出現,其中 iOS 14.4.2 到 14.6 都有這樣的問題,而 Android 裝置則可以毫無問題地直接連線。研究人員還就此事聯絡了蘋果的裝置安全團隊,但尚未收到任何回覆。

通過不斷的嘗試,Carl Schou 最終給出了一個解決方案,即手動編輯 iPhone 備份並在已知的網路中刪除惡意的 Wi-Fi 名,才可以恢復 iPhone 等 iOS 裝置網路的使用。

其實近幾年來,蘋果因為程式處理字元串帶來的 Bug 層出不窮,譬如,上一次,只因使用者姓 True,她的 iCloud 賬戶被蘋果封禁了半年之久。這一次關於 % 字元的問題不知何時才能根除,目前對於使用者可以做的就是不要去連線不熟悉以及名稱上帶有這種 % 等特殊字元的 Wi-Fi,避免一些可怕事情的發生。

參考:https://appleinsider.com/articles/21/07/04/new-malformed-wi-fi-name-bug-can-require-iphone-factory-reset-to-fix


IT145.com E-mail:sddin#qq.com