NX bit

Поделись знанием:
(перенаправлено с «XD-бит»)
Перейти к: навигация, поиск
К:Википедия:Статьи без источников (тип: не указан)

Атрибут (бит) NX-Bit (англ. no execute bit в терминологии фирмы AMD) или XD-Bit (англ. execute disable bit в терминологии фирмы Intel) — бит запрета исполнения, добавленный в страницы (см. таблицы страниц (англ.)) для реализации возможности предотвращения выполнения данных как кода. Используется для предотвращения уязвимости типа «переполнение буфера», позволяющей выполнять произвольный код на атакуемой системе локально или удалённо. Технология требует программной поддержки (см. DEP) со стороны ядра операционной системы.





Основные сведения

Технология NX-bit может работать только при соблюдении следующих условий:

  • наличие поддержки NX-bit со стороны процессора. NX-bit поддерживают процессоры фирмы Intel, начиная с Pentium 4 серии 6xx, и процессоры фирмы AMD, начиная с Athlon 64;
  • наличие поддержки NX-bit со стороны операционной системы. NX-bit поддерживают ОС Linux, начиная с ядра версии 2.3.23, и ОС Windows, начиная с Windows XP SP2;
  • использование PAE для процессоров архитектуры x86 или использование процессоров архитектуры x86-64 (бит запрета исполнения доступен в таблице страниц).

Некоторое ПО несовместимо с технологией NX-bit, поэтому BIOS предоставляет возможность отключения технологии.

Описание

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

Фирма AMD назвала бит «NX» от англ. no execute. Фирма Intel назвала тот же бит «XD» от англ. execution disable.

Поскольку в современных компьютерных системах память разделяется на страницы, имеющие определённые атрибуты, разработчики процессоров добавили ещё один: запрет исполнения кода на странице. То есть, такая страница может быть использована для хранения данных, но не программного кода. При попытке передать управление на такую страницу возникнет прерывание, ОС получит управление и завершит программу. Атрибут защиты от исполнения давно присутствовал в других[каких?] микропроцессорных архитектурах; однако, в x86-системах такая защита реализовывалась только на уровне программных сегментов, механизм которых давно не используется современными ОС. Теперь она добавлена ещё и на уровне отдельных страниц.

Современные программы чётко разделяют на сегменты кода («text»), данных («data»), неинициализированных данных («bss»), а также динамически распределяемую область памяти, которая подразделяется на кучу («heap») и программный стек («stack»). Если программа написана без ошибок, указатель команд никогда не выйдет за пределы сегментов кода; однако, в результате программных ошибок, управление может быть передано в другие области памяти. При этом процессор перестанет выполнять какие-то запрограммированные действия, а будет выполнять случайную последовательность команд, за которые он будет принимать хранящиеся в этих областях данные, до тех пор, пока не встретит недопустимую последовательность, или попытается выполнить операцию, нарушающую целостность системы, которая вызовет срабатывание системы защиты. В обоих случаях программа завершится аварийно. Также процессор может встретить последовательность, интерпретируемую как команды перехода к уже пройденному адресу. В таком случае процессор войдёт в бесконечный цикл, и программа «зависнет», забрав 100 % процессорного времени. Для предотвращения подобных случаев и был введён этот дополнительный атрибут: если некоторая область памяти не предназначена для хранения программного кода, то все её страницы должны помечаться NX-битом, и в случае попытки передать туда управление процессор сформирует исключение и ОС тут же аварийно завершит программу, сигнализировав выход за пределы сегмента (SIGSEGV).

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

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

Технические детали

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

Благодаря атрибуту NX, такое становится невозможным. Область стека помечается NX-битом и любое выполнение кода в нём запрещено. Теперь же, если передать управление стеку, то сработает защита. Хоть программу и можно заставить аварийно завершиться, но использовать её для выполнения произвольного кода становится очень сложно (для этого потребуется ошибочное снятие программой NX-защиты).

Однако, некоторые программы используют выполнение кода в стеке или куче. Такое решение может быть связано с оптимизацией, динамической компиляцией или просто оригинальным техническим решением. Обычно, операционные системы предоставляют системные вызовы для запроса памяти с разрешённой функцией исполнения как раз для таких целей, однако многие старые программы всегда считают всю память исполнимой. Для запуска таких программ под Windows приходится отключать функцию NX на весь сеанс работы, и чтобы включить её вновь, требуется перезагрузка. Хотя в Windows и предусмотрен механизм белого списка программ, для которых отключён DEP, тем не менее данный метод не всегда работает корректно.К:Википедия:Статьи без источников (тип: не указан)[источник не указан 4994 дня] Примером такой программы может служить Iris.

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

См. также

Напишите отзыв о статье "NX bit"

Ссылки

  • intel.com. [www.intel.com/cd/ids/developer/asmo-na/eng/149307.htm Execute disable bit functionality blocks malware «Code execution»].

Отрывок, характеризующий NX bit

Невольно он испытывал волнующее радостное чувство при мысли о посрамлении самонадеянной Австрии и о том, что через неделю, может быть, придется ему увидеть и принять участие в столкновении русских с французами, впервые после Суворова.
Но он боялся гения Бонапарта, который мог оказаться сильнее всей храбрости русских войск, и вместе с тем не мог допустить позора для своего героя.
Взволнованный и раздраженный этими мыслями, князь Андрей пошел в свою комнату, чтобы написать отцу, которому он писал каждый день. Он сошелся в коридоре с своим сожителем Несвицким и шутником Жерковым; они, как всегда, чему то смеялись.
– Что ты так мрачен? – спросил Несвицкий, заметив бледное с блестящими глазами лицо князя Андрея.
– Веселиться нечему, – отвечал Болконский.
В то время как князь Андрей сошелся с Несвицким и Жерковым, с другой стороны коридора навстречу им шли Штраух, австрийский генерал, состоявший при штабе Кутузова для наблюдения за продовольствием русской армии, и член гофкригсрата, приехавшие накануне. По широкому коридору было достаточно места, чтобы генералы могли свободно разойтись с тремя офицерами; но Жерков, отталкивая рукой Несвицкого, запыхавшимся голосом проговорил:
– Идут!… идут!… посторонитесь, дорогу! пожалуйста дорогу!
Генералы проходили с видом желания избавиться от утруждающих почестей. На лице шутника Жеркова выразилась вдруг глупая улыбка радости, которой он как будто не мог удержать.
– Ваше превосходительство, – сказал он по немецки, выдвигаясь вперед и обращаясь к австрийскому генералу. – Имею честь поздравить.
Он наклонил голову и неловко, как дети, которые учатся танцовать, стал расшаркиваться то одной, то другой ногой.
Генерал, член гофкригсрата, строго оглянулся на него; не заметив серьезность глупой улыбки, не мог отказать в минутном внимании. Он прищурился, показывая, что слушает.
– Имею честь поздравить, генерал Мак приехал,совсем здоров,только немного тут зашибся, – прибавил он,сияя улыбкой и указывая на свою голову.
Генерал нахмурился, отвернулся и пошел дальше.
– Gott, wie naiv! [Боже мой, как он прост!] – сказал он сердито, отойдя несколько шагов.
Несвицкий с хохотом обнял князя Андрея, но Болконский, еще более побледнев, с злобным выражением в лице, оттолкнул его и обратился к Жеркову. То нервное раздражение, в которое его привели вид Мака, известие об его поражении и мысли о том, что ожидает русскую армию, нашло себе исход в озлоблении на неуместную шутку Жеркова.
– Если вы, милостивый государь, – заговорил он пронзительно с легким дрожанием нижней челюсти, – хотите быть шутом , то я вам в этом не могу воспрепятствовать; но объявляю вам, что если вы осмелитесь другой раз скоморошничать в моем присутствии, то я вас научу, как вести себя.
Несвицкий и Жерков так были удивлены этой выходкой, что молча, раскрыв глаза, смотрели на Болконского.
– Что ж, я поздравил только, – сказал Жерков.
– Я не шучу с вами, извольте молчать! – крикнул Болконский и, взяв за руку Несвицкого, пошел прочь от Жеркова, не находившего, что ответить.
– Ну, что ты, братец, – успокоивая сказал Несвицкий.
– Как что? – заговорил князь Андрей, останавливаясь от волнения. – Да ты пойми, что мы, или офицеры, которые служим своему царю и отечеству и радуемся общему успеху и печалимся об общей неудаче, или мы лакеи, которым дела нет до господского дела. Quarante milles hommes massacres et l'ario mee de nos allies detruite, et vous trouvez la le mot pour rire, – сказал он, как будто этою французскою фразой закрепляя свое мнение. – C'est bien pour un garcon de rien, comme cet individu, dont vous avez fait un ami, mais pas pour vous, pas pour vous. [Сорок тысяч человек погибло и союзная нам армия уничтожена, а вы можете при этом шутить. Это простительно ничтожному мальчишке, как вот этот господин, которого вы сделали себе другом, но не вам, не вам.] Мальчишкам только можно так забавляться, – сказал князь Андрей по русски, выговаривая это слово с французским акцентом, заметив, что Жерков мог еще слышать его.
Он подождал, не ответит ли что корнет. Но корнет повернулся и вышел из коридора.


Гусарский Павлоградский полк стоял в двух милях от Браунау. Эскадрон, в котором юнкером служил Николай Ростов, расположен был в немецкой деревне Зальценек. Эскадронному командиру, ротмистру Денисову, известному всей кавалерийской дивизии под именем Васьки Денисова, была отведена лучшая квартира в деревне. Юнкер Ростов с тех самых пор, как он догнал полк в Польше, жил вместе с эскадронным командиром.
11 октября, в тот самый день, когда в главной квартире всё было поднято на ноги известием о поражении Мака, в штабе эскадрона походная жизнь спокойно шла по старому. Денисов, проигравший всю ночь в карты, еще не приходил домой, когда Ростов, рано утром, верхом, вернулся с фуражировки. Ростов в юнкерском мундире подъехал к крыльцу, толконув лошадь, гибким, молодым жестом скинул ногу, постоял на стремени, как будто не желая расстаться с лошадью, наконец, спрыгнул и крикнул вестового.
– А, Бондаренко, друг сердечный, – проговорил он бросившемуся стремглав к его лошади гусару. – Выводи, дружок, – сказал он с тою братскою, веселою нежностию, с которою обращаются со всеми хорошие молодые люди, когда они счастливы.
– Слушаю, ваше сиятельство, – отвечал хохол, встряхивая весело головой.
– Смотри же, выводи хорошенько!
Другой гусар бросился тоже к лошади, но Бондаренко уже перекинул поводья трензеля. Видно было, что юнкер давал хорошо на водку, и что услужить ему было выгодно. Ростов погладил лошадь по шее, потом по крупу и остановился на крыльце.
«Славно! Такая будет лошадь!» сказал он сам себе и, улыбаясь и придерживая саблю, взбежал на крыльцо, погромыхивая шпорами. Хозяин немец, в фуфайке и колпаке, с вилами, которыми он вычищал навоз, выглянул из коровника. Лицо немца вдруг просветлело, как только он увидал Ростова. Он весело улыбнулся и подмигнул: «Schon, gut Morgen! Schon, gut Morgen!» [Прекрасно, доброго утра!] повторял он, видимо, находя удовольствие в приветствии молодого человека.
– Schon fleissig! [Уже за работой!] – сказал Ростов всё с тою же радостною, братскою улыбкой, какая не сходила с его оживленного лица. – Hoch Oestreicher! Hoch Russen! Kaiser Alexander hoch! [Ура Австрийцы! Ура Русские! Император Александр ура!] – обратился он к немцу, повторяя слова, говоренные часто немцем хозяином.
Немец засмеялся, вышел совсем из двери коровника, сдернул
колпак и, взмахнув им над головой, закричал:
– Und die ganze Welt hoch! [И весь свет ура!]
Ростов сам так же, как немец, взмахнул фуражкой над головой и, смеясь, закричал: «Und Vivat die ganze Welt»! Хотя не было никакой причины к особенной радости ни для немца, вычищавшего свой коровник, ни для Ростова, ездившего со взводом за сеном, оба человека эти с счастливым восторгом и братскою любовью посмотрели друг на друга, потрясли головами в знак взаимной любви и улыбаясь разошлись – немец в коровник, а Ростов в избу, которую занимал с Денисовым.
– Что барин? – спросил он у Лаврушки, известного всему полку плута лакея Денисова.
– С вечера не бывали. Верно, проигрались, – отвечал Лаврушка. – Уж я знаю, коли выиграют, рано придут хвастаться, а коли до утра нет, значит, продулись, – сердитые придут. Кофею прикажете?
– Давай, давай.
Через 10 минут Лаврушка принес кофею. Идут! – сказал он, – теперь беда. – Ростов заглянул в окно и увидал возвращающегося домой Денисова. Денисов был маленький человек с красным лицом, блестящими черными глазами, черными взлохмоченными усами и волосами. На нем был расстегнутый ментик, спущенные в складках широкие чикчиры, и на затылке была надета смятая гусарская шапочка. Он мрачно, опустив голову, приближался к крыльцу.