Aimed at the wrong bug: 36 MCP advisories, and not one of them is AI-native
28 October 2026·6 min read
The one critical vulnerability in the official Model Context Protocol tooling this year was not a clever prompt. It was a proxy with no lock on the door. CVE-2025-49596 scored 9.4 out of 10, and its mechanism fits in a sentence: versions of @modelcontextprotocol/inspector before 0.14.1 let an unauthenticated request start MCP commands over stdio, so any web page the victim had open could reach the local debugging proxy and run code on their machine. Missing authentication for a critical function, CWE-306. That weakness is older than I am.
Almost everything written about securing AI agents in 2026 is about the model: prompt injection, tool poisoning, a document that smuggles instructions into the context window. That work is real and I am not waving it away. But the Inspector bug made me want to check a smaller, duller question against the public record. Of the vulnerabilities actually filed against the official MCP code, how many are AI-native, meaning they exist only because a language model is in the loop, and how many are the ordinary infrastructure bugs we were already writing advisories about ten years ago?
So I built the smallest lab that could answer it. One script asks the public GitHub Advisory Database for every reviewed advisory affecting the first-party MCP packages: the Python SDK mcp, the TypeScript SDK @modelcontextprotocol/sdk, the go-sdk, the Rust SDK rmcp, the @modelcontextprotocol/inspector debugging tool, and two reference servers, @modelcontextprotocol/server-filesystem and mcp-server-git. A second script reads the CWE weakness tags on each advisory and sorts the set into AI-native against classic. No tarballs, no login, about ninety kilobytes of JSON. Every number in this post falls out of that one query, run on 28 October 2026.
Thirty-six unique advisories came back. Zero are AI-native. All thirty-six are classic infrastructure or web bugs, spread across twenty-nine distinct weakness types.
Every advisory filed against the official MCP packages, one dot each. The count of AI-native weaknesses, prompt injection and the rest, is zero.
Reading the list feels like reading a web-application pentest from 2012. @modelcontextprotocol/server-filesystem had a path-traversal bug (CVE-2025-53110) where a colliding path prefix walked a file tool outside its allowed directory. The rmcp streamable-HTTP transport accepted requests without checking the Origin header, a textbook DNS-rebinding hole (CVE-2026-42559), and separately let an unauthenticated caller pile up the session table until the server ran out of memory (CVE-2026-63128). The Python SDK's WebSocket transport did no Host or Origin validation at all (CVE-2026-59950). The TypeScript SDK accepted bearer tokens that had been issued for a different service (CVE-2026-111771), the audience-validation mistake OAuth has been warning about for a decade. Group them by weakness and the shape is plain.
Weakness family
CWE hits
What it is
Origin / DNS rebinding / CSRF
12
A server that trusts any site able to reach it, so a page in your browser drives your local agent
Resource exhaustion / DoS
11
Unbounded sessions, memory or connections a stranger can stack up until the server falls over
Authentication / authorization
8
Functions with no login, or tokens accepted that were issued for someone else
Path traversal / link following
5
A file tool talked into reading or writing outside the folder it was handed
Input parsing / case / race
5
Malformed input, case tricks or timing windows that confuse the parser
Injection (command / code / XSS)
4
Untrusted text reaching a shell, an eval, or a browser as code
Information exposure
3
Internal data leaking out through errors or responses
SSRF
2
The server tricked into fetching internal addresses on the attacker's behalf
The counts are CWE occurrences, so they add to more than thirty-six: one advisory often carries two or three tags. The ranking is the point. Origin-trust and denial-of-service alone account for more than half of everything catalogued.
The same 36 advisories by weakness. The tall bars are the oldest problems in the book; the AI-native column does not exist.
The clearest confirmation came from the project's own homework. The MCP security best-practices document is careful and thorough, and when you list what it actually warns about, the items are confused-deputy OAuth proxies, token passthrough, SSRF against cloud metadata endpoints, DNS rebinding onto localhost, javascript: URLs that become XSS and then remote code execution, guessable session handles, mix-up attacks between authorization servers. Every one is an OAuth or web-infrastructure problem. The protocol's written threat model is a web threat model, and the model in the loop barely appears in it.
A clean zero should make you suspicious, and it made me suspicious of my own script. The honest objection is that a catalogue like this only counts what gets filed, and a prompt-injection flaw rarely gets filed as a CVE against library code. It lives in how a model behaves, or in how one particular server wires its tools together, not in a function someone can patch and tag with a version number. So a zero here does not mean prompt injection is rare in the wild. It means the SDK bugs serious enough to earn an advisory are, so far, all plumbing.
That pushed me to look at the layer where real deployments live, and the one measurement study I could find there points the same way. Zhou and colleagues scanned 7,973 live remote MCP servers in May 2026. They found 40.55 per cent exposing tools with no authentication at all, and of the 119 OAuth-protected servers they could test, every single one had at least one flaw, 325 between them. The place you would expect AI-native danger turns out to be bleeding from the oldest wound there is: nobody checked for a password.
I should say plainly where this could be wrong. I picked seven packages, and I picked the official ones, which are exactly the projects disciplined enough to write advisories in the first place; a sweep across the thousands of third-party servers would read differently. The AI-native label is my own mapping onto the CWE list, and it leans conservative, so a prompt-injection bug tagged with a generic input-validation CWE lands in my classic pile by default. And I spent most of a day convinced my collector was broken, re-running it against single packages, because I did not believe the AI-native count could really be zero, before I accepted that the script was just telling me what was there.
None of this says the model is safe to ignore. It says the bill came due on the boring parts first. Before asking whether an agent can be talked into something clever, it is worth asking whether the thing it connects to checks who is calling. For the one critical vulnerability in the entire official MCP surface this year, the answer was no.
Sources / Nguồn: - Method and code: github.com/daihongphucecq/mcp-advisory-shape — 36 advisories across 7 official MCP packages, collected 28 October 2026 from the public GitHub Advisory Database. - GitHub Advisory Database (the source queried): github.com/advisories - The MCP Inspector critical, CVE-2025-49596 / GHSA-7f8r-222p-6f5g, CWE-306, CVSS 9.4: github.com/advisories/GHSA-7f8r-222p-6f5g - MCP Security Best Practices (the protocol's own threat model): modelcontextprotocol.io - Zhou, Zhang, Zhang, Zhang, Zhang, Yang — "A First Measurement Study on Authentication Security in Real-World Remote MCP Servers", arXiv:2605.22333, 21 May 2026: arxiv.org/abs/2605.22333 - My previous write-up, same method on a different ecosystem: dhf.io.vn
Lỗ hổng nghiêm trọng duy nhất trong bộ công cụ Model Context Protocol chính thức năm nay không phải là một câu lệnh ranh ma. Nó là một cái proxy không khoá cửa. CVE-2025-49596 bị chấm 9,4 trên 10, và cơ chế của nó gói gọn trong một câu: các bản @modelcontextprotocol/inspector trước 0.14.1 cho phép một yêu cầu không cần đăng nhập khởi chạy lệnh MCP qua stdio, nên bất kỳ trang web nào nạn nhân đang mở cũng có thể với tới cái proxy gỡ lỗi chạy trên máy và chạy mã trên đó. Thiếu xác thực cho một chức năng trọng yếu, CWE-306. Cái lỗi ấy còn già hơn cả tôi.
Gần như mọi thứ viết về bảo vệ AI agent trong năm 2026 đều xoay quanh mô hình: tiêm lệnh, đầu độc công cụ, một tài liệu lén nhét chỉ thị vào cửa sổ ngữ cảnh. Mảng đó là có thật và tôi không gạt đi. Nhưng cái lỗi Inspector khiến tôi muốn đem một câu hỏi nhỏ hơn, buồn tẻ hơn ra đối chiếu với hồ sơ công khai. Trong số các lỗ hổng thực sự được ghi nhận cho mã MCP chính thức, bao nhiêu cái mang tính AI, tức là chỉ tồn tại vì có một mô hình ngôn ngữ trong vòng lặp, và bao nhiêu cái là những lỗi hạ tầng bình thường mà mười năm trước người ta đã viết advisory?
Thế là tôi dựng cái lab nhỏ nhất đủ để trả lời. Một script hỏi GitHub Advisory Database công khai về mọi advisory đã được duyệt có ảnh hưởng tới các gói MCP gốc: SDK Python mcp, SDK TypeScript @modelcontextprotocol/sdk, go-sdk, SDK Rust rmcp, công cụ gỡ lỗi @modelcontextprotocol/inspector, và hai server tham chiếu là @modelcontextprotocol/server-filesystem với mcp-server-git. Một script thứ hai đọc các nhãn điểm yếu CWE trên mỗi advisory rồi chia bộ dữ liệu thành nhóm mang tính AI và nhóm cổ điển. Không tải tarball, không đăng nhập, khoảng chín mươi kilobyte JSON. Mọi con số trong bài này đều rơi ra từ đúng một truy vấn đó, chạy ngày 28/10/2026.
Ba mươi sáu advisory trả về. Không cái nào mang tính AI. Cả ba mươi sáu đều là lỗi hạ tầng hoặc web cổ điển, trải trên hai mươi chín loại điểm yếu khác nhau.
Mỗi advisory ghi nhận cho các gói MCP chính thức là một chấm. Số điểm yếu mang tính AI, tiêm lệnh và những thứ cùng loại, bằng không.
Đọc cái danh sách ấy cứ như đọc một bản pentest ứng dụng web từ năm 2012. @modelcontextprotocol/server-filesystem dính lỗi path traversal (CVE-2025-53110), nơi một tiền tố đường dẫn trùng lặp dắt công cụ file đi ra ngoài thư mục được phép. Transport streamable-HTTP của rmcp nhận yêu cầu mà không kiểm tra header Origin, một lỗ DNS rebinding sách giáo khoa (CVE-2026-42559), và riêng ra còn để một kẻ gọi không đăng nhập chất đầy bảng phiên cho tới khi server cạn bộ nhớ (CVE-2026-63128). Transport WebSocket của SDK Python chẳng kiểm tra Host hay Origin gì cả (CVE-2026-59950). SDK TypeScript thì nhận cả những bearer token vốn được cấp cho một dịch vụ khác (CVE-2026-111771), đúng cái lỗi kiểm tra audience mà OAuth đã cảnh báo suốt mười năm. Gom chúng theo loại điểm yếu thì hình dạng hiện ra rõ ràng.
Nhóm điểm yếu
Lượt CWE
Nó là gì
Origin / DNS rebinding / CSRF
12
Server tin bất kỳ trang nào với tới được nó, nên một trang trong trình duyệt bạn điều khiển được con agent chạy trên máy bạn
Cạn tài nguyên / DoS
11
Phiên, bộ nhớ hay kết nối không giới hạn mà người lạ chất lên được cho tới khi server đổ
Xác thực / phân quyền
8
Chức năng không có đăng nhập, hoặc nhận token vốn được cấp cho người khác
Path traversal / theo liên kết
5
Công cụ file bị dụ đọc hay ghi ra ngoài thư mục đã giao
Phân tích đầu vào / hoa thường / race
5
Đầu vào dị dạng, mẹo hoa thường hay khe thời gian làm rối bộ phân tích
Chèn mã (lệnh / code / XSS)
4
Văn bản không tin cậy lọt vào shell, vào eval, hay vào trình duyệt dưới dạng mã
Lộ thông tin
3
Dữ liệu nội bộ rò ra qua thông báo lỗi hoặc phản hồi
SSRF
2
Server bị lừa đi gọi tới các địa chỉ nội bộ thay cho kẻ tấn công
Các con số là số lượt CWE, nên cộng lại hơn ba mươi sáu: một advisory thường mang hai, ba nhãn. Cái đáng chú ý là thứ hạng. Riêng lỗi tin-cậy-Origin và từ-chối-dịch-vụ đã chiếm quá nửa tất cả những gì được ghi nhận.
Vẫn 36 advisory đó, xếp theo điểm yếu. Những cột cao là các vấn đề cũ nhất trong sách; cột cho lỗi mang tính AI thì không tồn tại.
Bằng chứng rõ nhất lại đến từ chính bài tập về nhà của dự án. Tài liệu MCP Security Best Practices viết cẩn thận và kỹ lưỡng, và khi liệt kê ra những thứ nó thật sự cảnh báo thì đó là: proxy OAuth kiểu confused deputy, token passthrough, SSRF nhắm vào endpoint metadata của đám mây, DNS rebinding trỏ về localhost, các URL javascript: biến thành XSS rồi thành thực thi mã từ xa, các session handle đoán được, tấn công mix-up giữa các máy chủ cấp quyền. Từng cái một đều là vấn đề OAuth hoặc hạ tầng web. Mô hình đe doạ được viết ra của giao thức này là một mô hình đe doạ web, còn cái mô hình ngôn ngữ trong vòng lặp thì gần như không xuất hiện.
Một con số không tròn trĩnh lẽ ra phải khiến người ta nghi ngờ, và nó khiến tôi nghi ngờ chính cái script của mình. Lời phản bác trung thực là: một bản thống kê như thế này chỉ đếm những gì được ghi nhận, mà một lỗi tiêm lệnh thì hiếm khi được ghi nhận thành CVE đối với mã thư viện. Nó nằm ở cách một mô hình hành xử, hay ở cách một server cụ thể đấu nối các công cụ của nó, chứ không nằm trong một hàm mà ai đó vá được rồi gắn số phiên bản. Vậy nên số không ở đây không có nghĩa là tiêm lệnh hiếm gặp ngoài đời. Nó có nghĩa là những lỗi SDK đủ nghiêm trọng để được cấp một advisory, cho tới giờ, toàn là chuyện đường ống.
Điều đó đẩy tôi đi nhìn sang cái tầng mà các hệ thống thật sự vận hành, và nghiên cứu đo đạc duy nhất tôi tìm được ở đó cũng chỉ về cùng một hướng. Zhou và đồng nghiệp quét 7.973 server MCP từ xa đang chạy thật vào tháng 5/2026. Họ thấy 40,55 phần trăm phơi công cụ ra mà không có xác thực gì cả, và trong 119 server có bật OAuth mà họ kiểm tra được thì mọi server đều dính ít nhất một lỗi, tổng cộng 325 lỗi. Cái nơi người ta tưởng sẽ gặp hiểm hoạ mang tính AI hoá ra đang chảy máu từ vết thương cũ nhất đời: chẳng ai hỏi mật khẩu.
Tôi phải nói thẳng những chỗ chuyện này có thể sai. Tôi chọn bảy gói, và tôi chọn các gói chính thức, tức đúng những dự án kỷ luật đủ để viết advisory ngay từ đầu; quét qua hàng nghìn server bên thứ ba thì bức tranh sẽ khác. Nhãn "mang tính AI" là cách tôi tự ánh xạ lên danh sách CWE, và nó nghiêng về phía dè dặt, nên một lỗi tiêm lệnh bị gắn một CWE kiểm-tra-đầu-vào chung chung sẽ mặc nhiên rơi vào đống cổ điển của tôi. Và tôi mất gần trọn một ngày đinh ninh rằng cái collector của mình hỏng, chạy đi chạy lại với từng gói lẻ, vì tôi không tin nổi số lỗi mang tính AI lại có thể bằng không, trước khi chịu chấp nhận rằng script chỉ đang kể lại đúng những gì có ở đó.
Không điều nào trong đây nói rằng cứ kệ cái mô hình cũng được. Nó nói rằng hoá đơn đến hạn ở những phần nhàm chán trước tiên. Trước khi hỏi một con agent có bị dụ làm điều gì khôn khéo hay không, nên hỏi trước cái thứ nó đấu nối tới có kiểm tra xem ai đang gọi hay không. Với lỗ hổng nghiêm trọng duy nhất trên toàn bộ bề mặt MCP chính thức năm nay, câu trả lời là không.
Sources / Nguồn: - Phương pháp và mã nguồn: github.com/daihongphucecq/mcp-advisory-shape — 36 advisory trên 7 gói MCP chính thức, thu thập ngày 28/10/2026 từ GitHub Advisory Database công khai. - GitHub Advisory Database (nguồn được truy vấn): github.com/advisories - Lỗi nghiêm trọng của MCP Inspector, CVE-2025-49596 / GHSA-7f8r-222p-6f5g, CWE-306, CVSS 9,4: github.com/advisories/GHSA-7f8r-222p-6f5g - MCP Security Best Practices (mô hình đe doạ do chính giao thức viết ra): modelcontextprotocol.io - Zhou, Zhang, Zhang, Zhang, Zhang, Yang — "A First Measurement Study on Authentication Security in Real-World Remote MCP Servers", arXiv:2605.22333, 21/5/2026: arxiv.org/abs/2605.22333 - Bài viết trước của tôi, cùng phương pháp trên một hệ sinh thái khác: dhf.io.vn