如何讓macOS的使用者互動安全屏障瞬間變成“馬奇諾防線”(二)
在上一篇文章中,我詳細介紹了macOS的使用者互動安全屏障的過程,今天我就接著介紹這種防護措施是如何失效的?
macOS的使用者互動安全是如何被繞過的?
在經過一番探索之後,我發現了一個叫做"Mouse Keys"的功能特性。"Mouse Keys"是macOS的一項文件記錄功能,正如它的介紹那樣,該功能允許使用者把鍵盤當作滑鼠用。啟用"Mouse Keys"後,如果要將滑鼠往右移動,你只需按下O或鍵盤上的數字6即可。接著按下I或鍵盤上的數字5,就會確認單擊動作完成了。
這就引發了一些列安全問題,比如:
1.可以通過程式化方式啟用"Mouse Keys"嗎?
2.可以通過組合這些鍵盤事件,生成可信的滑鼠點選過程嗎?
對於這兩個問題,我的答案是肯定的!
首先,我可以使用AppleScript以程式化方式開啟“系統偏好設定”應用程式的視窗,該視窗具有用於啟用"Mouse Keys"的複選框,然後使用CoreGraphics傳送滑鼠檢查命令 "synthetic"以啟用模擬過程。
由於Apple僅保護某些UI元件(比如安全警報)不受"synthetic"命令的影響,因此攻擊過程很容易完成。
//click via mouse key void clickAllow(float X, float Y) { //move mouse CGEventPost(kCGHIDEventTap, CGEventCreateMouseEvent(nil, kCGEventMouseMoved, CGPointMake(X, Y), kCGMouseButtonLeft)); //apple script NSAppleScript* script = [[NSAppleScript alloc] initWithSource: @"tell application \"System Events\" to key code 87\n"]; //exec [script executeAndReturnError:nil]; }
要生成程式化的滑鼠單擊事件,在啟用"Mouse Keys"後,首先要移動滑鼠,然後通過AppleScript傳送所需的鍵盤事件。比如下面這個例子,我就合成了87鍵盤事件。
# ./sniffMK event: key down keycode: 0x57/87/5 event: key up keycode: 0x57/87/5 event: left mouse down (x: 146.207031, y: 49.777344) event: left mouse up (x: 146.207031, y: 49.777344)
當啟用"Mouse Keys"時,當鍵盤程式碼87(代表鍵盤上的數字5)被描述成單擊事件時,系統將其轉換為一次真正的滑鼠單擊過程。這可以通過使用我的開源滑鼠和鍵盤嗅探器 ofollow,noindex">SniffMK 可以觀察到整個過程,過程如下所示。
具體步驟如下:首先作業系統會將鍵盤程式碼轉換為滑鼠事件,然後再轉換為一次真正的滑鼠單擊過程,即使受保護的UI元件也會接受並處理這樣的事件!一般來說,當攻擊目標是作業系統本身時,這種受保護的元件就會預設信任這些模擬事件。
那麼我們可以用這種模擬事件做些什麼呢?比如進行轉儲並使用他們的私鑰和未加密的密碼來洩露使用者的鑰匙串。
具體視訊, 請點此 。
目前,我已經向蘋果公司報告了這個漏洞,他們也在High Sierra補充更新中將其修補為CVE-2017-7150:
但是,類似的模擬使用者行為的惡意事件仍然很多!
首先,我注意到各種與隱私相關的警報會盲目接受程式化的滑鼠操作事件,即使是在完全修補的macOS 10.13上,情況也如此。例如,在最新版本的macOS上,macOS會在程式碼試圖訪問以下資訊時顯示警告:
1.系統的地理位置資訊;
2.使用者的聯絡資訊;
3.使用者的日曆事件;
……
由於這些警報會對以上所說的那些模擬事件輕而易舉的繞過,因此惡意軟體可以通過程式化方式簡單的解除這些警報。
//given some point {x, y} // generate synthetic event... CGPostMouseEvent(point, true, 1, true); CGPostMouseEvent(point, true, 1, false);
以上是一個攻擊演示,演示了攻擊者如何通過模擬事件解除作業系統的訪問警報,從而來確定使用者的地理位置。
也許你可能會提出這樣的疑問“如果惡意軟體可以如此輕而易舉的繞過這些防護措施,那為什麼系統還會發出警報呢,乾脆讓它們直接跳過不得了?”對於這個問題,我也不無法回答你。
事實證明,目前macOS甚至存在著比以上所述的模擬事件操作是更糟糕的問題,比如允許無使用者操作許可權的惡意軟體或攻擊者與受保護的UI元件互動的問題,例如High Sierra的“使用者輔助核心載入”介面。雖然,它們也在macOS 10.6中被修復,但現實的情況卻不是想得那麼簡單。於是我試圖測試蘋果釋出的CVE-2017-7150補丁,並有意錯誤的剪下和貼上了一些程式碼。結果,漏洞發生了!
上面我講過,可以通過CoreGraphics框架傳送模擬的滑鼠事件。對於這樣的滑鼠點選事件,通常是由兩個事件合成的:滑鼠按下事件+滑鼠鬆開事件。
//given some point {x, y} // generate synthetic event... //final param: true => mouse down CGPostMouseEvent(point, true, 1, true); //final param: false => mouse up CGPostMouseEvent(point, true, 1, false);
但是,如果複製並貼上程式碼段的CGPostMouseEvent(point, true, 1, true);時,忘記將最終引數從true更改為false(以指示滑鼠鬆開),那這將生成兩個滑鼠按下事件。
理論上這種低階的失誤應該被忽略才是,但事實證明並非如此!同理,即通過SniffMK,我們也可以觀察到系統生成兩個滑鼠鬆開事件。
# ./sniffMK event: left mouse down event source pid 951 event state 0 (synthetic) (x: 1100.000000, y: 511.000000) event: left mouse up event source pid 0 event state 0 (synthetic) (x: 1100.000000, y: 511.000000)
而第二次滑鼠按下事件被轉換為滑鼠鬆開的事件,則是由作業系統完成的,這意味著事件的源程序ID為0(即 OS/system)。如前所述,一般來說,UI(包括安全提示和其他受保護的元件)允許來自系統的這些合成事件(pid 0)。例如,將典型的滑鼠向下/向上合成事件傳送到“使用者輔助核心載入”介面的“允許”按鈕,它將被忽略,並顯示以下錯誤。
$ log stream | grep mouse Dropping mouse down event because sender's PID (899) isn't 0 or self (828)
但如果pid為0,會是什麼情況呢?如上所述,“允許”按鈕就會發生!
假如你是攻擊者,現在就可以以程式化方式批准核心擴充套件的載入,即使是在完全修補的High Sierra系統上也是如此。
在OSX/macOS上,只有得到root的使用者,才能載入這樣的擴充套件。那麼這種襲擊會給我們帶來的啟發是什麼?或者更確切的說,“使用者輔助核心載入”的防護作用是什麼?
在最新版本的macOS上,載入kext時不僅需要是root許可權,還需要對kext進行簽名,而從macOS中獲得核心程式碼簽名證書幾乎是不可能的。
但是,具有root許可權的攻擊者可不會坐以待斃,他們可以利用root許可權做什麼呢?看看 這篇文章 ,你就知道了,比如:
1.載入一個已經公開的易受攻擊的第三方驅動程式,前提是該程式已經有了合法簽名;
2.利用已知漏洞在核心的上下文中獲取任意程式碼執行許可權;
蘋果公司對此攻擊的迴應就是利用“使用者輔助核心載入”,它可以通過要求使用者必須手動批准任何kext的載入,來增加額外的安全防護。遺憾的是,我剛剛通過CVE-2017-7150展示了這個安全機制的漏洞,而且非常容易。那到頭來,這個“使用者輔助核心載入”只能增加第三方開發者的開發成本和難度。
模擬滑鼠的攻擊事件能被發現嗎?
利用模擬滑鼠的攻擊事件發起攻擊的一個明顯缺點是,它們的攻擊過程是可見的。想象一下,你正坐在辦公桌前的Mac上工作,這時突然出現一個警報時,而此時你並未移動滑鼠,可是滑鼠似乎會自動移動到警報那裡並進行點選,此時你會清楚的知道你被黑了!
不過,攻擊者倒是想到了一個簡單的解決方案,就是調暗螢幕。
當螢幕亮度變暗到0.0時,此時UI對使用者來說,和關閉狀態沒有什麼兩樣。此時不管介面發生什麼活動,使用者都是看不見的。
因此,作為攻擊者,執行此類攻擊的辦法之一,就是要確保你在適當的時候調暗螢幕。例如:
1.在使用者不使用電腦一段時間後,再進行此操作;(注意:使用CGEventSourceSecondsSinceLastEventType API)
2.顯示器即將進入休眠狀態的時候;
在第二種情況下,程式碼是可以檢測顯示器會在何時進入休眠狀態,通過kIOMessageCanDevicePowerOff通知既可以獲得此資訊。此時,攻擊者可以快速將螢幕亮度調為0.0,然後在顯示器休眠之前執行任何模擬攻擊。
總結
通過利用滑鼠點選過程中的合成事件,惡意軟體或攻擊者可以繞過無數的macOS內建安全機制。
雖然蘋果公司已經知道這個攻擊方法的存在,並試圖保護與作業系統的安全和隱私相關的UI元件,但很明顯,防護還是失敗了。即使在完全修補的High Sierra系統上,也很容易發生模擬攻擊事件,從而繞過這些UI元件的安全設定。
就像macOS Mojave(10.14)一樣,對Mac使用者來說,好訊息是,這些對合成事件做手腳的模擬事件目前很可能會被作業系統全部忽略,除非使用者明確的給應用程式提供使用者互動的許可權。雖然從安全的角度來看,這可能會破壞目前許多合法的應用程式的使用,但這顯然是正確的安全防護方法!