WPA3 Security Testing
WPA3 security testing requires complex SAE and EAPOL analysis; Penzzer enables fuzzing by acting as a controllable WPA3 Access Point for devices.

In the world of security research, familiar protocols and server types - classic HTTP, RESTful APIs, and legacy backends - have long attracted the lion’s share of testing and tooling. Over years of relentless analysis, these systems have become both battle-hardened and well-understood, and the security industry has built a robust ecosystem around them: scanners, fuzzers, code analyzers, and more. But the landscape is evolving, and so are the protocols underpinning our most innovative web applications and services.
Among these next-generation components, MCP servers - often relying on custom, persistent, and highly performant communication channels built atop "streamable-HTTP" concepts - are emerging as a critical, yet overlooked, layer in distributed systems. From real-time analytics pipelines and financial trading platforms to IoT control planes and multiplayer game backends, MCP servers offer capabilities that traditional request/response web servers simply cannot match.
But with new power comes new risk. The same flexibility and performance optimizations that make MCP attractive also introduce a fundamentally different attack surface - one that traditional security testing tools are not equipped to handle. As researchers and defenders, our collective attention must shift to these blind spots before they become the next major vector for large-scale exploitation.
In this article, we’ll dissect MCP and streamable-HTTP at a protocol level, analyze their security implications, illustrate how conventional tools fail to expose the risks, and show how Penzzer’s MCP Inspector was engineered to uncover vulnerabilities where no one else is looking.
MCP, or Meta Content Protocol, is a design pattern and protocol family used to facilitate persistent, multiplexed, and context-rich communication between clients and servers. Unlike conventional web servers, which treat every HTTP request as an independent transaction, MCP servers enable ongoing dialogs - streams - where data can flow bidirectionally without the overhead of establishing new connections or sessions for each exchange.
MCP’s appeal lies in its versatility. You’ll find MCP servers embedded in:
MCP servers break from the request/response mold in several key ways:
These advantages have driven widespread MCP adoption in performance-critical applications - but have also led to a new class of security challenges that demand closer scrutiny.
Traditional HTTP was never designed for real-time, persistent communication. Its origins as a stateless, transactional protocol suited the early web, but fell short in the face of modern demands for live collaboration, streaming media, and high-throughput data flows. Streamable-HTTP represents a set of architectural patterns and protocol extensions that adapt HTTP for these use cases by introducing persistent, multiplexed streams atop familiar web transport mechanisms.
MCP servers are usually built on top of HTTP/1.1, leveraging its persistent connection ("keep-alive") capability to create long-lived channels between clients and servers. Unlike modern real-time protocols such as WebSockets or HTTP/2/HTTP/3, MCP does not natively support protocol-level multiplexing or binary streams. Instead, all multiplexing and stream management occur at the application layer on top of a plain HTTP/1.1 POST request that remains open for the lifetime of the connection.
This architecture provides the appearance of persistent, streamable communication while maintaining compatibility with HTTP infrastructure (load balancers, proxies, etc.), but also inherits limitations and security considerations from both HTTP/1.1 and the custom protocol layers.
A cornerstone of streamable-HTTP design is the persistent connection: one socket, many messages. Connections may be kept open for the life of a client session, supporting:
MCP must impose its own framing on top of the raw stream, as TCP and HTTP/1.1 only provide a transport, not message boundaries. Common framing strategies include:
\r\n\r\n).Framing is critical for correct parsing - but also introduces opportunities for confusion and exploitation if parsing is inconsistent or incomplete.
Without protocol-level support, MCP multiplexing is implemented at the application layer. Typical methods include:
Multiplexing improves performance and resource usage but complicates security analysis, as payloads for different users or operations may be interleaved within the same persistent HTTP request.
Persistent streams require careful handling of authentication and session state:
These protocol traits make MCP/streamable-HTTP both powerful and risky. The flexibility and abstraction layers that enable multiplexed, real-time interaction also offer attackers more places to hide payloads, evade detection, or confuse stateful parsers.
Persistent connections mean an attacker has a much longer-lived conduit into a system. There is no natural "reset" between requests, allowing for:
Most DAST (Dynamic Application Security Testing) tools are fundamentally built around the assumption of stateless request/response cycles. They expect to inject a payload, observe a response, and move on. Streamable-HTTP's persistent, multiplexed nature breaks this mental model:
Attackers can exploit these features by:
These factors make MCP and streamable-HTTP an attractive and under-scrutinized target for determined adversaries.
Consider a scenario where a streamable-HTTP endpoint allows file operations, such as downloading or uploading files. A naive parser may only check file paths for malicious input at the boundary of each message, but attackers can use fragmentation or multiplexing to evade these checks.
Example:
"../" sequence (used for directory traversal) across two frames, bypassing a naive filter:{"action": "get_file", "path": "/etc/../passwd"}The server, upon reconstructing the full path, processes /etc/../passwd and potentially exposes sensitive system files.
Because multiple logical streams may coexist within the same physical channel, mistakes in stream ID handling can result in data leakage:
If the MCP server fails to sanitize inputs within persistent streams, classic injection attacks (command, SQL, deserialization) are possible - but with added persistence:
Long-lived streams are vulnerable to state confusion:
Protocols using similar patterns - such as custom streaming APIs - have suffered similar classes of bugs, often going undetected for years due to the mismatch between protocol complexity and available testing tools.
Classic web application scanners treat each HTTP transaction as isolated and stateless. In a streamable-HTTP/MCP world, messages are persistent, contextual, and often multiplexed - breaking the assumptions of these tools.
Most DAST/SAST tools look for telltale patterns in responses - error messages, reflected payloads, etc. With multiplexed, stateful communication, these signals are diluted or delayed, and attacks may succeed without any overt error.
A penetration test of a real-time trading platform using MCP revealed no issues when scanned with conventional tools. Only a manual, protocol-aware review discovered a critical path traversal vulnerability - one that, if exploited, could have enabled an attacker to extract trading strategies and customer data undetected.
Recognizing the unique risks posed by MCP and streamable-HTTP servers, Penzzer’s research team developed the MCP Inspector - the first fuzzer and vulnerability scanner purpose-built for this environment.
Unlike conventional tools, MCP Inspector can:
During a proof-of-concept engagement, Penzzer’s MCP Inspector uncovered a directory traversal vulnerability in a custom MCP server used for IoT device management. By requesting a file that was above the parent directory from which files should have been requested, a sensitive file /etc/shadow has been accessed on the server running the MCP server.
POST /mcp/ HTTP/1.1
Host: server_ip_address:8000
Accept-Encoding: gzip, deflate
Connection: keep-alive
User-Agent: python-httpx/0.28.1
Accept: application/json, text/event-stream
content-type: application/json
mcp-session-id: 94898da8bd774249852522a945b380b6
mcp-protocol-version: 2025-06-18
Content-Length: 185
{"method":"tools/call","params":{"name":"read_row_csv_file","arguments":{"filename":"../../../../../../../../../etc/shadow","row":0},"_meta":{"progressToken":2}},"jsonrpc":"2.0","id":2}
HTTP/1.1 200 OK
date: Mon, 14 Jul 2025 09:56:15 GMT
cache-control: no-cache, no-transform
connection: keep-alive
content-type: text/event-stream
mcp-session-id: 94898da8bd774249852522a945b380b6
x-accel-buffering: no
transfer-encoding: chunked
event: message
data: {"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":"root:$y$j9T$x.x.$x.x.x:19778:0:99999:7:::\nName: 0, dtype: object"}],"structuredContent":{"result":"root:$y$j9T$x.x.$x.x.x:19778:0:99999:7:::
\nName: 0, dtype: object"},"isError":false}}
NOTE: Some aspects of the /etc/shadow file have been redacted

Identify security flaws before attackers do, automatically and at scale with Penzzer's intelligent fuzzing engine.
