開源壓縮庫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