# V5009. OWASP. Unchecked tainted data is used in expression.

Анализатор обнаружил использование данных, полученных извне, без предварительной проверки. Такой сценарий излишнего доверия может привести к различным негативным последствиям, в том числе - стать причиной уязвимостей.

На данный момент диагностическое правило V5009 выявляет ошибки по нескольким паттернам:

- Использование недостоверных данных в качестве аргумента функции, который должен содержать проверенные данные.
- Порча указателя за счёт изменения его значения с использованием недостоверных данных.

Рассмотрим все паттерны более подробно.

Пример подозрительного кода при использовании недостоверных данных в аргументе функции.

    char buf[1024];
    char username [256];
    ....
    if (scanf("%255s", username) == 1)
    {
      if (snprintf(buf, sizeof(buf) - 1, commandFormat, username) > 0)
      {
        int exitCode = system(buf); // <=
        ....
      }
      ....
    }

Этот код является уязвимым, т.к. пользовательский ввод передаётся командному интерпретатору без проверки полученных данных. Например, введя "&cmd", на Windows можно получить доступ к командному интерпретатору.

Правильный код должен осуществлять дополнительную проверку считанных данных:

    if (IsValid(username))
    {
      if (snprintf(buf, sizeof(buf) - 1, commandFormat, username) > 0)
      {
        int exitCode = system(buf);
        ....
      }
      ....
    }
    else
    {
      printf("Invalid username: %s", username);
      ....
    }

Пример подозрительного кода, связанного с порчей указателя.

    size_t offset = 0;
    int *pArr = arr;
    ....
    if (scanf("%zu", &offset) == 1)
    {
      pArr += offset; // <=
      ....
      DoSomething(pArr);
    }

В данном случае портится значение указателя 'pArr', т.к. в результате прибавления непроверенного значения 'offset' указатель может начать ссылаться за пределы массива. В результате можно испортить какие-то данные (на которые будет ссылаться 'pArr') с непредсказуемыми последствиями.

Правильный код проверяет допустимое смещение:

    if (offset <= allowableOffset)
    {
      pArr += offset;
      ....
      DoSomething(pArr);
    }

Данная диагностика классифицируется как:

CWE-134 CWE-20 CWE-78 OWASP-5.1.3 OWASP-5.3.8 OWASP-5.4.2