Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

archive/tar: malformed input causes panic in parsePAXRecord #40196

Open
josharian opened this issue Jul 13, 2020 · 3 comments
Open

archive/tar: malformed input causes panic in parsePAXRecord #40196

josharian opened this issue Jul 13, 2020 · 3 comments
Milestone

Comments

@josharian
Copy link
Contributor

@josharian josharian commented Jul 13, 2020

Discovered by oss-fuzz, at https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=24029. This is a slightly smaller reproducer.

cc @dsnet @dvyukov @FiloSottile

Reproduce:

package main

import (
	"archive/tar"
	"bytes"
)

func main() {
	r := bytes.NewReader(data)
	t := tar.NewReader(r)
	for {
		_, err := t.Next()
		if err != nil {
			return
		}
	}
}

var data = []byte("./PaxHeaders.20745/aaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000644\x000000000\x000000000\x0000000000132\x0012531145371\x00011420\x00 x\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ustar\x0000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000000000000000000000000000000030 mtime=1432668921.098285006\n30 ctime=2147483649.151633198\n30 ctime=1432668921.151633198\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")

Result:

$ go run fuzztar.go
panic: runtime error: slice bounds out of range [35:29]

goroutine 1 [running]:
archive/tar.parsePAXRecord(0xc0000200c0, 0x5a, 0x5a, 0x200, 0xc0000200c0, 0x5a, 0x0, 0x0, 0x0, 0x0)
	/Users/josh/go/1.14/src/archive/tar/strconv.go:269 +0x3e6
archive/tar.parsePAX(0x1106a40, 0xc000014480, 0xc0000144a8, 0x0, 0x0)
	/Users/josh/go/1.14/src/archive/tar/reader.go:310 +0x118
archive/tar.(*Reader).next(0xc000014480, 0x10d8500, 0xc00007a101, 0xc000014480)
	/Users/josh/go/1.14/src/archive/tar/reader.go:90 +0x1e2
archive/tar.(*Reader).Next(0xc000014480, 0xc000014480, 0xc000051f78, 0x1006ebf)
	/Users/josh/go/1.14/src/archive/tar/reader.go:52 +0x42
main.main()
	/Users/josh/Desktop/tardelme/fuzztar.go:12 +0x13c
exit status 2

Reproduces with tip, 1.14, and 1.13. I didn't try earlier.

@josharian josharian added this to the Go1.16 milestone Jul 13, 2020
@dsnet
Copy link
Member

@dsnet dsnet commented Jul 13, 2020

Code hasn't been touched in years, so probably been around for a while. Although, I was probably the one who introduced this bug. Ooops!

@gopherbot
Copy link

@gopherbot gopherbot commented Jul 16, 2020

Change https://golang.org/cl/243038 mentions this issue: archive,image: document security expectations

@FiloSottile
Copy link
Member

@FiloSottile FiloSottile commented Jul 16, 2020

This was also reported by Chijin Zhou of the Tencent Blade Team to security@golang.org a few hours before OSS-Fuzz found it. We've not been considering panics in archive/... and image/... packages to be security issues, because they can cleanly be recovered by applications that process untrusted inputs, and I've sent a CL to document that.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
5 participants
You can’t perform that action at this time.