diff options
| author | Deepak Rathore <deeratho@cisco.com> | 2026-02-11 20:59:43 -0800 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2026-02-27 17:45:06 +0000 |
| commit | e333b43a692acd58d42c5bdb8ac54b41c07e8a0d (patch) | |
| tree | 89d33c29da189e25271c7cb62216a025229c9173 | |
| parent | 242963f4cd1597d31a3efae2422016bf888c6e25 (diff) | |
| download | poky-e333b43a692acd58d42c5bdb8ac54b41c07e8a0d.tar.gz | |
go 1.22.12: Fix CVE-2025-61728
Upstream Repository: https://github.com/golang/go.git
Bug details: https://nvd.nist.gov/vuln/detail/CVE-2025-61728
Type: Security Fix
CVE: CVE-2025-61728
Score: 6.5
Patch: https://github.com/golang/go/commit/3235ef3db85c
(From OE-Core rev: 31eb409b8a0537d97e09e6a13b8182db4135f3c9)
Signed-off-by: Deepak Rathore <deeratho@cisco.com>
Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
Signed-off-by: Paul Barker <paul@pbarker.dev>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | meta/recipes-devtools/go/go-1.22.12.inc | 1 | ||||
| -rw-r--r-- | meta/recipes-devtools/go/go/CVE-2025-61728.patch | 171 |
2 files changed, 172 insertions, 0 deletions
diff --git a/meta/recipes-devtools/go/go-1.22.12.inc b/meta/recipes-devtools/go/go-1.22.12.inc index 46f6ef5d8f..04e380c821 100644 --- a/meta/recipes-devtools/go/go-1.22.12.inc +++ b/meta/recipes-devtools/go/go-1.22.12.inc | |||
| @@ -33,6 +33,7 @@ SRC_URI += "\ | |||
| 33 | file://CVE-2025-61729.patch \ | 33 | file://CVE-2025-61729.patch \ |
| 34 | file://CVE-2025-61730.patch \ | 34 | file://CVE-2025-61730.patch \ |
| 35 | file://CVE-2025-61726.patch \ | 35 | file://CVE-2025-61726.patch \ |
| 36 | file://CVE-2025-61728.patch \ | ||
| 36 | " | 37 | " |
| 37 | SRC_URI[main.sha256sum] = "012a7e1f37f362c0918c1dfa3334458ac2da1628c4b9cf4d9ca02db986e17d71" | 38 | SRC_URI[main.sha256sum] = "012a7e1f37f362c0918c1dfa3334458ac2da1628c4b9cf4d9ca02db986e17d71" |
| 38 | 39 | ||
diff --git a/meta/recipes-devtools/go/go/CVE-2025-61728.patch b/meta/recipes-devtools/go/go/CVE-2025-61728.patch new file mode 100644 index 0000000000..99266ed7a8 --- /dev/null +++ b/meta/recipes-devtools/go/go/CVE-2025-61728.patch | |||
| @@ -0,0 +1,171 @@ | |||
| 1 | From 727c39f7e6c9dc9d4a40d67f39f68ae8867a2abd Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Damien Neil <dneil@google.com> | ||
| 3 | Date: Tue, 4 Nov 2025 17:00:33 -0800 | ||
| 4 | Subject: [PATCH] [release-branch.go1.24] archive/zip: reduce CPU usage in | ||
| 5 | index construction | ||
| 6 | MIME-Version: 1.0 | ||
| 7 | Content-Type: text/plain; charset=UTF-8 | ||
| 8 | Content-Transfer-Encoding: 8bit | ||
| 9 | |||
| 10 | Constructing the zip index (which is done once when first opening | ||
| 11 | a file in an archive) can consume large amounts of CPU when | ||
| 12 | processing deeply-nested directory paths. | ||
| 13 | |||
| 14 | Switch to a less inefficient algorithm. | ||
| 15 | |||
| 16 | Thanks to Jakub Ciolek for reporting this issue. | ||
| 17 | |||
| 18 | goos: darwin | ||
| 19 | goarch: arm64 | ||
| 20 | pkg: archive/zip | ||
| 21 | cpu: Apple M4 Pro | ||
| 22 | │ /tmp/bench.0 │ /tmp/bench.1 │ | ||
| 23 | │ sec/op │ sec/op vs base │ | ||
| 24 | ReaderOneDeepDir-14 25983.62m ± 2% 46.01m ± 2% -99.82% (p=0.000 n=8) | ||
| 25 | ReaderManyDeepDirs-14 16.221 ± 1% 2.763 ± 6% -82.96% (p=0.000 n=8) | ||
| 26 | ReaderManyShallowFiles-14 130.3m ± 1% 128.8m ± 2% -1.20% (p=0.003 n=8) | ||
| 27 | geomean 3.801 253.9m -93.32% | ||
| 28 | |||
| 29 | Fixes #77102 | ||
| 30 | Fixes CVE-2025-61728 | ||
| 31 | |||
| 32 | CVE: CVE-2025-61728 | ||
| 33 | Upstream-Status: Backport [https://github.com/golang/go/commit/3235ef3db85c] | ||
| 34 | |||
| 35 | Change-Id: I2c9c864be01b2a2769eb67fbab1b250aeb8f6c42 | ||
| 36 | Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/3060 | ||
| 37 | Reviewed-by: Nicholas Husin <husin@google.com> | ||
| 38 | Reviewed-by: Neal Patel <nealpatel@google.com> | ||
| 39 | Reviewed-on: https://go-internal-review.googlesource.com/c/go/+/3328 | ||
| 40 | Reviewed-by: Damien Neil <dneil@google.com> | ||
| 41 | Reviewed-on: https://go-review.googlesource.com/c/go/+/736703 | ||
| 42 | TryBot-Bypass: Michael Pratt <mpratt@google.com> | ||
| 43 | Auto-Submit: Michael Pratt <mpratt@google.com> | ||
| 44 | Reviewed-by: Junyang Shao <shaojunyang@google.com> | ||
| 45 | (cherry picked from commit 3235ef3db85c2d7e797b976822a7addaf6d5ca2a) | ||
| 46 | Signed-off-by: Deepak Rathore <deeratho@cisco.com> | ||
| 47 | --- | ||
| 48 | src/archive/zip/reader.go | 11 ++++- | ||
| 49 | src/archive/zip/reader_test.go | 81 ++++++++++++++++++++++++++++++++++ | ||
| 50 | 2 files changed, 91 insertions(+), 1 deletion(-) | ||
| 51 | |||
| 52 | diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go | ||
| 53 | index 60b34b76ee..8a79f5d140 100644 | ||
| 54 | --- a/src/archive/zip/reader.go | ||
| 55 | +++ b/src/archive/zip/reader.go | ||
| 56 | @@ -830,7 +830,16 @@ func (r *Reader) initFileList() { | ||
| 57 | continue | ||
| 58 | } | ||
| 59 | |||
| 60 | - for dir := path.Dir(name); dir != "."; dir = path.Dir(dir) { | ||
| 61 | + dir := name | ||
| 62 | + for { | ||
| 63 | + if idx := strings.LastIndex(dir, "/"); idx < 0 { | ||
| 64 | + break | ||
| 65 | + } else { | ||
| 66 | + dir = dir[:idx] | ||
| 67 | + } | ||
| 68 | + if dirs[dir] { | ||
| 69 | + break | ||
| 70 | + } | ||
| 71 | dirs[dir] = true | ||
| 72 | } | ||
| 73 | |||
| 74 | diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go | ||
| 75 | index 9a77c1aa62..278714bf49 100644 | ||
| 76 | --- a/src/archive/zip/reader_test.go | ||
| 77 | +++ b/src/archive/zip/reader_test.go | ||
| 78 | @@ -8,6 +8,7 @@ import ( | ||
| 79 | "bytes" | ||
| 80 | "encoding/binary" | ||
| 81 | "encoding/hex" | ||
| 82 | + "fmt" | ||
| 83 | "internal/obscuretestdata" | ||
| 84 | "io" | ||
| 85 | "io/fs" | ||
| 86 | @@ -1834,3 +1835,83 @@ func TestBaseOffsetPlusOverflow(t *testing.T) { | ||
| 87 | // as the section reader offset & size were < 0. | ||
| 88 | NewReader(bytes.NewReader(data), int64(len(data))+1875) | ||
| 89 | } | ||
| 90 | + | ||
| 91 | +func BenchmarkReaderOneDeepDir(b *testing.B) { | ||
| 92 | + var buf bytes.Buffer | ||
| 93 | + zw := NewWriter(&buf) | ||
| 94 | + | ||
| 95 | + for i := range 4000 { | ||
| 96 | + name := strings.Repeat("a/", i) + "data" | ||
| 97 | + zw.CreateHeader(&FileHeader{ | ||
| 98 | + Name: name, | ||
| 99 | + Method: Store, | ||
| 100 | + }) | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + if err := zw.Close(); err != nil { | ||
| 104 | + b.Fatal(err) | ||
| 105 | + } | ||
| 106 | + data := buf.Bytes() | ||
| 107 | + | ||
| 108 | + for b.Loop() { | ||
| 109 | + zr, err := NewReader(bytes.NewReader(data), int64(len(data))) | ||
| 110 | + if err != nil { | ||
| 111 | + b.Fatal(err) | ||
| 112 | + } | ||
| 113 | + zr.Open("does-not-exist") | ||
| 114 | + } | ||
| 115 | +} | ||
| 116 | + | ||
| 117 | +func BenchmarkReaderManyDeepDirs(b *testing.B) { | ||
| 118 | + var buf bytes.Buffer | ||
| 119 | + zw := NewWriter(&buf) | ||
| 120 | + | ||
| 121 | + for i := range 2850 { | ||
| 122 | + name := fmt.Sprintf("%x", i) | ||
| 123 | + name = strings.Repeat("/"+name, i+1)[1:] | ||
| 124 | + | ||
| 125 | + zw.CreateHeader(&FileHeader{ | ||
| 126 | + Name: name, | ||
| 127 | + Method: Store, | ||
| 128 | + }) | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + if err := zw.Close(); err != nil { | ||
| 132 | + b.Fatal(err) | ||
| 133 | + } | ||
| 134 | + data := buf.Bytes() | ||
| 135 | + | ||
| 136 | + for b.Loop() { | ||
| 137 | + zr, err := NewReader(bytes.NewReader(data), int64(len(data))) | ||
| 138 | + if err != nil { | ||
| 139 | + b.Fatal(err) | ||
| 140 | + } | ||
| 141 | + zr.Open("does-not-exist") | ||
| 142 | + } | ||
| 143 | +} | ||
| 144 | + | ||
| 145 | +func BenchmarkReaderManyShallowFiles(b *testing.B) { | ||
| 146 | + var buf bytes.Buffer | ||
| 147 | + zw := NewWriter(&buf) | ||
| 148 | + | ||
| 149 | + for i := range 310000 { | ||
| 150 | + name := fmt.Sprintf("%v", i) | ||
| 151 | + zw.CreateHeader(&FileHeader{ | ||
| 152 | + Name: name, | ||
| 153 | + Method: Store, | ||
| 154 | + }) | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + if err := zw.Close(); err != nil { | ||
| 158 | + b.Fatal(err) | ||
| 159 | + } | ||
| 160 | + data := buf.Bytes() | ||
| 161 | + | ||
| 162 | + for b.Loop() { | ||
| 163 | + zr, err := NewReader(bytes.NewReader(data), int64(len(data))) | ||
| 164 | + if err != nil { | ||
| 165 | + b.Fatal(err) | ||
| 166 | + } | ||
| 167 | + zr.Open("does-not-exist") | ||
| 168 | + } | ||
| 169 | +} | ||
| 170 | -- | ||
| 171 | 2.35.6 | ||
