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

Материал из Rosalab Wiki
Перейти к: навигация, поиск
м (оформление)
м (оформление)
Строка 1: Строка 1:
 
{{Примечание|Статья в процессе написания. Переносится из написанного ранее [http://wiki.rosalab.ru/ru/images/b/b3/Securing_Memory_and_Kernel.pdf документа PDF].}}<br />
 
{{Примечание|Статья в процессе написания. Переносится из написанного ранее [http://wiki.rosalab.ru/ru/images/b/b3/Securing_Memory_and_Kernel.pdf документа PDF].}}<br />
  
== Защита памяти и ядра в ОС ROSA. Свод требований. ==
+
== Защита памяти и ядра в ОС ROSA. Свод требований ==
  
 
Здесь приведены рекомендации по настройке ядра и опций защиты памяти. Критически важно защищать ядро и системную память. Если допустить, что ядро или память скомпрометированы, то нет никаких гарантий в правильной работе любых механизмов безопасности и системы в целом.
 
Здесь приведены рекомендации по настройке ядра и опций защиты памяти. Критически важно защищать ядро и системную память. Если допустить, что ядро или память скомпрометированы, то нет никаких гарантий в правильной работе любых механизмов безопасности и системы в целом.
  
Сводная информация с рекомендуемыми настройками для ядра ОС и проекция к Методическому документу ФСТЭК «Рекомендации по обеспечению безопасной настройки операционных систем Linux» от 25 декабря 2022 г. -- приведена в таблице ниже:
+
Сводная информация с рекомендуемыми настройками для ядра ОС и проекция к Методическому документу ФСТЭК «Рекомендации по обеспечению безопасной настройки операционных систем Linux» от 25 декабря 2022 г. — приведена в таблице ниже:
  
 
{| class="wikitable"
 
{| class="wikitable"
Строка 21: Строка 21:
 
| 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 || Текст ячейки || Неактивно
 
| 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 || Текст ячейки ||  
+
| 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 || Текст ячейки || Неактивно
 
| 7 || <code>mitigations=auto,nosmt</code> || <code>/etc/default/grub</code> || 2.4.7 || Текст ячейки || Неактивно
Строка 53: Строка 53:
  
 
== Защита памяти и ядра ОС ==
 
== Защита памяти и ядра ОС ==
 +
 
'''В чем опасность?'''
 
'''В чем опасность?'''
  
Опасность заключается в возможности получения доступа к данным, обрабатывающимся ядром. Данные, которые обрабатывает ядро носят критическую ценность для ОС и её пользователей. Если они неправомочно доступны, то с их помощью можно реализовать атаки любого вида. По умолчанию в Linux имеются возможности загрузки другого ядра (подмены), или использовании потенциально опасных модулей (драйверов) ядра, в том числе без перезагрузки. Это может привести к обходу механизмов защиты и любой другой опасной активности.
+
Опасность заключается в возможности получения доступа к данным, обрабатывающимся ядром. Данные, которые обрабатывает ядро носят критическую ценность для ОС и её пользователей. Если они неправомочно доступны, то с их помощью можно реализовать атаки любого вида. По умолчанию в Linux имеются возможности загрузки другого ядра (подмены), или использовании потенциально опасных модулей (драйверов) ядра, в том числе без перезагрузки. Это может привести к обходу механизмов защиты и любой другой опасной активности.
  
 
'''Что можно сделать для повышения безопасности?'''
 
'''Что можно сделать для повышения безопасности?'''
  
Можно активизировать собственные механизмы защиты ядра ОС, направленные на противодействие атакам разного рода, такие как: защита памяти, защита от переполнения буфера, контроль целостности ядра и загружаемых драйверов, ограничить отладку и т.п. Информация о механизмах защиты ядра с пояснениями приведена далее.
+
Можно активизировать собственные механизмы защиты ядра ОС, направленные на противодействие атакам разного рода, такие как: защита памяти, защита от переполнения буфера, контроль целостности ядра и загружаемых драйверов, ограничить отладку и т. п. Информация о механизмах защиты ядра с пояснениями приведена далее.
  
Ядро является основным и наиболее критическим компонентом любого дистрибутива операционной системы Linux, в том числе и с точки зрения выполнения функций безопасности. Большинство их сосредоточено именно в ядре, либо так или иначе выполняется при посредничестве ядра ОС.  
+
Ядро является основным и наиболее критическим компонентом любого дистрибутива операционной системы Linux, в том числе и с точки зрения выполнения функций безопасности. Большинство их сосредоточено именно в ядре, либо так или иначе выполняется при посредничестве ядра ОС.
  
Ядро обрабатывает данные программ, управляет страницами памяти и взаимодействием между процессами, управляет файловыми системами, сетью, всей периферией, занимается разграничением доступа, генерирует первичные сообщения аудита, может контролировать целостность программ, управляет жизненным циклом каждого процесса, управляет вводом и выводом, и т.п. Следовательно, во время работы, в ядре обрабатывается или хранится множество важнейшей информации -- ключи шифрования, пароли или хеши паролей (аутентификационная информация), защищаемые данные, а также принимаются решения о доступе.  
+
Ядро обрабатывает данные программ, управляет страницами памяти и взаимодействием между процессами, управляет файловыми системами, сетью, всей периферией, занимается разграничением доступа, генерирует первичные сообщения аудита, может контролировать целостность программ, управляет жизненным циклом каждого процесса, управляет вводом и выводом, и т. п. Следовательно, во время работы, в ядре обрабатывается или хранится множество важнейшей информации — ключи шифрования, пароли или хеши паролей (аутентификационная информация), защищаемые данные, а также принимаются решения о доступе.
  
Кроме того, поскольку ядро еще и отслеживает все другие компоненты ОС. Важно, чтобы выполнялось только то ядро, которое является доверенным. Иначе может произойти раскрытие информации, и данные пользователей, а также пароли или ключи шифрования, могут быть скомпрометированы. Кроме того, если не защищать ядро ОС, то нарушитель может попытаться изменить состав модулей (драйверов) ядра. Это может привести к самым непредсказуемым последствиям. Под угрозой окажутся любые обрабатываемые данные и функции безопасности. Так можно преодолеть защиту, отключив важную подсистему ядра ОС Linux, например механизм аудита, функции разграничения доступа (SELinux), выключить защиту памяти или фильтр пакетов. Любым возможностям несанкционированного взаимодействия с ядром необходимо препятствовать.
+
Кроме того, поскольку ядро еще и отслеживает все другие компоненты ОС. Важно, чтобы выполнялось только то ядро, которое является доверенным. Иначе может произойти раскрытие информации, и данные пользователей, а также пароли или ключи шифрования, могут быть скомпрометированы. Кроме того, если не защищать ядро ОС, то нарушитель может попытаться изменить состав модулей (драйверов) ядра. Это может привести к самым непредсказуемым последствиям. Под угрозой окажутся любые обрабатываемые данные и функции безопасности. Так можно преодолеть защиту, отключив важную подсистему ядра ОС Linux, например механизм аудита, функции разграничения доступа (SELinux), выключить защиту памяти или фильтр пакетов. Любым возможностям несанкционированного взаимодействия с ядром необходимо препятствовать.
  
 
Подробная информация об известных техниках эксплуатации уязвимостей в ядре ОС Linux приведена по ссылке: https://github.com/xairy/linux-kernel-exploitation
 
Подробная информация об известных техниках эксплуатации уязвимостей в ядре ОС Linux приведена по ссылке: https://github.com/xairy/linux-kernel-exploitation
Строка 71: Строка 72:
 
=== Защита от просмотра адресов указателей ===
 
=== Защита от просмотра адресов указателей ===
  
Переменная ядра ОС, отвечающая за доступ к интерфейсам ядра <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>/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>kernel.kptr_restrict</code> определено значение <code>0</code>, то просматривать значения адресов в памяти может любой пользователь ОС. Если задано значение <code>1</code>, то просматривать адресацию функций может только <code>root</code>. Если значение равно <code>2</code>, то никто не получит информацию об адресации. Рекомендуемое значение — два. При значении единица — отображение адресов заменяется на нули для всех пользователей, кроме <code>root</code>. При значении два — отображение адресов заменяется на нули для всех пользователей, включая <code>root</code>.
  
 
Для проверки текущего значения этой переменной выполнить:
 
Для проверки текущего значения этой переменной выполнить:
Строка 86: Строка 87:
 
<code>echo 'kernel.kptr_restrict = 2' >> /etc/sysctl.conf</code>
 
<code>echo 'kernel.kptr_restrict = 2' >> /etc/sysctl.conf</code>
  
 
+
=== Отключение трассировки процессов ===
 +
pass
  
  
 
[[Категория:Безопасность]]
 
[[Категория:Безопасность]]

Версия 21:33, 9 декабря 2023

Idea.png
Примечание
Статья в процессе написания. Переносится из написанного ранее документа PDF.

Защита памяти и ядра в ОС 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 Текст ячейки Неактивно
18 vm.mmap_min_addr=4096 /etc/sysctl.conf 2.5.10 Текст ячейки 65536
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

Отключение трассировки процессов

pass