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


京公网安备11010802024551号