這是一個非常典型的記憶體損毀漏洞,對於許多開發者來說,直覺上會認為 SSH 漏洞通常發生在「伺服器端」(例如 OpenSSH Server),因為伺服器是面對公網的對象。但這次的 CVE-2026-55200 恰恰相反,它是一個「客戶端」漏洞。
這意味著如果你使用一個受影響的 SSH 客戶端去連接一個由駭客控制的惡意伺服器,即便你沒有輸入正確的密碼,對方也能在你的機器上執行任意程式碼。
libssh2 的角色與影響範圍
首先要釐清的是 libssh2 並不是一個像 Putty 或 OpenSSH 那樣獨立的軟體,而是一個 C 語言編寫的客戶端函式庫(Library)。許多知名工具為了實現 SSH 功能,會直接將 libssh2 整合進自己的程式碼中。
常見的受影響工具包括 curl、Git、PHP 以及許多嵌入式設備的韌體更新程式。最棘手的地方在於,許多軟體在編譯時使用了靜態連結(Static Linking),也就是將 libssh2 的程式碼直接打包進執行檔中。這導致即使你更新了作業系統的套件管理器,那些靜態連結的軟體依然帶著舊版本的漏洞,而你甚至不知道它們的存在。
漏洞的核心原理:整數溢位導致緩衝區溢位
這個漏洞發生在處理 SSH 握手階段的 ssh2_transport_read 函式中。簡單來說,當客戶端從伺服器接收封包時,封包中會包含一個 packet_length 欄位,告訴客戶端接下來要讀取多少資料。
程式碼在設計時只檢查了 packet_length 是否小於 1,但完全沒有設定上限。這裡就產生了整數溢位(Integer Overflow)的問題。
在 32 位元算術運算中,如果攻擊者傳送一個極大的數值(例如 0xffffffff),當程式將這個數值加上一些小的偏移量來計算總記憶體需求時,數值會發生翻轉(Wrap around),結果變成一個極小的數字。
接下來,系統會根據這個極小的數字分配一塊記憶體緩衝區(Buffer)。然而,後續的寫入動作卻會嘗試將原本那個巨大的封包內容全部寫入這塊小空間中。這就造成了堆積緩衝區溢位(Heap Buffer Overflow),攻擊者可以藉此覆蓋記憶體中的關鍵資料,進而達到遠端程式碼執行(RCE)的目的。
這種漏洞模式在資安界非常經典,但在 libssh2 中再次出現令人驚訝。事實上,2019 年曾出現過幾乎一模一樣的漏洞(CVE-2019-3855),這顯示了在處理外部輸入長度時,缺乏嚴格邊界檢查的風險。
目前的風險評估與實務建議
目前網路上已經出現了概念驗證(PoC)程式碼。雖然目前的 PoC 更多是本地驗證用的腳本,而非一鍵即用的遠端攻擊工具,但它為攻擊者提供了開發穩定漏洞利用程式的基礎。
對於工程師與系統管理員,建議採取以下行動:
第一,盤點所有使用 libssh2 的元件。不要只依賴套件管理工具,要檢查那些自定義編譯或第三方提供的二進位檔案。
第二,更新至已修正的版本。目前的修正方案是在計算之前,強制檢查 packet_length 是否超過 LIBSSH2_PACKET_MAXPAYLOAD。請確認你的版本包含 commit 97acf3d 的修正。
第三,實施連線限制。在補丁完全部署前,嚴格限制對不可信 SSH 伺服器的連線,並確保主機金鑰(Host Keys)經過驗證,防止中間人攻擊將流量導向惡意伺服器。
第四,關注相關聯漏洞。除了 CVE-2026-55200,同時應處理 CVE-2026-55199(導致 CPU 迴圈的拒絕服務攻擊)以及 CVE-2025-15661(SFTP 記憶體過讀漏洞)。
總結來說,這次事件提醒我們,任何處理外部輸入的解析邏輯,無論是伺服器端還是客戶端,只要涉及記憶體分配與長度計算,就必須採取最嚴格的邊界檢查。
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。