开源压缩库libarchive代码执行误差(CVE-2019-18408)剖析

宣布时间 2019-11-25

前 言


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。


误差修补


libarchive 团队已在Github上提交最新的修复版本,建议受影响用户尽快下载并更新:

https://github.com/libarchive/libarchive/releases/tag/v3.4.0

各大Linux刊行版清静更新信息如下:

Debian:https://security-tracker.debian.org/tracker/CVE-2019-18408

Ubuntu:https://usn.ubuntu.com/4169-1/

Gentoo:https://bugs.gentoo.org/show_bug.cgi?id=CVE-2019-18408

Arch Linux:https://www.archlinux.org/packages/?sort=&q=libarchive&maintainer=&flagged=


补丁剖析


在最新版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。


尊龙凯时 - 人生就是搏!



参考文献:


1.https://www.zdnet.com/article/libarchive-vulnerability-can-lead-to-code-execution-on-linux-freebsd-netbsd/#ftag=RSSbaffb68/

2.https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-18408

3.https://github.com/libarchive/libarchive/compare/v3.3.3...v3.4.0

4.https://lists.debian.org/debian-lts-announce/2019/10/msg00034.html