這是一張有關標題為 解讀 OpenSSH 高危險漏洞(CVE-2024-6387):競爭情況導致遠端程式碼執行風險 的圖片

解讀 OpenSSH 高危險漏洞(CVE-2024-6387):競爭情況導致遠端程式碼執行風險

本文探討 OpenSSH 的 CVE-2024-6387 漏洞,分析其成因、受影響版本以及 Ubuntu 的修復方式。

前言

在 2024 年 7 月 2 日,OpenSSH 爆出了 CVE-2024-6387 的 CVE,主要是在 SSH 伺服器 (sshd) 中發現了一個競爭情況(race condition),使用者沒有在預設的 120 秒(舊版本為 600 秒,這個秒數稱為 LoginGraceTime)內進行身份驗證時,sshd 的 SIGALRM 處理程序會被異步呼叫。然而,這個信號處理程序會呼叫多個非異步信號安全的函數,例如 syslog()。攻擊者利用此漏洞,可能導致具有 root 權限的遠端程式碼執行(remote code execution,RCE)。

受影響的版本

  • OpenSSH < 4.4p1。
  • 8.5p1 ≤ OpenSSH < 9.8p1。

Ubuntu 的修復方式

在此,如果有啟用 Ubuntu Pro 的話,可以發現系統的 SSH 已經更新並修復:

1
2
wells@tnserver:~$ ssh -V
OpenSSH_9.6p1 Ubuntu-3ubuntu13.3, OpenSSL 3.0.13 30 Jan 2024

在此處有看到的 SSH 版本雖然為 OpenSSH 9.6p,但已經套用修正補丁(patch)。也因此不需要將系統中的 SSH 進行升級。

使用的還是原本的 OpenSSH 9.6p 版本。可能由於相容性問題,無法直接升級整個 OpenSSH,因此需要在此版本上進行修改和測試以修補漏洞。在完成漏洞修補後,會利用 Git 的 format-patch 來建立補丁(patch),並在編譯時套用(apply)此補丁後再進行編譯。這類技巧在編譯時相當常見。

Ubuntu 維護的 OpenSSH 可以看到提交 19e460 中,帶有 CVE-2024-6387.patch。這個補丁主要會將 log.c 中的 sshsigdie 函數進行修改,使其在呼叫此函數時,只執行 _exit(1) 直接跳出而不執行 sshlogv進行日誌記錄,從而避免因競態條件而產生的潛在安全漏洞。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Description: fix signal handler race condition
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2070497

--- a/log.c
+++ b/log.c
@@ -452,12 +452,14 @@ void
 sshsigdie(const char *file, const char *func, int line, int showfunc,
     LogLevel level, const char *suffix, const char *fmt, ...)
 {
+#if 0
 	va_list args;
 
 	va_start(args, fmt);
 	sshlogv(file, func, line, showfunc, SYSLOG_LEVEL_FATAL,
 	    suffix, fmt, args);
 	va_end(args);
+#endif
 	_exit(1);
 }

結論

目前 Ubuntu 節至 2024/7/2 已經為 Jammy (22.04)、Mantic (23.10)、Noble (24.04) 釋出此修正版本。即便未釋出修正的系統。根據目前 Ubuntu 的官方初步解法,可以通過在 /etc/ssh/sshd_config 中,把 LoginGraceTime 設定為 0 以防範這個漏洞,不過可能會引發其他的問題(阻斷攻擊)。

該漏洞目前已經在 32 位元 Linux/glibc 系統上測試漏洞的示範,攻擊時間平均需要 6~8 小時達到服務器可接受的最大連接數量。儘管目前尚未在 64 位系統上成功,但未來有可能得到改進進而成功駭入。此外,目前對於 Windows 與 macOS 上的可利用性不明確。

大多數的使用者,可以在官方釋出更新檔時,透過管理包進行更新即可。

參考資料

  1. CVE-2024-6387 : A signal handler race condition was found in OpenSSH’s server (sshd), where a client does not authenticate within LoginG
  2. https://access.redhat.com/security/cve/cve-2024-6387
  3. ubuntu/+source/openssh
主題 Stack 由 Jimmy 設計