Впровадження команд (Command Injection) це кібератака, яка полягає у виконанні довільних команд в операційній системі хоста через вразливий додаток, що передає неперевірені дані користувача до системної оболонки. Ця вразливість виникає через недостатню валідацію вхідних даних, таких як форми, файли cookie або HTTP-заголовки. На відміну від впровадження коду, де зловмисник додає власний програмний код для виконання самим додатком, при впровадженні команд атакуючий розширює стандартну функціональність програми, змушуючи її викликати системні команди операційної системи.

Механізм атаки базується на тому, що додаток запускає системні утиліти з привілеями самого додатка. Якщо програма має підвищені привілеї, наприклад, запущена з правами адміністратора, зловмисник отримує можливість виконувати команди з цими ж високими привілеями. Крім прямого введення через форми, атака може здійснюватися через маніпуляцію змінними оточення, такими як PATH або APPHOME, якщо додаток використовує їх для пошуку та запуску виконуваних файлів без належної перевірки.

Існує поширена помилка щодо поведінки функцій запуску процесів у різних мовах програмування. Наприклад, функція system у мові C передає свої аргументи безпосередньо системній оболонці для аналізу. Натомість метод Runtime.exec у Java не викликає системну оболонку. Він розділяє рядок на масив слів і виконує перше слово як команду, а інші як параметри. Через це символи зчеплення команд, такі як крапка з комою, амперсанд або вертикальна риска, сприймаються просто як параметри і викликають помилку синтаксису, що обмежує можливість швидкого злому через цей метод.

Приклад вразливості на веб-ресурсі

Розглянемо гіпотетичний сценарій на сайті example.com, де працює скрипт видалення файлів. Скрипт приймає ім'я файлу через GET-запит і передає його у системну команду видалення без очищення вхідних даних.

php<?php
$file = $_GET['filename'];
system("rm $file");
?>

Якщо зловмисник надішле запит на адресу example.com/delete.php?filename=bob.txt;id, системна оболонка спочатку виконає команду видалення файлу bob.txt, а потім, зустрівши роздільник команд у вигляді крапки з комою, виконає команду id. Результат виконання команди відобразиться у відповіді сервера, демонструючи ідентифікатори користувача та групи, під якими працює веб-сервер.

Як захиститись від впровадження команд

Найбільш ефективним способом захисту є повна відмова від виклику системних команд через оболонку операційної системи. Розробникам слід використовувати вбудовані інтерфейси програмування додатків, які надає мова програмування. Наприклад, замість виклику системної утиліти для відправки пошти через командний рядок, варто застосовувати спеціалізовані бібліотеки.

  • Застосовуйте позитивну модель безпеки, яка базується на білих списках дозволених символів або значень, оскільки визначити всі дозволені символи значно простіше, ніж передбачити всі небезпечні комбінації.
  • Очищуйте всі вхідні дані від спеціальних символів системної оболонки, таких як крапка з комою, амперсанд або вертикальна риска, якщо використання системних викликів є неминучим.
  • Уникайте використання відносних шляхів для запуску програм та ретельно очищуйте змінні оточення перед виконанням команд, щоб запобігти підміні виконуваних файлів через маніпуляції зі змінною PATH.