抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

Zip Slip 目录遍历漏洞已影响多个 Java 项目

2018 年 6 月 06 日

看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!

近日,专注于开源及云安全监控防范工作的 Snyk 公司披露了一种可能会造成任意文件被覆写的安全漏洞,称为 Zip Slip 。其相应的攻击手段是创建一种特制的 ZIP 压缩文件,在其中引用会对目录进行遍历的文件名。受该风险影响的项目多达数千个,包括 AWS Toolkit for Eclipse Spring Integration LinkedIn 的 Pinot OLAP 数据库、 Apache/Twitter Heron 、Alibaba JStorm Jenkins Gradle 等等。各大云服务提供商也纷纷发现了该问题的存在,InfoQ 将对此问题的进展持续追踪。

据该公司所分析,这一安全漏洞对于 Java 生态系统来说影响尤其严重,这是因为在 Java 生态中缺少对压缩文件进行高层次处理功能的这样一种集中式的库。目前已知包含这一漏洞的 Java 类库包括 Java java.util.zip Apache commons-compres Apache Ant 、ZeroTurnaround 的 zt-zip zip4j 。Snyk 的 CEO Guy Podjarny 同时也向 InfoQ 表示,由于该漏洞所影响的压缩文件格式是那些解压缩类库支持的、并且允许在压缩文件中出现相对路径的文件格式,因此 JAR/EAR/WAR 都有可能成为潜在的受害者。

文件遍历攻击的目标是访问保存在 root 目录之外的文件或文件夹,只需在引用文件地址的变量中添加 “点 - 点 - 斜杠(…/)“或类似的符号,又或者是使用绝对文件路径,攻击者就有可能访问保存在文件系统中的任意文件或目录,例如应用程序的源代码或是配置文件,乃至重要的系统文件。举例来说,如果某个 ZIP 压缩文件中包含一个路径为"…/…/file.exe"的文件,那么在进行解压时,该文件的实际地址就会脱离目标文件夹之外(注:常见的压缩工具并不支持这种路径,但 ZIP 格式本身并没有这种限制)。这种情形可能会出现在服务端,也可能出现在客户端。所导致的结果可能是恶意文件被写入磁盘,或是敏感的文件被覆写。如果某个可执行文件或配置文件被某个包含了恶意代码的文件所覆盖,那么就有可能导致恶意代码被执行的问题。

Snyk 的白皮书通过以下这段代码举例说明在 Java 程序中出现的代码漏洞片段:

复制代码
Enumeration entries=​​zip​.g​etEntries();
while(entries​.h​asMoreElements()){
ZipEntry e ​=​entries.nextElement();
File f = new File(dir, e.​​getName());
InputStream input =​​zip​.g​etInputStream(e);
IOUtils​.c​opy(input, write(f));
}

在这段代码中,e.getName() 在与目标目录 dir 进行字符串拼接之前没有经过任何校验,就确定了 Java File 对象 f 的最终地址。如果在文件名中包含了向上遍历的目录路径(比如路径以 …/…/ 开头),那么在执行 IOUtils.copy 方法时,该文件就会被写入目标目录之外的地址。

一旦你意识到这种写法可能会被恶意利用,那么对该漏洞的防范倒是非常直接了当的。因为 ZIP 压缩文件没有理由需要将一个文件写入解压目录之外,所以你只需简单地进行检查就可以防止它发生:

复制代码
String canonicalDirPath=dir.getCanonicalPath();
String canonicalDestPath=e.getName().getCanonicalPath();
if(!canonicalDestPath.startsWith(canonicalDirPath)){
throw new ArchiverException("Entry is outside of the target dir: "
+ e.getName());
}

Snyk 的开发总监 Simon Maple 向 InfoQ 表示,他们已联系过的大多数软件供应商都在几天时间内修复了这个问题。

Java 并非唯一一个受此漏洞影响的语言,但潜在的危害却是最大的。JavaScript 的好处在于它的类库相对而言更集中化,并且它的两个具有解压缩文件功能的有风险的类库也已经修复了这个问题。.Net 生态中处理解压缩功能的类库也相对比较集中,在它的三个类库中已经有两个得到了修复,这两个发现了漏洞的库是 NuGet DotNetZip SharpCompress 。在 Go 生态系统中, mholt archiver 库发现了这一漏洞,但也已经修复。Snyk 的调查团队在 Ruby 和 Python 生态中还没有发现这一 bug。

Snyk 在 GitHub 上的相关项目将会由 Snyk 自身与各社区项目维护者时刻更新最新进展,该项目包含了各编程语言生态系统中与这一漏洞相关的最新信息的完整列表。

查看英文原文 Zip Slip Directory Traversal Vulnerability Impacts Multiple Java Projects

2018 年 6 月 06 日 16:061521
用户头像

发布了 428 篇内容, 共 153.9 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

USDT承兑商支付系统开发,区块链跨境支付源码

135深圳3055源中瑞8032

合约跟单软件开发,一键跟单系统搭建

135深圳3055源中瑞8032

一周信创舆情观察(10.12~10.18)

统小信uos

大数据上手实战!训练营“9营齐开”第二季限时免费报名啦

Apache Flink

大数据

Spring 5.2.7和SpringBoot 2.3.3中文翻译发布啦!!!

青年IT男

spring springboot

开发一个交易所需要多少费用?币币交易系统

135深圳3055源中瑞8032

华为云如何赋能无人车飞驰?从这群AI热血少年谈起

华为云开发者社区

人工智能 无人驾驶

笔记本中的“全优生”,英特尔Evo产品上市首日秒光!

新闻科技资讯

化身“监工”的AI,我们该如何相处?

脑极体

第五周学习代码技术选型总结

三板斧

极客大学架构师训练营

架构师训练营培训第一周总结

lakers

极客大学架构师训练营

区块链多币种钱包开发服务商,多币种钱包APP

135深圳3055源中瑞8032

架构师训练营第一期 - 第周五课后 - 作业一

极客大学架构师训练营

架构师训练营第一期 - 第五周课后 - 作业二

极客大学架构师训练营

LeetCode题解:50. Pow(x, n),暴力法,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

阿里18道常见的MySQL面试题,含解析

Java架构师迁哥

惠普中国(HPE)技术总监教你如何做个“火影般”的“架构师”

Java架构师迁哥

Java 程序员 架构

Java高并发编程的一本百科全书《Java高并发编程详解:多线程与架构设计》,把Java语言中最为晦涩的知识点都详解出来了!

Java架构之路

Java 程序员 架构 并发编程 编程语言

1分钟带你入门 React SCU、memo、pureCom

Leo

react.js 前端 React 前端进阶训练营 前端性能优化

政府和企业如何认识到区块链的好处

CECBC区块链专委会

比特币 区块链

极客时间 - 架构师一期 - 第五周作业

_

极客大学架构师训练营 第五周

第五周总结

_

架构师一期 架构师第五周总结

了解HashMap数据结构,超详细!

程序员的时光

面试 hashmap HashMap底层原理

第一周学习总结

Griffenliu

架构师训练营第 1 期第五周总结

Leo乐

极客大学架构师训练营

区块链技术本质再认知

CECBC区块链专委会

区块链 大数据

我从高级开发者身上学到的19条编码原则

Java架构师迁哥

架构师训练营 - 第一周学习总结

joshuamai

数字货币可能重构全球货币体系

CECBC区块链专委会

数字货币 金融

知识视频创作者何去何从,百度给出解答

脑极体

2020,国产数据库崭露峥嵘的发轫之年

墨天轮

数据库 阿里云 华为云 SQL优化 活动专区

Study Go: From Zero to Hero

Study Go: From Zero to Hero

Zip Slip目录遍历漏洞已影响多个Java项目-InfoQ