Рекомендации по безопасной настройке операционных систем на базе Linux
Содержание
Настройка средств защиты ядра Linux
СЗ-1. Включить защиту JIT-компилятора eBPF ядра Linux
СЗ-2. Инициализировать нулем динамическую память ядра при выделении
СЗ-3. Запретить слияние кэшей slab-аллокатора ядра
СЗ-4. Включить IOMMU
СЗ-5. Включить рандомизацию расположения стека ядра
СЗ-6. Включить средства защиты от аппаратных уязвимостей центрального процессора
СЗ-7. Включить изоляцию таблиц страниц ядра
СЗ-8. Запретить аллокацию первых страниц виртуальной памяти
Уменьшение периметра атаки ядра Linux
ПА-1. Ограничить доступ к журналу ядра
ПА-2. Предотвратить утечку информации об адресах объектов ядра через /proc и другие интерфейсы
ПА-3. Ограничить доступ к событиям производительности
ПА-4. Отключить системный вызов kexec_load()
ПА-5. Ограничить использование user namespaces
ПА-6. Запретить системный вызов bpf() для непривилегированных пользователей
ПА-7. Запретить системный вызов userfaultfd() для непривилегированных пользователей
ПА-8. Запретить автоматическую загрузку модулей ядра, отвечающих за поддержку дисциплины линии терминала
ПА-9. Отключить vsyscall
ПА-10. Отключить монтирование debugfs
ПА-11. Отключить TSX
ПА-12. Ограничить опасное использование механизма TIOCSTI
Настройка средств защиты пользовательского пространства со стороны ядра Linux
ПП-1. Запретить подключение к процессам с помощью ptrace()
ПП-2. Запретить небезопасный переход по символическим ссылкам
ПП-3. Запретить небезопасные операции с жесткими ссылками
ПП-4. Запретить небезопасные операции с FIFO-объектами
ПП-5. Запретить небезопасную запись файлов
ПП-6. Запретить создание дампа памяти для некоторых процессов
ПП-7. Включить полную рандомизацию размещения адресного пространства (ASLR)
ПП-8. Запретить доступ к прямой работе с floppy-дисками для непривилегированных пользователей
В данной документации представлены рекомендации по безопасной настройке операционных систем на базе ядра Linux. Они направлены на повышение защищенности информационных систем, построенных с использованием Linux, и позволяют снизить риски реализации угроз безопасности.
Данные рекомендации разделены на три группы по типу влияния на безопасность операционной системы:
- настройка средств защиты ядра,
- уменьшение периметра атаки ядра,
- настройка средств защиты пользовательского пространства со стороны ядра.
Для автоматизированной проверки данных параметров, а также опций компиляции ядра Linux, влияющих на безопасность, рекомендуем воспользоваться открытым инструментом kernel-hardening-checker.
Внимание! Изменение параметров безопасности ядра Linux может также оказать влияние на производительность системы и функциональность ПО в пользовательском пространстве. Поэтому данные рекомендации следует применять осознанно, с надлежащим тестированием, исходя из функционального назначения и модели угроз информационной системы.
Настройка средств защиты ядра Linux
В данном разделе перечислены опции sysctl и опции загрузки ядра (kernel cmdline parameters), которые позволяют усложнить эксплуатацию уязвимостей в ядре Linux.
СЗ-1. Включить защиту JIT-компилятора eBPF ядра Linux
В эксплойтах для ядра Linux может использоваться техника JIT spraying. Чтобы предотвратить атаки с применением данной техники, следует включить механизм защиты JIT-компилятора eBPF.
Рекомендации по настройке: установить значение опции sysctl net.core.bpf_jit_harden=2.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: данное средство защиты незначительно замедляет только движок eBPF JIT. Его замедление на 8% можно измерить на микробенчмарке из test_bpf.ko. С включением bpf_jit_harden движок eBPF JIT все равно остается почти в два раза
быстрее, чем интерпретатор eBPF.
СЗ-2. Инициализировать нулем динамическую память ядра при выделении
Инициализация динамической памяти ядра нулем при выделении затрудняет эксплуатацию уязвимостей типа Use After Free (использование после освобождения). Данная технология успешно применяется в ядре Linux для Android.
Безопасное значение по умолчанию также можно настроить с помощью параметра компиляции ядра Linux CONFIG_INIT_ON_ALLOC_DEFAULT_ON.
Рекомендации по настройке: установить значение опции загрузки ядра init_on_alloc=1.
Класс: влияет на сетевой и локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: возможно незначительное падение производительности (считается приемлемым для Android).
СЗ-3. Запретить слияние кэшей slab-аллокатора ядра
Запрет слияния кэшей slab-аллокатора ядра существенно затрудняет эксплуатацию повреждения памяти в динамической памяти ядра (heap).
Рекомендации по настройке: установить опцию загрузки ядра slab_nomerge.
Класс: влияет на сетевой и локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: нет.
СЗ-4. Включить IOMMU
Модуль управления памятью для операций ввода-вывода (IOMMU) ограничивает доступ к системной памяти для устройств на шине ввода-вывода, например PCI. Это необходимо для изоляции устройств и противодействия DMA-атакам. Для повышения безопасности системы следует включить IOMMU.
Примечание. Степень защиты от DMA-атак зависит от возможностей IOMMU на конкретной платформе, а также от настройки доменов IOMMU со стороны прошивки и операционной системы.
Рекомендации по настройке: установить значения для следующих опций загрузки ядра:
iommu=forceiommu.strict=1iommu.passthrough=0
Класс: влияет на физический вектор атаки.
Последующие ограничения: нет. При этом необходимо обязательно проверить, что после установки данных параметров устройства на шине ввода-вывода работают корректно.
Снижение производительности: возможно при определенных сценариях.
СЗ-5. Включить рандомизацию расположения стека ядра
Рандомизация расположения стека ядра при каждом очередном системном вызове мешает работе эксплойтов, использующих данные в стеке ядра.
Рекомендации по настройке: установить значение опции загрузки ядра randomize_kstack_offset=1.
Класс: влияет на сетевой и локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: сопоставимо с погрешностью измерения.
СЗ-6. Включить средства защиты от аппаратных уязвимостей центрального процессора
В ядре Linux присутствуют средства защиты от аппаратных уязвимостей центрального процессора, также известных как Transient Execution Vulnerabilities, таких как Meltdown, Spectre, MDS. Параметр загрузки ядра mitigations позволяет включить эти средства защиты.
Рекомендации по настройке: возможны следующие варианты настройки:
mitigations=auto— все средства защиты будут включены, однако для архитектуры x86 при этом останется включенной одновременная многопоточность (Simultaneous Multithreading, SMT), даже если эта технология подвержена указанным уязвимостям;mitigations=auto,nosmt— будут использоваться все средства защиты, для архитектуры x86 будет дополнительно отключена технология SMT, если она уязвима.
Примечание. Установка значения auto,nosmt может привести к снижению производительности.
При принятии решения о том, включать ли данные средства защиты, необходимо учитывать следующие факторы:
- модель безопасности информационной системы;
- необходимость исполнения недоверенного кода в конкретной системе;
- использование средств виртуализации в конкретной системе.
Примечание. Многие из данных средств защиты для архитектуры x86 требуют также обновления микрокода.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: зависит от типа нагрузки системы, поэтому рекомендуется предварительно провести нагрузочное тестирование информационной системы.
СЗ-7. Включить изоляцию таблиц страниц ядра
Аппаратная уязвимость Meltdown (Spectre v3, CVE-2017-5754) позволяет злоумышленнику получить несанкционированный доступ на чтение к привилегированной памяти (памяти ядра ОС). Изоляция таблиц страниц ядра (Kernel Page Table Isolation, KPTI) затрудняет проведение данной атаки. Кроме того, механизм KPTI предотвращает исполнение пользовательского кода из контекста ядра (этот метод эксплуатации уязвимостей называется ret2usr).
Рекомендации по настройке: установить значение опции загрузки ядра pti=on.
Класс: влияет на сетевой и локальный вектор атаки.
Последующие ограничения: нет.
Снижение производительности: Возможно снижение быстродействия, которое зависит от типа функциональной нагрузки ОС. Для точного ответа необходимо тестирование производительности системы с типовой нагрузкой.
СЗ-8. Запретить аллокацию первых страниц виртуальной памяти
Для пользовательских процессов не следует разрешать аллокацию первых страниц виртуальной памяти, так как это может быть использовано атакующим для эксплуатации уязвимостей разыменования нулевого указателя в ядре. Рекомендуем настроить sysctl-параметр vm.mmap_min_addr, чтобы запретить выделение первых 64 KiB адресного пространства.
Безопасное значение по умолчанию также можно настроить с помощью параметра компиляции ядра Linux CONFIG_DEFAULT_MMAP_MIN_ADDR.
Рекомендации по настройке: установить значение опции sysctl vm.mmap_min_addr=65536.
Примечание. Для 32-битной микроархитектуры arm из-за особенностей загрузчика следует использовать vm.mmap_min_addr=32768.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность современных пользовательских программ.
Снижение производительности: нет.
Уменьшение периметра атаки ядра Linux
ПА-1. Ограничить доступ к журналу ядра
Доступ непривилегированных пользователей к журналу ядра с помощью команды dmesg приводит к утечке информации, которой может воспользоваться атакующий при эксплуатации уязвимостей ядра. Следует ограничить доступ к журналу ядра для непривилегированных пользователей: он должен быть доступен только администраторам системы, имеющим разрешение CAP_SYSLOG.
Рекомендации по настройке: установить значение опции sysctl kernel.dmesg_restrict=1.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Это не вредит обычным сценариям использования систем.
Снижение производительности: нет.
ПА-2. Предотвратить утечку информации об адресах объектов ядра через /proc и другие интерфейсы
При эксплуатации уязвимостей в ядре Linux атакующий может воспользоваться утечкой информации через /proc и другие интерфейсы. Чтобы ее предотвратить, следует включить механизм замены на 0 для адресов объектов ядра, доступных через данные интерфейсы.
Рекомендации по настройке: установить значение опции sysctl kernel.kptr_restrict=2.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: это в некоторой мере затрудняет отладку ядра Linux для разработчиков, но никак не влияет на обычные сценарии использования систем.
Снижение производительности: нет.
ПА-3. Ограничить доступ к событиям производительности
События производительности (performance events) представляют ценность для атакующего. Следует ограничить доступ к событиям производительности для непривилегированных пользователей: данная информация должна быть доступна только администраторам системы, имеющим разрешение CAP_PERFMON.
Рекомендации по настройке: установить значение опции sysctl kernel.perf_event_paranoid=3.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Это не вредит обычным сценариям использования систем.
Снижение производительности: нет.
ПА-4. Отключить системный вызов kexec_load()
С помощью системного вызова kexec_load() атакующий может подменить образ ядра и нарушить цепочку доверенной загрузки. Это один из способов установки руткитов в Linux-системах. Следует отключить системный вызов kexec_load().
Рекомендации по настройке: установить значение опции sysctl kernel.kexec_load_disabled=1.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: сценарии использования систем, задействующих kexec_load(), становятся недоступны. Однако системы с повышенными требованиями к безопасности и с построенной цепочкой доверенной загрузки не используют такие сценарии.
Снижение производительности: нет.
ПА-5. Ограничить использование user namespaces
Функциональность user namespaces (USER_NS) позволяет независимо назначать идентификаторы пользователей (UID) внутри контейнеров Linux. В частности, с ее помощью можно создать ненастоящего пользователя root, который будет администратором только в конкретном контейнере.
Функциональность USER_NS используется веб-браузерами для изоляции своих процессов друг от друга. Однако данная функциональность критически увеличивает поверхность атаки ядра Linux, так как ненастоящий пользователь root внутри контейнера имеет доступ к привилегированным API ядра.
Многие эксплойты для ядра Linux работают именно из USER_NS. Поэтому множество авторитетных источников рекомендуют отключать USER_NS, если эта функциональность не является критически важной для выполнения бизнес-задачи информационной системы.
Обзор дискуссии о USER_NS в списке рассылки LKML: https://lwn.net/Articles/673597/
Рекомендации по настройке: установить значение опции sysctl user.max_user_namespaces=0.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: если система на базе Linux не использует user namespaces для выполнения своей задачи, то установка данного параметра никак не повлияет на работу системы. Рекомендуется проверить функциональность на тестовой системе после настройки.
Снижение производительности: нет.
ПА-6. Запретить системный вызов bpf() для непривилегированных пользователей
Системный вызов bpf() позволяет использовать технологию eBPF (extended Berkeley Packet Filter) для загрузки кода в ядро Linux. Многие атаки на ядро Linux становятся возможными из-за того, что системный вызов bpf() доступен непривилегированным пользователям. Следует
запретить системный вызов bpf() для непривилегированных пользователей.
Рекомендации по настройке: установить значение опции sysctl kernel.unprivileged_bpf_disabled=1.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: если непривилегированные процессы в системе на базе Linux не используют BPF для выполнения своей задачи, то установка данного параметра никак не повлияет на работу системы. Рекомендуется проверить функциональность на тестовой системе после настройки.
Снижение производительности: нет.
ПА-7. Запретить системный вызов userfaultfd() для непривилегированных пользователей
Системный вызов userfaultfd() часто используется атакующими в эксплойтах для уязвимостей ядра Linux. Один из многочисленных примеров: https://a13xp0p0v.github.io/2021/02/09/CVE-2021-26708.html.
Данная функциональность, доступная непривилегированному пользователю, позволяет атакующему построить надежный эксплойт-примитив для выполнения heap spraying: https://duasynt.com/blog/linux-kernel-heap-spray.
Следует запретить системный вызов userfaultfd() для непривилегированных пользователей.
Рекомендации по настройке: установить значение опции sysctl vm.unprivileged_userfaultfd=0.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет, начиная с версии ядра 5.11. В ядре Linux версии выше 5.11 был изменен принцип работы данного параметра. Теперь вместо запрета userfaultfd() для непривилегированных пользователей установка vm.unprivileged_userfaultfd=0 запрещает им использовать данный системный вызов для памяти ядра. Это предотвращает атаки с помощью userfaultfd() и при этом не вредит обычным сценариям использования систем. Для систем, использующих более старое ядро Linux, рекомендуется проверить функциональность на тестовой системе после настройки.
Снижение производительности: нет.
ПА-8. Запретить автоматическую загрузку модулей ядра, отвечающих за поддержку дисциплины линии терминала
Модули ядра Linux, отвечающие за поддержку дисциплины линии (ldisc) для терминала (tty), могут содержать уязвимости, которые позволяют атакующему повысить привилегии в системе. Следует отключить автоматическую загрузку таких модулей, чтобы уменьшить периметр атаки
ядра.
Рекомендации по настройке: установить значение опции sysctl dev.tty.ldisc_autoload=0.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: модули ldisc могут быть загружены только привилегированным пользователем. Это не вредит обычным сценариям использования систем.
Снижение производительности: нет.
ПА-9. Отключить vsyscall
Если устаревший интерфейс vsyscall включен, то ядро размещает функции vsyscall по фиксированным адресам 0xffffffffff600x00, что дает атакующему большие возможности при перехвате потока управления. Следует отключить этот устаревший механизм, если в его использовании нет необходимости.
Рекомендации по настройке: установить значение опции загрузки ядра vsyscall=none.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: это никак не помешает, если на системе не запускаются статически слинкованные исполняемые файлы и программы, использующие glibc до версии 2.14.
Снижение производительности: нет.
ПА-10. Отключить монтирование debugfs
Виртуальная файловая система debugfs дает дополнительные возможности атакующему, а также значительно увеличивает периметр атаки ядра. Необходимо отключить монтирование debugfs. Кроме того, если есть возможность, следует полностью отключить эту функциональность.
Рекомендации по настройке: установить значение опции загрузки ядра debugfs=no-mount (или лучше off).
Класс: влияет на локальный вектор атаки.
Последующие ограничения: установка данного параметра делает интерфейсы debugfs недоступными для прикладных программ, поэтому предварительно стоит уточнить необходимость в таком доступе для них.
Снижение производительности: нет.
ПА-11. Отключить TSX
Технология Transactional Synchronization Extensions (TSX), которая присутствует в процессорах Intel, подвержена аппаратной уязвимости TSX Asynchronous Abort (TAA) (CVE-2019-11135). Следует отключить технологию TSX, если система не работает с транзакционной памятью.
Рекомендации по настройке: установить значение опции загрузки ядра tsx=off.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: установка данного параметра отключает инструкции TSX-NI (Transactional Synchronization Extensions New Instructions) для работы с транзакционной памятью.
Снижение производительности: нет.
ПА-12. Ограничить опасное использование механизма TIOCSTI
Устаревший ioctl-вызов TIOCSTI для терминала (tty) позволяет атакующему выполнить локальное повышение привилегий в системе. Этот механизм не должен быть доступен для непривилегированных пользователей. В ядре Linux с версии 6.2 можно ограничить использование TIOCSTI с помощью sysctl-опции dev.tty.legacy_tiocsti.
Безопасное значение по умолчанию также можно настроить с помощью отключения параметра компиляции ядра Linux CONFIG_LEGACY_TIOCSTI.
Рекомендации по настройке: установить значение опции sysctl dev.tty.legacy_tiocsti=0.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность современных пользовательских программ. Однако после настройки рекомендуем проверить работу tty.
Снижение производительности: нет.
Настройка средств защиты пользовательского пространства со стороны ядра Linux
ПП-1. Запретить подключение к процессам с помощью ptrace()
Атакующие могут подключаться к процессам с помощью системного вызова ptrace(), что позволяет им перехватывать SSH-сессии и внедрять произвольный код. Следует установить ограничения на использование ptrace().
Рекомендации по настройке: установить значение опции sysctl kernel.yama.ptrace_scope=3.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Механизм ptrace используется разработчиками при отладке. Системы в промышленной эксплуатации его не используют.
Снижение производительности: нет.
ПП-2. Запретить небезопасный переход по символическим ссылкам
В Linux при обработке символических ссылок (symlinks) может возникать состояние гонки. Ошибки такого типа используются для атак с целью повышения привилегий в системе.
Пример атаки: привилегированный процесс проверяет отсутствие некоторого файла, который собирается создать. В момент между этой проверкой и созданием файла атакующий может успеть создать символическую ссылку с таким же именем, но указывающую на другой файл. В результате привилегированный процесс произведет запись в файл, указанный атакующим.
Следует запретить небезопасный переход по символическим ссылкам.
Рекомендации по настройке: установить значение опции sysctl fs.protected_symlinks=1.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность прикладных программ и блокирует только вредоносное поведение.
Снижение производительности: нет.
ПП-3. Запретить небезопасные операции с жесткими ссылками
В Linux при обработке жестких ссылок (hard links) может возникать состояние гонки. Ошибки такого типа используются для атак с целью повышения привилегий в системе.
Метод эксплуатации аналогичен с атакой через symlink: привилегированный процесс проходит по ссылке, созданной другим пользователем.
Следует запретить небезопасные операции с жесткими ссылками: пользователь должен иметь возможность создать жесткую ссылку на файл, только если он является владельцем этого файла или имеет права доступа к файлу на чтение и запись.
Рекомендации по настройке: установить значение опции sysctl fs.protected_hardlinks=1.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность прикладных программ и блокирует только вредоносное поведение.
Снижение производительности: нет.
ПП-4. Запретить небезопасные операции с FIFO-объектами
Операционные системы на базе ядра Linux подвержены атакам, при которых пользовательская программа вместо нормальной работы с файлом выполняет непреднамеренную запись в FIFO-объект, контролируемый атакующим. В ядре Linux существует механизм защиты от таких атак, запрещающий небезопасные операции с FIFO-объектами. Например, операция open для FIFO-объекта с флагом O_CREAT блокируется, если файл уже существует или пользователь не является владельцем директории. Следует включить данный механизм защиты.
Рекомендации по настройке: установить значение опции sysctl fs.protected_fifos=2.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность прикладных программ и блокирует только вредоносное поведение.
Снижение производительности: нет.
ПП-5. Запретить небезопасную запись файлов
Операционные системы на базе ядра Linux подвержены атакам, при которых пользовательская программа вместо нормальной работы с исходным файлом выполняет непреднамеренную запись в файл, контролируемый атакующим. В ядре Linux существует механизм защиты от таких атак, запрещающий небезопасную работу с файлами. Следует включить данный механизм защиты.
Рекомендации по настройке: установить значение опции sysctl fs.protected_regular=2.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность прикладных программ и блокирует только вредоносное поведение.
Снижение производительности: нет.
ПП-6. Запретить создание дампа памяти для некоторых процессов
Создание дампа памяти (core dump) для некоторых процессов представляет угрозу безопасности системы. Например, это относится к процессам, запущенным с измененными привилегиями за счет бита SUID. Чтобы предотвратить утечку информации, необходимо ограничить возможность
создания дампа памяти для данных процессов.
Рекомендации по настройке: установить значение опции sysctl fs.suid_dumpable=0.
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность прикладных программ и блокирует только потенциально опасное поведение.
Снижение производительности: нет.
ПП-7. Включить полную рандомизацию размещения адресного пространства (ASLR)
Рандомизация размещения адресного пространства (ASLR) затрудняет перехват потока управления и эксплуатацию уязвимостей в пользовательском пространстве, которые связаны с повреждением памяти по заданным адресам. Рекомендуем включить ASLR в полном режиме.
Рекомендации по настройке: установить значение опции sysctl kernel.randomize_va_space=2.
Класс: влияет на сетевой и локальный вектор атаки.
Последующие ограничения: нет. Установка данного параметра не влияет на нормальную функциональность современных пользовательских программ.
Снижение производительности: нет.
ПП-8. Запретить доступ к прямой работе с floppy-дисками для непривилегированных пользователей
Модуль drivers/block/floppy.c для поддержки floppy-дисков является устаревшим и неактивно поддерживаемым драйвером. Код модуля во многом сильно полагается на ограничения, определяемые физическим устройством, и также не предполагает никакой защиты от несанкционированных действий со стороны пользователя. Это подтверждается сопровождающим floppy-драйвера Денисом Ефремовым.
На общедоступных ресурсах был выявлен ряд потенциальных уязвимостей в драйвере. Один из многочисленных примеров доступен по ссылке.
Следует запретить доступ к прямой работе с floppy-дисками для непривилегированных пользователей, или рассмотреть возможность исключения модулей для поддержки floppy-дисков, активируемых опцией конфигурации BLK_DEV_FD, из используемой базовой конфигурации ядра.
Рекомендации по настройке: добавить udev-правило KERNEL=="fd[0-9]*", OWNER="root", MODE="0600".
Класс: влияет на локальный вектор атаки.
Последующие ограничения: нет. Установка ограничения не влияет на стандартную функциональность прикладных программ и блокирует только вредоносное поведение.
Снижение производительности: нет.