Có một loại công việc trong ngành bảo mật mà người ngoài ít biết đến: không phải vá lỗ hổng, không phải điều tra sự cố, mà là đặt bẫy và chờ đợi (honeypot). Người làm công việc này dựng lên những máy chủ giả, để lộ những cổng kết nối trông như thật, rồi ngồi quan sát xem ai sẽ đến gõ cửa, gõ như thế nào, và tìm kiếm thứ gì. Vào sáng đẹp trời, một kẻ đã gõ cửa theo cách chưa từng được ghi nhận trước đó.
Trước hết, cần hiểu honeypot là gì
Hệ thống honeypot là một tập hợp các máy chủ giả mạo được dựng lên với mục đích duy nhất là bị tấn công. Không có dữ liệu thật bên trong, không có người dùng thật, không có nghiệp vụ thật. Tất cả chỉ là mồi nhử.
Khi một kẻ tấn công trên internet quét tìm mục tiêu, chúng không biết đâu là máy chủ thật, đâu là bẫy. Chúng cứ thế gõ vào tất cả những thứ trông có vẻ có giá trị. Và khi chúng gõ vào bẫy, mọi hành động đều bị ghi lại chi tiết: gõ cửa nào, gõ lúc mấy giờ, dùng công cụ gì, và tìm kiếm thứ gì bên trong.
Hệ thống bẫy trong sự kiện này gồm năm phần riêng biệt:
Tên thành phần | Cổng lắng nghe | Dịch vụ được giả mạo |
| Cowrie | 22, 23 | SSH và Telnet, cách quản trị viên điều khiển server từ xa |
| Dionaea | 21, 80, 443, 3306, 6379, 8080, 9200, 11211 | Web, cơ sở dữ liệu MySQL, Redis, Elasticsearch, Memcached |
| Docker API | 2375 | Hệ thống chạy ứng dụng trong môi trường cô lập |
| Winbox | 8291 | Thiết bị mạng MikroTik |
| PyRDP | 3389 | Giao thức điều khiển màn hình từ xa |
Tất cả đều trông như thật. Tất cả đều là bẫy.
Cái gì đã xảy ra?
Lúc 9 giờ 14 phút sáng, một địa chỉ IP từ châu Âu bắt đầu kết nối vào hệ thống. Trong 15 phút tiếp theo, nó lần lượt thử tất cả mọi thứ. Hãy hình dung một người đi qua một dãy nhà, gõ nhẹ vào từng cánh cửa, không phá khóa, không đập cửa, chỉ gõ nhẹ rồi lắng nghe xem bên trong có tiếng động gì không.
Thời điểm | Hành động | Mục đích |
| 9:14:22 | Kết nối SSH cổng 22, ngắt ngay | Kiểm tra cổng có mở không |
| 9:14:23 | Kết nối Telnet cổng 23, ngắt ngay | Kiểm tra cổng có mở không |
| 9:15:18 | Kết nối MySQL cổng 3306 | Đọc banner phiên bản phần mềm |
| 9:16:05 | HTTP GET cổng 80, User-Agent: curl/8.7.1 | Thu thập thông tin web server |
| 9:16:06 | HTTPS GET cổng 443 | Thu thập thông tin web server |
| 9:16:07 | Redis cổng 6379, lệnh INFO server | Thu thập thông tin Redis |
| 9:16:08 | HTTP cổng 80, gửi MCP initialize | Kiểm tra có MCP server không |
| 9:22:31 | Docker API GET /version | Xác định phiên bản Docker |
| 9:22:33 | Docker API GET /containers/json | Liệt kê container đang chạy |
| 9:22:35 | Docker API POST /containers/create | Tạo container đọc /etc/passwd |
| 9:23:01 | Winbox cổng 8291, probe 1 byte | Kiểm tra thiết bị MikroTik |
| 9:25:14 | MySQL cổng 3306 lần 2 | Thử lại kết nối |
| 10:18:44 | SSH lần 2, thực hiện KEX exchange đầy đủ | Thu thập SSH fingerprint |
Điều đáng chú ý: đây không phải brute-force. Không một lần nào thử đăng nhập vào SSH hay MySQL. Toàn bộ hoạt động mang tính trinh sát, thu thập banner, xác định phiên bản, liệt kê dịch vụ khả dụng. Hành động duy nhất có tính tấn công là cố tạo container Docker để đọc danh sách tài khoản hệ thống.
Lần đầu tiên thấy điều lạ:
Trong cùng cổng HTTP, lúc 9 giờ 16 phút 8 giây, hệ thống ghi lại một đoạn dữ liệu không phải yêu cầu web thông thường. Đó là một đoạn JSON với nội dung khởi tạo giao thức MCP. Để hiểu tại sao điều này quan trọng, cần biết MCP là gì.
MCP là một giao thức mới do Anthropic, công ty tạo ra trợ lý AI Claude, phát triển và công bố. Mục đích của nó là cho phép các hệ thống AI như Claude, ChatGPT hay GitHub Copilot kết nối trực tiếp với các công cụ bên ngoài trong doanh nghiệp. Ví dụ, thay vì chỉ trả lời câu hỏi, một AI agent dùng MCP có thể đọc file trên máy chủ công ty, truy vấn cơ sở dữ liệu nội bộ, gọi API của hệ thống kế toán, hay thậm chí chạy các tác vụ tự động trên pipeline triển khai phần mềm. Nói đơn giản hơn: MCP là cái cầu nối giữa bộ não AI và toàn bộ hạ tầng của doanh nghiệp. Và cầu nối đó, trong phần lớn trường hợp triển khai hiện nay, không có khóa.
Tại sao lại không có khóa?
Khi Anthropic công bố đặc tả MCP lần đầu, tiêu chuẩn xác thực, tức là cơ chế yêu cầu người dùng phải chứng minh danh tính trước khi được phép kết nối, không phải là bắt buộc. Nó được liệt vào phần tùy chọn. Mãi đến phiên bản cập nhật tháng 6 năm 2025, OAuth 2.1 mới được thêm vào như một lựa chọn, nhưng vẫn không phải bắt buộc. Hệ quả là rất nhiều đội ngũ kỹ thuật đã triển khai MCP server nhanh chóng, tập trung vào việc làm cho AI hoạt động được, và bỏ qua phần bảo mật vì đặc tả không yêu cầu.
Thời điểm | Dữ liệu khảo sát |
| Tháng 7/2025 | Knostic phát hiện 1.862 MCP server phơi ra ngoài internet qua Shodan |
| Tháng 7/2025 | Trong 119 server kiểm tra trực tiếp, không server nào yêu cầu xác thực |
| Tháng 2/2026 | Cộng đồng bảo mật ước tính con số vượt 8.000 server |
Đây là tình trạng một dãy nhà mới xây, cửa đã lắp, nhưng ổ khóa chưa ai lắp vào.
Kẻ tấn công sẽ làm gì với một MCP server không có khóa?
Khi một kẻ tấn công kết nối thành công vào một MCP server không được bảo vệ, điều đầu tiên chúng làm là gửi yêu cầu tools/list, tức là hỏi server có thể làm được những gì. Server sẽ thành thật trả về danh sách đầy đủ, và từ đó kẻ tấn công có thể gọi bất kỳ công cụ nào mà không cần mật khẩu hay tài khoản.
Kỹ thuật tấn công | Cách hoạt động | Hậu quả |
| Liệt kê công cụ qua tools/list | Gọi API để nhận toàn bộ danh sách chức năng server | Biết được server có thể làm gì: đọc file, gọi API, chạy lệnh |
| Gọi công cụ không cần xác thực | Dùng JSON-RPC gọi trực tiếp bất kỳ tool nào | Thực thi hành động tùy ý trên hạ tầng nạn nhân |
| Tool poisoning | Chèn lệnh ẩn vào phần mô tả của một công cụ | AI agent của nạn nhân đọc mô tả và vô tình thực thi lệnh của kẻ tấn công |
| Khai thác sampling | Kích hoạt model AI của phía client thông qua server | Dùng AI của nạn nhân mà không tốn chi phí, hoặc dùng để tạo nội dung độc hại |
| Đánh cắp dữ liệu qua roots | Lấy danh sách thư mục làm việc của client | Biết được cấu trúc hệ thống file, xác định mục tiêu tiếp theo |
Phân tích đoạn dữ liệu bị bắt
Đây là nội dung gần đúng của đoạn dữ liệu mà hệ thống bẫy ghi lại được
</> JSON
{
"jsonrpc": "2.0",
"id": 4817523,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {
"sampling": {},
"elicitation": {},
"roots": { "listChanged": true }
},
"clientInfo": {
"name": "net-recon-mcp-probe",
"version": "1.0.0"
}
}
}
Mỗi trường trong đoạn dữ liệu này đều mang thông tin có giá trị:
Trường | Giá trị | Ý nghĩa phân tích |
| method | initialize | Bước bắt tay đầu tiên của MCP. Nếu phía kia là server thật, nó sẽ trả lời và quá trình khai thác bắt đầu |
| protocolVersion | 6/18/2025 | Phiên bản đặc tả MCP mới nhất, cho thấy công cụ được cập nhật thường xuyên |
| capabilities | sampling + elicitation + roots | Khai báo đủ cả ba khả năng để buộc server trả về tối đa thông tin trong response |
| clientInfo.name | net-recon-mcp-probe | Không khớp với bất kỳ dự án công khai nào, tên miền liên quan không tồn tại, đây là công cụ tự phát triển riêng |
| id | 4817523 | Giá trị cao bất thường, ngụ ý hệ thống này đã gửi hàng triệu yêu cầu trước đó, đây không phải mục tiêu đầu tiên |
Sau khi gõ cửa MCP, kẻ tấn công làm gì tiếp?
Lúc 9 giờ 22 phút, công cụ quét chuyển sang Docker API. Docker là hệ thống cho phép chạy các ứng dụng trong những container. Nếu cổng quản lý Docker được mở ra ngoài mà không có mã hóa và chứng thư xác thực, bất kỳ ai biết địa chỉ cũng có thể điều khiển toàn bộ Docker đó.
Bước | Yêu cầu gửi đi | Mục đích thực sự |
| 1 | GET /version | Xác định phiên bản Docker engine đang chạy |
| 2 | GET /v1.44/containers/json | Liệt kê tất cả container đang hoạt động trong hệ thống |
| 3 | POST /v1.44/containers/create với image busybox và lệnh cat /etc/passwd | Tạo container mới để đọc danh sách tài khoản người dùng của hệ điều hành chủ |
Mục tiêu của chuỗi thao tác này là thu thập thông tin tài khoản trên máy chủ thật thông qua Docker được mount chung volume với hệ điều hành. Đây là kỹ thuật leo quyền đã được ghi chép rộng rãi và được dùng trong hàng nghìn vụ xâm nhập thực tế.
Những sự cố MCP đã xảy ra trong thực tế
Những gì được mô tả không phải rủi ro lý thuyết. Trong năm 2025, đã có tám sự cố nghiêm trọng liên quan đến MCP được ghi nhận công khai:
Thời điểm | Sự cố | Hậu quả trực tiếp |
| Tháng 4/2025 | Chèn lệnh qua MCP của ứng dụng nhắn tin | Toàn bộ lịch sử hội thoại bị đánh cắp |
| Tháng 5/2025 | Lỗ hổng trong MCP của nền tảng lưu trữ code, khai thác qua pull request công khai | Repository riêng tư bị lộ ra ngoài |
| Tháng 6/2025 | Lỗi phân tách tenant trong nền tảng quản lý dự án dùng MCP | Dữ liệu của tổ chức A hiển thị cho tổ chức B |
| Tháng 6/2025 | Lỗ hổng trong công cụ debug chính thức của Anthropic | Thực thi lệnh từ xa trên máy nạn nhân |
| Tháng 7/2025 | Supply chain attack, CVE-2025-6514, thư viện MCP phổ biến 437K lượt tải | Command injection, cài mã độc trên máy người dùng |
| Tháng 7/2025 | Sandbox escape trên Filesystem MCP | Truy cập file tùy ý ngoài phạm vi cho phép |
| Tháng 9/2025 | MCP server giả mạo dịch vụ gửi email | Email âm thầm chuyển tiếp cho kẻ tấn công |
| Tháng 10/2025 | Xâm nhập registry tổng hợp MCP server | 3.000 MCP server bị ảnh hưởng |
Điều gì làm cho phát hiện này khác biệt so với trước đây?
Trước sự kiện này, MCP scanning chỉ xuất hiện trong báo cáo của các nhóm nghiên cứu bảo mật chuyên nghiệp. Các công ty như Knostic hay Cisco đã viết công cụ quét MCP server, nhưng với mục đích kiểm tra và lập bản đồ phục vụ nghiên cứu. Tất cả là bối cảnh kiểm soát.
Trước sự kiện này | Sau sự kiện này |
| MCP scanning chỉ xuất hiện trong tool nghiên cứu độc lập | MCP scanning xuất hiện như một module trong scanner đa giao thức tự động |
| Được dùng để lập bản đồ server phục vụ nghiên cứu | Được chạy cùng lúc với SSH, MySQL, Docker, Redis và Winbox scanning |
| Quy trình kiểm tra thủ công, có kiểm soát | Tự động hóa hoàn toàn từ một IP duy nhất trong 15 phút |
| Giai đoạn "cộng đồng nghiên cứu đang tìm hiểu vấn đề" | Giai đoạn "tích hợp vào toolkit hoạt động của attacker" |
Trong lịch sử bảo mật, khi một loại dịch vụ mới bắt đầu xuất hiện trong các scanner tự động, đó là dấu hiệu cho thấy cộng đồng tội phạm mạng đã đánh giá nó là đủ phổ biến và đủ có giá trị để đưa vào quy trình khai thác hàng loạt. Kubernetes API từng qua giai đoạn này, kết quả là hàng nghìn cluster bị chiếm để đào tiền mã hóa. Elasticsearch từng qua giai đoạn này, kết quả là hàng triệu bản ghi dữ liệu bị xóa hoặc tống tiền. MCP đang bước vào giai đoạn tương tự.
Vậy cần làm gì?
Nhóm 1: Người quản lý hoặc vận hành MCP server
Việc đầu tiên và quan trọng nhất là kiểm tra xem MCP server của tổ chức có đang phơi ra ngoài internet không. Cách đơn giản nhất là thử tìm kiếm trên Shodan với từ khóa "protocolVersion" "clientInfo" và xem thử server của mình có xuất hiện trong kết quả không. Nếu có, đó là tình trạng cần xử lý ngay lập tức, không phải để sau.
Nếu MCP server chỉ phục vụ nội bộ, hãy cấu hình để nó chỉ lắng nghe trên địa chỉ mạng nội bộ thay vì địa chỉ public. Một server không thể truy cập từ ngoài thì scanner tự động cũng không tìm thấy được. Trong trường hợp cần truy cập từ xa, giải pháp đúng là đặt server sau VPN, để chỉ những người có thông tin đăng nhập VPN mới kết nối được.
Về phần xác thực, nếu phiên bản MCP đang dùng đã hỗ trợ OAuth 2.1, không có lý do gì để không bật nó lên. Và cuối cùng, cần theo dõi log thường xuyên: bất kỳ request initialize nào đến từ nguồn không xác định đều là dấu hiệu của hoạt động trinh sát và cần được điều tra.
Nhóm 2: Kỹ sư bảo mật và đội phòng thủ
Ưu tiên đầu tiên là bổ sung rule phát hiện cho WAF hoặc IDS. Cụ thể, cần cảnh báo khi HTTP body chứa đồng thời ba chuỗi "method":"initialize", "protocolVersion" và "clientInfo" đến từ địa chỉ IP bên ngoài, vì đây là fingerprint đặc trưng của MCP handshake và không có lý do gì để nó xuất hiện từ ngoài mạng nội bộ.
Song song đó, cần rà soát lại toàn bộ danh sách cổng đang mở trên hạ tầng, đặc biệt chú ý đến cổng 2375 của Docker. Cổng này nếu không có TLS và chứng thư xác thực thì về bản chất là để ngỏ hoàn toàn, bất kỳ ai biết địa chỉ cũng điều khiển được Docker daemon. Đây là rủi ro nghiêm trọng và cần được đóng lại hoặc bảo vệ đúng cách trước khi quan tâm đến bất cứ thứ gì khác.
Nhóm 3: Developer đang xây dựng hệ thống AI agent
Khi xây dựng hệ thống có AI agent kết nối với MCP server, cần nhớ rằng phần mô tả của công cụ mà server trả về không phải lúc nào cũng đáng tin. Kẻ tấn công có thể chèn lệnh ẩn vào đúng phần mô tả đó, và AI agent khi đọc vào sẽ vô tình thực thi lệnh của kẻ tấn công mà không ai hay biết. Đây là kỹ thuật tool poisoning và không có cách phòng thủ hoàn hảo ngoài việc chỉ kết nối với những MCP server đáng tin cậy và đã được kiểm tra.
Ngoài ra, toàn bộ hành động của AI agent cần được ghi log đầy đủ, bao gồm công cụ nào được gọi, tham số nào được truyền vào, và dữ liệu nào được nhận về. Không có audit trail thì không thể điều tra khi sự cố xảy ra.
Cuối cùng, nguyên tắc quyền tối thiểu phải được áp dụng cho từng công cụ một. Công cụ chỉ cần đọc file thì không được cấp quyền ghi. Công cụ chỉ cần truy vấn dữ liệu thì không được cấp quyền xóa. Và nếu không có nhu cầu thực sự, không nên khai báo sampling hay roots trong capabilities, vì khai báo càng ít thì bề mặt tấn công càng nhỏ.



