GHSA-qhmf-xw27-6rqr
GHSA-qhmf-xw27-6rqr is a CWE-470 vulnerability in MessagePack. O3 Security confirms whether GHSA-qhmf-xw27-6rqr is actually reachable in your code before you act, and blocks exploitation at runtime until you patch.
MessagePack-CSharp: Typeless deserialization type restrictions do not recurse into arrays or generic arguments
Real-World Exposure
MessagePack.NETMessagePackReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects NuGet packages — download data is not available via public APIs for these ecosystems.
Description
Summary
MessagePack-CSharp's typeless deserialization includes MessagePackSerializerOptions.ThrowIfDeserializingTypeIsDisallowed(Type) as a safety check for dangerous types. The default implementation checks the outer type name, but it does not recursively inspect array element types or generic type arguments.
As a result, a type that would be blocked directly can be wrapped inside an array or constructed generic type and pass the outer type check. The formatter machinery can then materialize formatters for the inner blocked type.
Impact
Applications are affected when they deserialize untrusted payloads using typeless serialization features such as MessagePackSerializer.Typeless, TypelessObjectResolver, or related typeless resolver options.
Typeless deserialization is already a high-risk feature for untrusted data, but the presence of a disallowed-type hook creates an expectation that blocked types remain blocked. This issue weakens that mitigation because the check is not applied structurally to nested type components. An attacker who can supply typeless ext-100 payloads may bypass exact outer-type blocklist checks by naming wrapper types such as arrays or generic containers.
The consequence depends on which type is reached and what the application allows typeless deserialization to instantiate. The original findings describe bypasses involving blocked or user-blocklisted gadget types.
Affected components
- Package:
MessagePack - Feature: typeless deserialization
- APIs:
MessagePackSerializerOptions.ThrowIfDeserializingTypeIsDisallowed,TypelessFormatter - Finding IDs:
MESSAGEPACKCSHARP-030, duplicate/open variantMESSAGEPACKCSHARP-OPEN-007
Patches
Fixes are available via versions 2.5.301 and 3.1.7.
Upgrade guidance:
- Upgrade
MessagePackto the patched version for your release line. - Upgrade companion MessagePack packages in the same dependency graph to the coordinated patched versions.
The fix should apply type-disallow checks recursively to array element types, pointer/byref element types where applicable, nullable underlying types, and constructed generic type arguments. Formatter paths that materialize types supplied by the wire should not instantiate inner types that fail the configured policy.
Workarounds
Patching is recommended.
Avoid typeless deserialization for untrusted data. If typeless support is unavoidable, configure an explicit allowlist that rejects any type not approved by the application and ensure the allowlist recursively validates array elements and generic arguments. Do not rely on exact outer-type blocklists as a complete security boundary.
Resources
MESSAGEPACKCSHARP-030: typeless disallowed-type check is not recursiveMESSAGEPACKCSHARP-OPEN-007: duplicate/open finding for typeless blocklist gaps- CWE-502: Deserialization of Untrusted Data
- CWE-470: Use of Externally-Controlled Input to Select Classes or Code
CVE split rationale
This vulnerability is independently fixable in typeless type-policy enforcement. It is separate from MVC default options, collection allocation, LZ4 decoding, and recursion-depth issues.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| .NETNuGet | MessagePack | all versions | 2.5.301 |
| .NETNuGet | MessagePack | ≥ 3.0&&< 3.1.7 | 3.1.7 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for MessagePack. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
Fix
Update MessagePack to 2.5.301 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-qhmf-xw27-6rqr is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether GHSA-qhmf-xw27-6rqr is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to GHSA-qhmf-xw27-6rqr. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is GHSA-qhmf-xw27-6rqr in your dependencies?
O3 detects GHSA-qhmf-xw27-6rqr across NuGet dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.