Every CVE Search/ Get API key

CVE-2026-107386

amqp091-go: Pre-negotiation frame limit is not enforced to 4KB

6.3 MediumFix available

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
None
Integrity
None
Availability
Low

Exploit likelihood

0.49%Unchanged since Oct 9, 2026
90%50%10%1%

What each source reports

CVE List Score used 6.3

amqp091-go: Pre-negotiation frame limit is not enforced to 4KB

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
CVE-2026-107386
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
EUVDEUVD-2026-95161 6.3

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
EUVD-2026-95161
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-w6r9-248c-frg8 6.3

amqp091-go: Pre-negotiation frame limit is not enforced to 4KB

Summary

The frame-size mitigation released in amqp091-go v1.13.0 can be bypassed before connection.tune completes. A malicious or compromised AMQP peer can send only a seven-byte body-frame header containing a large attacker-controlled uint32 payload length. The client allocates a slice of that declared length before it verifies that the payload exists or rejects the frame for its invalid protocol state.

The bypass occurs because Connection.maxFrameSize starts at zero. The reader interprets zero as both “negotiated unlimited” and “not negotiated yet,” and skips the pre-allocation size check in either case. Open starts the reader goroutine before negotiation and does not store a limit until after it receives connection.tune.

This remains reachable even if the caller explicitly uses Config{FrameSize: frameMinSize}. A malicious broker can therefore cause excessive memory allocation, potentially terminating the Go client process through memory exhaustion, before authentication and connection setup complete.

Relationship to the existing advisory

GHSA-r9c8-gcjp-xfwh describes attacker-controlled, unbounded allocation by a malicious broker and identifies v1.13.0 as the patched version. Pull request 369 added a frame-size check before parser allocation, but the check is active only when the stored maximum is nonzero.

The v1.13.0 source still:

  1. starts the reader before protocol negotiation;
  2. skips the bound while maxFrameSize == 0;
  3. allocates the body using the peer-declared size; and
  4. stores the negotiated maximum only after connection.tune.

This appears to be an incomplete-fix or state-boundary bypass of the existing advisory rather than an unrelated allocation issue.

Affected source and root cause

The issue was reproduced at commit 9313fd9ea47bdb4e8f7f5db9bef94d5534d0bdde, dated 2026-07-30. The same relevant control flow is in the v1.13.0 tag.

The vulnerable sequence is:

  1. Open starts c.reader(conn) before calling c.open(config).
  2. The reader receives a pointer to the initially zero-valued c.maxFrameSize.
  3. ReadFrame decodes the peer-controlled uint32 size but rejects it only when max > 0.
  4. parseBodyFrame executes make([]byte, size) before io.ReadFull.
  5. maxFrameSize is first stored after processing connection.tune.

The source comments and regression tests explicitly combine “negotiated unlimited” with “not yet negotiated” as the same zero state. Those states need different security behavior.

Safe reproduction

This reproducer does not start RabbitMQ, contact any hosted service, send a large payload, or attempt to crash the process. It declares a 2 MiB body and observes the size of the slice passed to the transport's payload Read. Receiving a 2 MiB destination slice proves that the allocation occurred; the test then releases the blocked read and exits.

  1. Check out v1.13.0.
  2. Save the following as pre_negotiation_frame_limit_test.go in the repository root.
  3. Run go test -run '^TestPreNegotiationFrameLimitBypass$' -count=1 -v ..
package amqp091

import (
	"encoding/binary"
	"io"
	"sync"
	"testing"
	"time"
)

const declaredBodySize = 2 << 20

type stagedFrameConn…
Record
GHSA-w6r9-248c-frg8
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
NVD 6.3

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
CVE-2026-107386
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Weakness
CWE-770
Updated
2026-11-02
OSV 6.3

amqp091-go: Pre-negotiation frame limit is not enforced to 4KB

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
CVE-2026-107386
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
OSVDEBIAN-CVE-2026-107386 6.3

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
DEBIAN-CVE-2026-107386
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Updated
2026-11-02
Show 4 moreShow less
OSVGHSA-w6r9-248c-frg8 6.3

amqp091-go: Pre-negotiation frame limit is not enforced to 4KB

Summary

The frame-size mitigation released in amqp091-go v1.13.0 can be bypassed before connection.tune completes. A malicious or compromised AMQP peer can send only a seven-byte body-frame header containing a large attacker-controlled uint32 payload length. The client allocates a slice of that declared length before it verifies that the payload exists or rejects the frame for its invalid protocol state.

The bypass occurs because Connection.maxFrameSize starts at zero. The reader interprets zero as both “negotiated unlimited” and “not negotiated yet,” and skips the pre-allocation size check in either case. Open starts the reader goroutine before negotiation and does not store a limit until after it receives connection.tune.

This remains reachable even if the caller explicitly uses Config{FrameSize: frameMinSize}. A malicious broker can therefore cause excessive memory allocation, potentially terminating the Go client process through memory exhaustion, before authentication and connection setup complete.

Relationship to the existing advisory

GHSA-r9c8-gcjp-xfwh describes attacker-controlled, unbounded allocation by a malicious broker and identifies v1.13.0 as the patched version. Pull request 369 added a frame-size check before parser allocation, but the check is active only when the stored maximum is nonzero.

The v1.13.0 source still:

  1. starts the reader before protocol negotiation;
  2. skips the bound while maxFrameSize == 0;
  3. allocates the body using the peer-declared size; and
  4. stores the negotiated maximum only after connection.tune.

This appears to be an incomplete-fix or state-boundary bypass of the existing advisory rather than an unrelated allocation issue.

Affected source and root cause

The issue was reproduced at commit 9313fd9ea47bdb4e8f7f5db9bef94d5534d0bdde, dated 2026-07-30. The same relevant control flow is in the v1.13.0 tag.

The vulnerable sequence is:

  1. Open starts c.reader(conn) before calling c.open(config).
  2. The reader receives a pointer to the initially zero-valued c.maxFrameSize.
  3. ReadFrame decodes the peer-controlled uint32 size but rejects it only when max > 0.
  4. parseBodyFrame executes make([]byte, size) before io.ReadFull.
  5. maxFrameSize is first stored after processing connection.tune.

The source comments and regression tests explicitly combine “negotiated unlimited” with “not yet negotiated” as the same zero state. Those states need different security behavior.

Safe reproduction

This reproducer does not start RabbitMQ, contact any hosted service, send a large payload, or attempt to crash the process. It declares a 2 MiB body and observes the size of the slice passed to the transport's payload Read. Receiving a 2 MiB destination slice proves that the allocation occurred; the test then releases the blocked read and exits.

  1. Check out v1.13.0.
  2. Save the following as pre_negotiation_frame_limit_test.go in the repository root.
  3. Run go test -run '^TestPreNegotiationFrameLimitBypass$' -count=1 -v ..
package amqp091

import (
	"encoding/binary"
	"io"
	"sync"
	"testing"
	"time"
)

const declaredBodySize = 2 << 20

type stagedFrameConn…
Record
GHSA-w6r9-248c-frg8
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
OSVRHSA-2026:80217 7.5

Red Hat Security Advisory: Red Hat Hardened Images RPMs Security Update

Record
RHSA-2026:80217
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVUBUNTU-CVE-2026-107386 6.3

amqp091-go is a Go AMQP 0.9.1 client. From 1.13.0 until 1.14.0, the frame-size mitigation from the prior allocation advisory can be bypassed before connection.tune completes because Connection.maxFrameSize uses zero for both the not-yet-negotiated and negotiated-unlimited states. A malicious or compromised AMQP peer can send a short body-frame header with a large declared payload length, causing ReadFrame and the body-frame parser to allocate attacker-selected memory before the payload is received or the frame's protocol state is rejected. The condition is reachable through public Open even when Config.FrameSize is set to the protocol minimum and can cause severe memory pressure, out-of-memory termination, or loss of the client process before authentication completes. This issue is fixed in version 1.14.0.

Record
UBUNTU-CVE-2026-107386
CVSS 4.0
6.3 MediumCVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Updated
2026-11-02
OSVGO-2026-6700 No score

Pre-negotiation frame limit is not enforced to 4KB in github.com/rabbitmq/amqp091-go

Pre-negotiation frame limit is not enforced to 4KB in github.com/rabbitmq/amqp091-go

Record
GO-2026-6700
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
github.com/rabbitmq/amqp091-go
Go
before 1.14.0
1.14.0
golang-github-rabbitmq-amqp091-go
Debian:12
All versions, plus listed versions
1.10.0-11.11.0-11.12.0-11.14.0-11.15.0-1
Show 4 moreShow less
1.5.0-21.8.1-11.8.1-21.9.0-1
None known
golang-github-rabbitmq-amqp091-go
Debian:13
All versions, plus listed versions
1.10.0-11.11.0-11.12.0-11.14.0-11.15.0-1
None known
golang-github-rabbitmq-amqp091-go
Debian:14
before 1.14.0-1, plus listed versions
1.10.0-11.11.0-11.12.0-1
1.14.0-1
opentelemetry-collector-contrib
Red Hat:hummingbird:1
From an advisory covering 2 CVEs
before 0:0.162.0-0.2.hum1
0:0.162.0-0.2.hum1
golang-github-rabbitmq-amqp091-go
Ubuntu:24.04:LTS
All versions, plus listed versions
1.8.1-21.9.0-1
None known
golang-github-rabbitmq-amqp091-go
Ubuntu:26.10
All versions, plus listed versions
1.10.0-11.11.0-11.12.0-1
None known
golang-github-rabbitmq-amqp091-go
Ubuntu:26.04:LTS
All versions, plus listed versions
1.10.0-1
None known

History

History
RecordedChangedSources
affected, facts
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-107386 is a medium vulnerability (CVSS 6.3) in Rabbitmq Amqp091-go, published October 8, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.49%, the 42nd percentile. Fixed in github.com/rabbitmq/amqp091-go 1.14.0.

References

Show 19 moreShow less
This page doesn't list everything

Left out here: the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open