The fasthttp.FS request handler is vulnerable to directory traversal attacks on Windows systems, and can serve files from outside the provided root directory.
URL path normalization does not handle Windows path separators (backslashes), permitting an attacker to construct requests with relative paths.
{
"review_status": "REVIEWED",
"url": "https://pkg.go.dev/vuln/GO-2022-0355"
}{
"imports": [
{
"path": "github.com/valyala/fasthttp",
"symbols": [
"AppendBrotliBytes",
"AppendBrotliBytesLevel",
"AppendDeflateBytes",
"AppendDeflateBytesLevel",
"AppendGunzipBytes",
"AppendGzipBytes",
"AppendGzipBytesLevel",
"AppendHTTPDate",
"AppendInflateBytes",
"AppendUnbrotliBytes",
"Args.WriteTo",
"Client.CloseIdleConnections",
"Client.Do",
"Client.DoDeadline",
"Client.DoRedirects",
"Client.DoTimeout",
"Client.Get",
"Client.GetDeadline",
"Client.GetTimeout",
"Client.Post",
"Cookie.AppendBytes",
"Cookie.Cookie",
"Cookie.Parse",
"Cookie.ParseBytes",
"Cookie.String",
"Cookie.WriteTo",
"Dial",
"DialDualStack",
"DialDualStackTimeout",
"DialTimeout",
"Do",
"DoDeadline",
"DoRedirects",
"DoTimeout",
"FS.NewRequestHandler",
"FSHandler",
"FileLastModified",
"GenerateTestCertificate",
"Get",
"GetDeadline",
"GetTimeout",
"HostClient.CloseIdleConnections",
"HostClient.Do",
"HostClient.DoDeadline",
"HostClient.DoRedirects",
"HostClient.DoTimeout",
"HostClient.Get",
"HostClient.GetDeadline",
"HostClient.GetTimeout",
"HostClient.Post",
"LBClient.Do",
"LBClient.DoDeadline",
"LBClient.DoTimeout",
"ListenAndServe",
"ListenAndServeTLS",
"ListenAndServeTLSEmbed",
"ListenAndServeUNIX",
"NewStreamReader",
"ParseByteRange",
"ParseHTTPDate",
"ParseIPv4",
"PipelineClient.Do",
"PipelineClient.DoDeadline",
"PipelineClient.DoTimeout",
"PipelineClient.PendingRequests",
"Post",
"Request.Body",
"Request.BodyGunzip",
"Request.BodyInflate",
"Request.BodyUnbrotli",
"Request.BodyWriteTo",
"Request.ContinueReadBody",
"Request.ContinueReadBodyStream",
"Request.Host",
"Request.MultipartForm",
"Request.PostArgs",
"Request.Read",
"Request.ReadBody",
"Request.ReadLimitBody",
"Request.SetBodyStreamWriter",
"Request.SetHost",
"Request.SetHostBytes",
"Request.String",
"Request.SwapBody",
"Request.URI",
"Request.Write",
"Request.WriteTo",
"RequestCtx.FormFile",
"RequestCtx.FormValue",
"RequestCtx.Host",
"RequestCtx.IfModifiedSince",
"RequestCtx.MultipartForm",
"RequestCtx.Path",
"RequestCtx.PostArgs",
"RequestCtx.PostBody",
"RequestCtx.QueryArgs",
"RequestCtx.Redirect",
"RequestCtx.RedirectBytes",
"RequestCtx.SendFile",
"RequestCtx.SendFileBytes",
"RequestCtx.SetBodyStreamWriter",
"RequestCtx.String",
"RequestCtx.URI",
"RequestHeader.Add",
"RequestHeader.AddBytesK",
"RequestHeader.AddBytesKV",
"RequestHeader.AddBytesV",
"RequestHeader.Read",
"RequestHeader.ReadTrailer",
"RequestHeader.Set",
"RequestHeader.SetByteRange",
"RequestHeader.SetBytesK",
"RequestHeader.SetBytesKV",
"RequestHeader.SetBytesV",
"RequestHeader.SetCanonical",
"RequestHeader.SetReferer",
"RequestHeader.SetRefererBytes",
"RequestHeader.Write",
"Response.Body",
"Response.BodyGunzip",
"Response.BodyInflate",
"Response.BodyUnbrotli",
"Response.BodyWriteTo",
"Response.Read",
"Response.ReadBody",
"Response.ReadLimitBody",
"Response.SendFile",
"Response.SetBodyStreamWriter",
"Response.String",
"Response.SwapBody",
"Response.Write",
"Response.WriteDeflate",
"Response.WriteDeflateLevel",
"Response.WriteGzip",
"Response.WriteGzipLevel",
"Response.WriteTo",
"ResponseHeader.Add",
"ResponseHeader.AddBytesK",
"ResponseHeader.AddBytesKV",
"ResponseHeader.AddBytesV",
"ResponseHeader.AppendBytes",
"ResponseHeader.Cookie",
"ResponseHeader.DelClientCookie",
"ResponseHeader.DelClientCookieBytes",
"ResponseHeader.Header",
"ResponseHeader.Read",
"ResponseHeader.ReadTrailer",
"ResponseHeader.Set",
"ResponseHeader.SetBytesK",
"ResponseHeader.SetBytesKV",
"ResponseHeader.SetBytesV",
"ResponseHeader.SetCanonical",
"ResponseHeader.SetContentRange",
"ResponseHeader.SetCookie",
"ResponseHeader.SetLastModified",
"ResponseHeader.String",
"ResponseHeader.Write",
"ResponseHeader.WriteTo",
"SaveMultipartFile",
"Serve",
"ServeConn",
"ServeFile",
"ServeFileBytes",
"ServeFileBytesUncompressed",
"ServeFileUncompressed",
"ServeTLS",
"ServeTLSEmbed",
"Server.AppendCert",
"Server.AppendCertEmbed",
"Server.ListenAndServe",
"Server.ListenAndServeTLS",
"Server.ListenAndServeTLSEmbed",
"Server.ListenAndServeUNIX",
"Server.Serve",
"Server.ServeConn",
"Server.ServeTLS",
"Server.ServeTLSEmbed",
"Server.Shutdown",
"TCPDialer.Dial",
"TCPDialer.DialDualStack",
"TCPDialer.DialDualStackTimeout",
"TCPDialer.DialTimeout",
"URI.Parse",
"URI.Update",
"URI.UpdateBytes",
"URI.WriteTo",
"WriteBrotli",
"WriteBrotliLevel",
"WriteDeflate",
"WriteDeflateLevel",
"WriteGunzip",
"WriteGzip",
"WriteGzipLevel",
"WriteInflate",
"WriteMultipartForm",
"WriteUnbrotli",
"bigFileReader.Read",
"bigFileReader.WriteTo",
"ctxLogger.Printf",
"firstByteReader.Read",
"flushWriter.Write",
"fsFile.NewReader",
"fsSmallFileReader.WriteTo",
"hijackConn.Close",
"hijackConn.Read",
"perIPConn.Close",
"perIPConnCounter.Unregister",
"pipelineConnClient.Do",
"pipelineConnClient.DoDeadline",
"pipelineConnClient.PendingRequests",
"requestStream.Read",
"statsWriter.Write",
"tcpKeepaliveListener.Accept",
"workerPool.Serve"
]
}
]
}