Squid cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid 的用途很多,可以作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,也可以为一组人共享网络资源而缓存万维网、域名系统和其他网络搜索,以及通过过滤流量提高网络安全,在局域网通过代理上网等。
漏洞简介
Squid的HTTP Digest认证在未授权的并且高并发的情况下存在整数溢出漏洞风险,随后导致UAF。Squid 的 HTTPDigest 认证是非默认开启。
漏洞基本信息
公告:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11945
作者:synacktiv
影响版本:
Squid 5.x -> 5.0.1
Squid 2.x -> 2.7.STABLE9
Squid 3.x -> 3.5.28
Squid 4.x -> 4.10
修复版本
Squid 4.11 and 5.0.2
注:本篇文章仅在上述条件下调试分析
漏洞分析
通过 patch 分析得出,溢出的是references字段:
references溢出后会导致 _digest_nonce_h 数据结构提前释放,导致UAF:
创建_digest_nonce_h(会生成一个固定随机字符串凭证发送给用户)实例时references为1,每个request 请求references字段会加一。request结束后references会减一。因为request请求到结束的时间较短,需要大量的并发数量的累加references导致触发漏洞。
Squid digest 认证配置:
auth_paramdigest program /usr/local/squid/bin/digest_file_auth -c /usr/local/squid/digest.passwd
auth_paramdigest children 5
auth_paramdigest realm testrealm
auth_paramdigest nonce_garbage_interval 5 minutes
auth_paramdigest nonce_max_duration 30 minutes
auth_paramdigest nonce_max_count 50
acltest proxy_auth REQUIRED
http_access allow test
1.首先获取一个服务器的 nonce 字段值:
2.通过nonce字段值,短时间高并发的发送报文
CONNECTtest.com:443 HTTP/1.1
Host:test.com:443
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100Safari/537.36
Proxy-Authorization:Digest username="11111", realm="33333",nonce="dcea472040e3be38250541e9a1f6b768",uri="browser.gwdang.com:443", response="b12b53054f24f91c4b15cf873f22e298",qop=auth, nc=00000001, cnonce="70c18c47cce02533"
在实验中,单台虚拟机中访问可达700多次,而需要累计超过32767次后触发漏洞,效果如下:
危害
使用该Digest验证的Squid服务器,理论上容易遭受远程DOS攻击,配合其它漏洞可能导致信息泄露和远程代码执行,但是在实际验证中,触发整数溢出不太容易,实际危害不大。
参考引用
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11945
https://github.com/squid-cache/squid/commit/eeebf0f37a72a2de08348e85ae34b02c34e9a811?diff=unified
https://www.openwall.com/lists/oss-security/2020/04/23/2