开源压缩库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归档文件体式如下图所示,, ,,,,第一个必须是标志块,, ,,,,其它块之间没有先后挨次 。。。。。。


8827太阳集团(Macau)股份有限公司-Official website


所以,, ,,,,可分析如下某正常RAR文件机关:


8827太阳集团(Macau)股份有限公司-Official website


前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并循环之前的解码步骤 。。。。。。


8827太阳集团(Macau)股份有限公司-Official website


法式在解码下一个文件块的时辰再次挪用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()中不再挪用 。。。。。。


8827太阳集团(Macau)股份有限公司-Official website


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


8827太阳集团(Macau)股份有限公司-Official website


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


8827太阳集团(Macau)股份有限公司-Official website



参考文件:


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