<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Neon Innovation Lab</title>
    <description>The latest articles on DEV Community by Neon Innovation Lab (@neoninnovationlab).</description>
    <link>https://dev.to/neoninnovationlab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4109619%2F05883d0b-28de-416e-a221-84e543dab6c3.PNG</url>
      <title>DEV Community: Neon Innovation Lab</title>
      <link>https://dev.to/neoninnovationlab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neoninnovationlab"/>
    <language>en</language>
    <item>
      <title>Show HN: We scanned 23 public MCP servers for CVEs - Here is what broke</title>
      <dc:creator>Neon Innovation Lab</dc:creator>
      <pubDate>Fri, 04 Sep 2026 11:21:33 +0000</pubDate>
      <link>https://dev.to/neoninnovationlab/show-hn-we-scanned-23-public-mcp-servers-for-cves-here-is-what-broke-f1l</link>
      <guid>https://dev.to/neoninnovationlab/show-hn-we-scanned-23-public-mcp-servers-for-cves-here-is-what-broke-f1l</guid>
      <description>&lt;p&gt;With tens of thousands of Model Context Protocol (MCP) servers published in 2026, AI agents now have direct execution bridges to local terminals, filesystems, and production databases.&lt;/p&gt;

&lt;p&gt;Following 30+ CVE disclosures against MCP tools in early 2026 alone (including CVSS 9.4+ RCEs), verifying the security of MCP servers before plugging them into Claude Desktop, Cursor, or autonomous agent runtimes has become critical.&lt;/p&gt;

&lt;p&gt;However, existing scanning approaches suffer from two fatal flaws:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Active RCE on the Scanning Machine:&lt;/strong&gt; Several popular scanners attempt to execute &lt;code&gt;stdio&lt;/code&gt; commands directly from target configuration files to retrieve tool descriptions. If you scan an untrusted third-party server, you are executing arbitrary remote code on your own machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;False-Positive Floods:&lt;/strong&gt; Naive YARA or regex scanners trigger up to ~78% false-positive rates by flagging mock keys and test fixtures inside &lt;code&gt;test/&lt;/code&gt; folders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To see what real-world security looks like, we built a zero-execution AST static auditor and benchmarked &lt;strong&gt;23 prominent reference and community MCP servers&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Here is what we found.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Audit Benchmark (23 Repositories)
&lt;/h2&gt;

&lt;p&gt;We evaluated 23 MCP implementations across three tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic Official Reference Servers&lt;/strong&gt; (&lt;code&gt;modelcontextprotocol/servers&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archived Reference Servers&lt;/strong&gt; (&lt;code&gt;modelcontextprotocol/servers-archived&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Popular Community Implementations&lt;/strong&gt; (&lt;code&gt;fastmcp&lt;/code&gt;, &lt;code&gt;slack-mcp-server&lt;/code&gt;, &lt;code&gt;brave-search-mcp&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Executive Benchmark Table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Target MCP Server&lt;/th&gt;
&lt;th&gt;Files Scanned&lt;/th&gt;
&lt;th&gt;Trust Score&lt;/th&gt;
&lt;th&gt;Grade&lt;/th&gt;
&lt;th&gt;Flaws Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1–7&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anthropic Core Reference&lt;/strong&gt; (&lt;code&gt;filesystem&lt;/code&gt;, &lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;sequentialthinking&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;~60&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Anthropic Reference&lt;/strong&gt; (&lt;code&gt;everything&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;&lt;code&gt;85/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 (Unauthenticated SSE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9–20&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Archived Reference Servers&lt;/strong&gt; (&lt;code&gt;sqlite&lt;/code&gt;, &lt;code&gt;postgres&lt;/code&gt;, &lt;code&gt;slack&lt;/code&gt;, &lt;code&gt;puppeteer&lt;/code&gt;, &lt;code&gt;github&lt;/code&gt;, &lt;code&gt;gitlab&lt;/code&gt;, &lt;code&gt;redis&lt;/code&gt;, &lt;code&gt;sentry&lt;/code&gt;, &lt;code&gt;gdrive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;~60&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;FastMCP (Community)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;491&lt;/td&gt;
&lt;td&gt;&lt;code&gt;25/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;F&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 (ZipSlip, 0.0.0.0 SSE, Unconstrained file tools)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Slack MCP Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Brave Search MCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;&lt;code&gt;100/100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Actually Broke?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ZipSlip Archive Extraction (CWE-22)
&lt;/h3&gt;

&lt;p&gt;In community telemetry handling, archive extraction was performed using &lt;code&gt;tarfile.extractall()&lt;/code&gt; without safe directory containment or filter flags. In Python environments, unvalidated archive members can write arbitrary files outside the destination directory when unpacked.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Always specify &lt;code&gt;filter='data'&lt;/code&gt; in Python 3.12+ or sanitize archive member paths before extracting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Unauthenticated Remote SSE Transports on &lt;code&gt;0.0.0.0&lt;/code&gt; (CWE-306)
&lt;/h3&gt;

&lt;p&gt;Multiple example scripts and server entrypoints bound Server-Sent Events (SSE) transports directly to &lt;code&gt;0.0.0.0&lt;/code&gt; with no authentication middleware or Bearer token checks.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Danger:&lt;/strong&gt; Any client on the local network or public internet can discover the endpoint and execute MCP tool definitions without credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Default transport bindings strictly to &lt;code&gt;127.0.0.1&lt;/code&gt; for local usage, and require Bearer token or OAuth authentication headers whenever binding to &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Missing Root Path Boundary Containment in File Tools (CWE-22)
&lt;/h3&gt;

&lt;p&gt;We observed tools with functions named &lt;code&gt;read_file&lt;/code&gt; or &lt;code&gt;search_files&lt;/code&gt; that accept dynamic file path parameters from LLMs and pass them directly to &lt;code&gt;open()&lt;/code&gt; without checking if the target path resides within an allowed root.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Danger:&lt;/strong&gt; An LLM encountering a prompt injection or untrusted input can easily traverse up directories (&lt;code&gt;../../etc/passwd&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Fix:&lt;/strong&gt; Always enforce root boundary checks:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ALLOWED_ROOT&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;user_path&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_relative_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ALLOWED_ROOT&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Path traversal attempt detected&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Takeaways for Developers Building MCP Servers
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Treat tool descriptions as untrusted context:&lt;/strong&gt; Do not include hidden prompt overrides or unescaped user inputs in tool metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never invoke dynamic shells:&lt;/strong&gt; Avoid &lt;code&gt;subprocess.run(shell=True)&lt;/code&gt; and &lt;code&gt;child_process.exec()&lt;/code&gt;. Always pass arguments as explicit string arrays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter test fixtures from automated scanning:&lt;/strong&gt; If you run security audits in CI/CD, exclude test mock directories to eliminate 90%+ of false-positive noise.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Run an Audit on Your MCP Servers
&lt;/h2&gt;

&lt;p&gt;If you maintain an MCP server or use them in production, you can test your repository for these exact vulnerabilities without running untrusted code on your machine:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://apify.com/neon_innovation_lab/mcp-security-auditor" rel="noopener noreferrer"&gt;MCP Security &amp;amp; Vulnerability Auditor on Apify Store&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drop in your public GitHub repository URL, and it generates a complete Trust Score (0–100) and actionable remediation report.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>security</category>
      <category>python</category>
    </item>
  </channel>
</rss>
