Дослідник безпеки, який просканував 24 проєкти серверів MCP (Model-Control-Protocol) з відкритим вихідним кодом, виявив одну, але серйозну вразливість ін'єкції команд у пісочницю, яка має оцінку 9.8 за шкалою CVSS. Помилка міститься в AgenticX, фреймворку для ШІ-агентів середнього рівня, і дозволяє зловмиснику вводити довільні команди оболонки (shell commands) у Docker-контейнер, що запускає сервер.
Чому сервери MCP мають значення
MCP — це сполучна ланка, яка дозволяє автономним ШІ-агентам взаємодіяти із зовнішніми інструментами: файлами, базами даних, браузерами тощо. Розробники вбудовують MCP-сервер у свої застосунки, щоб надати мовній моделі можливість читати, записувати та діяти з реальними ресурсами. Сам протокол є легковажним і широко впровадженим, проте розробники кожного окремого проєкту мають самостійно забезпечувати безпеку навколишнього коду.
Масштабні впровадження MCP, такі як Cline або Aider, вже проходять регулярні аудити та мають налагоджені процеси безпеки. 24 проєкти, розглянуті в цьому дослідженні, належать до «середнього рівня» на GitHub, маючи від 100 до 1000 зірок. Такі репозиторії часто надають пріоритет швидкому випуску функцій, а не захищеності коду, що створює «сліпу зону» для користувачів, які вважають, що будь-який MCP-сервер з відкритим кодом є безпечним за замовчуванням.
Сканування
Дослідник створив сканер, який шукав п'ять класичних паттернів атак на вебзастосунки:
- Ін'єкція команд (Command injection)
- Обхід шляху (Path traversal)
- Підробка запитів на стороні сервера (SSRF)
- SQL-ін'єкція
- Втеча з пісочниці (Sandbox escape)
Запуск сканера для 5911 файлів із вихідним кодом виявив 94 початкові попередження. Після ручного аналізу лише одне попередження підтвердилося як справжня вразливість.
Суть помилки в AgenticX
AgenticX формує команди оболонки шляхом інтерполяції рядків, наданих користувачем, у Python f-strings, а потім передає результат безпосередньо в оболонку контейнера. Валідація або екранування шляхів до файлів не виконуються. Таким чином, зловмисний промпт може містити крапку з комою або інший метасимвол оболонки, що змусить контейнер виконати будь-яку команду на вибір зловмисника.
Дослідник виправив код шляхом:
- Використання
shlex.quote()для безпечного екранування будь-якого шляху, наданого мовною моделлю. - Додавання явних перевірок на наявність паттернів обходу шляху (
../) перед формуванням команди.
Повторне сканування після виправлення показало різке зниження рівня ризику, що підтверджує: усунення вразливості усунуло її першопричину.
Хто виграє, а хто програє
- Розробники ШІ, які вбудовують MCP-сервер у свої продукти, тепер мають конкретний приклад того, як один пропущений крок очищення даних може зруйнувати весь ланцюг безпеки. Ставтеся до кожного параметра, що надходить від мовної моделі, як до недовіреного вводу, так само як до будь-якого зовнішнього API-запиту.
Інша сторона медалі
Дослідник наголошує, що сам протокол MCP залишається надійним. Вразливість є не конструктивним недоліком формату передачі даних, а помилкою кодування в конкретній реалізації. Більші проєкти з ретельним аудитом уже вирішили подібні проблеми, і спільнота open-source може повчитися на виправленні AgenticX. Проте цей інцидент демонструє, що проєкти «середнього рівня» можуть містити критичні помилки, попри скромну кількість зірок.
Висновок
Одна неперевірена f-string в AgenticX перетворила весь MCP-сервер на плацдарм для виконання довільного коду. Цей випадок доводить, що безпека екосистем ШІ-агентів залежить не стільки від протоколу, скільки від дисциплінованої реалізації. Розробники повинні ставитися до кожного параметра, згенерованого LLM, як до ворожого, платформи мають впроваджувати засоби захисту під час виконання (runtime safeguards), а інструменти безпеки мають еволюціонувати, щоб розуміти унікальні ланцюги довіри, які створюють ШІ-агенти.
Джерело: dev.to/easterndev/i-scanned-24-mcp-server-projects-and-found-a-real-sandbox-command-injection-cvss-98-4k9h
