qmail 郵件伺服器中的遠端可利用漏洞

Qualys 的安全研究人員 顯示 機會 手術 qmail郵件伺服器中的漏洞, 著名的 早在 2005 年(CVE-2005-1513),但仍然沒有修補,因為 qmail 的作者認為創建一個可用於攻擊預設設定係統的有效漏洞是不切實際的。 Qualys 能夠準備一個漏洞來反駁這個假設,並允許人們透過發送專門設計的訊息來在伺服器上啟動遠端程式碼執行。

這個問題是由 stralloc_readyplus() 函數中的整數溢位引起的,在處理非常大的訊息時可能會發生這種情況。 運行需要具有64GB以上虛擬記憶體的4位元系統。 2005 年最初分析該漏洞時,Daniel J. Bernstein 認為,程式碼中分配數組的大小始終在 32 位元值以內的假設是基於沒有人為每個進程提供 GB 記憶體的事實。 在過去的 15 年裡,伺服器上的 64 位元系統已經取代了 32 位元系統,提供的記憶體量和網路頻寬也急劇增加。

qmail 軟體套件維護者考慮了 Bernstein 的註釋,並在啟動 qmail-smtpd 進程時限制了可用記憶體(例如,在 Debian 10 中,限制設定為 7MB)。 但Qualys的工程師發現這還不夠,除了qmail-smtpd之外,還可以對qmail-local進程進行遠端攻擊,而qmail-local進程在所有測試的軟體包中仍然不受限制。 作為證明,我們準備了一個漏洞原型,適合在預設配置下使用 qmail 攻擊 Debian 軟體包。
為了在攻擊期間組織遠端程式碼執行,伺服器需要 4GB 可用磁碟空間和 8GB RAM。
這個漏洞允許您以系統中任何使用者的權限執行任何 shell 命令,除了 root 和在「/home」目錄中沒有自己的子目錄的系統使用者(qmail-local 進程以權限啟動)進行交付的本機使用者)。

攻擊進行
透過發送非常大的郵件訊息,包括幾個標題行,大小約為 4GB 和 576MB。 在嘗試向本機使用者傳遞訊息時,在 qmail-local 中處理此類字串會導致整數溢位。 整數溢位會導致複製資料時緩衝區溢位以及使用 libc 程式碼覆寫記憶體頁的可能性。 透過操縱傳輸資料的佈局,也可以重寫「open()」函數的位址,將其替換為「system()」函數的位址。

接下來,在qmail-local中呼叫qmesearch()的過程中,透過open()函數開啟了「.qmail-extension」文件,導致該函數的實際執行
系統(“.qmail-副檔名”)。 但由於檔案的「副檔名」部分是根據接收者的位址產生的(例如「localuser-extension@localdomain」),因此攻擊者可以透過指定使用者「localuser-;command」來安排要傳送的命令執行;@ localdomain」作為訊息的收件人。

在程式碼分析過程中,在附加的 qmail-verify 修補程式中還發現了兩個漏洞,該補丁是 Debian 軟體包的一部分。 第一個漏洞(CVE-2020,3811)允許您繞過電子郵件地址驗證,第二個(CVE-2020,3812)導致本地資訊外洩。 特別是,第一個漏洞可讓您繞過漏洞利用中使用的位址正確性的驗證來傳送命令(該驗證不適用於沒有網域的位址,例如「localuser-;command;」)。 第二個漏洞可用於透過直接呼叫本機處理程序來檢查系統上檔案和目錄的存在,包括那些只能由 root 存取的檔案和目錄(qmail-verify 以 root 權限運行)。

為了解決這個問題,Bernstein 建議在執行 qmail 進程時對可用記憶體進行總限制(「softlimit -m12345678」),在這種情況下問題就會被阻止。 作為另一種保護方法,也提到透過「control/databytes」檔案限制處理郵件的最大大小(預設情況下,它不是使用預設設定建立的,qmail 仍然容易受到攻擊)。 此外,「control/databytes」不能防止系統使用者的本地攻擊,因為該限制僅被 qmail-smtpd 考慮。

該問題影響包 網路郵件,包含在 Debian 儲存庫中。 已經為此軟體包準備了一組補丁,消除了 2005 年以來的舊漏洞(透過向 alloc() 函數程式碼添加硬記憶體限制)和 qmail-verify 中的新問題。 分別地 準備好了 qmail-verify 補丁的更新版本。 開發商 分公司 不是qmail 他們準備了自己的補丁來阻止舊問題,並開始努力消除程式碼中所有可能的整數溢位。

來源: opennet.ru

添加評論