Qt是一個(gè)跨平臺的C++應用程序開(kāi)發(fā)框架,用于創(chuàng )建圖形用戶(hù)界面(GUI)應用程序、命令行工具、嵌入式系統和網(wǎng)絡(luò )應用等各種類(lèi)型的應用。
(相關(guān)資料圖)
Qt框架包含的Qt Network(網(wǎng)絡(luò )模塊),提供了QNetworkAccessManager 類(lèi),該類(lèi)允許應用程序發(fā)送網(wǎng)絡(luò )請求和接收回復。其在處理響應時(shí),會(huì )根據服務(wù)器發(fā)送的“Strict-Transport-Security”的響應頭來(lái)更新HSTS策略。
0x01 漏洞信息
0x02 漏洞影響
該漏洞存在Qt 5.15.14版本之前;6.2.9之前的6.X版本以及6.5.1之前的6.3.X-6.5.X版本。成因是Qt錯誤的解析了HSTS header,當大小寫(xiě)不匹配的時(shí)候,即使服務(wù)器明確禁止,客戶(hù)端也會(huì )使用未加密的連接。
0x03 漏洞分析
首先需要介紹HSTS(HTTP Strict Transport Security),這是一種WEB安全策略。用來(lái)防止中間人和SSL/TLS剝離攻擊。HSTS通過(guò)強制客戶(hù)端(如Web瀏覽器)始終使用HTTPS來(lái)保護通信,即使用戶(hù)手動(dòng)輸入的是HTTP網(wǎng)址。它通過(guò)在服務(wù)器的響應頭中添加"Strict-Transport-Security"字段來(lái)實(shí)現。一旦瀏覽器收到帶有HSTS頭的響應,它將記住該網(wǎng)站必須通過(guò)HTTPS進(jìn)行訪(fǎng)問(wèn),并在未來(lái)的請求中自動(dòng)將所有HTTP請求重定向到HTTPS。這樣可以防止攻擊者利用惡意重定向將用戶(hù)導向不安全的HTTP連接。
隨后進(jìn)行漏洞分析與驗證,筆者選擇的是Qt6.2.4版本。
用來(lái)進(jìn)行HSTS測試的網(wǎng)址為:hsts.badssl.com。
下述代碼為使用QNetworkAccessManager對象發(fā)起HTTPS請求,該網(wǎng)站以HTTPS請求的時(shí)候會(huì )返回Strict-Transport-Security響應頭。Qt會(huì )隱式的調用QHstsHeaderParser類(lèi)解析HSTS header隨后更新QHstsCache中的策略。
manager.strictTransportSecurityHosts函數能獲取當前的HSTS策略。當執行到QObject::connect內時(shí),可發(fā)現temp中添加了一項策略。
隨后我們使用的http://hsts.badssl.com/會(huì )自動(dòng)換成https://hsts.badssl.com/。由于本身QNetworkAccessManager發(fā)送多個(gè)網(wǎng)絡(luò )請求的異步性,這里我們使用如下代碼手動(dòng)添加策略:
// 添加HSTS策略
QListhstsPolicies;
QHstsPolicy policy;
policy.setHost("hsts.badssl.com");
policy.setIncludesSubDomains(true);
QDateTime expiry = QDateTime::currentDateTime().addYears(1); // 設置過(guò)期時(shí)間為1年后
policy.setExpiry(expiry);
hstsPolicies.append(policy);
manager.addStrictTransportSecurityHosts(hstsPolicies);
之后發(fā)送HTTP請求:
此時(shí)的響應頭是HTTPS請求的響應頭。
后續客戶(hù)端對該域名服務(wù)器的任何HTTP請求都將被隱式的轉換成HTTPS請求。
但是當服務(wù)器返回的響應頭的HSTS頭部是Strict-Transport-security,此時(shí)Security的S變成了s。這時(shí)客戶(hù)端便不會(huì )引入新的策略,從而導致了繼續使用明文協(xié)議HTTP。
Qt是一個(gè)開(kāi)源的軟件,可以去定位相關(guān)的代碼,筆者在netword/access/qhsts.cpp中發(fā)現了產(chǎn)生漏洞的代碼。代碼使用了==將響應頭字段與Strict-Transport-security進(jìn)行了比較,導致了大小寫(xiě)不匹配時(shí),HSTS策略引入失敗。
0x04 修復方法
Qt開(kāi)發(fā)者對源碼的修復如下:
當匹配Strict-Transport-Security字段的時(shí)候,使用大小寫(xiě)不敏感進(jìn)行匹配。引入全小寫(xiě)的測試用例進(jìn)行測試。用戶(hù)可以通過(guò)使用新版本的Qt預編譯庫進(jìn)行漏洞修復。
標簽: