CVE-2026-107386
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.
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
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 Medium
CVSS: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 Medium
CVSS: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:
- starts the reader before protocol negotiation;
- skips the bound while
maxFrameSize == 0; - allocates the body using the peer-declared size; and
- 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:
Openstartsc.reader(conn)before callingc.open(config).- The reader receives a pointer to the initially zero-valued
c.maxFrameSize. ReadFramedecodes the peer-controlleduint32size but rejects it only whenmax > 0.parseBodyFrameexecutesmake([]byte, size)beforeio.ReadFull.maxFrameSizeis first stored after processingconnection.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.
- Check out v1.13.0.
- Save the following as
pre_negotiation_frame_limit_test.goin the repository root. - 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 Medium
CVSS: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 Medium
CVSS: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 Medium
CVSS: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 Medium
CVSS: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:
- starts the reader before protocol negotiation;
- skips the bound while
maxFrameSize == 0; - allocates the body using the peer-declared size; and
- 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:
Openstartsc.reader(conn)before callingc.open(config).- The reader receives a pointer to the initially zero-valued
c.maxFrameSize. ReadFramedecodes the peer-controlleduint32size but rejects it only whenmax > 0.parseBodyFrameexecutesmake([]byte, size)beforeio.ReadFull.maxFrameSizeis first stored after processingconnection.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.
- Check out v1.13.0.
- Save the following as
pre_negotiation_frame_limit_test.goin the repository root. - 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 Medium
CVSS: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 High
CVSS: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 Medium
CVSS: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
| Package | Affected | Fixed |
|---|---|---|
github.com/rabbitmq/amqp091-goGo |
before 1.14.0 | 1.14.0 |
golang-github-rabbitmq-amqp091-goDebian: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 less1.5.0-21.8.1-11.8.1-21.9.0-1 |
None known |
golang-github-rabbitmq-amqp091-goDebian: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-goDebian: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-contribRed 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-goUbuntu:24.04:LTS |
All versions, plus listed versions 1.8.1-21.9.0-1 |
None known |
golang-github-rabbitmq-amqp091-goUbuntu:26.10 |
All versions, plus listed versions 1.10.0-11.11.0-11.12.0-1 |
None known |
golang-github-rabbitmq-amqp091-goUbuntu:26.04:LTS |
All versions, plus listed versions 1.10.0-1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| first indexed | CVE 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
github.com/rabbitmq/amqp091-go/security/advisories/GHSA-w6r9-248c-frg8
github.com/rabbitmq/amqp091-go/pull/377
github.com/rabbitmq/amqp091-go/commit/6723e8cff8710f0a6bf5fb4af375e285052535b3
github.com/rabbitmq/amqp091-go/releases/tag/v1.14.0
github.com/advisories/GHSA-w6r9-248c-frg8
github.com/CVEProject/cvelistV5/tree/main/cves/2026/107xxx/CVE-2026-107386.json
Show 19 moreShow less
nvd.nist.gov/vuln/detail/CVE-2026-107386
security-tracker.debian.org/tracker/CVE-2026-107386
github.com/rabbitmq/amqp091-go
access.redhat.com/errata/RHSA-2026:80217
access.redhat.com/security/cve/CVE-2026-107386
access.redhat.com/security/cve/CVE-2026-79921
access.redhat.com/security/updates/classification
images.redhat.com
security.access.redhat.com/data/csaf/v2/advisories/2026/rhsa-2026_80217.json
bugzilla.redhat.com/show_bug.cgi?id=2524713
cve.org/CVERecord?id=CVE-2026-79921
nvd.nist.gov/vuln/detail/CVE-2026-79921
github.com/rabbitmq/amqp091-go/commit/6beb7b51f59e46ddcf8066ad498dad32491d3be0
github.com/rabbitmq/amqp091-go/pull/353
github.com/rabbitmq/amqp091-go/releases/tag/v1.13.0
github.com/rabbitmq/amqp091-go/security/advisories/GHSA-6c5v-hqjr-5xxp
bugzilla.redhat.com/show_bug.cgi?id=2548205
cve.org/CVERecord?id=CVE-2026-107386
ubuntu.com/security/CVE-2026-107386
Left out here: the rest of 2 source descriptions. The JSON record has them.