按 Enter 到主內容區
:::

TWCERT-電子報

:::

儘速更新各版OpenSSH,解除User enumeration瑕疵

發布日期:
字型大小:
  • 發布單位:TWCERT/CC
  • 更新日期:2019-04-03
  • 點閱次數:740
儘速更新各版OpenSSH,解除User enumeration瑕疵

CVE編號

CVE-2018-15473

內文

●概述:
自1999年發展迄今的OpenSSH(OpenBSD Secure Shell),係開放原始碼,以C語言撰寫之跨平台加密通訊軟體,據Qualys研究員分析,得知OpenSSH自開創迄今,全數版本皆存在姓名列舉(User enumeration)弱點,在auth2-gss.c、auth2-hostbased.c、and auth2-pubkey.c原始碼內,凡涉及userauth_pubkey( )函數區段均有設計瑕疵,故對於無效使用者登入,未待完整解析封包內所有request,迅速回應錯誤訊息,毫不延遲的時間差距,則透露出帳號不存在的事實,反之若使用者有效時,server逕中斷與攻擊者的連線,駭客以惡意封包探勘,結合時序攻擊(timing attack)與brute-force方式,極易分別輸入帳號是否正確,從而獲得真實用戶帳號。基於OpenSSH廣泛運用,探勘實務亦公開披露,大量設備已受威脅,儘管公布修補方式,且OpenBSD已升級至最新版,然龐大的終端修補量可能耗時數月,目前OpenSSH官網連線失敗,網站似遭連線超載拖垮,建議使用者近日可隨機測試是否回復營運,儘快下載新版。
●編註:
(1)漏洞原理
OpenSSH進行身分驗證過程並無輸入值檢查缺陷,亦無緩衝區溢位之類錯誤,關鍵在於OpenSSH對有效與無效之嘗試登入,做出兩種相異程式反應,藉著其中差別,讓駭客有臆測帳號正確性的管道,稱作姓名列舉(User enumeration),以局部原始碼說明:
static int
userauth_pubkey(struct ssh *ssh)
{
...
if (!authctxt->valid) {
debug2("%s: disabled because of invalid user", __func__);
return 0;
}
if ((r = sshpkt_get_u8(ssh, &have_sig)) != 0 ||
(r = sshpkt_get_cstring(ssh, &pkalg, NULL)) != 0 ||
(r = sshpkt_get_string(ssh, &pkblob, &blen)) != 0)
fatal("%s: parse request failed: %s", __func__, ssh_err(r));
先模擬駭客探勘情境,若以惡意封包測試前段程式碼,若用戶無效或不存在,則userauth_pubkey( )函數旋即回傳0,OpenSSH server送出SSH2_MSG_USERAUTH_FAILURE訊息給攻擊者,然而正常用戶有效時,sshpkt_get_u8( )函數則回傳false,server呼叫fatal( )關閉對攻擊者的連線且無回應訊息。
鑑此,可以得知真正造成姓名列舉的主因,即是程式對於無效使用者登入驗證,未完整解析封包內全數request,迅速回應無效使用者之錯誤訊息,毫不延遲的時間差,則透露出帳號不存在的事實。可以說User enumeration本身就是一種時序攻擊(timing attack),純粹利用程式判斷式及運算耗時等細節數據,推敲出合法用戶帳號,既然能對帳號採取brute-force或字典攻擊,或許也能如法炮製而猜測密碼,在OpenSSH原始碼內,已確知auth2-gss.c、auth2-hostbased.c、and auth2-pubkey.c具有姓名列舉破綻。
(2)危害程度
由於OpenSSH跨平台支援特性,其client端已嵌入大量運作中軟硬體,顯見此弱點分布甚廣,從雲端機房到託管物聯網,數以億計的設備已暴露在威脅之下,尤其探勘實作技術已公開,儘管修補方式也在8月中旬公告,穩定版本OpenSSH 7.8亦於8月24日釋出,然而龐大的終端修補量可能需耗時數月之久,目前試圖連線OpenSSH官網均告失敗,似乎是被連線超載拖垮該網站,使用者來日可隨機測試是否回復營運。

影響產品

OpenSSH 2.3 ~ 7.7

解決辦法

網管者請至官網下載OpenSSH 7.8,若無法立即取得升級版,切莫因User enumeration生在auth2-pubkey.c,而停用公鑰驗證,否則密碼洩露比帳號洩露更危險。
回頁首