OpenSSH Post-Quantum Cryptography ML-DSA SSH 安全性 VPS 維運

OpenSSH KEX 換完 mlkem 剩下簽章沒動:10.4 用 mldsa44-ed25519 補完 post-quantum 的最後一哩,順手修掉 SFTP 客戶端被牽著鼻子走的路徑洞

OpenSSH 10.4 在 2026 年 7 月上線,把 ML-DSA 44 加 Ed25519 的複合簽章實驗性接進主線,post-quantum host key 跟使用者金鑰第一次能生;同時把 SFTP 客戶端被伺服器導向任意路徑、GSSAPI 預先認證 DoS 跟 rekey 時的 client UAF 全補起來。本文說明為什麼簽章跟 KEX 該分開想、怎麼在自架 VPS 上開啟這個實驗算法、以及 sshd -G 大小寫變更、Linux seccomp fatal 幾個容易踩雷的 breaking change。

OpenSSH 從 10.0 起就把 mlkem768x25519-sha256 訂為預設的金鑰交換演算法,到了 10.1 甚至會對沒有走 post-quantum KEX 的連線直接跳警告。過了將近一年,簽章這一塊卻沒動——host key、使用者金鑰依舊只剩 Ed25519、ECDSA、RSA 三個可選。2026 年 7 月 6 日釋出的 10.4 把這個空缺補起來:ML-DSA 44 加 Ed25519 的複合簽章第一次以實驗算法的身分進主線,ssh-keygen -t mldsa44-ed25519 可以直接生出 host key 或使用者金鑰。同一份 changelog 裡塞的另一組修補更值得先看——SFTP 跟 SCP 客戶端被惡意伺服器牽著鼻子把檔案寫到別的路徑的漏洞,是這次八項安全修補中影響面最廣的一支。

為什麼 KEX 換完了簽章還得再換一次

Post-quantum KEX 解決的是「今天錄下來、明天量子電腦算出 session key」這條 store-now-decrypt-later 攻擊路徑,重點是保護連線內容的機密性。簽章不一樣,被破解的後果是身分冒充:一把用了三年的 host key 私鑰如果哪天被推回來,攻擊者就能在中間人位置對舊客戶端偽造成整臺伺服器。長效金鑰的威脅視窗遠比 session 長,可是真正能落地的 post-quantum 簽章方案一直卡在成本問題上。

ML-DSA 44 是 NIST FIPS 204 標準底下最小一組參數,公開金鑰 1312 位元組、簽章 2420 位元組,跟 Ed25519 的 32 位元組公鑰、64 位元組簽章比起來,膨脹的是好幾十倍。放進 SSH 握手裡,多出來的往返延遲跟頻寬對走一般網際網路的 VPS 影響有限,但在高頻自動化情境——CI runner 對 Git 伺服器每分鐘拉數十次、Ansible 對數百臺主機 fan-out——就會被放大。10.4 的做法是把 ML-DSA 44 跟 Ed25519 拼成 composite signature,同一組金鑰同時產出兩個簽章,任一邊被破解另一邊還撐得住。設計文件是 IETF 的 draft-miller-sshm-mldsa44-ed25519-composite-sigs,實作上仍算實驗,還沒進 draft-standard 階段。

mldsa44-ed25519 在自架伺服器上的最小可行設定

生金鑰的動作跟過去沒兩樣:

1
ssh-keygen -t mldsa44-ed25519 -f ~/.ssh/id_mldsa44_ed25519 -C "vps-2026"

實際會產出將近 4 KB 的公開金鑰檔,authorized_keys 貼進去照樣認得。伺服器端要在 /etc/ssh/sshd_config 補一組 host key 設定,並把演算法加進允許清單:

1
2
3
HostKey /etc/ssh/ssh_host_mldsa44_ed25519_key
HostKeyAlgorithms [email protected]
PubkeyAcceptedAlgorithms [email protected]

+ 前綴是接在預設清單後面而不取代——這一點很關鍵,寫成 = 或忘了前綴會把 Ed25519、RSA 一起洗掉,非 10.4 客戶端從此連不進來。客戶端這邊 ~/.ssh/config 也得配一份,只設伺服器不設客戶端,握手時仍會回落到 Ed25519:

1
2
3
Host vps-2026
HostKeyAlgorithms ^[email protected]
PubkeyAcceptedAlgorithms ^[email protected]

^ 是把該演算法插到清單最前,優先協商。日常維運上實驗算法建議只用在特定機器上——用 Match hostHost block 圈住,避免整個 fleet 一次改動。至於現有的 Ed25519 host key 該不該砍掉,答案是不該。並存跑一段時間、把 known_hosts 上的 mldsa44 fingerprint 分發完再收掉舊的,任何一步爆炸都還有回頭路。

SFTP 的路徑竊改比新演算法更急

sftp host:/path . 這種命令列下載,過去預設信任伺服器回傳的檔名。10.4 修的其中一支洞就是:惡意伺服器可以在回應裡塞入包含目錄跳脫的檔名,讓客戶端把檔案寫到工作目錄以外的位置,最惡劣的情形是覆蓋掉 .ssh/authorized_keys 或 shell 啟動腳本。SCP 的 remote-to-remote 傳輸也吃到類似的問題,惡意來源可以把檔案倒進上層目錄。兩個都不是要 root 權限、也不需要客戶端接受任何提示的漏洞——只要對方伺服器被打下來、或本來就是不可信的第三方,帳號跑起 sftp/scp 那一刻就中招。

另一個容易被忽略的修補在 sshdinternal-sftp 子系統上:命令列超過九個引數之後靜默截斷。這代表 ForceCommand internal-sftp -f -u -d /jail -R -e -o LogLevel=INFO -p 22 -X 這類長設定可能有安全相關的參數就這樣被吃掉、卻沒任何錯誤訊息。用 chroot SFTP 做多租戶檔案伺服器的部署要特別回頭檢查一次。GSSAPI 預先認證的 DoS 影響範圍窄一點,只針對開了 GSSAPIAuthentication yes 的機器;rekey 過程中伺服器更換 host key 觸發客戶端 UAF 的那支,則是 10.4 修掉的 memory safety 洞裡最紮實的一項。

三個容易漏看的 breaking change

第一個是 sshd -G 印出的 directive 名稱從全小寫改成混合大小寫,例如 pubkeyauthentication 變成 PubkeyAuthentication。任何用 grep 或 awk 剖析這份輸出的組態管理工具、監控腳本,都得先確認過。Puppet、Chef、Ansible 用來驗證 sshd 設定的 module 幾乎都會踩到。

第二個是 Linux 上的 seccomp sandbox 失敗行為改為 fatal。過去 seccomp 建不起來會回落到其他 sandbox 或直接繼續跑,10.4 把這個容忍度收掉了——除非在編譯時或 sshd_config 裡明確關閉,否則沙盒建不起來 sshd 就不會啟動。跑在很舊的 kernel 或客製化 syscall filter 的環境會被擋在門口。

第三個是傳輸層現在會直接踢掉在 post-authentication rekey 過程中送出非 KEX 訊息的對端。過去有些連線多工工具或不夠嚴謹的 SSH 函式庫會在這個窗口塞 SSH_MSG_CHANNEL_DATA,之前是被忽略,現在是斷線。開源函式庫如 golang.org/x/crypto/ssh、paramiko 的舊版本可能會踩到,先在測試環境跑過一輪比較保險。

該不該現在就升上去

現階段的實際建議很單純:安全修補該立刻拉,post-quantum 簽章可以先在少數幾臺實驗機開起來。SFTP 跟 SCP 的路徑竊改沒有 CVSS 9.x 的耀眼分數,可是攻擊條件低、後果直接——共用 SFTP jail 主機、CI 使用第三方 registry、跨組織備份都在暴露面上。相較之下複合簽章目前只是 draft、跟不支援的客戶端互通還會被強制 downgrade,把 Ed25519 全數換掉沒有實質好處,但拿一臺跳板機或 bastion 起頭跑一下,累積操作經驗、確認硬體 token(例如 YubiKey firmware 對 mldsa44 的支援進度)跟自動化流程能跟上,是務實的下一步。

NCSE Network 的臺灣是方電訊機房 VPS 全線支援自帶 kernel 跟自訂 OpenSSH build,Intel Gold CPU 加 NVMe SSD 的組合處理 ML-DSA 簽章驗證幾乎感覺不到額外開銷,適合拿來作為 post-quantum SSH 的實驗與遷移環境。有興趣把長效身分金鑰提前抗量子化、或想在正式導入前先評估握手成本的團隊,可以到 ncse.tw 了解相關方案。

需要穩定的雲端主機?

NCSE Network 提供企業級 VPS,7 天免費試用,臺灣是方電訊機房,99% SLA 保證。

查看 VPS 方案 →