这是针对由 Bartek Nowotarski 发现并记录的 CONTINUATION 洪泛漏洞的概念验证代码。技术细节在他的博客文章中有非常详尽的记录,见此处。虽然我主要关注研究者所记录的 Go 语言 bug,但这段代码对于测试与此问题相关的其他 CVE 应该也有帮助。
此代码借鉴了以下来源:
我最初的目标是深入理解这个漏洞,同时为工作中测试此问题开发一个工具。这在我详细研究 http2 内部工作原理时也很有帮助。其他有用的资料包括:
你可以运行附带的 server.go 文件,该文件运行在易受攻击的 golang.org/x/net 版本(0.20.0)上。
$ go run server.go
服务器运行在 8443 端口,客户端默认连接该端口。
当针对易受攻击的服务器运行时,客户端将能够持续发送 CONTINUATION 帧,持续时间为你通过 wait 标志指定的秒数。服务器每 2 秒打印一次 CPU 使用率,你会看到随着客户端的运行,CPU 使用率迅速增加。在打了补丁的版本(0.23.0 及以上)中,一旦达到头部大小限制,服务器将关闭连接。
运行客户端,创建 6 个并发连接,调用 https://localhost:8443,并为每个连接发送 CONTINUATION 帧持续 200 秒:
$ go run client.go -time-limit 200 -connections 6 -url https://localhost:8443