<?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: Truong Bui</title>
    <description>The latest articles on DEV Community by Truong Bui (@truong_bui_eaec3f963bbe21).</description>
    <link>https://dev.to/truong_bui_eaec3f963bbe21</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3917737%2F0c4a230b-f05f-4417-8fdc-02764eb5c871.jpg</url>
      <title>DEV Community: Truong Bui</title>
      <link>https://dev.to/truong_bui_eaec3f963bbe21</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/truong_bui_eaec3f963bbe21"/>
    <language>en</language>
    <item>
      <title>What I found scanning 2,600 public MCP servers</title>
      <dc:creator>Truong Bui</dc:creator>
      <pubDate>Thu, 07 May 2026 10:49:06 +0000</pubDate>
      <link>https://dev.to/truong_bui_eaec3f963bbe21/what-i-found-scanning-2600-public-mcp-servers-3gen</link>
      <guid>https://dev.to/truong_bui_eaec3f963bbe21/what-i-found-scanning-2600-public-mcp-servers-3gen</guid>
      <description>&lt;p&gt;Hey everyone, I built a security scanner for MCP servers (&lt;a href="https://mcpsafe.io" rel="noopener noreferrer"&gt;mcpsafe.io&lt;/a&gt;) and ran it across the public catalog I'd indexed from npm, PyPI, and GitHub — about 5,000 active servers, 2,634 of which produced at least one finding. The results were rougher than I expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's broken, by % of servers affected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;51%&lt;/strong&gt; — unpinned GitHub Actions (&lt;code&gt;uses: actions/checkout@v4&lt;/code&gt; instead of a SHA). Tag rewrites are silent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;45%&lt;/strong&gt; — HTTP / socket / subprocess calls without a timeout. Hang-forever territory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;41%&lt;/strong&gt; — overbroad MCP tool input schemas (&lt;code&gt;z.string()&lt;/code&gt;, bare &lt;code&gt;str&lt;/code&gt;, &lt;code&gt;{"type":"string"}&lt;/code&gt; on fields named &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;query&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;). The exact shape that lets prompt injection through.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;37%&lt;/strong&gt; — &lt;code&gt;except: pass&lt;/code&gt; swallowing errors with no logging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28%&lt;/strong&gt; — Dockerfiles with no &lt;code&gt;USER&lt;/code&gt; directive, so the container runs as root.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;22%&lt;/strong&gt; — npm/pip install-time hooks (&lt;code&gt;postinstall&lt;/code&gt;, custom &lt;code&gt;cmdclass&lt;/code&gt;). Code execution before you ever import anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19%&lt;/strong&gt; — server binds to &lt;code&gt;0.0.0.0&lt;/code&gt;. DNS rebinding is real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;11%&lt;/strong&gt; — pinned to dependency versions with known CVEs in the OSV database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small set of severe findings keeps showing up too: 97 servers had runtime-secret-exfil patterns (env vars or KMS plaintext returned in tool responses); 88 had user input concatenated into the &lt;code&gt;system&lt;/code&gt; role of an inner LLM call without sanitization. Those are the bugs that make the news.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this is more than the usual SAST stuff:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP servers are different because &lt;em&gt;every tool description, return value, and file the server reads ends up inside an LLM's context&lt;/em&gt;. An overbroad schema isn't just sloppy — it's a prompt-injection surface. A silenced exception isn't just bad logging — it's where a malicious tool quietly succeeds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What MCPSafe.io does:&lt;/strong&gt; 43 rules right now, all MCP-specific, mapped to CWE. Free public scanning at &lt;a href="https://mcpsafe.io" rel="noopener noreferrer"&gt;mcpsafe.io&lt;/a&gt;, no signup. Paste a GitHub repo, npm package, or PyPI package, get a result. Deep scans run a 5-judge LLM consensus (Bedrock, OpenAI, Mistral, Vertex) to filter low-confidence findings.&lt;/p&gt;

&lt;p&gt;If you maintain an MCP server, the free path will catch most of the issues above. If you find a false positive, every finding has a "report" link that goes to my inbox.&lt;/p&gt;

&lt;p&gt;Curious to hear which patterns I'm missing. Thank you!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>mcp</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
