频道栏目
首页 > 安全 > 系统安全 > 正文

获取已锁定的OnePlus 3/3T:引导加载程序漏洞

2017-02-14 09:16:27      个评论      
收藏   我要投稿

获取已锁定的OnePlus 3/3T:引导加载程序漏洞,在这篇文中,我公开了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的命令非常简单:

// '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分区,例如,会在引导时提示以下警告:

\

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

上一篇:iOS开发工具——网络封包分析工具Charles
下一篇:深入分析Win32k系统调用过滤机制
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站