0x00 漏洞背景
Qt框架包含的Qt Network(网络模块),提供了QNetworkAccessManager 类,该类允许应用程序发送网络请求和接收回复。其在处理响应时,会根据服务器发送的“Strict-Transport-Security”的响应头来更新HSTS策略。
随后进行漏洞分析与验证,笔者选择的是Qt6.2.4版本。
用来进行HSTS测试的网址为:hsts.badssl.com。
下述代码为使用QNetworkAccessManager对象发起HTTPS请求,该网站以HTTPS请求的时候会返回Strict-Transport-Security响应头。Qt会隐式的调用QHstsHeaderParser类解析HSTS header随后更新QHstsCache中的策略。
QListhstsPolicies;
QHstsPolicy policy;
policy.setHost(“hsts.badssl.com”);
policy.setIncludesSubDomains(true);
QDateTime expiry = QDateTime::currentDateTime().addYears(1); // 设置过期时间为1年后
policy.setExpiry(expiry);
hstsPolicies.append(policy);
manager.addStrictTransportSecurityHosts(hstsPolicies);
但是当服务器返回的响应头的HSTS头部是Strict-Transport-security,此时Security的S变成了s。这时客户端便不会引入新的策略,从而导致了继续使用明文协议HTTP。
Qt是一个开源的软件,可以去定位相关的代码,笔者在netword/access/qhsts.cpp中发现了产生漏洞的代码。代码使用了==将响应头字段与Strict-Transport-security进行了比较,导致了大小写不匹配时,HSTS策略引入失败。
- 当匹配Strict-Transport-Security字段的时候,使用大小写不敏感进行匹配。
- 引入全小写的测试用例进行测试。
洞源实验室
安全工程师:hu1y40
2023 年 6 月 16 日