CVE-2021-35211: SolarWinds Serv-U SSH 漏洞分析
SolarWinds發布安全公告,修復了Serv-U中存在的遠程代碼執行漏洞(CVE-2021-35211),該漏洞為微軟發現在野利用后向SolarWinds報告,并提供了漏洞利用的概念證明。未經身份驗證的遠程攻擊者利用此漏洞可在受影響的服務器上以特殊權限執行任意代碼,請相關用戶盡快采取措施進行防護。
該漏洞存在于SSH協議中,與 SUNBURST 供應鏈攻擊無關,僅影響SolarWinds Serv-U Managed File Transfer和Serv-U Secure FTP。使用Serv-U管理控制臺向導創建域時會默認選擇啟用SSH,若Serv-U環境中未啟用SSH則不受此漏洞影響。
通過枚舉ssh-字符串在Serv-U中發現了SSH實現。SSH實例如圖1所示:
圖 1. SSH-字符串
研究人員在上述代碼中設置斷點,并嘗試用SSH客戶端連接到Serv-U確認這一假設:
圖 2. 圖1中代碼中設置的斷點的調用棧
此時,研究人員發現Serv-U.dll和RhinoNET.dll都禁用了ASLR支持。研究人員逆向Serv-U.dll和RhinoNET.dll中相關的代碼后發現可以追蹤SSH消息的路徑。為處理進入的SSH連接,Serv-U.dll從RhinoNET!CRhinoSocket 類創建了CSUSSHSocket對象。CSUSSHSocket 對象的lifetime是TCP連接的長度。底層的CRhinoSocket 為socket提供了緩存的接口,因此單個TCP包可能含有許多字節。這表明單個包也可能包含任意數量的SSH消息以及部分SSH消息。CSUSSHSocket::ProcessRecvBuffer函數負責處理來自緩存socket數據的SSH消息。
CSUSSHSocket::ProcessRecvBuffer首先用ParseBanner檢查SSH版本。如果ParseBanner成功從banner獲得SSH版本,ProcessRecvBuffer就會循環處理ParseMessage,會從socket數據中獲取當前消息的指針,并從消息中提出msg_id和length域。
圖 3. CSUSSHSocket::ProcessRecvBuffer處理循環部分代碼
消息數據包含在payload緩存中,其中第一個字節就是msg_id:
然后,ProcessRecvBuffer會根據msg_id來處理消息。部分消息會直接經消息處理循環,其他消息會傳遞給ssh_pkt_others,ssh_pkt_others會發布消息給隊列為另一個線程來處理。
圖 4. CSUSSHSocket::ProcessRecvBuffer中的預認證處理
如果msg_id委托給另一個線程,CSSHSession::OnSSHMessage就會負責處理。該函數主要處理需要與Serv-U管理用戶簡介數據和UI更新交互的消息。由于CSSHSession::OnSSHMessage需要先成功進行用戶交互,所以也沒有發現漏洞。
在對Serv-U進行模糊測試時,很明顯應用發現一些包含異常,比如日志記錄錯誤、系統奔潰等。這些行為可以改善文件服務器應用的運行時間,還是引發可能的內容奔潰。攻擊者可以利用這一機會來發起暴力破解等攻擊。
在測試過程中,研究人員發現了一些讀寫訪問違背等異常情況,這些可以引發奔潰:
圖 5. WinDbg表明模糊測試生成的SSH消息引發的奔潰
如上所述,libeay32.dll中的CRYPTO_ctr128_encrypt嘗試調用無效的地址。使用的OpenSSL版本是1.0.2u,下面是相關的OpenSSL函數:
同時,下面是處理的結構:
奔潰函數是通過以下路徑從OpenSSL API獲得的:
EVP_EncryptUpdate -> evp_EncryptDecryptUpdate -> aes_ctr_cipher -> CRYPTO_ctr128_encrypt
進一步分析調用棧,發現Serv-U會從CSUSSHSocket::ParseMessage 調用EVP_EncryptUpdate,如下所示:
圖 6. 調用OpenSSL的位置,攻擊者控制的函數指針可能會被調用
此時,研究人員通過測試操作了最小化的TCP包緩存以小到觸發奔潰所需的最小SSH消息。
研究人員發現該問題產生的根本原因是Serv-U創建了OpenSSL AES128-CTR代碼,如下所示:
用NULL key或空IV來調用EVP_EncryptInit_ex,Serv-U這么做是因為在處理 KEXINIT 消息時創建了上下文。但AES密鑰擴展在密鑰設置之前不會執行,并且ctx->cipher_data數據在密鑰擴展執行前仍然保持未初始化狀態。因此,研究人員推測消息的序列在密鑰初始化之前就會引發enc_algo_client_to_server->decrypt被調用。Serv-U KEXINIT handler在消息中的所有參數創建對象。但對應的對象在NEWKEYS消息被處理簽不會被新創建的對象替換。客戶端會在發布NEWKEYS消息之前在正常的SSH連接過程中完成密鑰交換過程。不輪是連接狀態還是密鑰交換,Serv-U會處理NEWKEYS。
總結
以上是生活随笔為你收集整理的CVE-2021-35211: SolarWinds Serv-U SSH 漏洞分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络安全人才的发展情况是怎么样的呢?快上
- 下一篇: 反制爬虫之Burp Suite RCE