作者:keenjoy95
隨着 macOS / iOS 普及程度的提高,mac 平台的內核監控與攻防也漸漸地成為了熱門話題。
筆者近期實踐了一些可行的監控方案,這些方案將有助於構建完整的內核監控系統。
Kernel Authorization
首先值得關注的是 KAuth 機制,該機制於 12 年前引入 Mac OS X 10.4 Tiger 內核。這一可以稱得上是簡陋的回調接口由蘋果官方認可,我們可以在開發者中心找到詳細的示例代碼和文檔 [1]。
實踐后可發現 KAuth 機制很容易上手,但天花板也隨之而來。正如 Jonathan Levin 在《*OS Internals Volume III》[2] 一書中總結的那樣,作為 KPI (Kernel Programming Interface) 的 KAuth 機制缺乏細粒度的監控能力,基於它去設計安防軟件一定會捉襟見肘。
以進程監控回調 KAUTH_FILEOP_EXEC
為例,我們可以得到進程路徑,但無法取得命令行參數。類似的情況還有文件創建時的 fmodep 上下文等。
不過這種限制不應該難倒我們,通過反彙編引擎和動態棧回溯我們可以挖出這些信息。下圖是 Google Chrome 運行時那冗長的啟動參數:
MAC (Mandatory Access Control) Framework
在 Mac OS X 10.5 Leopard 的 SDK 中蘋果“錯誤的”為大家引入了一種新的監控機制 —— Mandatory Access Control Policy Framework。很快蘋果公司糾正了這一錯誤,徹底將這一接口私有化。在文檔 QA1574 [3] 中蘋果明確的指出第三方不應該使用 MAC 機制,它不屬於 KPI 的一部分。
這意味着只有蘋果公司才能夠調用這套相對靈活而強力的接口,例如:Apple Seatbelt Sandbox [4]、TMSafetyNet (Safety net for Time Machine) [5]、AMFI (Apple Mobile File Integrity) [6] 等等。
MAC Version 47 的接口細節如下:
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_policy.h#L6192
我依稀記得微軟公司也曾經有過類似的私貨,結果這些 Undocumented API 的使用差點讓微軟被起訴到分家,罪名是私用 Undocumented API 涉嫌不公平競爭。
言歸正傳,因為 XNU 源代碼公開,MAC Policy Framework 的使用非常容易上手。但另一個問題也隨之而來,如何監控系統或第三方使用 MAC Framework 的情況?
上述需求的一個隱含問題是:如何保證遍歷系統內部數據結構時的安全,即持有(不導出的)鎖是個關鍵。這種小問題也不應該難倒我們,通過閱讀 XNU 相關源代碼,我們可以很快找到一個解決方案:
在民風彪悍的參數檢查之後
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L652
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L655
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L658
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L661
是獲取 mac_policy_mtx
鎖的代碼
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L671
在釋放鎖之前
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L780
系統給了第三方驅動兩次回調的機會
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L770
https://github.com/opensource-apple/xnu/blob/10.12/security/mac_base.c#L774
這兩次寶貴的機會是持鎖的,我們可以用它來安全地 dump 相關內核數據結構。
下圖展示了 TMSafetyNet、Apple Mobile File Integrity 以及 Apple Seatbelt Sandbox 對於 MAC Policy 回調的使用情況:
[3] https://developer.apple.com/library/content/qa/qa1574/_index.html
[5] https://support.apple.com/en-us/HT201250
[6] https://www.theiphonewiki.com/wiki/AppleMobileFileIntegrity
[7] https://www.synack.com/2015/11/17/monitoring-process-creation-via-the-kernel-part-i/
[8] https://www.fireeye.com/services/freeware/monitor.html
[9] https://msdn.microsoft.com/en-us/library/windows/hardware/ff541918(v=vs.85).aspx
转载请注明:IAMCOOL » 實現 macOS 內核監控的幾種方法