Android 安全一直以来都是个值得关注的问题,今年二月末「深蓝洞察」的一篇 文章 揭露了某些厂商利用反序列化漏洞来实现自身保活、隐私窃取的行径。

我们日常使用的手机尚能被攻击,那么其它那些搭载了 Android 系统的设备又何尝不会?许多电视盒子、智能音箱之类产品的厂商为了图方便往往会关闭正常 Android 系统的部分安全机制(如 SELinux),这就可能导致第三方应用趁虚而入,造成用户隐私泄露

朋友的 Android TV 是在关闭 SELinux 且 system_server 可调试的情况下才成功 PWN 的,那么「坏蛋」应用能否在只关闭 SELinux 的情况下做一些事情呢?

App Zygote

App zygote 是 Google 为 Chrome / WebView 设计的一项特殊功能,几乎没有什么文档,它允许第三方应用为 isolated service 生成自己的 zygote 进程以加速一些共享资源的加载

因为这是一个「zygote 进程」,显然需要给它 CAP_SETUID 才能使其在 fork 后将 uid 设置为隔离进程的 uid,这里拿 Momo 的 app zygote 做小白鼠,看看它都有哪些 capabilities:

while ! PID=$(pidof io.github.vvb2060.mahoshojo_zygote); do sleep 1; done
capsh --decode=$(cat /proc/$PID/status | grep -Po '(?<=CapEff:\t).*')

在 Termux 中运行脚本,然后启动 Momo 应用,得知它的 App Zygote 具有的 caps 为 0x00000000000001c0=cap_setgid,cap_setuid,cap_setpcap,嗯,很符合我们对 zygote 的想象。

在正常情况下,系统 zygote 的 seccomp 过滤器会限制 app zygote 能够 setuid 的范围,然而当 SELinux 关闭时,seccomp 过滤器也 一并被禁用,这就导致我们可以直接在 app zygote 内 setuid(0) 来轻松拿到 root 权限

Exploit

完整代码已经上传 GitHub,整体大致封装了一下,提权成功之后会起一个守护进程,等待命令行连接并把标准 io 的 fd 发给它,控制其 exec 一个 root shell

现阶段搭载 Android 系统的智能终端或许还是 Android 5 ~ 7 的版本居多,不能直接利用这个漏洞,但是几年之后呢?如果厂商依然不重视安全问题,当智能终端的主流 Android 版本达到 Android 10+,将又是一场隐私灾难。