当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2013-028389

漏洞标题:Android 8219321 - 漏洞分析分享

相关厂商:Google

漏洞作者: SeaRobber

提交时间:2013-07-10 13:04

修复时间:2013-07-10 13:04

公开时间:2013-07-10 13:04

漏洞类型:设计错误/逻辑缺陷

危害等级:低

自评Rank:5

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2013-07-10: 积极联系厂商并且等待厂商认领中,细节不对外公开
2013-07-10: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

漏洞位置:
Android系统中java.util.zip工具包下ZipFile.java文件中的语句“mEntries.put(newEntry.getName(), newEntry);”没有进行校验重名entry逻辑漏洞。
ZipFile.java文件如下连接:
http://www.java2s.com/Open-Source/Android/android-core/platform-libcore/java/util/zip/ZipFile.java.htm

详细说明:

漏洞利用分析:
zipFile.java文件是用于根据不同打开模式(如read\write等)进行解压apk应用文件的;如下

/**
* Opens a file as <i>ZIP-archive</i>. "mode" must be {@code OPEN_READ} or
* {@code OPEN_DELETE} . The latter sets the "delete on exit" flag through a
* file.
* ...
*/
public ZipFile(File file, int mode) throws IOException {
...
readCentralDir();
...
}


其中有函数readCentralDir(),其作用为根据apk压缩包的结构进行读取压缩包内容,如下:

/**
* Find the central directory and read the contents.
* ...
*/
private void readCentralDir() throws IOException {
...
rafs = new RAFStream(mRaf, centralDirOffset);
bin = new BufferedInputStream(rafs, 4096);
for (int i = 0; i < numEntries; i++) {
ZipEntry newEntry = new ZipEntry(ler, bin);
mEntries.put(newEntry.getName(), newEntry);
}
}


其中在遍历整个apk压缩包文件的每个entry节点并读取其内容时,语句"mEntries.put(newEntry.getName(), newEntry);"
没有进行重名entry节点校验,从而导致apk文件在被加入重名的(并被加入了恶意代码的)Class.dex文件后,
其校验签名时还是用第一个拥有正确签名的Class.dex文件,而在解压读取时却被加入的重名文件把正确的内容进行了覆盖执行;从而产生的攻击行为。
目前google给出的补丁为对此语句进行重名entry校验并抛出异常:如下:

if (mEntries.put(entryName, newEntry) != null) {
throw new ZipException("Duplicate entry name: " + entryName);
}

漏洞证明:

目前网上已经出现POC代码:
https://gist.github.com/poliva/36b0795ab79ad6f14fd8

修复方案:

版权声明:转载请注明来源 SeaRobber@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝