Вопрос или проблема
Руководство описывает значение VmFlags:
Строка "VmFlags" (доступна с Linux 3.8) представляет
флаги ядра, связанные с областью виртуальной памяти,
закодированные с использованием следующих двухбуквенных кодов:
rd - доступен для чтения
wr - доступен для записи
ex - исполняемый
sh - общий
mr - можно читать
mw - можно записывать
me - можно исполнять
ms - можно делиться
В чем разница между “доступен для чтения” и “можно читать”? Кажется, что они эквивалентны. То же самое для версий записи/исполнения/разделения.
Объявления в include/linux/mm.h
немного проясняют их назначение:
/* mprotect() жестко кодирует VM_MAYREAD >> 4 == VM_READ, и так для r/w/x битов. */
#define VM_MAYREAD 0x00000010 /* ограничения для mprotect() и т.д. */
#define VM_MAYWRITE 0x00000020
#define VM_MAYEXEC 0x00000040
#define VM_MAYSHARE 0x00000080
Флаги представляют разные части информации: VM_READ
означает, что страница доступна для чтения, VM_MAYREAD
означает, что чтение разрешено. Страница может быть отображена без одного из флагов VM_READ
/VM_WRITE
и т.д., но это не указывает на то, можно ли изменить флаг.
Наличие двух наборов флагов означает, что разрешения могут быть определены при выделении страницы (кодом, который знает, какие разрешения являются подходящими), и затем код, который управляет фактическими настройками, не нуждается в знаниях о разрешениях, только нужно проверить флаги VM_MAY
. Если mprotect
требуется отобразить страницу как PROT_WRITE
, необходимо проверить, установлен ли флаг VM_MAYWRITE
.
Возможность отображения страниц как недоступных для чтения и предотвращения их возможности быть доступными для чтения может показаться удивительной, но она полезна в некоторых обстоятельствах; например, триггерные страницы могут быть отображены только для записи и никогда не должны быть доступны для чтения.
Ответ или решение
В операционной системе Linux, особенно когда речь идет о файлах, расположенных в каталоге /proc/$PID/smaps
, важно разграничивать понятия "readable" и "may read", поскольку они обозначают разные аспекты управления памятью процесса. Данные термины связаны с флагами виртуальных областей памяти, и их понимание критически важно для всех, кто занимается администрированием систем или разработкой ПО на уровне операционной системы.
Теория
Согласно мануалу (man page
), строка VmFlags
отображает флаги ядра, связанные с управлением виртуальной памятью. Среди них два варианта, которые часто вызывают путаницу:
rd
— "readable" (читаемый)mr
— "may read" (возможность чтения)
"Readable" (читаемый) указывает, что в настоящее время область памяти доступна для чтения. Это означает, что текущие настройки страниц памяти позволяют процессу считывать данные из этой области.
"May read" (возможность чтения), с другой стороны, указывает на изначально допустимые действия с памятью, которые предусмотрены настройками системы, когда страница была изначально выделена. Этот флаг не гарантирует, что чтение в текущий момент разрешено, но показывает возможность предоставления такого разрешения через системные вызовы, например, mprotect
.
Важный аспект заключается в том, что mprotect
и другие вызовы могут менять права доступа к области памяти в пределах допустимых границ, установленных через флаги "may". Например, mprotect
проверяет наличие флага VM_MAYREAD
, чтобы разрешить новую конфигурацию данных.
Пример
Рассмотрим ситуацию: процесс создал новый сегмент памяти с флагами mr
(may read) и mw
(may write), но без флага rd
(readable). Изначально процесс не может читать из этого сегмента, так как флаг rd
отсутствует, но может быть получен доступ к этому действию путем вызова mprotect
, который добавит флаг rd
при наличии соответствующего разрешения от VM_MAYREAD
.
Также можно привести пример с использованием страниц, которые должны обеспечивать защиту данных. Например, люди, занимающиеся безопасностью систем, могут использовать данные флаги, чтобы предотвращать несанкционированное чтение информации, сохраняя страницы в состоянии только для записи.
Применение
Это разграничение имеет практическое значение для администраторов систем и разработчиков низкоуровневого ПО. Знание того, какие флаги установлены на различных сегментах памяти процесса, позволяет эффективно управлять доступом к этим сегментам, повышать безопасность и защищенность программы, предотвращая несанкционированные операции.
Если разработчик хочет обеспечить, что определенные сегменты памяти его приложения останутся неизменными для чтения, он может использовать mprotect
, чтобы гарантировать, что флаг rd
не будет установлен, если VM_MAYREAD
отсутствует. В сценариях, где приложения динамически управляют доступом к памяти, использование флагов "may" позволяет создавать гибкие и безопасные конфигурации.
Подводя итог, понимание различия между "readable" и "may read" необходимо для глубокого контроля и управления доступом к памяти в Linux. Эти флаги помогают разработчикам и администраторам эффективно управлять безопасностью и ресурсами системы, что особенно важно в условиях, требующих высокой надежности и защиты данных.