В^Х
W^X («запись xor выполнение», произносится как W xor X ) — функция безопасности в операционных системах и виртуальных машинах . Это памяти политика защиты , согласно которой каждая страница в процесса или ядра адресном пространстве может быть либо доступной для записи, либо исполняемой , но не тем и другим одновременно. Без такой защиты программа может записывать (как данные «W») инструкции ЦП в область памяти, предназначенную для данных, а затем запускать (как исполняемый файл «X»; или читать-выполнять «RX») эти инструкции. Это может быть опасно, если автор памяти злонамерен. W^X — это Unix-подобная терминология для строгого использования общей концепции защиты исполняемого пространства , управляемой через mprotect
системный вызов.
W^X относительно прост на процессорных архитектурах , поддерживающих детальные разрешения страниц, таких как AMD от SPARC и SPARC64 от Sun, - PA , RISC Packard Hewlett от , HP (первоначально x86-64 - ) Альфа и ARM .
Термин W^X также применялся к разрешениям на запись/выполнение файловой системы для уменьшения уязвимостей записи файлов (например, в памяти) и устойчивости злоумышленников. [ 1 ] Обеспечение ограничений прав доступа к файлам также может устранить пробелы в применении W^X, вызванные файлами, отображенными в памяти. [ 2 ] [ 3 ] Полный запрет на использование произвольного собственного кода также может уменьшить уязвимости ядра и ЦП, не выявленные через существующий код на компьютере. [ 4 ] Менее интрузивный подход — заблокировать файл на время любого сопоставления с исполняемой памятью, чего достаточно для предотвращения обходов после проверки.
Совместимость
[ редактировать ]В некоторых ранних процессорах Intel 64 отсутствовал бит NX, необходимый для W^X, но он появился в более поздних чипах. На более ограниченных процессорах, таких как Intel i386 , W^X требует использования ограничения сегмента кода CS в качестве « линии на песке », точки в адресном пространстве, выше которой выполнение не разрешено и расположены данные, а ниже которой разрешено и размещаются исполняемые страницы. Эта схема использовалась в Exec Shield . [ 5 ]
Изменения компоновщика обычно необходимы для отделения данных от кода (например, батуты , необходимые для функций компоновщика и библиотеки среды выполнения ). Переключатель, позволяющий смешивание, обычно называют execstack
в Unix-подобных системах [ 6 ]
W^X также может представлять собой небольшую проблему для JIT-компиляции , которая включает в себя интерпретатор, генерирующий машинный код на лету, а затем запускающий его. Простое решение, используемое большинством, исторически включая Firefox , заключается в том, чтобы просто сделать страницу исполняемой после того, как интерпретатор завершит написание машинного кода, используя VirtualProtect
в Windows или mprotect
в Unix-подобных операционных системах. Другое решение предполагает отображение одной и той же области памяти на две страницы: одну с помощью RW, а другую с помощью RX. [ 7 ] Не существует простого консенсуса относительно того, какое решение безопаснее: сторонники последнего подхода полагают, что разрешение на выполнение страницы, которая когда-либо была доступна для записи, противоречит принципу W^X (существует политика SELinux для управления такими операциями, называемая allow_execmod
) и что рандомизация макета адресного пространства позволит безопасно поместить обе страницы в один и тот же процесс. Сторонники первого подхода считают, что второй подход безопасен только тогда, когда две страницы отданы двум отдельным процессам, а межпроцессное взаимодействие будет более затратным, чем вызов mprotect
.
История
[ редактировать ]W^X был впервые реализован в OpenBSD 3.3, выпущенном в мае 2003 года. В 2004 году Microsoft представила аналогичную функцию под названием DEP ( предотвращение выполнения данных ) в Windows XP. Аналогичные функции доступны для других операционных систем, включая исправления PaX и Exec Shield для Linux , а также . реализацию PaX в NetBSD В Red Hat Enterprise Linux (и автоматически CentOS ) версии 5 или в ядре Linux 2.6.18-8 SELinux получил allow_execmem
, allow_execheap
, и allow_execmod
политики, которые предоставляют W^X при отключении.
Хотя W^X (или DEP) на протяжении большей части своего существования защищал только программы пользовательского пространства, в 2012 году Microsoft распространила его на ядро Windows на архитектурах x86 и ARM. [ 8 ] В конце 2014 — начале 2015 года W^X был добавлен в ядро OpenBSD на архитектуре AMD64. [ 9 ] В начале 2016 года W^X был полностью реализован в ядре AMD64 NetBSD и частично в ядре i386.
Компьютеры macOS , работающие на кремниевых процессорах Apple, применяют W^X для всех программ. Компьютеры Mac на базе Intel применяют эту политику только для программ, использующих режим Hardened Runtime ОС. [ 10 ] [ 11 ]
Начиная с Firefox 46 в 2016 году и заканчивая Firefox 116 в 2023 году, виртуальная машина Firefox для JavaScript реализовала политику W^X. [ 7 ] Позже это было отменено на некоторых платформах по соображениям производительности, но осталось на других, которые применяют W^X для всех программ. [ 12 ]
Начиная с .NET 6.0 в 2021 году, .NET теперь использует W^X. [ 13 ]
Ссылки
[ редактировать ]- ^ «Применить ограничения execve() для API > 28» .
- ^ «Новости ядра Зака» .
- ^ «SARA — новый многоуровневый LSM» .
- ^ «Усиление защиты ядра Linux (серия 2.0.x)» .
- ^ «i386 W^X» . 17 апреля 2003 года . Проверено 19 июня 2014 г.
- ^ Linux по администрированию системы Руководство –
- ^ Перейти обратно: а б «JIT-код W^X включен в Firefox» . Проверено 29 апреля 2016 г.
- ^ «Усовершенствования по устранению уязвимостей в Win8» .
- ^ «Защита W^X для ядра AMD64» .
- ^ «Портирование JIT-компиляторов на Apple Silicon» . разработчик.apple.com . Проверено 17 апреля 2022 г.
- ^ «Часто задаваемые вопросы по ARM Mac» . SecureMac. 17 июля 2020 г. Проверено 17 апреля 2022 г.
- ^ «1835876 — Рассмотрите возможность отключения защиты памяти кода в процессе содержимого» . bugzilla.mozilla.org . Мозилла . Проверено 1 июля 2024 г.
- ^ «Что нового в .NET 6» . docs.microsoft.com . Майкрософт . Проверено 9 ноября 2021 г.