Một nhà nghiên cứu bảo mật khi quét 24 dự án máy chủ MCP (Model-Control-Protocol) mã nguồn mở đã phát hiện ra một lỗ hổng chèn lệnh sandbox (sandbox command-injection) duy nhất nhưng cực kỳ nghiêm trọng với điểm số 9.8 trên thang CVSS. Lỗ hổng này nằm trong AgenticX, một framework AI-agent tầm trung, cho phép kẻ tấn công chèn các lệnh shell tùy ý vào container Docker đang chạy máy chủ.
Tại sao các máy chủ MCP lại quan trọng
MCP là "chất keo" cho phép các tác nhân AI tự trị (autonomous AI agents) giao tiếp với các công cụ bên ngoài—như tệp tin, cơ sở dữ liệu, trình duyệt và các loại tương tự. Các nhà phát triển nhúng một máy chủ MCP vào ứng dụng của họ để cung cấp cho mô hình ngôn ngữ khả năng đọc, ghi và tác động lên các tài nguyên thực tế. Bản thân giao thức này rất nhẹ và được áp dụng rộng rãi, nhưng việc bảo mật mã nguồn xung quanh lại phụ thuộc vào những người duy trì từng dự án.
Các triển khai MCP quy mô lớn như Cline hoặc Aider đã nhận được các đợt kiểm tra (audit) thường xuyên và có quy trình bảo mật hoàn thiện. 24 dự án được kiểm tra ở đây nằm trong phạm vi "tầm trung" trên GitHub, với số lượng sao từ 100 đến 1.000. Những kho lưu trữ đó thường ưu tiên việc bàn giao tính năng nhanh chóng hơn là mã nguồn được bảo mật chặt chẽ, tạo ra một điểm mù cho những người dùng vốn mặc định rằng bất kỳ máy chủ MCP mã nguồn mở nào cũng đều an toàn.
Quá trình quét
Nhà nghiên cứu đã xây dựng một trình quét để tìm kiếm năm kiểu tấn công ứng dụng web kinh điển:
- Chèn lệnh (Command injection)
- Duyệt đường dẫn (Path traversal)
- Giả mạo yêu cầu phía máy chủ (Server-Side Request Forgery - SSRF)
- Chèn SQL (SQL injection)
- Thoát khỏi sandbox (Sandbox escape)
Việc chạy trình quét trên 5.911 tệp nguồn đã tạo ra 94 cảnh báo ban đầu. Sau khi phân loại thủ công, chỉ có một cảnh báo được xác nhận là lỗ hổng thực sự.
Chi tiết về lỗ hổng trong AgenticX
AgenticX xây dựng các lệnh shell bằng cách chèn các chuỗi do người dùng cung cấp vào các f-string của Python, sau đó chuyển kết quả trực tiếp đến shell của container. Không có quá trình xác thực hoặc thêm dấu ngoặc kép cho các đường dẫn tệp. Do đó, một câu lệnh (prompt) độc hại có thể chèn dấu chấm phẩy hoặc các ký tự đặc biệt khác của shell, khiến container thực thi bất kỳ lệnh nào mà kẻ tấn công chọn.
Nhà nghiên cứu đã vá mã nguồn bằng cách:
- Sử dụng
shlex.quote()để thoát (escape) một cách an toàn bất kỳ đường dẫn nào do mô hình ngôn ngữ cung cấp. - Thêm các kiểm tra rõ ràng đối với các mẫu duyệt đường dẫn (
../) trước khi xây dựng lệnh.
Việc chạy lại trình quét sau khi sửa lỗi cho thấy mức độ rủi ro giảm mạnh, xác nhận rằng biện pháp khắc phục đã giải quyết được nguyên nhân gốc rễ.
Ai được lợi, ai chịu thiệt
- Các nhà phát triển AI khi nhúng máy chủ MCP vào sản phẩm của họ hiện đã có một ví dụ cụ thể về việc chỉ một bước làm sạch dữ liệu (sanitization) bị thiếu có thể phá vỡ toàn bộ chuỗi bảo mật. Hãy coi mọi tham số đến từ mô hình ngôn ngữ là đầu vào không đáng tin cậy, giống như cách bạn xử lý bất kỳ dữ liệu payload API bên ngoài nào.
Góc nhìn khác
Nhà nghiên cứu nhấn mạnh rằng bản thân giao thức MCP vẫn an toàn. Lỗ hổng này không phải là điểm yếu trong thiết kế định dạng truyền tải mà là một sơ suất trong quá trình lập trình của một triển khai cụ thể. Các dự án lớn hơn, đã được kiểm tra kỹ lưỡng đã giải quyết các vấn đề tương tự, và cộng đồng mã nguồn mở có thể học hỏi từ bản vá của AgenticX. Tuy nhiên, sự cố này cho thấy các dự án "tầm trung" vẫn có thể ẩn chứa các lỗi có tác động lớn bất chấp số lượng sao khiêm tốn.
Bài học rút ra
Một f-string duy nhất không được kiểm tra trong AgenticX đã biến toàn bộ máy chủ MCP thành bệ phóng để thực thi mã tùy ý. Sự việc này chứng minh rằng tính bảo mật của hệ sinh thái AI-agent phụ thuộc ít hơn vào giao thức và phụ thuộc nhiều hơn vào việc triển khai có kỷ luật. Các nhà phát triển phải coi mọi tham số do LLM tạo ra là có tính thù địch, các nền tảng nên thực thi các biện pháp bảo vệ trong thời gian chạy (runtime), và các công cụ bảo mật cần phát triển để hiểu được các chuỗi tin cậy (trust chains) độc đáo mà các tác nhân AI tạo ra.
Nguồn: dev.to/easterndev/i-scanned-24-mcp-server-projects-and-found-a-real-sandbox-command-injection-cvss-98-4k9h
