概述:OpenSSH(OpenBSD Secure Shell)是加拿大OpenBSD計劃組的一套用于安全訪問遠程計算機的連接工具。該工具是SSH協議的開源實現,支持對所有的傳輸進行加密,可有效阻止竊聽、連接劫持以及其他網絡級的攻擊。 OpenSSH 9.6及之前版本存在安全漏洞,該漏洞源于當使用常見類型的DRAM時,mm_answer_authpassword中已驗證的整數值不能抵抗單個比特的翻轉,導致攻擊者可以繞過身份驗證。
目錄
一、🚨高危漏洞
二、?? 中危漏洞(建議修復)
三、🔎 低危漏洞(可作為加固措施)
四、?修復建議
五、🛠修復方案
5.1 在線升級
1. 檢查當前版本
2. 在不同系統上的升級方法
🔹 Ubuntu / Debian
🔹 CentOS / RHEL / AlmaLinux
🔹 Amazon Linux / Fedora
3. 升級前的安全措施
4. 升級后驗證
5.2 離線升級
1. 上傳到服務器
2. 升級 OpenSSL
3. 升級 OpenSSH
4. 備份配置并檢查
5. 重啟 sshd 并驗證
六、 🛡?補充
1. 進入目錄并解壓
2. 安裝依賴
3. 檢查依賴是否安裝好
七、??異常情況
1.命令:ssh -V
1. 檢查新版本是否正確
2. 替換系統默認命令
3. 讓 OpenSSH 用新的 OpenSSL
4. 重啟 sshd 并驗證
2、命令:sshd -t -f /etc/ssh/sshd_config
1.修復權限只允許 root 讀寫,其他用戶不能訪問:
2.確認文件歸屬
3.檢查配置文件確認 /etc/ssh/sshd_config 里有類似:
4.重啟 sshd
🔄 如果私鑰丟失/損壞
一、🚨高危漏洞
-
CVE-2023-38408(ssh-agent PKCS11 遠程代碼執行漏洞)
-
影響版本:OpenSSH 9.3p2 之前
-
危害:可被遠程執行代碼
-
風險分值:9.8
-
修復:升級至最新版本 OpenSSH
-
-
CVE-2024-6387(信號處理競爭條件,遠程 root RCE)
-
影響:glibc 系統上,未經身份驗證攻擊者可 root 權限執行代碼
-
風險分值:8.1
-
修復:升級至官方修復版本
-
-
CVE-2023-51767(內存比特翻轉繞過認證)
-
危害:攻擊者可能繞過密碼認證
-
風險分值:7.0
-
修復:升級至 OpenSSH 9.7 以上
-
-
CVE-2024-6409(信號處理競爭條件漏洞)
-
危害:可能導致 DoS 或提權
-
風險分值:7.0
-
修復:升級至最新版本
-
二、?? 中危漏洞(建議修復)
-
CVE-2025-26465(VerifyHostKeyDNS 代碼處理不當,可被中間人攻擊)
-
風險分值:6.8
-
-
CVE-2023-51385(命令注入漏洞)
-
風險分值:6.5
-
-
CVE-2023-48795(繞過完整性檢查)
-
風險分值:5.9
-
三、🔎 低危漏洞(可作為加固措施)
-
CVE-2025-32728(DisableForwarding 指令未完全禁用轉發)
-
風險分值:3.8
-
-
CVE-2021-36368(代理轉發認證問題)
-
風險分值:3.7
-
四、?修復建議
-
立即升級 OpenSSH 至最新穩定版(>= 9.8 或最新 2025 年版本)
你現在是 OpenSSH 8.8,非常落后,幾乎所有漏洞都出在這里。 -
如果暫時不能升級,可以考慮臨時緩解措施:
-
禁用 ssh-agent(避免 CVE-2023-38408)
-
縮短
LoginGraceTime
(緩解 CVE-2024-6387) -
關閉
VerifyHostKeyDNS
選項(緩解 CVE-2025-26465) -
確認
DisableForwarding
配置(緩解 CVE-2025-32728)
-
-
防護措施:
-
使用防火墻限制 SSH 訪問來源(只允許管理端 IP)
-
啟用 Fail2ban 或類似工具防暴力破解
-
開啟 SSH 登錄日志監控
-
五、🛠修復方案
CVE-2023-51767 是硬件層面的 Rowhammer 問題,不屬于 OpenSSH 自身邏輯漏洞,所以沒有給出補丁,但保持 OpenSSH 升級到 9.7+ 仍然是最佳實踐,因為:
新版本修復了其他安全問題(比如內存泄露、DoS、認證繞過等)。
安全團隊通常會在新版本中加固潛在風險(比如在敏感變量上增加防護)。
便于日后維護,避免安全掃描時反復報舊版本漏洞。
注意:本文重點講解離線升級方案
5.1 在線升級
1. 檢查當前版本
ssh -V
例如輸出:
OpenSSH_9.6p1, OpenSSL 3.0.2 15 Mar 2022
2. 在不同系統上的升級方法
🔹 Ubuntu / Debian
sudo apt update
sudo apt install --only-upgrade openssh-server
如果倉庫還沒 9.7,可以用 ppa
或者 自行編譯:
sudo apt build-dep openssh
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
tar -xzf openssh-9.7p1.tar.gz
cd openssh-9.7p1
./configure
make
sudo make install
🔹 CentOS / RHEL / AlmaLinux
系統自帶版本通常比較舊,可以用 第三方 repo 或 源碼編譯:
sudo yum update openssh
如果倉庫沒有 9.7:
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.7p1.tar.gz
tar -xzf openssh-9.7p1.tar.gz
cd openssh-9.7p1
./configure
make
sudo make install
🔹 Amazon Linux / Fedora
Amazon Linux 官方聲明“不修復 Rowhammer 類問題”,但你依舊可以升級:
sudo dnf upgrade openssh
3. 升級前的安全措施
-
保持一個 root 會話不斷開(避免 ssh 升級過程中掉線)。
-
備份配置:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
-
驗證配置文件語法:
sshd -t
4. 升級后驗證
ssh -V systemctl status sshd
確保版本號 ≥ 9.7,并且 sshd 正常運行。
5.2 離線升級
檢查系統現有版本
ssh -V
輸出:
OpenSSH_9.1p1, OpenSSL 1.0.2k-fips 26 Jan 2017
服務器連不上 www.openssl.org
或 cdn.openbsd.org
,最穩妥的辦法就是:
在能上網的本地電腦下載源碼包
下載好以后,把 openssh-9.7p1.tar.gz
文件準備好。
-
OpenSSH 9.7p1 源碼包
-
OpenSSL 3.0 LTS 版本(如果以后還想升級 OpenSSL)
-
?https://download.csdn.net/download/t631048648/91799482(編譯 OpenSSH / OpenSSL 依賴?
gcc
、make
、zlib-devel
、pam-devel
) -
?https://download.csdn.net/download/t631048648/91799479(
zlib-devel
和pam-devel
編譯 OpenSSH 必須的依賴包)
1. 上傳到服務器
把兩個文件傳到 /root
(假設你已經上傳好了,可以直接下一步)。
ls -lh /root/openssh-9.7p1.tar.gz /root/openssl-3.0.17.tar.gz
確認文件存在。
2. 升級 OpenSSL
先升級 OpenSSL(因為 OpenSSH 依賴它)。
cd /root
tar -xzf openssl-3.0.17.tar.gz
cd openssl-3.0.17# 編譯安裝
./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared zlib
make -j$(nproc)
make install# 建立軟鏈接,替換舊 openssl
mv /usr/bin/openssl /usr/bin/openssl.bak.$(date +%F-%H%M%S)
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl# 更新庫文件路徑
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
ldconfig -v# 驗證版本
openssl version
預期輸出:
OpenSSL 3.0.17 XX XXX 2024
3. 升級 OpenSSH
這里有一個依賴,可以先去第六章節查看。
cd /root
tar -xzf openssh-9.7p1.tar.gz
cd openssh-9.7p1# 安裝依賴本文第六章節# 配置編譯,指定新的 OpenSSL
./configure --with-ssl-dir=/usr/local/openssl --with-ssl-engine --sysconfdir=/etc/ssh
make -j$(nproc)
make install# 備份配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%H%M%S)# 檢查配置
./sshd -t -f /etc/ssh/sshd_config# 重啟服務
systemctl restart sshd
ssh -V
4. 備份配置并檢查
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F-%H%M%S)
./sshd -t -f /etc/ssh/sshd_config
5. 重啟 sshd 并驗證
systemctl restart sshd ssh -V
目標輸出:
OpenSSH_9.7p1, OpenSSL 3.0.17 ...
💯 如下圖所示說明更新成功
??升級 sshd 時要 保持一個 root 會話不關閉,避免萬一 sshd 配置錯誤把你鎖在外面。
六、 🛡?補充
把 openssh-build-deps.tar.gz
和 build-deps.tar.gz
上傳到 /root
。接下來就是在服務器上解壓并安裝這些離線依賴包:
1. 進入目錄并解壓
cd /root# 解壓兩個依賴包集合
tar -xzf openssh-build-deps.tar.gz
tar -xzf build-deps.tar.gz
2. 安裝依賴
如果里面有很多 .rpm
文件,可以一次性安裝:
rpm -ivh *.rpm --force --nodeps
?? 注意:
-
--force
表示覆蓋舊版本(如果系統已有)。 -
--nodeps
表示忽略依賴檢查,避免因為缺少網絡拉不下依賴包而失敗。
3. 檢查依賴是否安裝好
確認 gcc
、make
、zlib-devel
、pam-devel
都能用:
gcc --version
make --version
rpm -qa | grep zlib-devel
rpm -qa | grep pam-devel
七、??異常情況
1.命令:ssh -V
輸出:OpenSSH_9.1p1, OpenSSL 1.0.2k-fips 26 Jan 2017這個現象很關鍵 說明你編譯 / 安裝的 新 OpenSSH 和 OpenSSL 并沒有被系統真正使用,
系統還是在調用 舊的二進制和庫:
ssh -V
輸出OpenSSH_9.1p1
(舊的系統自帶版本)OpenSSL 1.0.2k-fips
(CentOS/RHEL 7 自帶的舊庫)
查找新 ssh 在哪里
find /usr/local -name ssh -type f
find /usr/local -name sshd -type f
如果輸出如下:
/usr/local/bin/ssh/usr/local/sbin/sshd
結果說明:
-
你新編譯安裝的 OpenSSH 9.7 已經存在:
-
/usr/local/bin/ssh
-
/usr/local/sbin/sshd
-
(還有一份在
/usr/local/openssh/
,說明你可能在編譯時用了--prefix=/usr/local/openssh
)
-
-
系統默認用的還是
/usr/bin/ssh
和/usr/sbin/sshd
(老版本 9.1 + OpenSSL 1.0.2k)。
讓系統使用新版本的 ssh/sshd
1. 檢查新版本是否正確
/usr/local/bin/ssh -V
/usr/local/sbin/sshd -V
你應該能看到:
OpenSSH_9.7p1, OpenSSL 3.0.17 ...
2. 替換系統默認命令
先備份舊的,再做軟鏈接:
mv /usr/bin/ssh /usr/bin/ssh.bak.$(date +%F-%H%M%S)
ln -s /usr/local/bin/ssh /usr/bin/sshmv /usr/sbin/sshd /usr/sbin/sshd.bak.$(date +%F-%H%M%S)
ln -s /usr/local/sbin/sshd /usr/sbin/sshd
3. 讓 OpenSSH 用新的 OpenSSL
確認它鏈接的是 3.0.17:
ldd /usr/local/bin/ssh | grep ssl
如果輸出還是 /usr/lib64/libssl.so.10
(舊 1.0.2k),說明沒走到新庫,需要更新庫搜索路徑:
echo "/usr/local/openssl/lib" > /etc/ld.so.conf.d/openssl.conf
ldconfig -v
再檢查:
ldd /usr/local/bin/ssh | grep ssl
應該會看到 /usr/local/openssl/lib/libssl.so.3
。
4. 重啟 sshd 并驗證
systemctl restart sshd ssh -V
預期輸出:
OpenSSH_9.7p1, OpenSSL 3.0.17 ...
2、命令:sshd -t -f /etc/ssh/sshd_config
報了
/etc/ssh/ssh_host_*
的 權限過寬(0640),導致sshd
出于安全考慮拒絕使用這些私鑰,結果就變成了:sshd: no hostkeys available -- exiting.
也就是說 sshd 根本起不來。
1.修復權限
只允許 root
讀寫,其他用戶不能訪問:
chmod 600 /etc/ssh/ssh_host_*_key
(只改私鑰,不要動 .pub
公鑰文件)
正確權限應該是:
-rw------- 1 root root /etc/ssh/ssh_host_rsa_key
-rw------- 1 root root /etc/ssh/ssh_host_ecdsa_key
-rw------- 1 root root /etc/ssh/ssh_host_ed25519_key
2.確認文件歸屬
chown root:root /etc/ssh/ssh_host_*_key
3.檢查配置文件
確認 /etc/ssh/sshd_config
里有類似:
HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
4.重啟 sshd
systemctl restart sshd
systemctl status sshd
🔄 如果私鑰丟失/損壞
如果 /etc/ssh/ssh_host_*
文件不存在或不可用,可以重新生成:
ssh-keygen -A
它會自動在 /etc/ssh/
下生成新的 ssh_host_*
密鑰對。
建議先跑:
ls -l /etc/ssh/ssh_host_*_key
最后在看一下是否修復
systemctl status sshd