7z apache解析漏洞_开源压缩库 libarchive 代码执行漏洞(CVE-2019-18408)分析

前言

2019年2月,Check Point安全研究团队检测发现WinRAR解压缩软件存在若干重大漏洞。攻击者可利用上述漏洞,通过诱使用户使用WinRAR软件打开恶意构造的压缩包文件,执行恶意代码,实现对用户主机入侵的目的。

同样,在不久前谷歌的安全研究员发现libarchive库中存在漏洞CVE-2019-18408。攻击者可利用精心构造的压缩文件,对受影响用户造成压缩程序拒绝服务或执行恶意代码。

漏洞危害

libarchive是一个开源的压缩和归档库。它支持实时访问多种压缩文件格式,比如7z、zip、cpio、pax、rar、cab、uuencode等,因此应用十分广泛。

这次被曝出的安全漏洞间接影响到了大量项目和产品。实际上不光是压缩/解压工具可能会采用libarchive,libarchive还应用于台式机和服务器操作系统(各大Linux发行版、MacOS、Windows)、各种包管理器(Pacman、XBPS、NetBSD’s、CMake等)、文件浏览器(Springy、Nautilus,GVFs等)中,甚至某些邮件反病毒软件都会用到它,那么攻击者完全可以利用libarchive的漏洞,发送包含恶意压缩包的邮件,利用漏洞执行任意代码甚至控制设备。

影响版本

libarchive version < 3.4.0

漏洞原理

概括:当解压RAR格式的压缩文件失败时,程序会继续寻找下一个文件块的Header并进行解码,而之前解压失败并释放的堆空间被重新使用,造成UAF(Use After Free)漏洞。

通常RAR归档文件格式如下图所示,第一个必须是标志块,其它块之间没有先后顺序。

所以,可分析如下某正常RAR文件构造:

前7个字节为RAR格式签名(v5版本以下),0x6152为块CRC,0x72为块类型,0x1A21为块标志,0x0007为块大小,由此正确判定为rar文件。

当程序处理第一个文件块Header时,因特殊构造导致解码失败,所以read_data_compressed()函数会返回ARCHIVE_FAILED。之后,在archive_read_format_rar_read_data()函数中,rar->ppmd7_context被释放,即CPpmd7结构体指针变量p。

当*buff不为NULL时,也就是unp_buffer(未解压数据)依然存在时,程序会接着处理rar文件,之后会寻找下一个文件块的Header并循环之前的解码步骤。

程序在解码下一个文件块的时候再次调用read_data_compressed()函数中的Ppmd7_DecodeSymbol()函数进行解码,再次使用被释放的对象p,因此造成UAF。

漏洞修补

各大Linux发行版安全更新信息如下:

补丁分析

在最新版v3.4.0中,释放rar->ppmd7_conext之后,开发者将rar->start_new_table置为1,rar->ppmd_valid置为0,因此Ppmd7_DecodeSymbol()函数在read_data_compressed()中不再调用。

在parse_code()函数中,对第二个文件块进行解码,但无法创建新的哈夫曼编码表,因此最终返回-30,其值是ARCHIVE_FATAL的宏定义,而ARCHIVE_FATAL意味着程序不再进行任何操作并进行退出处理。

对于rar>ppmd_valid的设置,可以确保在rar_br_bits为0的情况下,类似构造的RAR文件在parse_code阶段始终可以返回ARCHIVE_FATAL。

参考文献:

本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1086/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值