exponenta event banner

Библиотека загружена из внешнего пути

Использование аргумента библиотеки из пути, управляемого извне

Описание

Этот дефект возникает, когда библиотеки загружаются из фиксированных или управляемых извне небезопасных путей, и непреднамеренные участники могут управлять одним или несколькими расположениями на путях. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

Если злоумышленник знает или управляет путем, используемым для загрузки библиотеки, он может изменить:

  • Библиотека, загружаемая программой, заменяющая требуемую библиотеку и команды.

  • Среда, в которой выполняется библиотека, предоставляющая злоумышленнику непреднамеренные разрешения и возможности.

Зафиксировать

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

Другим решением является использование функций, требующих явных путей. Например, system() не требует полного пути, поскольку он может использовать PATH переменная среды. Однако execl() и execv() требуется полный путь.

Примеры

развернуть все

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include <limits.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

void* taintedpathlib() {
    void* libhandle = NULL;
    char lib[SIZE128] = "";
    char* userpath = getenv("LD_LIBRARY_PATH");
    strncpy(lib, userpath, SIZE128);
    strcat(lib, "/libX.so");
    libhandle = dlopen(lib, 0x00001);
    return libhandle;
}

В этом примере загружается библиотека libX.so из переменной среды LD_LIBRARY_PATH. Злоумышленник может изменить путь к библиотеке в этой переменной среды. Фактическая загружаемая библиотека может отличаться от той, которую вы планируете.

Коррекция - изменение и проверка пути

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

  • Функция sanitize_str защищает от возможных переполнений буфера.

  • Функция identified_safe_libX_folder проверяет принадлежность пути к списку путей в белом списке.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include <limits.h>

enum {
    SIZE10  =  10,
    SIZE100 = 100,
    SIZE128 = 128
};

/* Use white list */
static const char *libX_safe_folder[] = {
  "/usr/",
  "/usr/lib",
  "/lib"
};

/* Return the index if the input is in the white list */
int identified_safe_libX_folder(const char* path)
{
  for (int i = 0; i < sizeof(libX_safe_folder) / sizeof(libX_safe_folder[0]); i ++)
    {
      if (strcmp(path, libX_safe_folder[i]) == 0)
      return i;
    }
  return -1;    
}

/* Function to sanitize a string */
char *sanitize_str(char* s, size_t n) {
  /* strlen is used here as a kind of firewall for tainted string errors */
  if (strlen(s) > 0 && strlen(s) < n)
    return s;
  else
    return NULL;
}

void* taintedpathlib(char* userpath) {
  void* libhandle = NULL;
  const char *const checked_userpath = sanitize_str(userpath, SIZE128);
  if (checked_userpath != NULL) {
    int index = identified_safe_libX_folder(checked_userpath);
    if (index > 0) {
      char lib[SIZE128] = "";
      strncpy(lib, libX_safe_folder[index], SIZE128);
      strcat(lib, "/libX.so");
      libhandle = dlopen(lib, RTLD_LAZY);    
    }
  }
  return libhandle;
}

Информация о результатах

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_PATH_LIB
Воздействие: среднее
CWE ID: 114, 426
Представлен в R2015b