-
Notifications
You must be signed in to change notification settings - Fork 17.7k
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, image, debug, encoding, x/net/html: DO NOT PANIC #47653
Comments
Change https://golang.org/cl/353850 mentions this issue: |
Change https://golang.org/cl/353851 mentions this issue: |
Change https://golang.org/cl/353852 mentions this issue: |
Related to: #48085 |
For libraries that wrap user-provided interfaces (such as reading from a user-provided One way to detect panics that originate within the library might be to use Fortunately, we can use a variable to detect an abnormal exit, then snoop the caller stack, and finally That would allow these packages to recover from internal bugs, but without masking (or destroying information from) panics in user code. |
That said, now that we have fuzzing coming I wonder whether the (That's in contrast with, say, packages with a large amount of nondeterminism like |
Memory allocation failures remain an issue, though. I'm not sure to what extent the Go runtime even bothers to handle them. With compression and APIs that expose entire sections of the file as arrays, it's really not possible to avoid memory allocation failures merely by checking the input file sizes prior to decoding. In other cases, there is a section which supposedly-small section that gets exposed as an array, and the bulk of the data is represented separately and can be accessed through a streaming interface (so its size does not matter for memory consumption purposes). Archive formats typically have this property. For example, Maybe you could add a Security Considerations section to the package documentation detailing such issues? |
Change https://golang.org/cl/371394 mentions this issue: |
@FiloSottile thank you for filing this issue! So we have a bunch of CLs addressing parts of this issue starting from October 2021, but none of them have been merged. Shall we punt this issue instead to Go1.19 when we shall have more adequate time? What do y'all think @FiloSottile @bcmills @katiehockman @julieqiu? Thank you! |
@FiloSottile @golang/security This is in the 1.18 milestone; time to move to 1.19? Thanks. |
Agree about moving this to Go 1.19. |
Change https://go.dev/cl/393874 mentions this issue: |
Tweak the (*Data).parseUnits method to check a bit more carefully for buffer read errors, so as to avoid infinite looping on malformed inputs. Fixes #51758. Updates #47653. Change-Id: I6d67fcb53392acf651ceec636789ab9e49ad5a5c Reviewed-on: https://go-review.googlesource.com/c/go/+/393874 Reviewed-by: Ian Lance Taylor <[email protected]> Trust: Than McIntosh <[email protected]> Run-TryBot: Than McIntosh <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
Change https://go.dev/cl/396880 mentions this issue: |
No test because we could add an infinite number of tests of bogus data. For #47653 Fixes #52035 Change-Id: Iec7e2fe23f2dd1cf14bad2475422f243f51028f5 Reviewed-on: https://go-review.googlesource.com/c/go/+/396880 Trust: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Tobias Klauser <[email protected]> Reviewed-by: Than McIntosh <[email protected]>
Change https://go.dev/cl/469895 mentions this issue: |
For reference here, https://github.com/catenacyber/ngolo-fuzzing is my attempt to go at this ;-) |
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58603 Change-Id: I67fc45365c1a5b0b4b381f541bf2fee8ce8ddc3a Reviewed-on: https://go-review.googlesource.com/c/go/+/469895 TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Bryan Mills <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]>
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For golang#47653 Fixes golang#58603 Change-Id: I67fc45365c1a5b0b4b381f541bf2fee8ce8ddc3a Reviewed-on: https://go-review.googlesource.com/c/go/+/469895 TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Bryan Mills <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]>
Change https://go.dev/cl/470397 mentions this issue: |
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58642 Change-Id: I19fee0dc9bd6239b520c15182b8f1e57bb0049bb Reviewed-on: https://go-review.googlesource.com/c/go/+/470397 Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Reviewed-by: Bryan Mills <[email protected]>
Change https://go.dev/cl/471678 mentions this issue: |
Change https://go.dev/cl/471835 mentions this issue: |
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58755 Change-Id: I5b95a21f47ec306ad90cd6221f0566c6f8b6c3ad Reviewed-on: https://go-review.googlesource.com/c/go/+/471835 Reviewed-by: Dmitri Shuralyov <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]>
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58754 Change-Id: Ic3ef58b204b946f8bff80310d4c8dfcbb2939a1c Reviewed-on: https://go-review.googlesource.com/c/go/+/471678 Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]>
Change https://go.dev/cl/473657 mentions this issue: |
This avoids a very large memory allocation if corrupt data says that we need to read a very long string. No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #58886 Change-Id: I4e80ba62a6416d010c8804e4f49ae81bdafaadb8 Reviewed-on: https://go-review.googlesource.com/c/go/+/473657 Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Bryan Mills <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
Change https://go.dev/cl/488475 mentions this issue: |
A section with uninitialized data contains no bytes and occupies no space in the file. This change makes it return an error on reading from this section so that it will force the caller to check for a section with uninitialized data. This is the debug/pe version of CL 429601. This will break programs that expect a byte slice with the length described by the SizeOfRawData field. There are two reasons to introduce this breaking change: 1) uninitialized data is uninitialized and there is no reason to allocate memory for it; 2) it could result in an OOM if the file is corrupted and has a large invalid SizeOfRawData. No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #59817 Change-Id: I1ae94e9508f803b37926275d9a571f724a09af9f Reviewed-on: https://go-review.googlesource.com/c/go/+/488475 Reviewed-by: Bryan Mills <[email protected]> Reviewed-by: kortschak <[email protected]> Reviewed-by: Alex Brainman <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]>
Change https://go.dev/cl/499419 mentions this issue: |
For #47653 Change-Id: Id44c9dba58966f43f188030a53343d890a6ffde7 Reviewed-on: https://go-review.googlesource.com/c/go/+/499419 Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> TryBot-Bypass: Ian Lance Taylor <[email protected]> Reviewed-by: Eli Bendersky <[email protected]>
This comment was marked as spam.
This comment was marked as spam.
Change https://go.dev/cl/632035 mentions this issue: |
No test case because the problem can only happen for invalid data. Let the fuzzer find cases like this. For #47653 Fixes #70584 Change-Id: I8a69a27dcb5b258b88f8e01ebaf0ec20cfcd489b Reviewed-on: https://go-review.googlesource.com/c/go/+/632035 Reviewed-by: Veronica Silina <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Tobias Klauser <[email protected]> Auto-Submit: Ian Lance Taylor <[email protected]> Reviewed-by: Cherry Mui <[email protected]>
We have a number of packages that implement parsers where a panic might lead to a Denial of Service, but returning an invalid input error instead would be perfectly harmless. We should wrap them all in a
recover()
and prevent the panic from propagating, as a robustness and defense in depth measure.We need to be careful about preserving documented panic conditions, and about not leaving behind persistent state that might be corrupt following a panic.
Ideas for other packages that can benefit are welcome. Crypto packages were intentionally left out, as we should be confident in their operation.
math/big
has a lot of entry points and persistent state by definition (and we have a plan to drag it out of the security perimeter)./cc @golang/security
The text was updated successfully, but these errors were encountered: