CERT C: Rec. POS05-C

Ограничьте доступ к файлам путем создания тюрьмы

Описание

Управляйте определением

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

Примеры

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

Описание

Манипуляция с файлами после chroot() без chdir("/") обнаруживает доступ к файловой системе за пределами тюрьмы, созданной chroot. Путем вызова chroot вы создаете тюрьму файловой системы, которая ограничивает доступ к определенной подсистеме файла. Однако эта тюрьма неэффективна, если вы не вызываете chdir("/").

Риск

Если вы не вызываете chdir("/") после создания тюрьмы chroot, функции манипуляции с файлами, который берет путь, когда аргумент может получить доступ к файлам за пределами тюрьмы. Атакующий может все еще управлять файлами вне подсистемы, которую вы задали, делая chroot тюрьму неэффективной.

Фиксация

После вызова chroot вызовите chdir("/"), чтобы сделать вашу тюрьму chroot более безопасной.

Пример - открытый файл в chroot - тюрьма

#include <unistd.h>
#include <stdio.h>

const char root_path[] = "/var/ftproot";
const char log_path[] = "file.log";
FILE* chrootmisuse() {
    FILE* res;
    chroot(root_path);
    chdir("base"); 
    res = fopen(log_path, "r"); 
    return res;
}

Этот пример использует chroot, чтобы создать chroot-тюрьму. Однако, чтобы использовать тюрьму chroot надежно, необходимо вызвать chdir("\") позже. Этот пример вызывает chdir("base"), который не эквивалентен. Средство поиска ошибки также отмечает fopen, потому что fopen открывает файл в уязвимом chroot - тюрьма.

Исправление — вызывает chdir("/")

Перед вводными файлами вызовите chdir("/").

#include <unistd.h>
#include <stdio.h>

const char root_path[] = "/var/ftproot";
const char log_path[] = "file.log";
FILE* chrootmisuse() {
    FILE* res;
    chroot(root_path);
    chdir("/");    
    res = fopen(log_path, "r");
    return res;
}

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

Группа: Rec. 50. POSIX (POS)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.