﻿# Внедрение команд ОС

Инъекция команд операционной системы \(OS command injection\) – тип атаки на приложение, предоставляющий злоумышленнику возможность несанкционированного выполнения команд операционной системы на некоторой машине\. 

Помимо непосредственного внедрения самих команд, злоумышленник также может произвести и инъекцию аргумента \(argument injection\)\. Все эти атаки могут приводить к нарушению работы системы, раскрытию конфиденциальных данных и другим неприятным последствиям\.

Для защиты от инъекций команд необходимо производить проверку входных данных, конкретная реализация которой зависит от ситуации\.

Уязвимости к таким атакам принадлежат категории [A3:2021\-Injection](https://owasp.org/Top10/A03_2021-Injection/) в списке [OWASP Top Ten](https://owasp.org/Top10/) 2021\. В [Common Weakness Enumeration](https://cwe.mitre.org/) им соответствуют позиции [CWE\-77](https://cwe.mitre.org/data/definitions/77.html), [CWE\-78](https://cwe.mitre.org/data/definitions/78.html) и [CWE\-88](https://cwe.mitre.org/data/definitions/88.html)\.

## Пример уязвимости

Для наглядности разберём данную атаку на следующем примере:

```cpp
const string OperationsExecutorPath = "executor.exe";

private void HandleRequest(HttpRequest request)
{
  ....
  string operationIndex = request.QueryString["operationIndex"];
  Process.Start("cmd", $"/c {OperationsExecutorPath} {operationIndex}");

  ....
}
```

Используя некоторую утилиту 'executor\.exe', приложение будет выполнять различные действия в зависимости от содержимого запроса\. Конкретную операцию определяет значение параметра 'operationIndex'\. Приложение ожидает, что в данный параметр будет записано некоторое число, которое будет передано в команду\. Например, если 'operationIndex' будет равен '1', приложение запустит на выполнение следующую команду:

```cpp
cmd /c executor.exe 1
```

Проблема приведённого выше кода состоит в том, что входное значение никак не проверяется, что делает систему уязвимой к инъекциям команд/аргументов\. Вместо ожидаемых чисел злоумышленник может передать значение, которое приведёт к выполнению выбранной им вредоносной команды\. К примеру, в качестве значения параметра 'operationIndex' может быть передана следующая строка:

```cpp
0 & del /q /f /s .
```

Ниже приведена команда, которая будет выполнена при вызове _Process\.Start_:

```cpp
cmd /c executor.exe 0 & del /q /f /s .
```

Командный интерпретатор \(cmd\) воспринимает символ '&' как разделитель команд\. Сначала будет выполнен вполне обычный вызов некоторой утилиты 'executor\.exe' с аргументом '0', а затем – команда 'del', которая с такими аргументами удалит все файлы в текущей и вложенных директориях \(за исключением тех, для которых у приложения нет достаточных прав доступа\)\. Очевидно, что вместо команды 'del' злоумышленник мог бы использовать любую другую\. Таким образом, правильно подобранное значение 'operationIndex' позволяет выполнять произвольные команды в системе, где работает приложение\.

## Инъекции команд и инъекции аргументов

Инъекции команд и аргументов тесно связаны и во многих случаях для обоих типов атак используют термин 'инъекция команд' \(command injection\)\. Приведённый пример является демонстрацией сразу двух типов атаки\.

С одной стороны, злоумышленник добавил в переданное значение разделитель команд – '&'\. Так как приложение не проверило полученную строку на наличие этого разделителя, после обычного вызова 'executor\.exe' будет выполнена дополнительная команда 'del'\. Атаки, связанные с использованием разделителей команд, классифицируют как инъекции команд \(command injection\)\. Согласно [Common Weakness Enumeration](https://cwe.mitre.org/), такие атаки принадлежат категории [CWE\-78](https://cwe.mitre.org/data/definitions/78.html)\.

С другой стороны, приложение предполагает использование переданной пользователем строки в качестве аргумента \(причём одновременно как cmd, так и утилиты 'executor\.exe'\)\. В приведённом примере приложение не проверяет строку на наличие разделителей аргументов \(в данном случае – пробелов\)\. Из\-за этого злоумышленник может передать в cmd дополнительные аргументы, которые и приводят к выполнению вредоносных команд\. Атаки, связанные с добавлением дополнительных аргументов, называют инъекциями аргументов \(argument injection\)\. Им соответствует [CWE\-88](https://cwe.mitre.org/data/definitions/88.html)\.

Оба типа атаки могут быть также отнесены к категории [CWE\-77](https://cwe.mitre.org/data/definitions/77.html), являющейся родительской по отношению к [CWE\-78](https://cwe.mitre.org/data/definitions/78.html) и [CWE\-88](https://cwe.mitre.org/data/definitions/88.html)\.

## Способы защиты

Главная причина появления уязвимости к инъекциям команд/аргументов состоит в отсутствии корректной валидации входных данных\. Способ её проведения зависит от ситуации\. Самый общий подход заключается в проверке входных данных на наличие разделителей команд и аргументов\. Также необходимо убедиться в том, что внешние данные не приведут к подмене исходной команды\.

Как правило, наиболее удобным вариантом будет использование подходов, актуальных для конкретного случая\. К примеру, если входная строка должна содержать число, то для защиты от атак достаточно проверить, действительно ли пользователь передал число:

```cpp
private void HandleRequest(HttpRequest request)
{
  ....
  string operationIndex = request.QueryString["operationIndex"];

  if (int.TryParse(operationIndex, out int index))
  {
    Process.Start("cmd", $"/c {OperationsExecutorPath} {index}");
  }
  else
  {
    // error handling
  }
  ....
}
```

Для поиска таких проблем в коде может быть использован [taint\-анализ](https://pvs-studio.ru/ru/blog/terms/6496/)\. Данная технология позволит автоматически отследить места возможного попадания небезопасных данных в методы запуска процессов\.

## Дополнительные ссылки

1. [OWASP, OWASP Топ\-10](https://owasp.org/Top10/)
1. [Описание Command Injection на официальном сайте OWASP](https://owasp.org/www-community/attacks/Command_Injection)
1. [Диагностическое правило V5616](https://pvs-studio.ru/ru/docs/warnings/v5616/)
1. [Классификация предупреждений PVS\-Studio согласно OWASP Top 10 Web Application Security Risks](https://pvs-studio.ru/ru/pvs-studio/sast/owasptopten/)
1. [Классификация предупреждений PVS\-Studio согласно OWASP Application Security Verification Standard \(ASVS\)](https://pvs-studio.ru/ru/pvs-studio/sast/owasp/)
1. [OWASP, уязвимости и taint анализ в PVS\-Studio C\#\. Смешать, но не взбалтывать](https://pvs-studio.ru/ru/blog/posts/csharp/0831/)
1. [Терминология: taint\-анализ](https://pvs-studio.ru/ru/blog/terms/6496/)