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/zip: EOCDR comment length handling is inconsistent with other ZIP implementations #66869

Closed
ouuan opened this issue Apr 17, 2024 · 6 comments · Fixed by NixOS/nixpkgs#319485
Labels
NeedsFix The path to resolution is known, but the work has not been done. Security
Milestone

Comments

@ouuan
Copy link

ouuan commented Apr 17, 2024

This has been reported in email and accepted as a PUBLIC track security issue.

Go version

go version go1.22.2 linux/amd64

Output of go env in your module/workspace:

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/root/.cache/go-build'
GOENV='/root/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='local'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.2'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='0'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -fno-caret-diagnostics -Qunused-arguments -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build216392132=/tmp/go-build -gno-record-gcc-switches'

What did you do?

Use archive/zip (actually, a thin wrapper library https://github.com/evilsocket/islazy/blob/master/zip/unzip.go) to extract the attached ZIP archive: poc.zip (Warning: It contains malware. Do not open the extracted exe file!)

It is constructed as illustrated below:

normal ZIP archive with a virus

    LFH           ─╮
    data (virus)   ├─→──┐
    CDH            │    │
    EOCDR         ─╯    │ copy the inner
                        ↓ archive with virus
the final ZIP archive   │ as the data of
                        │ the outer archive
    LFH (size set to 1) │
    data (copied) ←─────┘
    CDH (size set to 1)
    EOCDR (comment length set to 1 with empty comment content)

What did you see happen?

It can get the malware inside the ZIP archive. This is caused by the following logic, which skips EOCDR with a bogus comment length field and continues to search for the next one:

if n+directoryEndLen+i <= len(b) {
return i
}

However, this is inconsistent with most other ZIP implementations, so they are using different EOCDRs and get different files extracted. Most other ZIP implementations are not able to get the virus. The PoC file is flagged by only 1/62 security vendor on VirusTotal.

This inconsistency can also be used in other scenarios depending on the specific use case of the package, such as hiding add-on files from linter and reviewers.

What did you expect to see?

archive/zip should return an error when a bogus EOCDR is encountered.

@cherrymui cherrymui added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Apr 17, 2024
@cherrymui cherrymui added this to the Backlog milestone Apr 17, 2024
@cherrymui
Copy link
Member

cc @dsnet @bradfitz

@neild neild added Security NeedsFix The path to resolution is known, but the work has not been done. and removed NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. labels Apr 22, 2024
@gopherbot
Copy link
Contributor

Change https://go.dev/cl/585397 mentions this issue: archive/zip: treat truncated EOCDR comment as an error

@dmitshur dmitshur modified the milestones: Backlog, Go1.23 May 16, 2024
@neild
Copy link
Contributor

neild commented May 21, 2024

This parser misalignment is a PUBLIC track security issue. We have assigned this CVE-2024-24789.

@gopherbot please open backport issues. This is a security issue.

@gopherbot
Copy link
Contributor

Backport issue(s) opened: #67553 (for 1.21), #67554 (for 1.22).

Remember to create the cherry-pick CL(s) as soon as the patch is submitted to master, according to https://go.dev/wiki/MinorReleases.

@gopherbot
Copy link
Contributor

Change https://go.dev/cl/588795 mentions this issue: [release-branch.go1.21] archive/zip: treat truncated EOCDR comment as an error

@gopherbot
Copy link
Contributor

Change https://go.dev/cl/588796 mentions this issue: [release-branch.go1.22] archive/zip: treat truncated EOCDR comment as an error

gopherbot pushed a commit that referenced this issue May 29, 2024
… an error

When scanning for an end of central directory record,
treat an EOCDR signature with a record containing a truncated
comment as an error. Previously, we would skip over the invalid
record and look for another one. Other implementations do not
do this (they either consider this a hard error, or just ignore
the truncated comment). This parser misalignment allowed
presenting entirely different archive contents to Go programs
and other zip decoders.

For #66869
Fixes #67554

Change-Id: I94e5cb028534bb5704588b8af27f1e22ea49c7c6
Reviewed-on: https://go-review.googlesource.com/c/go/+/585397
Reviewed-by: Joseph Tsai <[email protected]>
Reviewed-by: Dmitri Shuralyov <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
(cherry picked from commit 33d725e)
Reviewed-on: https://go-review.googlesource.com/c/go/+/588796
Reviewed-by: Matthew Dempsky <[email protected]>
gopherbot pushed a commit that referenced this issue May 29, 2024
… an error

When scanning for an end of central directory record,
treat an EOCDR signature with a record containing a truncated
comment as an error. Previously, we would skip over the invalid
record and look for another one. Other implementations do not
do this (they either consider this a hard error, or just ignore
the truncated comment). This parser misalignment allowed
presenting entirely different archive contents to Go programs
and other zip decoders.

For #66869
Fixes #67553

Change-Id: I94e5cb028534bb5704588b8af27f1e22ea49c7c6
Reviewed-on: https://go-review.googlesource.com/c/go/+/585397
Reviewed-by: Joseph Tsai <[email protected]>
Reviewed-by: Dmitri Shuralyov <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
(cherry picked from commit 33d725e)
Reviewed-on: https://go-review.googlesource.com/c/go/+/588795
Reviewed-by: Matthew Dempsky <[email protected]>
drakkan added a commit to drakkan/compress that referenced this issue Jun 5, 2024
klauspost added a commit to klauspost/zipindex that referenced this issue Jun 5, 2024
Notably includes golang/go#66869 and `RemoveInsecurePaths()` for golang/go#55356

Updates CI.
harshavardhana pushed a commit to minio/zipindex that referenced this issue Jun 5, 2024
Notably includes golang/go#66869 and `RemoveInsecurePaths()` for golang/go#55356
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NeedsFix The path to resolution is known, but the work has not been done. Security
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants