CVE-2026-61695
Wire Swift runtime: negative LENGTH_DELIMITED length in skipGroup() crashes any protobuf-decoding service
CVE-2026-61695 is a high vulnerability (CVSS 7.5) in Square Wire, published September 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.69%, the 52nd percentile. Fixed in github.com/square/wire 6.4.1.
Wire provides gRPC and protocol buffers for Android, Kotlin, Swift, and Java. Prior to 6.4.1 and 7.0.0-alpha04, Wire's Swift runtime ProtoReader.skipGroup(expectedEndTag:unknownFieldsWriter:) accepts a negative length for a LENGTH_DELIMITED field inside an unknown START_GROUP field. ProtoReader.readData() forwards the negative count to ReadBuffer.readData(count:), whose upper-bound-only check permits the value to reach Foundation Data(bytes:count:) and trigger an unrecoverable process trap instead of a catchable ProtoDecoder.Error. Any Swift process decoding untrusted protobuf bytes can be crashed without authentication, user interaction, or knowledge of the target schema. This issue is fixed in versions 6.4.1 and 7.0.0-alpha04.
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
- High
Exploit likelihood
What each source reports
CVE List Score used
7.5
Wire Swift runtime: negative LENGTH_DELIMITED length in skipGroup() crashes any protobuf-decoding service
Wire provides gRPC and protocol buffers for Android, Kotlin, Swift, and Java. Prior to 6.4.1 and 7.0.0-alpha04, Wire's Swift runtime ProtoReader.skipGroup(expectedEndTag:unknownFieldsWriter:) accepts a negative length for a LENGTH_DELIMITED field inside an unknown START_GROUP field. ProtoReader.readData() forwards the negative count to ReadBuffer.readData(count:), whose upper-bound-only check permits the value to reach Foundation Data(bytes:count:) and trigger an unrecoverable process trap instead of a catchable ProtoDecoder.Error. Any Swift process decoding untrusted protobuf bytes can be crashed without authentication, user interaction, or knowledge of the target schema. This issue is fixed in versions 6.4.1 and 7.0.0-alpha04.
- Record
CVE-2026-61695- 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 - Weakness
- CWE-129
- Updated
- 2026-11-02
EUVDEUVD-2026-85559
7.5
Wire provides gRPC and protocol buffers for Android, Kotlin, Swift, and Java. Prior to 6.4.1 and 7.0.0-alpha04, Wire's Swift runtime ProtoReader.skipGroup(expectedEndTag:unknownFieldsWriter:) accepts a negative length for a LENGTH_DELIMITED field inside an unknown START_GROUP field. ProtoReader.readData() forwards the negative count to ReadBuffer.readData(count:), whose upper-bound-only check permits the value to reach Foundation Data(bytes:count:) and trigger an unrecoverable process trap instead of a catchable ProtoDecoder.Error. Any Swift process decoding untrusted protobuf bytes can be crashed without authentication, user interaction, or knowledge of the target schema. This issue is fixed in versions 6.4.1 and 7.0.0-alpha04.
- Record
EUVD-2026-85559- 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
GitHub AdvisoriesGHSA-86wm-r4c5-2rc9
7.5
Wire Swift runtime: negative LENGTH_DELIMITED length in skipGroup() crashes any protobuf-decoding service
Summary
Wire's Swift runtime (Wire SPM/CocoaPods product, implemented by
wire-runtime-swift) did not reject a negative LENGTH_DELIMITED field length
while skipping an unknown protobuf group. A crafted 10-byte protobuf payload
could cause ProtoReader.skipGroup() to read a length-delimited field whose
varint decodes to a negative Int32. That negative value was then passed to
ReadBuffer.readData(count:).
ReadBuffer checked only that the requested read did not go past the end of
the buffer. It did not reject negative counts. As a result, a negative count
could pass the bounds check and reach Foundation's Data(bytes:count:), which
traps and aborts the process (Signal 5 / SIGTRAP) instead of throwing Wire's
documented ProtoDecoder.Error.
This is the Swift sibling of the Kotlin/JVM negative-length-in-skipGroup()
issue fixed in com.squareup.wire:wire-runtime 6.3.0
(CVE-2026-45799, GHSA-7xpr-hc2w-34m9). That earlier fix added a
length < 0 rejection to the Kotlin readers. The functionally similar Swift
ProtoReader.skipGroup() path was not covered by that fix and remained
vulnerable in released Swift runtime versions through 6.4.0, and in Wire 7
alpha releases through 7.0.0-alpha03.
The issue is fixed for the supported 6.x release line in Wire 6.4.1.
skipGroup() runs for any unknown field with wire type 3 (START_GROUP), so
no schema knowledge is required. A service decoding any message type with
ProtoDecoder.decode(_:from:) over untrusted bytes can be reached by sending an
unknown group field.
Impact
Denial of service.
A single 10-byte attacker-controlled protobuf payload can abort the process
with an unrecoverable runtime trap. Callers following Wire's documented Swift
API generally expect ProtoDecoder.decode(_:from:) to throw catchable decoding
errors such as ProtoDecoder.Error. They cannot catch a SIGTRAP from
Foundation's Data(bytes:count:).
Any Swift process that decodes untrusted protobuf data with Wire's Swift runtime may be affected. Examples include iOS, macOS, or server-side Swift applications that accept protobuf request bodies, websocket frames, stored messages, queue payloads, files, or any other attacker-controlled serialized protobuf bytes.
The vulnerability requires:
- The application decodes untrusted protobuf bytes with Wire's Swift runtime.
- The attacker can provide a protobuf payload containing an unknown
START_GROUPfield. - That group contains a
LENGTH_DELIMITEDfield whose encoded length decodes to a negative signed 32-bit value.
The attacker does not need:
- Authentication.
- User interaction.
- Knowledge of the target message schema.
- A valid known field number in the target schema.
Affected Products
Swift Package Manager / CocoaPods Wire
Affected versions:
- All released Swift runtime versions through
6.4.0. - Wire 7 alpha releases through
7.0.0-alpha03.
Patched versions:
6.4.1for the supported 6.x release line.7.0.0-alpha04for the 7.x alpha line (the first 7.x release containing PR #3616).
Recommended action:
- Upgrade to Wire
6.4.1or later on the supported stable line. - If using a Wire 7 alpha release, upgrade to
7.0.0-alpha04or a later 7.x release containing PR #3616.
Vulnerable Code
The vulnerable code was in
wire-runtime-swift/src/main/swift/ProtoCodable/ProtoReader.swift,
skipGroup(expectedEndTag:unknownFieldsWriter:):
case .lengthDelimited:
let length = try Int32(truncatingIfNeeded: buffer.readVarint()) // can be negative, e.g. -128
state = .lengthDelimited(length: Int(length))
let data = try readData() // no length >= 0 check
try unknownFieldsWriter.encode(tag: tag, value: data)
ProtoReader.readData() then forwarded the stored negative length to the
buffer:
func readData() throws -> Data {
guard case let .lengthDelimited(length) = state else {
fatalError("Decoding field as…
- Record
GHSA-86wm-r4c5-2rc9- 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 - Weakness
- CWE-129
- Updated
- 2026-11-02
NVD
7.5
Wire provides gRPC and protocol buffers for Android, Kotlin, Swift, and Java. Prior to 6.4.1 and 7.0.0-alpha04, Wire's Swift runtime ProtoReader.skipGroup(expectedEndTag:unknownFieldsWriter:) accepts a negative length for a LENGTH_DELIMITED field inside an unknown START_GROUP field. ProtoReader.readData() forwards the negative count to ReadBuffer.readData(count:), whose upper-bound-only check permits the value to reach Foundation Data(bytes:count:) and trigger an unrecoverable process trap instead of a catchable ProtoDecoder.Error. Any Swift process decoding untrusted protobuf bytes can be crashed without authentication, user interaction, or knowledge of the target schema. This issue is fixed in versions 6.4.1 and 7.0.0-alpha04.
- Record
CVE-2026-61695- 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 - Weakness
- CWE-129
- Updated
- 2026-11-02
OSV
7.5
Wire Swift runtime: negative LENGTH_DELIMITED length in skipGroup() crashes any protobuf-decoding service
Wire provides gRPC and protocol buffers for Android, Kotlin, Swift, and Java. Prior to 6.4.1 and 7.0.0-alpha04, Wire's Swift runtime ProtoReader.skipGroup(expectedEndTag:unknownFieldsWriter:) accepts a negative length for a LENGTH_DELIMITED field inside an unknown START_GROUP field. ProtoReader.readData() forwards the negative count to ReadBuffer.readData(count:), whose upper-bound-only check permits the value to reach Foundation Data(bytes:count:) and trigger an unrecoverable process trap instead of a catchable ProtoDecoder.Error. Any Swift process decoding untrusted protobuf bytes can be crashed without authentication, user interaction, or knowledge of the target schema. This issue is fixed in versions 6.4.1 and 7.0.0-alpha04.
- Record
CVE-2026-61695- 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 - Weakness
- CWE-129
- Updated
- 2026-11-02
OSVGHSA-86wm-r4c5-2rc9
7.5
Wire Swift runtime: negative LENGTH_DELIMITED length in skipGroup() crashes any protobuf-decoding service
Summary
Wire's Swift runtime (Wire SPM/CocoaPods product, implemented by
wire-runtime-swift) did not reject a negative LENGTH_DELIMITED field length
while skipping an unknown protobuf group. A crafted 10-byte protobuf payload
could cause ProtoReader.skipGroup() to read a length-delimited field whose
varint decodes to a negative Int32. That negative value was then passed to
ReadBuffer.readData(count:).
ReadBuffer checked only that the requested read did not go past the end of
the buffer. It did not reject negative counts. As a result, a negative count
could pass the bounds check and reach Foundation's Data(bytes:count:), which
traps and aborts the process (Signal 5 / SIGTRAP) instead of throwing Wire's
documented ProtoDecoder.Error.
This is the Swift sibling of the Kotlin/JVM negative-length-in-skipGroup()
issue fixed in com.squareup.wire:wire-runtime 6.3.0
(CVE-2026-45799, GHSA-7xpr-hc2w-34m9). That earlier fix added a
length < 0 rejection to the Kotlin readers. The functionally similar Swift
ProtoReader.skipGroup() path was not covered by that fix and remained
vulnerable in released Swift runtime versions through 6.4.0, and in Wire 7
alpha releases through 7.0.0-alpha03.
The issue is fixed for the supported 6.x release line in Wire 6.4.1.
skipGroup() runs for any unknown field with wire type 3 (START_GROUP), so
no schema knowledge is required. A service decoding any message type with
ProtoDecoder.decode(_:from:) over untrusted bytes can be reached by sending an
unknown group field.
Impact
Denial of service.
A single 10-byte attacker-controlled protobuf payload can abort the process
with an unrecoverable runtime trap. Callers following Wire's documented Swift
API generally expect ProtoDecoder.decode(_:from:) to throw catchable decoding
errors such as ProtoDecoder.Error. They cannot catch a SIGTRAP from
Foundation's Data(bytes:count:).
Any Swift process that decodes untrusted protobuf data with Wire's Swift runtime may be affected. Examples include iOS, macOS, or server-side Swift applications that accept protobuf request bodies, websocket frames, stored messages, queue payloads, files, or any other attacker-controlled serialized protobuf bytes.
The vulnerability requires:
- The application decodes untrusted protobuf bytes with Wire's Swift runtime.
- The attacker can provide a protobuf payload containing an unknown
START_GROUPfield. - That group contains a
LENGTH_DELIMITEDfield whose encoded length decodes to a negative signed 32-bit value.
The attacker does not need:
- Authentication.
- User interaction.
- Knowledge of the target message schema.
- A valid known field number in the target schema.
Affected Products
Swift Package Manager / CocoaPods Wire
Affected versions:
- All released Swift runtime versions through
6.4.0. - Wire 7 alpha releases through
7.0.0-alpha03.
Patched versions:
6.4.1for the supported 6.x release line.7.0.0-alpha04for the 7.x alpha line (the first 7.x release containing PR #3616).
Recommended action:
- Upgrade to Wire
6.4.1or later on the supported stable line. - If using a Wire 7 alpha release, upgrade to
7.0.0-alpha04or a later 7.x release containing PR #3616.
Vulnerable Code
The vulnerable code was in
wire-runtime-swift/src/main/swift/ProtoCodable/ProtoReader.swift,
skipGroup(expectedEndTag:unknownFieldsWriter:):
case .lengthDelimited:
let length = try Int32(truncatingIfNeeded: buffer.readVarint()) // can be negative, e.g. -128
state = .lengthDelimited(length: Int(length))
let data = try readData() // no length >= 0 check
try unknownFieldsWriter.encode(tag: tag, value: data)
ProtoReader.readData() then forwarded the stored negative length to the
buffer:
func readData() throws -> Data {
guard case let .lengthDelimited(length) = state else {
fatalError("Decoding field as…
- Record
GHSA-86wm-r4c5-2rc9- 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 - Weakness
- CWE-129
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
github.com/square/wireSwiftURL |
through 6.4.0 | 6.4.1 |
github.com/square/wireSwiftURL |
before 6.4.1 | 6.4.1 |
History
| When | Changed | Sources |
|---|---|---|
| 2026-11-02 | created | CVE List, EUVD, GitHub Advisories, NVD, OSV |
References
github.com/square/wire/security/advisories/GHSA-86wm-r4c5-2rc9
github.com/square/wire/pull/3616
github.com/square/wire/commit/24043b6b3a5e5974a978f2745b76d50b31407c1c
github.com/square/wire/commit/81ff7f24a6795d9a8be2e03f272b2d979a5d2c7e
github.com/square/wire/releases/tag/6.4.1
github.com/square/wire/releases/tag/7.0.0-alpha04
Left out here: the rest of 2 source descriptions. The JSON record has them.