exponenta event banner

CERT C: Rec. WIN00-C

Быть специфичным при динамической загрузке библиотек

Описание

Определение правила

Быть специфичным при динамической загрузке библиотек. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие следующих проблем:

  • Загрузка библиотеки из относительного пути может управляться внешним субъектом.

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

Примеры

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

Проблема

Загрузка библиотеки из относительного пути может управляться внешним субъектом, который обнаруживает процедуры загрузки библиотеки, загружающие внешнюю библиотеку. При загрузке библиотеки с использованием относительного пути или без пути функция поиска ошибок помечает процедуру загрузки как дефект.

Риск

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

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

При загрузке внешней библиотеки укажите полный путь.

Пример - Открыть библиотеку с именем библиотеки
#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>

void relative_path()
{
    dlopen("liberty.dll",RTLD_LAZY);
}

В этом примере: dlopen открывает окно liberty путем вызова только имени библиотеки. Однако этот вызов библиотеки использует относительный путь для поиска библиотеки, что небезопасно.

Исправление - использовать полный путь к библиотеке

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

#include <dlfcn.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>

void relative_path()
{
    dlopen("/home/my_libs/library/liberty.dll",RTLD_LAZY);
}
Проблема

Библиотека, загруженная из внешнего управляемого пути, ищет библиотеки, загруженные из фиксированного или управляемого пути. Если непреднамеренные субъекты могут управлять одним или несколькими местоположениями на этом фиксированном пути, то Bug Finder вызывает дефект.

Риск

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

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

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

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

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

Другим решением является использование функций, требующих явных путей. Например, 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. Злоумышленник может изменить путь к библиотеке в этой переменной среды. Фактическая загружаемая библиотека может отличаться от той, которую вы планируете.

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

Одной из возможных корректировок является изменение способа получения пути к библиотеке и проверка пути к библиотеке перед открытием библиотеки. В этом примере путь принимается в качестве входного аргумента. Затем проверяется путь, чтобы убедиться, что библиотека не находится под /usr/.

#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
};

/* Function to sanitize a string */
int sanitize_str(char* s, size_t n) {
    /* strlen is used here as a kind of firewall for tainted string errors */
    int res = (strlen(s) > 0 && strlen(s) < n);
    return res;
}
void* taintedpathlib(char* userpath) {
    void* libhandle = NULL;
    if (sanitize_str(userpath, SIZE128)) {
        char lib[SIZE128] = "";

        if (strncmp(userpath, "/usr", 4)!=0) {
            strncpy(lib, userpath, SIZE128);
            strcat(lib, "/libX.so");
            libhandle = dlopen(lib, RTLD_LAZY);    
        }
    }
    return libhandle;
}

Проверить информацию

Группа: Rec. 51. Microsoft Windows (WIN)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.