Feb 14, 2026·6 min read·13 visits
A critical 9.8/10 RCE in the Windows MSMQ service allows unauthenticated attackers to execute arbitrary code as the Network Service account via TCP port 1801. It affects almost all versions of Windows. Patch immediately or disable the service.
Microsoft Message Queuing (MSMQ) is a relic of a bygone era, a middleware service that allows applications to talk to each other when they aren't online at the same time. It's the kind of legacy debt that sysadmins forget exists until it sets the server on fire. Enter CVE-2023-21554, dubbed 'QueueJumper'. It is a critical, unauthenticated Remote Code Execution (RCE) vulnerability that allows an attacker to take over a Windows Server simply by sending a malformed packet to TCP port 1801. No credentials, no user interaction, just pure, unadulterated memory corruption.
Microsoft Message Queuing (MSMQ) is like that one box of cables you keep in your closet 'just in case'. You don't know why you have it, you haven't touched it in a decade, but it's there, taking up space and gathering dust. In the Windows world, MSMQ is an optional component used for asynchronous communication. It was big in the early 2000s for gluing together enterprise applications.
Here's the kicker: even though it's 'optional', it often gets enabled silently. Install Microsoft Exchange? You might get MSMQ. Install certain SQL Server components? MSMQ tags along. Once enabled, it opens TCP port 1801 and listens for incoming connections from anyone. It doesn't ask for a password. It doesn't check if you're a friend. It just blindly accepts binary blobs and tries to parse them.
This vulnerability, discovered by Check Point Research, is a classic case of 'old code meets modern scrutiny'. The service runs as mqsvc.exe, usually with Network Service privileges. While that's not SYSTEM, it's more than enough to pivot, escalate, and turn a domain controller into a cryptocurrency miner.
The vulnerability lives inside mqqm.dll, the library responsible for parsing the proprietary MSMQ binary protocol. If you've ever looked at protocol parsers written in C/C++ from the 90s, you know exactly where this is going. The protocol consists of a Base Header followed by a variable number of section headers (User Header, Property Header, Security Header, etc.).
Specifically, the flaw is an Out-of-Bounds Write (CWE-787). The parser reads a size field from the incoming packet header to determine how much memory to allocate—or worse, assumes a fixed buffer size—and then copies data from the packet into that buffer based on a different length field provided by the attacker.
It is the security equivalent of a bank teller asking, 'How much money are you giving me?' and you say 'Five dollars', but then you hand them a dump truck full of pennies and they try to stuff it all into a single envelope. The envelope rips, the pennies spill everywhere (memory corruption), and in the chaos, you slip a note to the manager saying 'Give me the vault key' (Remote Code Execution).
Let's look at the logic failure. The MSMQ protocol uses a pointer-rich structure for its headers. When mqsvc.exe receives a packet, it calls CQmPacket::CQmPacket to initialize the packet object. The vulnerability is triggered when parsing specific variable-length headers, such as the Extension Header.
In a simplified view, the vulnerable pseudo-code looks something like this:
// Simplified logic of the vulnerability
void ParseHeader(byte* packetData) {
// Attacker controls headerSize
DWORD headerSize = *(DWORD*)(packetData + OFFSET_SIZE);
// Allocation might be small or fixed
byte* buffer = new byte[FIXED_BUFFER_SIZE];
// ... checks are missing or insufficient ...
// CRITICAL FLAW: Writing beyond the bounds of 'buffer'
// The code trusts the packet data to not exceed the buffer
// without strictly validating headerSize against the allocated capacity.
memcpy(buffer, packetData + OFFSET_DATA, headerSize);
}The patch provided by Microsoft in April 2023 (KB5025229) introduces strict bounds checking. They added validation routines that ensure the NextSection pointer (which points to the next header in the stream) does not point outside the boundaries of the received packet data. If the offset calculations point into unmapped memory or overlap in invalid ways, the parser now throws an exception and drops the connection.
Exploiting QueueJumper is surprisingly clean for a binary heap overflow. The attack vector is strictly network-based on TCP port 1801. A functional exploit requires sending a sequence of packets to set up the internal state of the Queue Manager, followed by the trigger packet.
The Attack Chain:
establish_connection packet. This convinces the server to allocate a session object.connection_parameters packet is sent to set packet sizes and timeouts. This grooms the heap, ensuring the subsequent allocation lands next to something interesting.user_message packet containing a malformed Extension Header. This header claims to be small but contains a massive payload.When mqsvc.exe processes the trigger, it calculates the address for the next header. Due to the integer overflow or missing check, it writes the attacker's shellcode into the adjacent memory chunk. If the attacker successfully overwrites a virtual function table (vtable) pointer or a return address on the stack, they gain control of the instruction pointer (RIP/EIP).
While public PoCs (like those by zoemurmure) mostly demonstrate a Denial of Service (crashing the service with an access violation), weaponizing this for RCE is trivial for a seasoned exploit dev. You simply replace the garbage data with a ROP chain leading to VirtualProtect and your shellcode.
You might be thinking, "It's just the Network Service account, who cares?" You should care. Network Service is a built-in Windows account that has less privilege than SYSTEM, but it still has significant access to network resources. It can authenticate to other machines in the domain using the computer's machine account (DOMAIN\COMPUTER$).
Scenario:
nt authority\network service.With an EPSS score hovering around 0.92 (92%), this isn't theoretical. The barrier to entry is low, and the payoff is high. If you have port 1801 exposed to the internet, you are effectively running a public shell server.
The mitigation strategy here is binary: either you need MSMQ, or you don't. Most of you don't.
Option 1: The Scorched Earth Policy (Recommended) If you don't have a specific, documented business need for MSMQ, disable it. Right now. Go to your servers and run:
Disable-WindowsOptionalFeature -Online -FeatureName MSMQ-Server -RemoveOption 2: The Patch (For the Unfortunate) If you are running legacy software that requires MSMQ (I'm sorry), you must apply the April 2023 Security Updates. This includes KB5025229 for Windows 10/11 and corresponding KBs for Server 2008/2012/2016/2019/2022.
Option 3: Firewalls (The Band-Aid) If you can't patch and can't disable it (why?), block TCP port 1801 at the perimeter. MSMQ should never, ever be exposed to the public internet. If Shodan can see your port 1801, you've already lost.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
Windows 10 Microsoft | < April 2023 Update | April 2023 Patch |
Windows Server Microsoft | 2008 - 2022 (Pre-April 2023) | April 2023 Patch |
| Attribute | Detail |
|---|---|
| CVSS Score | 9.8 (Critical) |
| Attack Vector | Network (TCP 1801) |
| Authentication | None (Unauthenticated) |
| EPSS Score | 0.92 (High Probability) |
| CWE | CWE-20 / CWE-787 |
| Impact | Remote Code Execution (System Takeover) |