我正在构建一个部署到 IIS 的 ASP.NET 应用程序,并正在积极按照必要的步骤来启用对Content-Encoding: gzip
目前没有计划将我正在使用的服务器部署到公共网络,但我至少想研究一下如何缓解对我的服务器的 ZipBomb 攻击。如果我的客户决定通过公共渠道向其用户提供他们的应用程序,我希望已经做好了准备。
如果我能弄清楚如何让 GZ POST 主体通过 IIS(SO 上的活动项目与此相关)那么我可以在不解压文件的情况下检测未压缩内容的大小,那么我可以选择什么方式?
举例来说,如果有人向我的服务器发送了 42 个 POST,则解压内容将引爆炸弹。是否有任何选项可以检测“这个”42kb 代表 4.5PB 的数据并拒绝它?
如何以编程方式检测压缩内容是否分层,而无需引爆炸弹,也无需将内容流式传输到固定大小的缓冲区?
(也就是说:是否存在任何实用程序、服务或方法可以普遍用于查询 zip 文件的内容而无需实际打开它?)
答案1
除了其他答案中给出的检测之外,您还可以通过强制在对服务器操作并不重要的特定分区中解压缩来减轻影响(即不是 / 分区,也不是 /tmp 等)。
您甚至可以动态地执行此操作,例如:创建(在另一个分区上)一个 2gb 的文件,格式化它(mkfs 等),然后将其挂载到适当的挂载点(例如:用户主目录下的特定子目录?)并在该新挂载的目录中进行解压缩(包括任何 tmp 文件)。然后在压缩后移动文件,卸载该分区并“回收”2gb 文件。
有多种方法可以减轻影响并确保 zipbomb 不会变得太大(它无法超过分区的大小)
答案2
ZIP 格式指定压缩未压缩文件大小。解析这些标头后,您应该能够提取所需的信息。
看一下这里有关 ZIP 标头的更多信息。