Защита памяти и ядра в ОС ROSA — различия между версиями
Consta (обсуждение | вклад) м (Consta переименовал страницу Защита памяти и ядра ОС ROSA в Защита памяти и ядра в ОС ROSA: так точнее) |
Consta (обсуждение | вклад) (→Защита памяти и ядра в ОС ROSA) |
||
Строка 3: | Строка 3: | ||
Здесь приведены рекомендации по настройке ядра и опций защиты памяти. Критически важно защищать ядро и системную память. Если допустить, что ядро или память скомпрометированы, то нет никаких гарантий в правильной работе любых механизмов безопасности и системы в целом. | Здесь приведены рекомендации по настройке ядра и опций защиты памяти. Критически важно защищать ядро и системную память. Если допустить, что ядро или память скомпрометированы, то нет никаких гарантий в правильной работе любых механизмов безопасности и системы в целом. | ||
− | Сводная информация с рекомендуемыми настройками для ядра ОС и проекция к Методическому документу ФСТЭК «Рекомендации по обеспечению безопасной настройки операционных систем Linux» от 25 декабря 2022 г. -- приведена в таблице | + | Сводная информация с рекомендуемыми настройками для ядра ОС и проекция к Методическому документу ФСТЭК «Рекомендации по обеспечению безопасной настройки операционных систем Linux» от 25 декабря 2022 г. -- приведена в таблице ниже: |
+ | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
Строка 12: | Строка 13: | ||
| 2 || <code>kernel.kptr_restrict=2</code> || <code>/etc/sysctl.conf</code> || 2.4.2 || Текст ячейки || <code>0</code> | | 2 || <code>kernel.kptr_restrict=2</code> || <code>/etc/sysctl.conf</code> || 2.4.2 || Текст ячейки || <code>0</code> | ||
|- | |- | ||
− | | | + | | 3 || <code>init_on_alloc=1</code> || <code>/etc/default/grub</code> || 2.4.3 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 4 || <code>slab_nomerge</code> || <code>/etc/default/grub</code> || 2.4.4 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 5 || <code>iommu=force</code> <br /> <code>iommu.strict=1</code> <br /> <code>iommu.passthrough=0</code> || <code>/etc/default/grub</code> || 2.4.5 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 6 || <code>randomize_kstack_offset=1</code> || <code>/etc/default/grub</code> || 2.4.6 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 7 || <code>mitigations=auto,nosmt</code> || <code>/etc/default/grub</code> || 2.4.7 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 8 || <code>net.core.bpf_jit_harden=2</code> || <code>/etc/sysctl.conf</code> || 2.4.8 || Текст ячейки || <code>0</code> |
|- | |- | ||
− | | | + | | 9 || <code>vsyscall=none</code> || <code>/etc/default/grub</code> || 2.5.1 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 10 || <code>kernel.perf_event_paranoid=3</code> || <code>/etc/sysctl.conf</code> || 2.5.2 || Нет || <code>2</code> |
|- | |- | ||
− | | | + | | 11 || <code>debugfs=no-mount</code> || <code>/etc/default/grub</code> || 2.5.3 || Текст ячейки || Неактивно |
|- | |- | ||
− | | | + | | 12 || <code>kernel.kexec_load_disabled=1</code> || <code>/etc/sysctl.conf</code> || 2.5.4 || Текст ячейки || <code>0</code> |
|- | |- | ||
− | | | + | | 13 || <code>user.max_user_namespaces=0</code> || <code>/etc/sysctl.conf</code> || 2.5.5 || Текст ячейки || <code>509894</code> |
|- | |- | ||
− | | | + | | 14 || <code>kernel.unprivileged_bpf_disabled=1</code> || <code>/etc/sysctl.conf</code> || 2.5.6 || Текст ячейки || <code>2</code> |
|- | |- | ||
− | | | + | | 15 || <code>vm.unprivileged_userfaultfd=0</code> || <code>/etc/sysctl.conf</code> || 2.5.7 || Текст ячейки || <code>1</code> |
|- | |- | ||
− | | | + | | 16 || <code>dev.tty.ldisc_autoload=0</code> || <code>/etc/sysctl.conf</code> || 2.5.8 || Текст ячейки || <code>1</code> |
|- | |- | ||
− | | | + | | 17 || <code>tsx=off</code> || <code>/etc/default/grub</code> || 2.5.9 || Текст ячейки || <code>65536</code> |
|- | |- | ||
− | | | + | | 18 || <code>vm.mmap_min_addr=4096</code> || <code>/etc/sysctl.conf</code> || 2.5.10 || Текст ячейки || Текст ячейки |
|- | |- | ||
− | | | + | | 19 || <code>kernel.randomize_va_space=2</code> || <code>/etc/sysctl.conf</code> || 2.5.11 || Текст ячейки || <code>2</code> |
|- | |- | ||
− | | | + | | 20 || <code>kernel.yama.ptrace_scope=3</code> || <code>/etc/sysctl.conf</code> || 2.6.1 || Текст ячейки || <code>1</code> |
|} | |} | ||
+ | |||
+ | === В чем опасность? === | ||
+ | |||
+ | Опасность заключается в возможности получения доступа к данным, обрабатывающимся ядром. Данные, которые обрабатывает ядро носят критическую ценность для ОС и её пользователей. Если они неправомочно доступны, то с их помощью можно реализовать атаки любого вида. По умолчанию в Linux имеются возможности загрузки другого ядра (подмены), или использовании потенциально опасных модулей (драйверов) ядра, в том числе без перезагрузки. Это может привести к обходу механизмов защиты и любой другой опасной активности. | ||
+ | |||
+ | === Что можно сделать для повышения безопасности? === | ||
+ | |||
+ | Можно активизировать собственные механизмы защиты ядра ОС, направленные на противодействие атакам разного рода, такие как: защита памяти, защита от переполнения буфера, контроль целостности ядра и загружаемых драйверов, ограничить отладку и т.п. Информация о механизмах защиты ядра с пояснениями приведена далее. | ||
+ | |||
+ | Ядро является основным и наиболее критическим компонентом любого дистрибутива операционной системы Linux, в том числе и с точки зрения выполнения функций безопасности. Большинство их сосредоточено именно в ядре, либо так или иначе выполняется при посредничестве ядра ОС. | ||
+ | |||
+ | Ядро обрабатывает данные программ, управляет страницами памяти и взаимодействием между процессами, управляет файловыми системами, сетью, всей периферией, занимается разграничением доступа, генерирует первичные сообщения аудита, может контролировать целостность программ, управляет жизненным циклом каждого процесса, управляет вводом и выводом, и т.п. Следовательно, во время работы, в ядре обрабатывается или хранится множество важнейшей информации -- ключи шифрования, пароли или хеши паролей (аутентификационная информация), защищаемые данные, а также принимаются решения о доступе. | ||
+ | |||
+ | Кроме того, поскольку ядро еще и отслеживает все другие компоненты ОС. Важно, чтобы выполнялось только то ядро, которое является доверенным. Иначе может произойти раскрытие информации, и данные пользователей, а также пароли или ключи шифрования, могут быть скомпрометированы. Кроме того, если не защищать ядро ОС, то нарушитель может попытаться изменить состав модулей (драйверов) ядра. Это может привести к самым непредсказуемым последствиям. Под угрозой окажутся любые обрабатываемые данные и функции безопасности. Так можно преодолеть защиту, отключив важную подсистему ядра ОС Linux, например механизм аудита, функции разграничения доступа (SELinux), выключить защиту памяти или фильтр пакетов. Любым возможностям несанкционированного взаимодействия с ядром необходимо препятствовать. | ||
+ | |||
+ | Подробная информация об известных техниках эксплуатации уязвимостей в ядре ОС Linux приведена по ссылке: https://github.com/xairy/linux-kernel-exploitation | ||
+ | |||
+ | ==== Защита от просмотра адресов указателей ==== | ||
+ | |||
+ | Переменная ядра ОС, отвечающая за доступ к интерфейсам ядра <code>/proc/kallsyms</code> и <code>/proc/modules</code> -- это <code>kernel.kptr_restrict<code>. Просматривая эти файлы, можно получать значения адресации памяти для указателей ядра. То есть можно, например, узнать, на какой адрес в памяти ссылается указатель той или иной программы, или загруженного модуля ядра. Переменная может принимать значения <code>0</code>, <code>1</code> и <code>2</code>. Более подробное описание рисков, связанных с атакой на адреса указателей и прототип эксплойта, демонстрирующий такую возможность, приведены по ссылке: https://kernsec.org/wiki/index.php/Bug_Classes/Kernel_pointer_leak | ||
+ | |||
+ | Если для переменной <code>kernel.kptr_restrict</code> определено значение <code>0</code>, то просматривать значения адресов в памяти может любой пользователь ОС. Если задано значение <code>1</code>, то просматривать адресацию функций может только <code>root</code>. Если значение равно <code>2</code>, то никто не получит информацию об адресации. Рекомендуемое значение -- два. При значении единица -- отображение адресов заменяется на нули для всех пользователей, кроме <code>root</code>. При значении два -- отображение адресов заменяется на нули для всех пользователей, включая <code>root</code>. | ||
+ | |||
+ | Для проверки текущего значения этой переменной выполнить: | ||
+ | |||
+ | <code># sysctl -a | grep kptr</code> | ||
+ | <code>kernel.kptr_restrict = 2</code> | ||
+ | |||
+ | Если значение отличается, то выполнить установку этой переменной: | ||
+ | |||
+ | <code># sysctl -w kernel.kptr_restrict=2</code> | ||
+ | |||
+ | <code>echo 'kernel.kptr_restrict = 2' >> /etc/sysctl.conf</code> | ||
+ | |||
+ | Статья в процессе написания. Переносится из написанного ранее документа PDF. | ||
+ | Для нетерпеливых -- ссылка на | ||
+ | [[Файл:Securing Memory and Kernel.pdf|мини|без|файл]] | ||
[[Категория:Безопасность]] | [[Категория:Безопасность]] |
Версия 00:09, 6 декабря 2023
Содержание
Защита памяти и ядра в ОС ROSA
Здесь приведены рекомендации по настройке ядра и опций защиты памяти. Критически важно защищать ядро и системную память. Если допустить, что ядро или память скомпрометированы, то нет никаких гарантий в правильной работе любых механизмов безопасности и системы в целом.
Сводная информация с рекомендуемыми настройками для ядра ОС и проекция к Методическому документу ФСТЭК «Рекомендации по обеспечению безопасной настройки операционных систем Linux» от 25 декабря 2022 г. -- приведена в таблице ниже:
№ п/п | Параметр и рекомендуемое значение | Интерфейс | См. документ ФСТЭК | См. раздел | Значение по умолчанию |
---|---|---|---|---|---|
1 | kernel.dmesg_restrict=1 |
/etc/sysctl.conf |
2.4.1 | Текст ячейки | 0
|
2 | kernel.kptr_restrict=2 |
/etc/sysctl.conf |
2.4.2 | Текст ячейки | 0
|
3 | init_on_alloc=1 |
/etc/default/grub |
2.4.3 | Текст ячейки | Неактивно |
4 | slab_nomerge |
/etc/default/grub |
2.4.4 | Текст ячейки | Неактивно |
5 | iommu=force iommu.strict=1 iommu.passthrough=0 |
/etc/default/grub |
2.4.5 | Текст ячейки | Неактивно |
6 | randomize_kstack_offset=1 |
/etc/default/grub |
2.4.6 | Текст ячейки | Неактивно |
7 | mitigations=auto,nosmt |
/etc/default/grub |
2.4.7 | Текст ячейки | Неактивно |
8 | net.core.bpf_jit_harden=2 |
/etc/sysctl.conf |
2.4.8 | Текст ячейки | 0
|
9 | vsyscall=none |
/etc/default/grub |
2.5.1 | Текст ячейки | Неактивно |
10 | kernel.perf_event_paranoid=3 |
/etc/sysctl.conf |
2.5.2 | Нет | 2
|
11 | debugfs=no-mount |
/etc/default/grub |
2.5.3 | Текст ячейки | Неактивно |
12 | kernel.kexec_load_disabled=1 |
/etc/sysctl.conf |
2.5.4 | Текст ячейки | 0
|
13 | user.max_user_namespaces=0 |
/etc/sysctl.conf |
2.5.5 | Текст ячейки | 509894
|
14 | kernel.unprivileged_bpf_disabled=1 |
/etc/sysctl.conf |
2.5.6 | Текст ячейки | 2
|
15 | vm.unprivileged_userfaultfd=0 |
/etc/sysctl.conf |
2.5.7 | Текст ячейки | 1
|
16 | dev.tty.ldisc_autoload=0 |
/etc/sysctl.conf |
2.5.8 | Текст ячейки | 1
|
17 | tsx=off |
/etc/default/grub |
2.5.9 | Текст ячейки | 65536
|
18 | vm.mmap_min_addr=4096 |
/etc/sysctl.conf |
2.5.10 | Текст ячейки | Текст ячейки |
19 | kernel.randomize_va_space=2 |
/etc/sysctl.conf |
2.5.11 | Текст ячейки | 2
|
20 | kernel.yama.ptrace_scope=3 |
/etc/sysctl.conf |
2.6.1 | Текст ячейки | 1
|
В чем опасность?
Опасность заключается в возможности получения доступа к данным, обрабатывающимся ядром. Данные, которые обрабатывает ядро носят критическую ценность для ОС и её пользователей. Если они неправомочно доступны, то с их помощью можно реализовать атаки любого вида. По умолчанию в Linux имеются возможности загрузки другого ядра (подмены), или использовании потенциально опасных модулей (драйверов) ядра, в том числе без перезагрузки. Это может привести к обходу механизмов защиты и любой другой опасной активности.
Что можно сделать для повышения безопасности?
Можно активизировать собственные механизмы защиты ядра ОС, направленные на противодействие атакам разного рода, такие как: защита памяти, защита от переполнения буфера, контроль целостности ядра и загружаемых драйверов, ограничить отладку и т.п. Информация о механизмах защиты ядра с пояснениями приведена далее.
Ядро является основным и наиболее критическим компонентом любого дистрибутива операционной системы Linux, в том числе и с точки зрения выполнения функций безопасности. Большинство их сосредоточено именно в ядре, либо так или иначе выполняется при посредничестве ядра ОС.
Ядро обрабатывает данные программ, управляет страницами памяти и взаимодействием между процессами, управляет файловыми системами, сетью, всей периферией, занимается разграничением доступа, генерирует первичные сообщения аудита, может контролировать целостность программ, управляет жизненным циклом каждого процесса, управляет вводом и выводом, и т.п. Следовательно, во время работы, в ядре обрабатывается или хранится множество важнейшей информации -- ключи шифрования, пароли или хеши паролей (аутентификационная информация), защищаемые данные, а также принимаются решения о доступе.
Кроме того, поскольку ядро еще и отслеживает все другие компоненты ОС. Важно, чтобы выполнялось только то ядро, которое является доверенным. Иначе может произойти раскрытие информации, и данные пользователей, а также пароли или ключи шифрования, могут быть скомпрометированы. Кроме того, если не защищать ядро ОС, то нарушитель может попытаться изменить состав модулей (драйверов) ядра. Это может привести к самым непредсказуемым последствиям. Под угрозой окажутся любые обрабатываемые данные и функции безопасности. Так можно преодолеть защиту, отключив важную подсистему ядра ОС Linux, например механизм аудита, функции разграничения доступа (SELinux), выключить защиту памяти или фильтр пакетов. Любым возможностям несанкционированного взаимодействия с ядром необходимо препятствовать.
Подробная информация об известных техниках эксплуатации уязвимостей в ядре ОС Linux приведена по ссылке: https://github.com/xairy/linux-kernel-exploitation
Защита от просмотра адресов указателей
Переменная ядра ОС, отвечающая за доступ к интерфейсам ядра /proc/kallsyms
и /proc/modules
-- это kernel.kptr_restrict<code>. Просматривая эти файлы, можно получать значения адресации памяти для указателей ядра. То есть можно, например, узнать, на какой адрес в памяти ссылается указатель той или иной программы, или загруженного модуля ядра. Переменная может принимать значения <code>0
, 1
и 2
. Более подробное описание рисков, связанных с атакой на адреса указателей и прототип эксплойта, демонстрирующий такую возможность, приведены по ссылке: https://kernsec.org/wiki/index.php/Bug_Classes/Kernel_pointer_leak
Если для переменной kernel.kptr_restrict
определено значение 0
, то просматривать значения адресов в памяти может любой пользователь ОС. Если задано значение 1
, то просматривать адресацию функций может только root
. Если значение равно 2
, то никто не получит информацию об адресации. Рекомендуемое значение -- два. При значении единица -- отображение адресов заменяется на нули для всех пользователей, кроме root
. При значении два -- отображение адресов заменяется на нули для всех пользователей, включая root
.
Для проверки текущего значения этой переменной выполнить:
# sysctl -a | grep kptr
kernel.kptr_restrict = 2
Если значение отличается, то выполнить установку этой переменной:
# sysctl -w kernel.kptr_restrict=2
echo 'kernel.kptr_restrict = 2' >> /etc/sysctl.conf
Статья в процессе написания. Переносится из написанного ранее документа PDF. Для нетерпеливых -- ссылка на