libssh CVE-2018-10933 身份驗證繞過漏洞分析報告
報告編號:B6-2018-101703
報告來源:360-CERT
報告作者:360-CERT
更新日期:2018-10-17
0x00 事件背景
2018-10-16 libssh釋出更新公告旨在解決CVE-2018-10933的問題
libssh版本0.6及更高版本在服務端程式碼中具有身份驗證繞過漏洞。 通過向服務端提供SSH2_MSG_USERAUTH_SUCCESS訊息來代替服務端期望啟動身份驗證的 SSH2_MSG_USERAUTH_REQUEST訊息,攻擊者可以在沒有任何憑據的情況下成功進行身份驗證。 進而可以進行一些惡意操作。
0x01 詳情分析
在libssh的example中已經存在一些server端的例子,測試環境則採用這些例子進行說明
這個漏洞能用,但目前就分析而言發現,無法很好的泛用,所以建議及時進行更新以免遭受影響
在libssh中以session的方式對會話進行處理,無論是server的建立還是client的連線。
均以
session = ssh_new();
進行session建立
因為這個漏洞是直接獲得AUTH所以服務端的配置和客戶端的連線認證方式等完全不用在意
簡單的client連線示例的部分程式碼,以體現邏輯為主。
首先是設定一些引數,然後利用session進行連線
然後進行knownhost認證處理,這步就是平時在進行ssh連線的時候進行提醒的是否要儲存信 息
if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0) return -1; if(ssh_connect(session)){ fprintf(stderr,"Connection failed : %s\n",ssh_get_error(session)); return -1; } state=verify_knownhost(session); if (state != 0) return -1; auth=authenticate_console(session); if(auth != SSH_AUTH_SUCCESS){ return -1; }
authenticate_console(session)
的流程為先發送一個 ssh_userauth_none
再根據選擇的AUTH方式,嘗試GSSAPI、PublicKey、 Password的方式
這裡採用的patch掉client中傳送密碼認證的時候的資料包
將第二行的 SSH2_MSG_USERAUTH_REQUEST
-> SSH2_MSG_USERAUTH_SUCCESS
rc = ssh_buffer_pack(session->out_buffer, "bsssbs", SSH2_MSG_USERAUTH_SUCCESS, username ? username : session->opts.username, "ssh-connection", "password", 0, /* false */ password );
並且需要在 ssh_userauth_get_response
之前直接返回,因為這一步會再次向服務端進行通 信,但此時受影響版本的server已經 Authentication successful
這時候的session就已經可以獲得相應的許可權了。通過官方的Tutorial的執行命令的例子調 用 ssh_channel_request_exec
進行命令執行
0x02 修復分析
官方通過增加欄位,並註冊額外的session狀態校驗函式進行檢驗,在處理流程中標註 session處於的狀態,避免client隨意傳送 SSH2_MSG_USERAUTH_SUCCESS
進行bypass
+static enum ssh_packet_filter_result_e ssh_packet_incoming_filter(ssh_session session) +case SSH2_MSG_USERAUTH_SUCCESS:// 52 +if ((session->auth_state != SSH_AUTH_STATE_KBDINT_SENT) && +(session->auth_state != SSH_AUTH_STATE_PUBKEY_AUTH_SENT) && +(session->auth_state != SSH_AUTH_STATE_PASSWORD_AUTH_SENT) && +(session->auth_state != SSH_AUTH_STATE_GSSAPI_MIC_SENT) && +(session->auth_state != SSH_AUTH_STATE_AUTH_NONE_SENT)) +{ +rc = SSH_PACKET_DENIED; +break; +}
該校驗函式判斷session的狀態是否處於 SSH_AUTH_STATE_PUBKEY_AUTH_SENT
, SSH_AUTH_STATE_PASSWORD_AUTH_SENT
, SSH_AUTH_STATE_NONE_SENT
這些個狀態 來確認是否要接受資料包裡帶有 SSH2_MSG_USERAUTH_SUCCESS
的情況
@@ -88,6 +88,7 @@ static int ssh_auth_response_termination(void *user){ case SSH_AUTH_STATE_PUBKEY_AUTH_SENT: case SSH_AUTH_STATE_PUBKEY_OFFER_SENT: case SSH_AUTH_STATE_PASSWORD_AUTH_SENT: +case SSH_AUTH_STATE_AUTH_NONE_SENT: return 0; default: return 1; @@ -143,6 +144,7 @@ static int ssh_userauth_get_response(ssh_session session) { case SSH_AUTH_STATE_PUBKEY_OFFER_SENT: case SSH_AUTH_STATE_PUBKEY_AUTH_SENT: case SSH_AUTH_STATE_PASSWORD_AUTH_SENT: +case SSH_AUTH_STATE_AUTH_NONE_SENT: case SSH_AUTH_STATE_NONE: /* not reached */ rc = SSH_AUTH_ERROR;
同時在每次的response校驗中增加該欄位,如果該欄位存在就直接返回error
0x03 驗證截圖
執行命令
獲得shell
0x04 影響範圍
libssh0.6以上的版本
目前各大發行版中部分已經對相應package進行更新,但還未完全進行版本迭代,具體情況可以關注一下連結
Debain
ofollow,noindex" target="_blank">https://security-tracker.debian.org/tracker/CVE-2018-10933
ubuntu
https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2018-10933.html
opensuse
https://www.suse.com/security/cve/CVE-2018-10933/
redhat
https://access.redhat.com/security/cve/cve-2018-10933
通過360CERT Quake資產檢索平臺發現共計3,170臺裝置開放libssh服務在外網,但並非所有的libssh服務均處於受影響的版本範圍。該漏洞影響範圍有限。
0x05 修復建議
及時對服務端libssh版本進行更新
可以在如下網址下載最新的0.7.6以及0.8.4版本
https://red.libssh.org/projects/libssh/files
或者在如下地址尋找對應版本的patch檔案
https://www.libssh.org/security/
0x06 時間線
2018-10-16libssh 官方釋出重要更新
2018-10-16360CERT釋出預警報告
2018-10-17360CERT釋出分析報告