紀錄工作經驗、相關知識,解決技術相關問題。

時事新聞, 資訊相關

OpenSSH 長密碼驗證繞過漏洞:Alpine 等 musl 系統更新與版本確認

OpenSSH 長密碼驗證繞過漏洞:Alpine 等 musl 系統更新與版本確認 特色圖片

SSH 是伺服器、路由器與各種自架服務最常用的遠端登入通道,只要 sshd 的密碼驗證出問題,影響的就是「能不能擋住陌生人」這件事。

OpenSSH 專案在 2026 年 11 月 5 日釋出 10.6p2,處理一個可以用超長密碼繞過 sshd 密碼驗證的問題。

受影響的不是所有 Linux,而是使用 musl libc、且 sshd 沒有啟用 PAM 的系統,Alpine Linux 是官方明確點名的例子。

這個漏洞的編號是 CVE-2026-123158,美國 CISA 已在 11 月 9 日把它列入已知遭利用漏洞目錄(Known Exploited Vulnerabilities Catalog),代表已有實際攻擊。我們來看看該怎麼更新、怎麼確認自己有沒有中。

先做這件事:更新 OpenSSH

最直接的做法:更新 openssh 套件,然後重新啟動 sshd。

Alpine 官方公告特別強調,只升級套件不會換掉正在跑的 sshd 行程,一定要重啟才算完成。

  1. 更新套件:
apk upgrade -U -a
  1. 重新啟動 sshd:
rc-service sshd restart

以上兩個指令取自 Alpine 官方公告,適用於 Alpine。其他發行版請改用自己的套件管理器與服務管理指令,並以該發行版的安全公告為準。

怎麼確認自己的版本有沒有受影響

先搞清楚兩件事:你的系統用哪種 C 函式庫(libc),以及 sshd 有沒有啟用 PAM。

站長自己的看法是,這一步比比對版本號更重要,因為這個漏洞的條件是「系統環境」,不是單看 OpenSSH 版本。

第一步:確認是不是 musl

ldd --version

輸出若出現 musl,就是 musl libc 系統。依 sshhole.com 的整理,Alpine、OpenWrt、Buildroot、Yocto 與以 Alpine 為基底的 Docker 映像檔屬於 musl 系統;同一頁也指出 Debian、Ubuntu、Fedora 使用 glibc 且通常經 PAM 驗證,不受影響,RHEL 則未在該頁說明。

第二步:確認設定

sshd -T | grep -i -E "passwordauthentication|usepam"

Alpine 官方公告列出的受影響條件,需要同時成立:

條件說明
沒有使用 PAMAlpine 的 openssh-server 套件沒有 PAM;openssh-server-pam 且 UsePAM no 也算
開著密碼登入PasswordAuthentication yes,這也是 OpenSSH 預設值
有密碼欄位為 * 的帳號例如只用金鑰登入、沒設密碼的帳號,Alpine 上的 root 也是這類
至少一個帳號有 $5$ 或 $6$ 開頭的密碼雜湊只要有一個,所有沒設密碼的帳號都會曝險

openssh-server-pam 搭配 UsePAM yes、PasswordAuthentication no,以及密碼欄位是 !(鎖定帳號)的情況,官方列為不受影響。

第三步:對照修補版本

一般人看 ssh -V 或套件版本時容易誤會:發行版常把修補放進自己的舊版本,版本號不會跳到上游的 10.6p2。

實例:Alpine 3.23 的修補版本是 10.2_p1-r1,編號比 10.6p2 低,但這個版本已經帶著同一個問題的修補。所以判斷方式是對照「自己那個分支」的修補版本,而不是只看有沒有 10.6。

下表取自 Alpine 官方公告,每列一個分支:

Alpine 分支修補後的 openssh 套件版本
edge10.6_p2-r0
3.2410.3_p1-r2
3.2310.2_p1-r1
3.2210.0_p1-r11
3.219.9_p2-r1

3.16 到 3.20 這些較舊的分支官方也有提供修補套件,完整清單請看 Alpine 官方公告。

查自己裝的版本:

apk policy openssh-server

apk policy 是 Alpine 官方 wiki 列出的查詢指令,會顯示這個套件已安裝與可安裝的版本;如果裝的是 openssh-server-pam,就把套件名稱換掉。套件版本大於等於上表對應分支的數字,就是已修補;否則先更新。

漏洞內容與觸發條件

OpenSSH 官方 release notes 的描述是:沒有 PAM 支援的情況下,部分 Linux 系統上存在可透過 sshd 利用的密碼驗證繞過。專案認為根本原因在 sshd 之外,但可以在 sshd 這一側避開。回報者是 Wakefield 的 Özgün Kültekin。

白話說明如下。

為什麼會中

依 Alpine 公告的技術說明:沒有 PAM 時,sshd 會用 crypt() 把輸入的密碼做雜湊,再拿結果去比對密碼欄位。

musl 的 crypt() 遇到超過 256 位元組的密碼會失敗,並回傳 *。沒設密碼的帳號,密碼欄位剛好也是 *,兩邊一比對就相符,登入通過。

攻擊長什麼樣子

Alpine 公告寫的是,密碼長度介於 257 到 1024 位元組,一次連線就能成功,不需要重試。

官方資料沒有提到暴力猜測,這類攻擊也不需要猜到真正的密碼。

CVE 編號

這個漏洞的編號是 CVE-2026-123158。Alpine 公告發布當下還沒有編號,之後才由 MITRE 指派,美國國家漏洞資料庫(NVD)列出的 CVSS 3.1 分數是 8.1(High)。

美國 CISA 在 2026 年 11 月 9 日把它加入已知遭利用漏洞目錄,名稱是「OpenBSD OpenSSH Unexpected Status Code or Return Value Vulnerability」,聯邦機構的修補期限是 11 月 12 日。列入這份目錄,代表 CISA 掌握到已有實際利用的證據,有符合條件的機器請不要再拖。

要不要檢查有沒有被登入過

Alpine 公告建議,到 /var/log/messages 找 sshd 的 Accepted password for 紀錄,看是不是出現在沒設密碼的帳號(例如 alpine、root 或只用金鑰的帳號)上;也建議檢查 doas 使用紀錄、新建帳號與 authorized_keys 的異動。公告的說法是,無法排除被登入的話,就把機器視為已遭入侵。

暫時無法更新怎麼辦

OpenWrt、嵌入式系統這類韌體要等廠商出更新,不一定能馬上升級。官方提供的暫時做法是關掉密碼登入。

  1. 先確認金鑰登入可用,並保留目前的連線視窗,另開一個視窗測試新登入。
  2. 在 /etc/ssh/sshd_config.d/ 放一個設定檔,內容為 PasswordAuthentication no。Alpine 3.19 起預設會讀這個目錄,更舊的版本不會讀,要直接改 sshd_config。
  3. 若 sshd_config 裡有 PasswordAuthentication yes(包含 Match 區塊內),要改成 no。
  4. 用 sshd -t 檢查設定,再重啟 sshd。
  5. 用 sshd -T | grep -i passwordauthentication 確認結果是 passwordauthentication no。

Alpine 公告也說明,另一個條件是用 openssh-server-pam 並設定 UsePAM yes 就不受影響。

參考資料與延伸閱讀

發佈留言