W ^ X («написать xor выполнить», произносится W xor X) - это функция безопасности в операционных системах и виртуальных машинах. Это политика защиты памяти , согласно которой каждая страница в процессе или адресном пространстве ядра может быть либо записываемым, либо исполняемым, но не тем и другим одновременно. Без такой защиты программа может записывать (как данные "W") инструкции ЦП в область памяти, предназначенную для данных, а затем запускать (как исполняемый "X"; или читать-выполнять "RX") эти инструкции. Это может быть опасно, если автор памяти злонамерен. W ^ X - это Unix-подобная терминология для строгого использования общей концепции защиты исполняемого пространства, управляемой с помощью системного вызова mprotect
.
W ^ X относительно прост на процессорах, которые поддерживают детализированные разрешения страниц, такие как Sun SPARC и SPARC64, AMD AMD64, Hewlett-Packard PA-RISC, HP (первоначально Digital Equipment Corporation ' s) Alpha и ARM.
W ^ X также были применены к разрешениям на запись / выполнение файловой системы, чтобы уменьшить уязвимости записи файлов (как в памяти) и настойчивость злоумышленника. Установление ограничений на права доступа к файлам также может закрыть пробелы в применении W ^ X, вызванные файлами с отображением памяти. Полное запрещение использования произвольного нативного кода также может уменьшить уязвимости ядра и ЦП, не обнаруженные через существующий код на компьютере.
В некоторых ранних процессорах Intel 64 отсутствовал бит NX, необходимый для W ^ X, но он появился в более поздних чипах. На более ограниченных процессорах, таких как Intel i386, W ^ X требует использования ограничения сегмента кода CS в виде строки «на песке ", точка в адресном пространстве, выше которой выполнение запрещено и данные расположены, а ниже которой разрешено и размещаются исполняемые страницы. Эта схема использовалась в Exec Shield.
Linker, изменения обычно требуются для отделения данных от кода (например, trampolines, которые необходимы для компоновщика и библиотеки функции среды выполнения ). Переключатель, разрешающий микширование, обычно называется execstack
в Unix-подобных системах
W ^ X также может представлять незначительную проблему для своевременной компиляции, которая включает интерпретатор, генерирующий машинный код на лету, а затем запускающий их. Простое решение, используемое большинством, включая Firefox, заключается в том, чтобы просто сделать страницу исполняемой после того, как интерпретатор закончит писать машинный код, используя VirtualProtect
в Windows или mprotect
в Unix-лайки. Другое решение включает отображение одной и той же области памяти на двух страницах, одна с RW, а другая с RX. Нет простого консенсуса относительно того, какое решение является более безопасным: сторонники последнего подхода считают, что некоторые критики считают, что разрешение на выполнение страницы, которая когда-либо была доступна для записи, лишает смысла W ^ X (существует SELinux политика для управления такими операциями, называемая allow_execmod
), и эта рандомизация разметки адресного пространства сделает безопасным размещение обеих страниц в одном процессе. Сторонники первого подхода считают, что второй подход безопасен только тогда, когда две страницы переданы двум отдельным процессам, и межпроцессное взаимодействие будет дороже, чем вызов mprotect
.
W ^ X впервые был реализован в OpenBSD 3.3, выпущенном в мае 2003 года. В 2004 году Microsoft представила аналогичную функцию под названием DEP (Data Execution Prevention ) в 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. В конце 2014 - начале 2015 года W ^ X был добавлен в ядро OpenBSD на архитектуре AMD64. В начале 2016 года W ^ X был полностью реализован в ядре NetBSD AMD64 и частично в ядре i386.
Начиная с Firefox 46 в 2016 году, виртуальная машина Firefox для JavaScript также реализует политику W ^ X.
execstack (8)
– Linux Системное администрирование Руководство