透過 SOCKS5 代理程式存取時,curl 和 libcurl 中出現緩衝區溢位

在並行開發的用於透過curl網路和libcurl庫接收和發送資料的實用程式中發現了一個漏洞(CVE-2023-38545),該漏洞可能導致緩衝區溢出並可能在網路上執行攻擊者程式碼。使用curl實用程式或使用libcurl的應用程式存取用戶端時,將其傳送到攻擊者控制的HTTPS伺服器。 只有在curl 中啟用了透過SOCKS5 代理程式進行存取時,才會出現此問題。 無需代理直接存取時,不會出現該漏洞。 該漏洞已在curl 8.4.0版本中修復。 作為 Hackerone 網路漏洞賞金計畫的一部分,發現該漏洞的安全研究人員獲得了 4660 美元的獎勵。

該漏洞是由於存取 SOCKS5 代理程式之前的主機名稱解析程式碼錯誤造成的。 如果主機名稱最長為 256 個字符,curl 會立即將名稱傳遞給 SOCKS5 代理進行解析,如果名稱超過 255 個字符,則切換到本地解析器並將已定義的地址傳遞給 SOCKS5 。 由於程式碼中的錯誤,在透過 SOCKS5 進行連接的緩慢協商期間,指示需要本地解析的標誌可能被設定為錯誤的值,這導致在按期望分配的緩衝區中記錄了長主機名稱儲存IP 位址或名稱,不超過255 個字元。

透過 SOCKS5 代理程式透過curl存取的網站的擁有者可以透過傳回請求重定向程式碼(HTTP 30x)並將「Location:」標頭設定為主機名稱在16以上範圍內的URL來觸發客戶端緩衝區溢位到64 KB(16 KB 是溢出分配的緩衝區所需的最小大小,65 KB 是URL 中允許的最大主機名稱長度)。 如果在 libcurl 設定中啟用了請求重定向,並且使用的 SOCKS5 代理程式足夠慢,那麼長主機名稱將被寫入一個小緩衝區,顯然尺寸較小。

該漏洞主要影響基於libcurl的應用程序,僅當使用值小於65541的“--limit-rate”選項時才會出現在curl實用程式中- libcurl預設分配大小為16 KB的緩衝區,並且在curl實用程式中它是 100 KB,但大小會根據「-limit-rate」參數的值而變化。

該計畫的作者 Daniel Stenberg 提到,漏洞已經 1315 天沒有被發現了。 它還表示,如果curl是用記憶體安全的語言編寫的,那麼先前發現的curl中41%的漏洞可能是可以避免的,但在可預見的將來沒有計劃將curl重寫為另一種語言。 作為提高程式碼庫安全性的措施,建議擴展用於測試程式碼的工具,並更積極地使用用程式語言編寫的依賴項,以確保記憶體的安全操作。 它還正在考慮用安全語言編寫的變體逐步替換部分curl的可能性,例如用Rust實現的實驗性Hyper HTTP後端。

來源: opennet.ru

添加評論