В /proc/$PID/smaps в VmFlags в чем разница между “readable” и “may read”?

Вопрос или проблема

Руководство описывает значение 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. Эти флаги помогают разработчикам и администраторам эффективно управлять безопасностью и ресурсами системы, что особенно важно в условиях, требующих высокой надежности и защиты данных.

Оцените материал
Добавить комментарий

Капча загружается...