diff --git a/abseil-cpp.spec b/abseil-cpp.spec index 5488806b6b64df999049e0b9f2a5389c77e36ddd..058bea9093e189de676914cfa765cb4da6d2841b 100644 --- a/abseil-cpp.spec +++ b/abseil-cpp.spec @@ -2,13 +2,15 @@ %undefine __cmake_in_source_build Name: abseil-cpp Version: 20210324.2 -Release: 1 +Release: 2 Summary: C++ Common Libraries License: ASL 2.0 URL: https://abseil.io Source0: https://github.com/abseil/abseil-cpp/archive/%{version}/%{name}-%{version}.tar.gz +Patch0: backport-CVE-2025-0838.patch + BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: make @@ -57,6 +59,12 @@ Development headers for %{name} %{_libdir}/pkgconfig/*.pc %changelog +* Mon Feb 24 2025 xinghe - 20210324.2-2 +- Type:cves +- ID:CVE-2025-0838 +- SUG:NA +- DESC:fix CVE-2025-0838 + * Fri Oct 15 2021 licihua - 20210324.2-1 - update to 20210324.2 diff --git a/backport-CVE-2025-0838.patch b/backport-CVE-2025-0838.patch new file mode 100644 index 0000000000000000000000000000000000000000..221dc5c0006232b65436271675c990a61e719eba --- /dev/null +++ b/backport-CVE-2025-0838.patch @@ -0,0 +1,108 @@ +From 3c4b18dc14949d1c6dac8bae2e459c71b21e3416 Mon Sep 17 00:00:00 2001 +From: Derek Mauro +Date: Wed, 22 Jan 2025 15:58:56 -0500 +Subject: [PATCH] Fix potential integer overflow in hash container + create/resize + +The sized constructors, reserve(), and rehash() methods of +absl::{flat,node}_hash_{set,map} did not impose an upper bound on +their size argument. As a result, it was possible for a caller to pass +a very large size that would cause an integer overflow when computing +the size of the container's backing store. Subsequent accesses to the +container might then access out-of-bounds memory. + +The fix is in two parts: + +1) Update max_size() to return the maximum number of items that can be +stored in the container + +2) Validate the size arguments to the constructors, reserve(), and +rehash() methods, and abort the program when the argument is invalid + +We've looked at uses of these containers in Google codebases like +Chrome, and determined this vulnerability is likely to be difficult to +exploit. This is primarily because container sizes are rarely +attacker-controlled. + +The bug was discovered by Dmitry Vyukov . + +Conflict: remove absl/base/config.h and context adapt +Reference: https://github.com/abseil/abseil-cpp/commit/3c4b18dc14949d1c6dac8bae2e459c71b21e3416 +--- + absl/container/internal/raw_hash_set.h | 15 ++++++++++++++- + absl/container/internal/raw_hash_set_test.cc | 8 ++++++++ + 2 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/absl/container/internal/raw_hash_set.h b/absl/container/internal/raw_hash_set.h +index 8615de8..7e74de6 100644 +--- a/absl/container/internal/raw_hash_set.h ++++ b/absl/container/internal/raw_hash_set.h +@@ -468,6 +468,12 @@ inline size_t NormalizeCapacity(size_t n) { + return n ? ~size_t{} >> countl_zero(n) : 1; + } + ++template ++size_t MaxValidCapacity() { ++ return NormalizeCapacity((std::numeric_limits::max)() / 4 / ++ kSlotSize); ++} ++ + // General notes on capacity/growth methods below: + // - We use 7/8th as maximum load factor. For 16-wide groups, that gives an + // average of two empty slots per group. +@@ -795,6 +801,8 @@ class raw_hash_set { + : ctrl_(EmptyGroup()), + settings_(0, HashtablezInfoHandle(), hash, eq, alloc) { + if (bucket_count) { ++ ABSL_RAW_CHECK(bucket_count <= MaxValidCapacity(), ++ "Hash table size overflow"); + capacity_ = NormalizeCapacity(bucket_count); + initialize_slots(); + } +@@ -986,7 +994,9 @@ class raw_hash_set { + bool empty() const { return !size(); } + size_t size() const { return size_; } + size_t capacity() const { return capacity_; } +- size_t max_size() const { return (std::numeric_limits::max)(); } ++ size_t max_size() const { ++ return CapacityToGrowth(MaxValidCapacity()); ++ } + + ABSL_ATTRIBUTE_REINITIALIZES void clear() { + // Iterating over this container is O(bucket_count()). When bucket_count() +@@ -1318,11 +1328,14 @@ class raw_hash_set { + auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size())); + // n == 0 unconditionally rehashes as per the standard. + if (n == 0 || m > capacity_) { ++ ABSL_RAW_CHECK(m <= MaxValidCapacity(), ++ "Hash table size overflow"); + resize(m); + } + } + + void reserve(size_t n) { ++ ABSL_RAW_CHECK(n <= max_size(), "Hash table size overflow"); + size_t m = GrowthToLowerboundCapacity(n); + if (m > capacity_) { + resize(NormalizeCapacity(m)); +diff --git a/absl/container/internal/raw_hash_set_test.cc b/absl/container/internal/raw_hash_set_test.cc +index 7dac65a..27efa7a 100644 +--- a/absl/container/internal/raw_hash_set_test.cc ++++ b/absl/container/internal/raw_hash_set_test.cc +@@ -1978,6 +1978,14 @@ TEST(Sanitizer, PoisoningOnErase) { + } + #endif // ABSL_HAVE_ADDRESS_SANITIZER + ++TEST(Table, MaxSizeOverflow) { ++ size_t overflow = (std::numeric_limits::max)(); ++ EXPECT_DEATH_IF_SUPPORTED(IntTable t(overflow), "Hash table size overflow"); ++ IntTable t; ++ EXPECT_DEATH_IF_SUPPORTED(t.reserve(overflow), "Hash table size overflow"); ++ EXPECT_DEATH_IF_SUPPORTED(t.rehash(overflow), "Hash table size overflow"); ++} ++ + } // namespace + } // namespace container_internal + ABSL_NAMESPACE_END +-- +2.43.0 \ No newline at end of file