小米 Redmi 5 Plus 身份验证绕过漏洞分析

  • 来源:网络
  • 更新日期:2020-06-15

摘要:0x01 漏洞描述小米 Second Space 取代了 MIUI 设备上的 Android 用户配置文件。它允许管理员和第二用户通过主屏幕上的图标或锁定屏幕来切换配置文件,这两个用户空间都可以用

0x01 漏洞描述

小米 Second Space 取代了 MIUI 设备上的 Android 用户配置文件。它允许管理员和第二用户通过主屏幕上的图标或锁定屏幕来切换配置文件,这两个用户空间都可以用 PIN 或密码保护。

在小米 MIUI 系统中发现了一种方法,该方法允许用户在不提供密码或 PIN 的情况下在空格之间切换。这需要启用 第二空间 和 密码 / PIN 屏幕锁定以及 USB 调试。

该漏洞是由 ADB 命令触发的,该命令发送意图以绕过密码提示的标志启动 SwitchUserService 服务。结果,用户可以在不知道密码的情况下立即切换空间。

该问题是在 Redmi 5 Plus 设备中发现的,但已确认会影响多个最新的 MIUI 版本。

0x02 漏洞验证

验证全新的 Redmi 5 plus 设备:

1. 设立 第二空间 的功能,如果提示不能设置,从设置锁屏密码或 PIN 设置>第二空间;

2. 导航到 设置 > 关于手机 并在 MIUI 版本上点击 7 次以激活 开发人员选项 ;

3. 从设置>其他设置>开发人员选项> USB 调试中启用 USB 调试;

2. 出现提示后,连接 USB 线并授权计算机;

5. 键入以下命令来获取 Second Space 用户的 ID,然后绕过密码 / PIN 提示切换到该 ID。

$ SECOND_USER=`adb shell pm list users | grep -o { [ 0-9 ] * | tr -d \'{\' | tail -n 1` $ adb shell am start-service --ez params_check_password False --ei params_target_user_id $SECOND_USER -a com.miui.xspace.TO_CHANGE_USER

无需提供密码即可从 第二空间 切换到 第一空间

$ adb shell 是启动服务 -e params_check_password 否 -e params_target_user_id 0 -a com.miui.xspace.TO_CHANGE_USER

下面的视频演示了该过程 (建议全屏观看)。

https://labs.f-secure.com/assets/Uploads/demo3.mp4

记录了以下操作:

1.(00:02)切换到第二个空间,当屏幕变黑时请求并提供 PIN 输入,可通过短暂显示的 设置 活动看到;

2.(00:13)切换回主要空间,要求并提供 PIN 输入。再次简要显示 设置 活动;

3.(00:29)切换到没有 PIN 的第二个空格,不弹出 设置 ;

4.(00:43)切换回主要空间,更改 params_target_user_id,无 PIN 时未弹出 设置 ;

5.(01:23)再次切换到第二空间以在相关设置中显示 PIN 输入要求。

0x03 技术细节

负责大多数 第二空间 功能的系统应用程序 / 程序包是 com.miui.securitycore 。对以下设置中 在空间之间切换 选项的静态分析使我们指向 SecondSpaceSettingsFragment 类,该类通过调用 switchToOwnerSpace()方法来实现此切换 。依次启动 com.miui.securityspace.service。

SwitchUserService 服务:

在此服务的实现中, startCommand()重写调用处理 checkPasswordBeforeSwitch(),然后从启动切换过程的位置调用 SpaceManager.switchUser()。

该漏洞在于在 checkPasswordBeforeSwitch()内强制执行密码要求的方式,因为存在布尔值足以跳过提示。这意味着当将 params_check_password extra 设置为 False 时发送服务启动意图时,可以绕过密码输入。可以通过发出以下命令,使用 ADB Shell 而不需要 root 访问权限来实现:

$ am start-service --ez params_check_password False --ei params_target_user_id 10 -a com.miui.xspace.TO_CHANGE_USER

上面的命令也可以通过将 params_target_user_id 整数指定为 0 来从第二个空间切换到主要空间。

对应用程序的 AndroidManifest.xml 进行更仔细的检查后发现,该服务未声明为 private,或者 export = false 。但是,如果未明确设置,则由于存在 intent-filters,因此默认情况下将导出 Service ,如清单的以下摘录所示:

因此,该服务的安全性取决于启动该服务所需的权限,因为大多数拥有 INTERACT_ACROSS_USERS 权限的应用程序都是系统应用程序。但是,此权限也由 shell 程序用户持有,这是普通的非 root ADB Shell 提供的访问级别。

0x04 时间线