информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Spanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
исполняемый стек 19.06.03 13:22  Число просмотров: 1318
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> Извините, что не в форуме "operating systems". Этот вопрос
> скорее туда.
>
> Что заставляет разработчиков ОС делать сегмент стека
> исполняемым?
> Это беда самых популярных ОС. Хочется понять причины,
> которые к приводят к такому положению.

Причина очень простая - скорость доступа к стеку ...
>
> Наверняка создателям приходили в голову такие вопросы...

Есть различные способы сделать стек неисполняемым (либо отследить сискол из сегмента стека) в том числе и для x86

наиболее популярные решения для x86

это

1) PAX (есть реализации для linux и NT)
2) openwall (для linux)
<beginners>
исполняемый стек 19.06.03 12:45  
Автор: diov Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Извините, что не в форуме "operating systems". Этот вопрос скорее туда.

Что заставляет разработчиков ОС делать сегмент стека исполняемым?
Это беда самых популярных ОС. Хочется понять причины, которые к приводят к такому положению.

Наверняка создателям приходили в голову такие вопросы...
исполняемый стек 19.06.03 13:22  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> Извините, что не в форуме "operating systems". Этот вопрос
> скорее туда.
>
> Что заставляет разработчиков ОС делать сегмент стека
> исполняемым?
> Это беда самых популярных ОС. Хочется понять причины,
> которые к приводят к такому положению.

Причина очень простая - скорость доступа к стеку ...
>
> Наверняка создателям приходили в голову такие вопросы...

Есть различные способы сделать стек неисполняемым (либо отследить сискол из сегмента стека) в том числе и для x86

наиболее популярные решения для x86

это

1) PAX (есть реализации для linux и NT)
2) openwall (для linux)
Sorry, вопрос может и глуп, но все же: а почему бы приложению, которое хочет защититься таким образом, не вызвать VirtualProtect ? 21.06.03 09:59  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 21.06.03 10:02  Количество правок: 1
<"чистая" ссылка>
Re: VirtualProtect 23.06.03 14:36  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
Насколько я зная компиляторы могут что то подобное юзать опционально ... но там это дело вроде бы используется не для защиты как таковой а для контроля размера стека - типа нарушил защиту - раздвинул стек ... НО проблемы это не снимает да и используется эта фича в отладочном режиме (то что это тормоза совершенно очевидно )- я к сожалению особо подробно в это дело не вникал может кто сможет рассказать про это дело более развернуто
Re[2]: VirtualProtect 24.06.03 16:17  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> Насколько я зная компиляторы могут что то подобное юзать
> опционально ... но там это дело вроде бы используется не
ВиртуалПротект может менять права на СТРАНИЦЫ, а в x86 архитектуре нельзя выставлять страницам запрет на исполнение (исполнение можно разрешать/запрещать только СЕГМЕНТАМ). Стек в любом случае должен оставаться RW, а даже если и запретить для селектора SS исполнение, то, как уже было замечено, flat модель позволяет обратиться к той же странице через другой селектор (в частности cs, для которого исполнение должно быть всегда).

> для защиты как таковой а для контроля размера стека - типа
> нарушил защиту - раздвинул стек ... НО проблемы это не
Guard Page в стеке есть всегда (и в Release тоже - это фича ОСи, а не компилятора) и у нее сброшен бит P (present). В Optional Header-е у PE exe-шника указывается Stack Commit Size (по умолчанию 0x4000) - сколько стека физически выделяется при создании процесса, и Stack Reserved Size (по умолчанию 0x100000) - до каких пор может расти стек за счет этой самой Guard Page. Стек расширяется в обработчике Page Fault-а, когда происходит обращение к Guard Page-у, а сама эта пага сдвигается дальше.

> снимает да и используется эта фича в отладочном режиме (то
> что это тормоза совершенно очевидно )- я к сожалению особо
> подробно в это дело не вникал может кто сможет рассказать
> про это дело более развернуто
В общем случае проблему срыва стека на x86 flat модели решить нельзя. Расширение стек-фрейма для функции и введение туда разных проверочных данных помогает только для отладки своих программ, т.к. эксплоит, который сорвал стек процесса чаще всего никогда не возвращает управление и следовательно никогда не выполняет код, который мог бы проверить состояние стека на выходе из функции.
Да, печально. Остался последний вопрос... 25.06.03 20:36  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 25.06.03 20:37  Количество правок: 1
<"чистая" ссылка>
PAGE_READONLY
PAGE_READWRITE
PAGE_WRITECOPY
PAGE_EXECUTE
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE.
PAGE_EXECUTE_WRITECOPY
PAGE_GUARD
PAGE_NOACCESS
PAGE_NOCACHE (модификатор)

Столько приятных на первый взгляд режимов доступа к страницам открывает VirtualProtect... Однако PAGE_READWRITE функционально равно PAGE_EXECUTE_READWRITE на Intel... Столько режимов из-за мультиплатформенности, т.е. на других платформах (NT4 + DEC Alpha, к примеру), это не так?
Да, печально. Остался последний вопрос... 26.06.03 12:58  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> PAGE_READONLY
> PAGE_READWRITE
> PAGE_WRITECOPY
> PAGE_EXECUTE
> PAGE_EXECUTE_READ
> PAGE_EXECUTE_READWRITE.
> PAGE_EXECUTE_WRITECOPY
> PAGE_GUARD
> PAGE_NOACCESS
> PAGE_NOCACHE (модификатор)

> Столько приятных на первый взгляд режимов доступа к
> страницам открывает VirtualProtect... Однако PAGE_READWRITE
> функционально равно PAGE_EXECUTE_READWRITE на Intel...
> Столько режимов из-за мультиплатформенности, т.е. на других
> платформах (NT4 + DEC Alpha, к примеру), это не так?

Ага. Причем ноги у сегментации растут от backward compatibilyty с 8086 и т.д.. На том же 680x0 все необходимое разделение можно сделать при помощи страниц. И запретить исполнение в странице тамошний MMU может. Причем возможно до 5 уровней разбиения на страницы с произвольной (устанавливаются в спец регистрах) битовостью каждого уровня. В x86 существует только 3 жестко заданных уровня: 10 бит - индекс в PD, 10 - в PT, и 12 - смещение на странице.

Кста, flat-модель - не столько признак криворукости или лени программистов, сколько забота о портабельности. Уж очень на многих платформах вообще не существует понятия подобного сегментам (всегда удобнее работать с линейной памятью). И вся необходимая функциональность ложится на страничный обмен. И это правильно. Как сказал еще Оккам: "Не вводи сущности сверх необходимости". Два механизма, выполняющие в сущности одно и то же - явный перебор.

Ничего не имею против Intel, но x86 - не самый лучший пример продуманной архитектуры.
исполняемый стек 19.06.03 14:13  
Автор: diov Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Причина очень простая - скорость доступа к стеку ...
Хым... непонятно, почему
push, pop, call, ret, ...
- замедлятся, если убрать флаги исполняемости?

> Есть различные способы сделать стек неисполняемым (либо
> отследить сискол из сегмента стека) в том числе и для x86
Проверка сис-call-ов - хорошая идея...

> наиболее популярные решения для x86
>
> это
>
> 1) PAX (есть реализации для linux и NT)
> 2) openwall (для linux)
исполняемый стек 19.06.03 14:40  
Автор: cb <cb> Статус: Member
<"чистая" ссылка>
> Хым... непонятно, почему
> push, pop, call, ret, ...
> - замедлятся, если убрать флаги исполняемости?

если я ничего не путаю, то замедляет не отсутствие флагов, а то что сегмент стека имеет селектор отличный от текущего...

cb.
исполняемый стек 19.06.03 14:38  
Автор: XR <eXtremal Research> Статус: The Elderman
<"чистая" ссылка>
> > Причина очень простая - скорость доступа к стеку ...
> Хым... непонятно, почему
> push, pop, call, ret, ...
> - замедлятся, если убрать флаги исполняемости?
AFAIK x86 это (nonexec page) не умеет (PAX правда умеет это обходить через одно место :))
а размещать стек в своем сегменте это обрекать себя на межсегментные переключения ...

>
> > Есть различные способы сделать стек неисполняемым
> (либо
> > отследить сискол из сегмента стека) в том числе и для
> x86
> Проверка сис-call-ов - хорошая идея...

Ну да - когда точно известна структура памяти user space задачи
это работает (см openwall)
http://www.openwall.com

> > наиболее популярные решения для x86
> >
> > это
> >
> > 1) PAX (есть реализации для linux и NT)
> > 2) openwall (для linux)
исполняемый стек 20.06.03 05:10  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Я вообще до сих пор не втыкаюсь, почему все операционки юзают флэт модель? Размещение буферов каждого в своем сегменте позволяет на системном уровне "железно" защитить их от переполнения. Селекторы кэшируются и для современных камней потери на переключение незначительны, а безопасность и стабильность системы возрастает многократно.
исполняемый стек 20.06.03 09:43  
Автор: diov Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Я вообще до сих пор не втыкаюсь, почему все операционки
> юзают флэт модель?
> Селекторы кэшируются и для современных
> камней потери на переключение незначительны,
Опять непонятно: о каком переключении сегментов идет речь?
Например: SS указывает в один сегмент, DS - в другой, и переключения задач не происходит.

Подведем итоги.
Выслушав все замечания, раскопав пыльную книжку про защищенный режим процессоров x86, можно сделать выводы:
1. вся фигня из-за флэт модели
2. page-таблица в PM режиме не позволяет различать флаги чтения от исполнения для страницы

Несмотря на то, что дескрипторы для SS, DS, ES, FS могут иметь "правильные" флаги, из-за флэт модели возможно записать в одно место памяти через эти сегментные регистры, а затем исполнить его через CS.

1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach