Ін'єкція команд через MCP
Крапка з комою в аргументі інструмента стає командою оболонки.
Що таке Ін'єкція команд через MCP?
Інструмент MCP працює на сервері, тож кожен аргумент, який він отримує, — недовірений ввід. Якщо збирати команду оболонки, вклеюючи цей ввід у рядок, крапка з комою чи зворотний апостроф перестає бути даними й стає командою, яку виконує ваш сервер. Ви знайдете підсунутий аргумент у трасуванні агента й побачите, що інструмент повертає звичайну порожню відповідь, тоді як root-оболонка зі зворотним з'єднанням викрадає облікові дані бази даних. Після цього ви викличете git напряму, без оболонки на шляху. Виправлення коду не скасовує код, який уже виконався.
Що ви дізнаєтесь у Ін'єкція команд через MCP
- Усвідомте, що інструмент MCP працює на сервері, тож будь-який аргумент, з якого він збирає команду, — недовірений ввід, який може нести код
- Поясніть, як вклеювання вводу в рядок команди оболонки перетворює метасимволи на кшталт ; і | на синтаксис команди й призводить до віддаленого виконання коду
- Усвідомте, що підсунута команда виконується окремо від відповіді, тож звичайний вигляд відповіді інструмента не доводить, що нічого не сталося
- Застосуйте надійне виправлення: викликайте програму напряму й передавайте кожне значення окремим аргументом, без оболонки, яка б його інтерпретувала
- Відрізняйте параметризацію від екранування чи списків заборонених символів і поясніть, чому прибрана оболонка усуває цілу категорію вад, а не один випадок
- Підтверджуйте виправлення коду повторним запуском початкового експлойту й пам'ятайте, що хост, який уже виконав код зловмисника, потребує ротації секретів і повторного розгортання
Ін'єкція команд через MCP — Кроки навчання
-
Інструмент, що запускає git
У компанії Sarnholt працює публічний помічник для репозиторіїв. Один із його інструментів, commit_search, шукає коміти за автором. Боб не знає, як цей інструмент написаний, але будь-який інструмент, що шукає в git за іменем, яке вводить сам Боб, варто перевірити. Він відкриває того самого агента, яким може скористатися будь-хто.
-
Подивіться, як це працює
Спочатку звичайний запит: Боб дізнається, що інструмент робить з іменем, яке отримує. Введене ім'я автора перетворюється на запит до git. Git працює з командного рядка, тож десь на сервері це ім'я майже напевно підставляється в команду git. Якщо воно потрапляє туди як текст, Боб може дописати до команди своє.
-
Куди потрапляє ім'я
-
Закрийте аргумент, додайте команду
Боб просить коміти автора, чиє «ім'я» насправді не ім'я: крапкою з комою воно завершує команду git і додає команду самого Боба — завантажити зі свого хоста скрипт і запустити його.
-
Буденна відповідь приховала шкоду
Відповідь помічника нічим не вирізняється: жоден коміт не знайдено. Саме на це й розрахунок. Підсунута команда не дає про себе знати у відповіді інструмента, а тихо виконується на сервері.
-
Оболонка на сервері
Скрипт, який віддав сервер Боба, відкрив з'єднання просто до його слухача. Боб перемикається на нього, щоб побачити, що йому дав один виклик commit_search. Інструмент зробив саме те, що велів його код. Питання в тому, що в цьому коді перетворило аргумент на команду.
-
Чому це спрацювало
-
Оболонка там, де її не має бути
Алісі терміново пише команда SOC. Сповіщення не про вхід і не про файл, а про процес.
-
Що встановлює сповіщення
Сповіщення звузило пошук до одного інструмента й одного виду вхідних даних.
-
Виклик у трасуванні
Агент веде запис кожного виклику інструмента. Серед них — і виклик із підсунутою командою.
Охоплення стандартів безпеки
OWASP MCP Top 10
- MCP05:2025 Command Injection & Execution
CWE
- CWE-78 Improper Neutralization of Special Elements used in an OS Command
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security