IT 之家 11 月 23 日消息 稍早之前,Magisk 的开发者 topjohnwu 宣布推出了新版的 Magisk 工具,绕过一些安卓的 SafetyNet Attestation API,让手机在获取 Root 的情况下也能玩具有该 API 的手游(如《FGO》)。
但是在这之后他发现,这一解决方案对自己的一加 6 手机无效。之后,他在一则 Medium 帖子中表示发现了一个安全漏洞,《Fate/Grand Order》(通常称《FGO》)似乎在滥用这一漏洞,用来监测他一加手机上的 Root 访问权。

XDA 发布了一篇文章,根据他的发现梳理了这一漏洞的信息。以下为该文主要内容翻译。
Procfs 和安卓
在基于 Unix 的操作系统上,有一个名为 “procfs” 的特殊文件系统,其中包含有关进程(可以联想应用程序)的信息,例如内存使用情况(可以联想 RAM)、状态(进程是否正在运行,休眠等)。在大多数基于 Unix 的操作系统上,用户和应用程序可以轻松访问 procfs,来查看系统上正在运行的应用程序和服务类型(参考 Windows 的任务管理器)。然而从安卓 7.0“牛轧糖” 系统开始,Google 锁定了对 procfs 的访问权限。在 Android Nougat(安卓 7.x)系统之前,像 SystemPanel 这样的应用程序能够收集有关正在运行的应用程序的数据,而无需任何特殊权限。安卓 7.x 系统之后,应用程序需要通过 UsageStats 或 AccessibilityService 等 API 才可以做到这一点,这两个 API 都由必须通过用户授予的权限来把关。
Google 通过使用 “hidepid = 2” 标志挂载/proc,来阻止应用程序通过 procfs 读取其他应用程序的状态。通过这一手段,应用程序只能看到自己进程的状态。因此,应用程序需要通过可被接受的 API(如 UsageStats 或 AccessibilityService)来获取当前设备上正在运行的应用程序和服务的信息。
漏洞
如果 procfs 没有用 “hidepid = 2” 挂载怎么办?那么,应用程序可以自由地读取系统上运行的其他应用程序(和挂载点)的状态,而无需任何额外的权限 (注)。Google 在自家的设备上通过 “hidepid = 2” 挂载了的 procfs,但并未强制其他 OEM 对设备强制执行此要求。来自 LG、一加、华为/荣耀、小米等公司的几款设备尚未通过 “hidepid = 2” 挂载 procfs。由此,《Fate/Grand Order》等应用程序就能利用它来检测设备上是否存在 Magisk(或是否 Root)。
注:安卓 9 Pie 中的一个安全性改动会阻止应用程序在自己的 “SELinux 上下文(context,可大致理解为 “环境”)” 之外读取信息,因为每个应用程序现在都是单独隔离的。SELinux 是一个内核模块,充当各种 “守卫”,阻止应用程序和服务访问它们不应该访问的文件。SELinux 上下文如同一个文件的标签,其中包含用户和角色等信息。如果没有为 procfs 启用 “hidepid = 2” 标志,则处于相同 SELinux 上下文的应用程序可以读取同一上下文中有关其他应用程序的信息。在运行安卓 9 Pie 的设备上,只有针对安卓 9 Pie 构建的应用才会将这一新的 SELinux 更改应用在它们身上。只要安装时没有通过 “hidepid = 2” 挂载 procfs,针对 Android 8.1 Oreo 或更低版本的应用程序将仍使用旧的 SELinux 规则,也就可以访问相同 SELinux 上下文中的进程信息。应 Google Play 的新要求,你的设备上运行多数应用程序目标 API 应对应安卓 8.0“奥利奥”,但是,很多应用程序尚未针对安卓 Pie 进行更新。
procfs 漏洞演示:

▲左为通过 “hidepid = 2” 挂载了 procfs 的 Google Pixel 3 XL,右为未通过 “hidepid = 2” 挂载 procfs 的华为 Mate 20 X

▲在 Google Pixel 3 XL 上,“Material Terminal” 应用程序只能看到自己的进程;在华为 Mate 20 X 上,“Material Terminal” 应用程序可以看到其他进程。
我的设备是否受影响?
以下是 XDA 发现的未使用 “hidepid = 2” 挂载 procfs 的设备(项目从左至右对应为:OEM 厂商、设备、安卓版本、是否存在 procfs 泄密)。
后果有多糟糕?
如果与 FuséeGelée、Blueborne、KRACK、Meltdown(熔断)Spectre(幽灵)等漏洞进行比较,这个 bug 就相形见绌了。应用无法通过这一漏洞获取 root 权限,或窃取你的密码。你的银行账户、信用卡都是安全的。最坏的情况是,应用程序可以判断你的设备上是否有另一个应用程序正在运行,因此用途非常有限。请记住,这是许多 GNU / Linux 发行版的规范行为,另外,Google 最近才开始通过安卓 7.x 系统阻止 procfs 访问。这一 bug 能让应用程序绕过所需的某些权限来监视其他进程,但无法破坏安卓系统的沙箱并从其他应用程序中窃取数据。可无论如何,这是非预期的行为,且已经打破了安卓的隐私功能,因此 bug 必须得到修复。
如何检测设备是否受影响
若要检查设备是否会向其他应用程序泄漏进程信息(即 procfs 未使用 “hidepid = 2” 挂载),你可以使用 shell 命令(参考上文对比图),也可以使用 topjohnwu 开发的应用程序(点此从 GitHub 获取)进行检查。如果你的手机已经获取 Root 权限,topjohnwu 的应用还能让你使用 “hidepid = 2” 重新挂载 procfs。

会有修复吗?
是的,这一定会得到修复。谷歌现在会要求所有设备使用 “hidepid = 2” 挂载 procfs。谷歌将通过更新兼容性测试套件(CTS)来强制执行。这里的 CTS 是一组测试,所有设备必须通过测试,才能使用 Google Play 应用和服务。想要销售预装了 Google Play 商店的所有 OEM,最后都必须推出更新,以便在不久的将来使用 “hidepid = 2” 重新挂载 procfs。这一问题最先在一加设备上发现,一加方面已经知悉此问题并正在进行修复。如果其他 OEM 对此错误发表评论,我们将就在此文进行更新。但是,你大可不必怀疑所使用的设备的 OEM 是否会发布更新,如果他们希望更新通过 CTS 测试,就必须修复此 bug。
XDA 原文地址:点此前往(英文)
转载文章,版权归作者所有,转载请联系作者。作者:IT之家,来源:https://www.ithome.com/0/396/548.htm