写点什么

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:061462
用户头像

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

关注

评论

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

Flutter 中与平台相关的生命周期

老孟Flutter

flutter

作业 - 第九周

eva

第八章作业 - 用户路径

Au revoir

双非渣硕的我是如何拿到字节跳动研发岗SP

拓跋阿秀

c++ 字节跳动 互联网 计算机 校园招聘

软件工程是否可以指导小团队的建设

风翱

软件工程 3月日更

数据分析(第八章作业)

大小姐

再推荐一款小众且好用的 Python 爬虫库 - MechanicalSoup

星安果

Python 自动化 爬虫 MechanicalSoup 小众

Python救救我!如何连接串口实现一个报警灯报警器

ucsheep

Python websocket 串口 报警器 报警灯

操作系统--死锁避免(银行家算法)

风骨散人

银行家算法

如何提高Flutter应用程序的性能

老孟Flutter

flutter

Service Mesh是什么,为我们解决了什么问题?

xcbeyond

Service Mesh 服务网格 3月日更

『计算机组成原理』 计算机系统概述(考研、面试必备)

风骨散人

ARTS-Week-0

绝影

ARTS 打卡计划 ARTS活动

[老孟Flutter] Stateful 组件的生命周期

老孟Flutter

flutter

墨迹天气成长中心页用户路径分析(模拟)

🙈🙈🙈

极客大学产品经理训练营

一份百投百中的计算机校招简历是如何迭代足足26版的?

拓跋阿秀

c++ 字节跳动 计算机 简历 校招

【Axure9百例NO.46】中继器多条件判断的优雅处理

zhuchuanming

原型设计 Axure 交互原型

6年时间,从实习生到阿里巴巴的P7,这就是我这个三本生的进阶之路

神奇小汤圆

Java 编程 程序员 架构 面试

产品经理训练营 - 第八章作业

joelhy

产品经理训练营

计算机组成原理--主存储器

风骨散人

『C++』我想学C++,C++太难了,那我想入门,给我10分钟我带你入门

风骨散人

图论--网络流最大流问题

风骨散人

如何判断自己是否适合当前公司?

石云升

离职 28天写作 职场经验 3月日更

云端身份认证和访问管理

龙归科技

身份云 云安全

JavaEE知识体系梳理

空城机

Java Java介绍 Java EE 大学作业

第八章作业

流浪猫

『Python爬虫』Python实现刷B站、爱奇艺等视频网站播放量(Python教学文章)

风骨散人

Python 爬虫

产品 0 期 - 第九周作业

vipyinzhiwei

能进BAT、TMD的C++学习过程大分享

拓跋阿秀

c++ 字节跳动 计算机 BATJMD

互联网HR黑话指南

硬核编程

华为与开发者的“情谊”,在HDC.Cloud 2021上书写智能时代新篇

脑极体

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