elastic / apm-agent-go

https://www.elastic.co/guide/en/apm/agent/go/current/index.html
Apache License 2.0
422 stars 197 forks source link

lack of escaping of filename in content-disposition `FileAttachment()` is vulnerable to Reflect File Download #1621

Closed sufatmawati closed 6 months ago

sufatmawati commented 6 months ago

Describe the bug The filename parameter of the Context.FileAttachment function is not properly sanitized. A maliciously crafted filename can cause the Content-Disposition header to be sent with an unexpected filename value or otherwise modify the Content-Disposition header. For example, a filename of "setup.bat";x=.txt" will be sent as a file named "setup.bat". If the FileAttachment function is called with names provided by an untrusted source, this may permit an attacker to cause a file to be served with a name different than provided. Maliciously crafted attachment file name can modify the Content-Disposition header.

pull-request for patched the vulnerable on #1620

func (c *Context) FileAttachment(filepath, filename string) {
    if isASCII(filename) {
        c.Writer.Header().Set("Content-Disposition", `attachment; filename="`+filename+`"`)
package main

import (
  "github.com/gin-gonic/gin"
  "go.elastic.co/apm/v2"
)

func main() {
  r := gin.Default()
  r.GET("/download", func(c *gin.Context) {
    dir := "/Users/{CHANGE_PROJECT_DIRECTRY}/"

    // Although the file name is hard-coded, we assume that the file name is actually determined by the DB or user input.
    filename := "malicious.sh\";dummy=.txt"
    c.FileAttachment(dir + filename, filename)
  })
  r.Run()
}
HTTP/1.1 304 Not Modified
Content-Disposition: attachment; filename="malicious.sh";dummy=.txt"
Date: Wed, 20 Jul 2022 11:17:43 GMT

Content-Disposition: attachment; filename="malicious.sh";dummy=.txt"

CWE-494 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N

### Tasks
- [ ] https://github.com/elastic/apm-agent-go/pull/1620