开源压缩库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