NX-Bit

NX-Bit (No eXecute Bit - в AMD), или XD-Bit (Execute Disable Bit - в Intel) — антивирус, способный предотвратить «заражение» ПК некоторыми типами вредоносного ПО. Борется с искусственно-вызванной ошибкой переполнения буфера. С данным антивирусом имеет тесную связь технология Microsoft DEP.

Технология может работать только если:

  • Имеется поддержка процессора на аппаратном уровне (от Intel Pentium 4 серии 6xx и выше, а также все модификации AMD Athlon 64);
  • Установлена ОС с поддержкой данной технологии (Linux с ядром, начиная от версии 2.3.23; Windows XP Service Pack 2 и выше);
  • Применяется PAE или архитектура x86-64.

Иногда технология способна вызвать конфликт программного характера с некоторыми видами программного обеспечения. Так, в BIOS’е материнских плат, поддерживающих процессоры с EDB, имеется возможность отключения этой технологии.

NX (XD) — атрибут страницы памяти, употребляемый в архитектурах x86 и x86-64, предназначенный для укрепления защиты системы от программных ошибок, вирусов, троянских коней и других вредоносных программ. 

  • NX (No eXecute) — терминология AMD;
  • XD (eXecution Disable) — терминология Intel.

NX-bit - самый старший разряд элемента 64-битных таблиц страниц, которые применяются процессором для распределения памяти в адресном пространстве. 64-разрядные таблицы страниц используются только в ОС, работающих в 64-битном режиме, либо с включенным расширением физических адресов (PAE).

В настоящее время, компьютерные системы обладают памятью, разделенной на страницы с определенными атрибутами. Так, в новые серии продуктов разработчики процессоров добавили еще один атрибут - запрет исполнения кода на странице (страница может быть использована для хранения данных, но не для хранения программного кода). В случае возникновения попытки передать управление на подобного рода страницу, процессор генерирует специальную ошибку страницы, и программа прекращает свою работу в аварийном порядке. 

Атрибут защиты от исполнения внедряли и в другие микропроцессорные архитектуры, но только в x86-системах эта защита реализовывалась на уровне программных сегментов. Сегодня такая защита внедрена и на уровне отдельных страниц.

В современных ПО наблюдается четкое разделение на сегменты кода («text»), данных («data») и неинициализированных данных («bss»). Кроме того, имеется и динамически-распределяемый сегмент памяти, который, в свою очередь, делится на:

  • кучу («heap»);
  • программный стек («stack»).

Если при написании программы не было допущено никаких ошибок, указатель команд не выйдет за пределы сегментов кода. Но в случае программных ошибок, управление может быть передано в другие области памяти. Это повлечет за собой блокирование процессора перед операциями по запрограммированным действиям, и начало произвольного выполнения случайной последовательности команд. Так будет продолжаться до тех пор, пока процессор не идентифицирует недопустимую последовательность, тогда сработает внутренняя система защиты. Так или иначе, программа завершится аварийно. Кроме того, процессору может попасться последовательность, которая интерпретируется как команда перехода к пройденному адресу. В этом случае, процессор попадет в бесконечный цикл, а программа «зависнет». Чтобы предотвратить подобные случаи, специалисты ввели дополнительный атрибут, который определяет следующее условие: если какая-то область памяти не предназначена для хранения программного кода, то все ее страницы должны помечаться NX-битом, а в случае возникновения попытки передать управление, процессор сформирует команду, и операционная система мгновенно завершит программу. Ключевой причиной введения данного атрибута было не столько обеспечение быстрой реакции на такие ошибки, сколько распространенность подобных ошибок среди злоумышленников, которые использовали их для несанкционированного доступа к ПК. Написанные ими всевозможные вирусы и черви искали уязвимые места в распространенных ПО.

Тех. детали

Зачастую, буфер переполняется в тех случаях, когда разработчик делает его фиксированной длины. Полагая, что отведенного пространства будет достаточно, разработчик не проверяет выход данных за границы, при манипуляции ими, в результате чего поступающие данные могут занять не предназначенный для них сегмент памяти, уничтожив при этом хранящуюся в тех сегментах информацию. 

Нередко временные буферы выделяются внутри подпрограмм, память для которых определена в программном стеке. В нем, помимо всего прочего, расположены адреса возвратов в вызывающую подпрограмму. Изучив код программы, злоумышленник может обнаружить подобную ошибку, и после передать в программу определенную последовательность данных, при обработке которой программа по ошибке заменит адрес возврата в стеке на адрес, требуемый злоумышленнику. По завершению подпрограммы, инструкция возврата (RET) вытолкнет из стека в указатель команд адрес входа в процедуру злоумышленника, и он получит контроль над компьютером. Атрибут NX делает такую манипуляцию невозможной. Область стека отмечается NX-битом, а любое выполнение кода - запрещается. Так, если передать управление стеку, то сработает защита.

Для запуска программ, использующих выполнение кода в стеке/куче под операционной системой Windows, необходимо отключать функцию NX на протяжении всего сеанса работы. Для повторной ее активации требуется перезагрузка компьютера. Несмотря на то, что в Windows предусмотрен механизм белого списка приложений, этот метод не всегда корректно работает.

#