یک پژوهشگر امنیتی با اسکن ۲۴ پروژه متنباز سرور MCP (Model-Control-Protocol)، یک نقص امنیتی واحد اما بسیار شدید از نوع تزریق دستور در محیط ایزوله (sandbox command-injection) کشف کرد که امتیاز ۹.۸ را در مقیاس CVSS دریافت کرده است. این باگ در AgenticX، یک فریمورک میانردهی عامل هوش مصنوعی (AI-agent)، وجود دارد و به مهاجم اجازه میدهد دستورات دلخواه شل (shell commands) را به کانتینر Docker که سرور را اجرا میکند، تزریق کند.
چرا سرورهای MCP اهمیت دارند
MCP چسبی است که به عاملهای هوش مصنوعی خودگردان اجازه میدهد با ابزارهای خارجی مانند فایلها، پایگاههای داده، مرورگرها و موارد مشابه ارتباط برقرار کنند. توسعهدهندگان یک سرور MCP را در برنامههای خود تعبیه میکنند تا به یک مدل زبانی توانایی خواندن، نوشتن و اقدام بر روی منابع دنیای واقعی را بدهند. خودِ این پروتکل سبکوزن و بهطور گسترده پذیرفته شده است، اما مسئولین نگهداری هر پروژه موظف هستند کدهای اطراف آن را ایمن کنند.
پیادهسازیهای مقیاسبزرگ MCP مانند Cline یا Aider هماکنون بهطور منظم مورد حسابرسی قرار میگیرند و فرآیندهای امنیتی بالغی دارند. ۲۴ پروژهای که در اینجا بررسی شدند، در محدوده «میانرده» در GitHub قرار دارند و بین ۱۰۰ تا ۱,۰۰۰ ستاره دارند. این مخازن اغلب تحویل سریع ویژگیها را بر کد مقاومسازیشده اولویت میدهند، که این امر باعث ایجاد یک نقطه کور برای کاربرانی میشود که تصور میکنند هر سرور MCP متنباز بهصورت پیشفرض ایمن است.
اسکن
پژوهشگر اسکنری ساخته است که به دنبال پنج الگوی کلاسیک حملات اپلیکیشنهای وب بود:
- تزریق دستور (Command injection)
- پیمایش مسیر (Path traversal)
- جعل درخواست سمت سرور (SSRF)
- تزریق SQL (SQL injection)
- فرار از محیط ایزوله (Sandbox escape)
اجرای اسکنر روی ۵,۹۱۱ فایل منبع، ۹۴ هشدار اولیه ایجاد کرد. پس از غربالگری دستی، تنها یک هشدار به عنوان یک آسیبپذیری واقعی تأیید شد.
بررسی باگ AgenticX
AgenticX دستورات شل را از طریق جایگذاری رشتههای ارائهشده توسط کاربر در f-stringهای پایتون میسازد و سپس نتیجه را مستقیماً به شلِ کانتینر میفرستد. هیچ اعتبارسنجی یا قرار دادن مسیر فایلها در کوتیشن (quoting) انجام نمیشود. بنابراین، یک پرامپت مخرب میتواند یک سمیکولون (;) یا سایر کاراکترهای خاص شل را تزریق کند و باعث شود کانتینر هر دستوری را که مهاجم انتخاب میکند، اجرا نماید.
پژوهشگر با انجام اقدامات زیر، کد را اصلاح کرد:
۱. استفاده از shlex.quote() برای ایمنسازی (escape) هر مسیری که توسط مدل زبانی ارائه میشود.
۲. افزودن بررسیهای صریح برای الگوهای پیمایش مسیر (../) قبل از ساخت دستور.
اجرای مجدد اسکنر پس از اصلاح، نشان داد که سطح ریسک بهطور چشمگیری کاهش یافته است، که تأیید میکند این راهکار مشکل اصلی را برطرف کرده است.
چه کسی سود میبرد، چه کسی ضرر میکند
- توسعهدهندگان هوش مصنوعی که یک سرور MCP را در محصولات خود تعبیه میکنند، اکنون نمونهای ملموس از این دارند که چگونه یک مرحلهی سادهی عدم پاکسازی (sanitization) میتواند کل زنجیره امنیتی را از هم بپاشد. با هر پارامتری که از یک مدل زبانی میآید، مانند هر دادهی ورودی از یک API خارجی، به عنوان ورودی غیرقابل اعتماد رفتار کنید.
روی دیگر داستان
پژوهشگر تأکید میکند که خودِ پروتکل MCP همچنان سالم است. این نقص، یک ضعف طراحی در فرمت انتقال داده نیست، بلکه یک سهلانگاری در کدنویسی در یک پیادهسازی خاص است. پروژههای بزرگتر و دارای حسابرسی دقیق، پیش از این مسائل مشابهی را برطرف کردهاند و جامعه متنباز میتواند از وصلهی (patch) AgenticX درس بگیرد. با این حال، این حادثه نشان میدهد که پروژههای «میانرده» با وجود تعداد ستارههای اندک، میتوانند حاوی باگهای پرخطر باشند.
نتیجهگیری
یک f-string بررسینشده در AgenticX، کل یک سرور MCP را به سکوی پرتابی برای اجرای کد دلخواه تبدیل کرد. این اتفاق ثابت میکند که امنیت اکوسیستمهای عامل هوش مصنوعی کمتر به پروتکل و بیشتر به پیادهسازی منضبط بستگی دارد. توسعهدهندگان باید با هر پارامتر تولیدشده توسط LLM به عنوان یک ورودی خصمانه برخورد کنند، پلتفرمها باید از محافظهای زمان اجرا (runtime safeguards) استفاده کنند و ابزارهای امنیتی باید برای درک زنجیرههای اعتماد منحصربهفردی که عاملهای هوش مصنوعی ایجاد میکنند، تکامل یابند.
Source: dev.to/easterndev/i-scanned-24-mcp-server-projects-and-found-a-real-sandbox-command-injection-cvss-98-4k9h
