华为主题管理器任意代码执行漏洞深度解析

本文详细分析了华为EMUI主题管理器中的安全漏洞,攻击者可通过恶意主题文件实现任意代码执行,获得系统级权限。漏洞涉及动态代码加载机制缺陷和签名验证绕过,影响EMUI 9.1至12多个版本。

华为主题管理器任意代码执行

26 Jul 2023 - 发布于 Luca Carettoni

2019年,我们有幸参与了华为新推出的移动漏洞赏金计划。为此,我们决定研究华为的主题系统。

主题管理器允许EMUI设备使用自定义主题来个性化设置,包括锁屏、壁纸和图标等。能够进行这类系统级更改的进程需要拥有提升的权限,这使得它们成为研究和利用的宝贵目标。

背景

在EMUI上实现锁屏时,使用了三种可能的引擎:

  • com.ibimuyu.lockscreen
  • com.vlife.huawei.emuilock
  • com.huawei.ucdlockscreen

安装主题时,SystemUI.apk会根据硬编码的受信任应用列表验证尝试进行这些更改的应用的签名。从我们观察到的情况来看,这个过程似乎得到了正确实施,没有明显的方法可以绕过签名检查。

也就是说,我们发现当使用com.huawei.ucdlockscreen时,它会在运行时加载额外的类。这些类的签名没有得到适当验证,甚至根本没有检查。这为我们引入自己的代码提供了机会。

查看主题归档文件(.hwt)的结构,我们看到解锁屏幕元素按以下方式打包:

1
2
3
4
unlock/
├── theme.xml
├── ext.properties
└── NOVA6LockScreen2019120501.apk

在unlock目录中,我们看到了theme.xml文件,这是一个指定多个属性的清单。这些设置包括要使用的动态解锁引擎(在我们的案例中是ucdscreenlock)和一个ext.properties文件,该文件允许从主题文件中动态加载Java代码。

让我们看看文件内容:

1
2
3
engine=ucdscreenlock
extensionImpl=com.huawei.nova.ExtensionJarImpl
extensionJar=NOVA6LockScreen2019120501.apk

这指示动态引擎(com.huawei.ucdlockscreen)在运行时从NOVA6LockScreen2019120501.apk加载com.huawei.nova.ExtensionJarImpl。由于这个类没有经过验证,我们可以引入自己的代码来实现任意代码执行。更有趣的是,我们的代码将在高权限应用程序(com.huawei.android.thememanager)的进程中运行,如下所示。

利用logcat工具,我们可以看到动态加载过程:

1
I/HwThemeManager: Loading extension from: /data/themes/0/unlock/ucdscreenlock/NOVA6LockScreen2019120501.apk

这个漏洞通过在EMUI 9.1和10上的直接测试得到确认,但似乎也影响当前版本的EMUI,但存在一些限制*。

影响

如前所述,这导致使用高权限应用程序的PID执行任意代码。在我们的测试中,利用该漏洞获得了大约200个Android和华为自定义权限。其中包括下面列出的权限,这些权限可能导致设备用户数据、敏感系统数据、输入系统的任何凭据以及系统环境的完整性完全受损。

考虑到应用程序可以发送需要huawei.android.permission.HW_SIGNATURE_OR_SYSTEM权限的intent,我们认为有可能利用现有的系统功能来获得系统级代码执行。一旦实现,这个漏洞作为root链的一部分具有巨大潜力。

可利用性

这个问题可以可靠地利用,没有技术障碍。也就是说,利用需要安装自定义主题。为了远程实现这一点,需要用户交互。我们可以设想几种可能有效的社会工程场景,或者使用第二个漏洞来强制下载和安装主题。

首先,可以向其他用户赠送主题,因此可以利用(或欺骗)受信任的联系人来说服受害者接受并安装恶意主题。

例如,以下URL将打开主题赠送页面:hwt://www.huawei.com/themes?type=33&id=0&from=AAAA&channelId=BBB

其次,攻击者可以在线发布指向恶意主题的链接或QR码,然后说服受害者使用hwt://方案通过深度链接触发HwThemeManager应用程序。

公平地说,我们必须承认华为对新主题和壁纸有审查过程,这可能会限制利用此漏洞的实时主题的使用。

部分修复

华为于2022年2月24日发布了HwThemeManager的更新(内部跟踪为HWPSIRT-2019-12158),声明此问题已解决。尽管如此,我们认为问题实际上是在ucdlockscreen.apk(com.huawei.ucdlockscreen版本3及更高版本)中解决的。

这是一个重要的区别,因为最新版本的ucdlockscreen.apk是由HwThemeManager在运行时安装的,在应用需要此类引擎的主题之后。即使在库存手机上(包括EMUI 9、10和最新的12.0.0.149),具有物理访问权限的攻击者也可以卸载最新版本并安装旧的易受攻击版本,因为它是由华为正确签名的。

如果没有华为的进一步缓解措施,具有设备物理访问权限的攻击者仍然可以利用此漏洞在最新设备上获得系统特权访问。

进一步发现

在对最新版本的com.huawei.ucdlockscreen(版本4.6)中引入的修复进行几个小时的逆向工程后,我们发现了影响EMUI 9.1版本的额外绕过。这个问题不需要物理访问,并且可以再次触发相同的可利用条件。

在主题加载期间,最新版本的com.huawei.ucdlockscreen检查是否存在/data/themes/0/unlock/ucdscreenlock/error文件。由于/data/themes/0/中的所有文件都是从提供的主题(.hwt)文件中复制的,它们都可以由攻击者控制。

此文件用于检查主题的特定版本。攻击者可以简单地嵌入引用旧版本的错误文件,强制支持旧版主题。这样做时,攻击者还会在ext.properties文件中指定一个虚构的包名。恶意.hwt文件中的这些更改组合绕过了所有必需的检查——使问题在最新的EMUI9.1上再次可利用,无需物理访问。在我们调查时,其他EMUI主要版本似乎实施了签名验证机制来缓解此问题。

披露

根据华为移动漏洞赏金的条款,此问题于2019年12月31日披露,并由华为如上所述进行了处理。额外研究结果于2021年9月1日报告给华为。鉴于从原始修复以来已经过去了很长时间,并且我们认为该问题不再可以远程利用,我们决定发布漏洞的详细信息。

在撰写本文时(2023年4月28日),通过强制加载易受攻击的ucdlockscreen.apk,该问题在最新的EMUI(12.0.0.149)上仍然可以在本地利用。我们决定不发布易受攻击的ucdlockscreen.apk版本以及恶意主题概念验证。虽然这个问题对攻击者不再有趣,但它仍然可以使root社区受益,并促进安全研究人员识别华为基于EMUI的设备中的问题。

结论

虽然漏洞本身在技术上有趣,但这里有两个安全工程学习教训。最大的收获显然是,虽然依赖签名验证来验证软件组件可能是一种有效的安全措施,但必须彻底扩展到包括任何动态加载的代码。也就是说,华为似乎不再提供bootloader解锁选项(参见此处),使得root更加复杂和昂贵。这个漏洞是否会被root社区开发的链使用还有待观察。

第二个工程教训是确保当我们设计向后兼容机制时,我们应该假设可能存在我们想要放弃的旧版本。

这项研究得益于华为移动电话漏洞赏金计划。我们要感谢华为PSIRT在处理此问题、慷慨的赏金以及披露细节的开放性方面的帮助。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计