iOS 惡意軟件如何悄悄監視用戶
這將是一個系列文章,我們將介紹移動攻擊者的想法,以及攻擊者使用哪些技術來逃避安全保護以及如何悄悄地監視手機和平板電腦,而不被用戶發現。
我們將在本文介紹最近攻擊者是如何避開攝像頭和麥克風綠色/橙色指示器,來悄悄監視用戶的。
從 iOS 14 開始,蘋果多了幾個新指示器:一個綠點和一個橙點。當訪問攝像頭或麥克風時,這些指示燈會發出信號。
當沒有綠色/橙色圓點時,就意味著手機沒有被監聽。

我們知道像 NSO/Pegasus 這樣的惡意軟件能夠監聽麥克風。NSO 組織和數百名其他針對移動設備的攻擊者能否在視覺指示器關閉時拍攝我們的視頻?
讓我們來看看此功能是否對攻擊者構成任何挑戰。
邏輯問題
讓我們先想想,每次訪問攝像頭或麥克風時,指示燈是否真的亮起?我們很快就會想到 Siri。如果麥克風指示燈沒有一直亮起,手機如何知道我們何時說“Hey Siri”?手機一定在聽某種正確的聲音。
“Hey Siri”
/System/Library/PrivateFrameworks/CoreSpeech.framework/corespeechd依賴于VoiceTrigger.framework來持續監控用戶的聲音,然后在聽到關鍵字時激活Siri。
輔助功能 -> 語音控制

語音控制允許你使用語音命令與設備進行交互。
/System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/XPCServices/com.apple.SpeechRecognitionCore.brokerd.xpc/XPCServices/com.apple.SpeechRecognitionCore.speechrecognitiond.xpc/com.apple.SpeechRecognitionCore.speechrecognitiond
負責訪問麥克風。

SwitchControl的部分功能是檢測用戶頭部的運動來與設備進行交互。非常酷的功能!由以下人員處理:
/System/Library/PrivateFrameworks/AccessibilityUI.framework/XPCServices/com.apple.accessibility.AccessibilityUIServer.xpc/com.apple.accessibility.AccessibilityUIServer
和
/System/Library/CoreServices/AssistiveTouch.app/assistivetouchd
這些功能必須訪問麥克風或攝像頭才能運行。但是,這些功能不會觸發綠色/橙色視覺指示器。這意味著移動惡意軟件也可以做同樣的事情。
這意味著,通過向com.apple.accessibility.AccessibilityUIServer / com.apple. speech recotioncore .speech recotioncore .speech recotiondaemon注入一個惡意線程,攻擊者就可以對麥克風進行靜默訪問。攝像頭訪問需要額外的補丁,我們稍后會討論它。
繞過 TCC 提示
TCC 代表“透明度、同意和控制”。iOS 用戶經常會遇到這樣的提示:

TCC 的核心是一個名為 tccd 的系統守護進程,它管理對敏感數據庫的訪問以及從輸入設備(包括但不限于麥克風和攝像頭)收集敏感數據的權限。
TCC提示符只適用于具有UI界面的應用程序。任何在后臺運行的東西都需要特殊的權限才能操作。權限如下圖所示。只需要kTCCServiceMicrophone就可以接入麥克風。

攝像頭訪問稍微復雜一些。除了 tccd 之外,還有另一個名為 mediaserverd 的系統守護進程確保沒有后臺運行狀態的進程可以訪問攝像頭。

到目前為止,當用戶與另一個前臺應用程序交互時,似乎需要一個額外的步驟(例如修補 mediaserverd)來訪問后臺的攝像頭。
禁用麥克風、攝像頭訪問的可視指示器
第一種方法比較粗糙,使用Cycript向SpringBoard注入代碼,導致指示器突然消失。

受com.apple.SpeechRecognitionCore.speechrecognitiond 和 com.apple.accessibility.AccessibilityUIServer 的啟發,這是一種非常適合我們目的的私有權限 (com.apple.private.mediaexperience.suppressrecordingstatetosystemstatus)!不幸的是,此方法不適用于攝像頭訪問。

通過修復“mediaserverd”在后臺訪問攝像頭
mediaserverd 是一個監控媒體捕獲會話的守護進程。想要訪問攝像頭的進程必須得到 tccd 和 mediaserverd 的批準。它是 tccd 之后的額外安全層。當它檢測到應用程序不再在前臺運行時,它還會終止攝像頭訪問。
值得注意的是,mediaserverd 配備了一個特殊的權限(get-task-allow)來防止代碼注入。

由于“get-task-allow”授權,動態調試器依賴于獲取任務端口,如 cycript,frida 在 mediaserverd 守護進程上不起作用。當 mediaserverd 沒有響應時,它也會經常被系統阻止,即使是很短的時間。這并不常見:這些跡象告訴我們 mediaserverd 負責一些重要的事情。
當進程切換到后臺時,mediaserverd 將收到通知并撤銷對該特定進程的攝像頭訪問權限。我們需要找到一種方法,讓mediaserverd在檢測到進程在后臺運行時不做任何事情。
經過簡短的研究,我們發現可以通過掛鉤到 Objective-C 方法 -[FigCaptureClientSessionMonitor _updateClientStateCondition:newValue:] 來防止 mediaserverd 撤銷對攝像頭的訪問權限,因此不需要代碼覆蓋。
為了注入 mediaserverd,我們使用了 lldb。Lldb 不依賴于任務端口,而是調用內核進行代碼注入。實際上,已經具有內核代碼執行能力的攻擊者可以替代 mediaserverd 的“權限”來執行此類注入。
POC源代碼可以在這里找到。
根據 2015 年之前的實驗,Mac 上前置攝像頭旁邊的綠燈不能僅使用軟件關閉。修改 AppleCameraInterface 驅動程序并上傳自定義網絡攝像頭固件沒有解決問題。綠燈無法關閉,因為它在攝像頭開機時亮起。只要有電,燈就會一直亮著。從隱私角度來看,基于硬件的指示器是理想的。我們尚未在最近的 Mac 版本/硬件上對此進行驗證。
我們做了一個演示,從后臺進程訪問攝像頭/麥克風,并使用RTMP協議流視頻/音頻,步驟如下:
1.設置RTMP服務器;
2.編譯mediaserver_patch,將代碼注入mediaserverd;
3.編譯 ios_streaming_cam,使用以下權限重新簽署二進制文件并在后臺運行;

參考及來源:https://blog.zecops.com/research/how-ios-malware-can-spy-on-users-silently/