Slide 1

Slide 1 text

Go 1.19.1 security fix net/url JoinPath 2022/09/07 Let’s Go Talk #3 5min LT aboy 

Slide 2

Slide 2 text

🎉

Slide 3

Slide 3 text

security fixes 🤔

Slide 4

Slide 4 text

今日は net/url についての話!

Slide 5

Slide 5 text

net/url JoinPath (Go 1.19) - elem を base と結合し ./ や ../ が取り除かれた URL 文字列を返す - 内部では url.Parse したあとに URL.JoinPath (Go 1.19) を呼んでいる // JoinPath returns a URL string with the provided path elements joined to // the existing path of base and the resulting path cleaned of any ./ or ../ elements. func JoinPath(base string, elem ...string) (result string, err error) { url, err := Parse(base) if err != nil { return } result = url.JoinPath(elem...).String() return }

Slide 6

Slide 6 text

どういう問題があった? - net/url JoinPath(base string, elem ...string) が相対パスを取り除か ないケースがあった - base に末尾スラッシュがない場合の ../ パス - elem に何も指定しない場合の base パス内 - ディレクトリトラバーサルにつながる可能性 - Go 1.19.1 では URL.JoinPath に2点変更が加わった fmt.Println(url.JoinPath("https://go.dev", "../go")) // https://go.dev/../go fmt.Println(url.JoinPath("https://go.dev/", "../go")) // https://go.dev/go fmt.Println(url.JoinPath("https://go.dev/../go")) // https://go.dev/../go

Slide 7

Slide 7 text

必ず先頭に / をつけて path.Join を呼ぶようになった - path.Join(“”, “../”) は “..”、path.Join(“/”, “../”) は “/” を返す ※参考:path.Join のテストケース https://github.com/golang/go/blob/master/src/path/path_test.go#L36

Slide 8

Slide 8 text

必ず base のパス含めて path.Join を呼ぶようになった - url.JoinPath(“https://go.dev/../go”) のとき /../go をパスとして処理

Slide 9

Slide 9 text

参考 - https://twitter.com/golang/status/1567189780873486337?s=20&t=1NSLbARJbP_DS CsVPjJDPw - Go 1.19.1 and Go 1.18.6 are released - net/url: JoinPath doesn’t strip relative path components in all circumstances - https://go-review.googlesource.com/c/go/+/423514/ - https://github.com/golang/go/commit/28335508913a46e05ef0c 04a18e8a1a6beb775ec - https://pkg.go.dev/net/url#JoinPath - https://github.com/golang/go/blob/master/src/path/path_test.go