200,000 exposed MCP servers later, the boring checks still win
Key takeaways
- OX Security's April disclosure put vulnerable MCP instances at roughly 200,000, and a stats report counted over thirty MCP related CVEs in a single 60 day window.
- The exposed instances are mostly human mistakes: admin interfaces bound to every interface, no authentication, plaintext secrets in configs and servers months behind on patches.
- Run ss -tlnp | grep node and treat anything on 0.0.0.0 that is not meant to be public as a bug, since local tool servers should bind to localhost.
- Test whether the endpoint answers useful data without an auth header using curl, because that ten second check is the most common finding in exposure scans.
- Pin the server version, watch the release feed, and send tool call logs somewhere with an alert rule and a human who looks at them.
The numbers from this spring keep sitting in my head. OX Security’s April disclosure put vulnerable MCP instances at roughly two hundred thousand, across a supply chain footprint of more than 150 million package downloads. A stats report tallied over thirty MCP related CVEs in a single 60 day window. Gartner started connecting the coming GenAI breach wave to exactly this exposure.
Read the CSA research note and you will see the phrase systemic design flaw, and yes, the protocol era genuinely has architectural problems that spec releases will need years to settle.
But census the actual exposed instances and the list is embarrassingly human: admin interfaces bound to every interface, no authentication, secrets sitting in plaintext configs, servers months behind on patches. The design flaw makes headlines. The config mistake pays the attackers.
The five checks I run on every MCP server
1. What are you listening on
ss -tlnp | grep node
Anything on 0.0.0.0 that is not meant to be public is a bug. Local tool servers should bind to localhost. If your MCP server has a web UI and it answers on all interfaces, that is the incident, everything else is commentary.
2. Does it answer without credentials
curl -s http://localhost:PORT/ | head
If the endpoint returns useful data with no auth header, stop and fix. This takes ten seconds and it is the single most common finding in exposure scans.
3. What secrets are in the config
grep -rE "(api_key|token|secret)" . --include="*.json" | grep -v "\$"
Plaintext keys in config files are how one cloned repo becomes a leaked org. The regex above is a start; a scanner catches the formats grep misses, like JSON quoted keys that defeat the naive pattern. I learned that one the hard way testing my own scanner against JSON configs.
4. Is the version pinned
A floating server tag means someone else decides when your tooling changes. Pin it. Then watch the release feed so a pin does not become a museum piece.
5. Do the logs go somewhere a person looks
Logs rotated into a volume nobody reads are a retention liability with delusions of being a control. Tool call logs should land somewhere with an alert rule attached. You do not need a SIEM. You need one query and one human.
The uncomfortable summary
Two hundred thousand exposed instances were not collected by novel research exploits. They were collected by pointing basic network scans at the basics. Your defense gets the same treatment: basic checks, run consistently, before someone else runs them for you.
I keep a free 12 point preflight checklist for MCP setups that extends this list. Link below.
Sources
- CSA note citing the OX Security disclosure: https://labs.cloudsecurityalliance.org/research/csa-research-note-mcp-security-crisis-20260504-csa-styled/
- MCP security statistics report with the CVE tally: https://www.practical-devsecops.com/mcp-security-statistics-2026-report/
- Breach timeline reference: https://authzed.com/blog/timeline-mcp-breaches
If you want to run checks like these on an MCP server or a .claude/ directory before you install it, I maintain mcpscan, an open-source scanner for tool poisoning, risky permissions and leaked secrets. Issues and false-positive reports are welcome.
Originally published on DEV. Discussion happens there.
Frequently asked questions
- How do I check if my MCP server is exposed to the internet?
- Run ss -tlnp | grep node and look for anything listening on 0.0.0.0 that should not be public. Then curl the endpoint without credentials, and if it returns useful data you need to fix authentication.
- Why are so many MCP servers vulnerable?
- According to the article, the exposed instances are mostly basic mistakes like admin interfaces bound to all interfaces, no authentication, plaintext secrets and unpatched servers. Architectural flaws in the protocol exist, but the config mistakes are what attackers collect.
- Should I pin my MCP server version?
- Yes. A floating server tag means someone else decides when your tooling changes, so pin it and watch the release feed so the pin does not go stale.
About the author
Security Engineer & Technical Writer
Security engineer and technical writer based in Batam, Indonesia. I review and harden MCP servers and AI agents, build security automation, and write up what holds and what fails. I also train on DNS security as a PANDI .id Academy trainer.
Related articles
-
3 min read
What Actually Changes When an MCP Server Leaves Your Laptop
Moving an MCP server behind a gateway: per-request auth, tenant isolation, request-bound approvals and structured logs, plus a lab with 13 runtime tests.
- MCP Security
- Deployment
-
6 min read
PHP2Shell: The Patch Is Out. Is It Running in Your Containers?
PHP2Shell patches for CVE-2026-109618 and CVE-2026-109619 are out. Five checks to prove the fix is running in your containers, not just released.
- Security Engineering
- Deployment
-
6 min read
The eMudhra CA Keys Were One Byte Long. Does Your Container Still Trust Them?
Eight eMudhra CA keys were one-byte numbers. Browsers blocked them in hours, but containers may not. A 15-minute trust store audit for Docker, Python, Java.
- Security Engineering
- Deployment
All writing | RSS | Markdown