Защита памяти и ядра в ОС ROSA — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
м (Consta переименовал страницу Защита памяти и ядра ОС ROSA в Защита памяти и ядра в ОС ROSA: так точнее)
(Защита памяти и ядра в ОС 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. Для нетерпеливых -- ссылка на

Ошибка создания миниатюры:
файл