在 Exim 郵件伺服器中
在預設配置中,本機使用者可以在沒有不必要的複雜性的情況下執行攻擊,因為應用了「驗證=收件者」ACL,它對外部位址執行額外的檢查。 當設定發生變更時,例如充當另一個網域的輔助 MX、刪除「verify=recipient」ACL 或對 local_part_suffix 進行某些更改,可能會發生遠端攻擊。 如果攻擊者能夠將與伺服器的連線保持開啟 7 天(例如,每分鐘發送一個位元組以繞過逾時),則遠端攻擊也是可能的。 同時,可能存在更簡單的攻擊向量來遠端利用該問題。
此漏洞是由於 /src/deliver.c 檔案中定義的 Deliver_message() 函數中收件人地址驗證不正確造成的。 透過操縱位址格式,攻擊者可以將其資料替換為透過 root 權限的 execv() 函數呼叫的命令的參數。 操作不需要使用用於緩衝區溢位或記憶體損壞的複雜技術;簡單的字元替換就足夠了。
該問題與地址轉換結構的使用有關:
交付本地部分 = 展開字串(
string_sprintf("${local_part:%s}", new->address));
交付域=展開字串(
string_sprintf("${網域名稱:%s}", new->address));
Expand_string() 函數是一個過於複雜的組合器,包括識別命令“${run{commandargs}”,這會導致啟動外部處理程序。 因此,要在 SMTP 會話中進行攻擊,本機使用者只需發送類似「RCPT TO “username+${run{...}}@localhost」的命令,其中 localhost 是 local_domains 清單中的主機之一, username 是現有本地用戶的名稱。
如果伺服器用作郵件中繼,則遠端發送命令「RCPT TO「${run{...}}@relaydomain.com」就足夠了,其中relaydomain.com是relay_to_domains中列出的主機之一設定部分。 由於 Exim 不預設為刪除特權模式 (deliver_drop_privilege = false),因此透過「${run{...}}」傳遞的指令將以 root 身分執行。
值得注意的是,該漏洞是
對繼續在發行版中使用的先前版本的修復目前僅提供
來源: opennet.ru