Skip to content

archive/zip: EOCDR comment length handling is inconsistent with other ZIP implementations #66869

Description

@ouuan

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.

Activity

  1. added
    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.
    on Apr 17, 2024
  2. added this to the Backlog milestone on Apr 17, 2024
  3. cherrymui commented on Apr 17, 2024

    @cherrymui
    Member
  4. added
    NeedsFixThe path to resolution is known, but the work has not been done.
    and removed
    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.
    on Apr 22, 2024
  5. gopherbot commented on May 14, 2024

    @gopherbot
    Contributor

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

  6. modified the milestones: Backlog, Go1.23 on May 16, 2024
  7. added a commit that references this issue on May 16, 2024
    33d725e
  8. neild commented on May 21, 2024

    @neild
    Contributor

    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.

  9. gopherbot commented on May 21, 2024

    @gopherbot
    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.

  10. gopherbot commented on May 28, 2024

    @gopherbot
    Contributor

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

  11. gopherbot commented on May 28, 2024

    @gopherbot
    Contributor

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

  12. added a commit that references this issue on Jun 5, 2024
  13. added a commit that references this issue on Jun 5, 2024
  14. added a commit that references this issue on Jun 5, 2024
  15. locked and limited conversation to collaborators on May 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.Security

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions