Совершенный код. Трудности перевода или неясная мысль?
От: D1g174LM4n14c  
Дата: 06.11.05 15:16
Оценка:
С. Макконнелл, книга "Совершенный Код".

Часть II, Глава 8 — Защитное программирование.
Раздел 8.3 — Способы обработки ошибок.

Описываеются варианты способов обработки ошибок, среди которых следующий:

"Вызвать процедуру или объект — обработчик ошибок"

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

...

Этот подход может очень серьезно повлиять на безопасность. Если в программе возникнет переполнение буфера, злоумышленник сможет узнать адрес метода (объекта)-обработчика. Таким образом, при переполнении буфера во время работы приложения использовать этот способ небезопасно.


Я выделил жирным шрифтом тот момент, который остался для меня неясным. Хотя я знаю, что такое переполнение буфера и как это работает, — я не понял что имел ввиду автор. Во-первых, каким образом при переполнении можно узнать адрес обработчика (в общем случае), а во-вторых, чем это может быть опасно?

Спасибо.
Re: Совершенный код. Трудности перевода или неясная мысль?
От: Ignoramus  
Дата: 07.11.05 15:22
Оценка:
Здравствуйте, D1g174LM4n14c, Вы писали:

DLM>С. Макконнелл, книга "Совершенный Код".


DLM>Часть II, Глава 8 — Защитное программирование.

DLM>Раздел 8.3 — Способы обработки ошибок.

DLM>Описываеются варианты способов обработки ошибок, среди которых следующий:


DLM>"Вызвать процедуру или объект — обработчик ошибок"


DLM>

DLM>Другим подходом к централизованной обработке ошибок является создание глобальной специализированной процедуры или объекта. Преимущество его в том, что контроль над обработкой ошибок сосредоточен в одном месте, что облегчает отладку.

DLM>...

DLM>Этот подход может очень серьезно повлиять на безопасность. Если в программе возникнет переполнение буфера, злоумышленник сможет узнать адрес метода (объекта)-обработчика. Таким образом, при переполнении буфера во время работы приложения использовать этот способ небезопасно.


DLM>Я выделил жирным шрифтом тот момент, который остался для меня неясным. Хотя я знаю, что такое переполнение буфера и как это работает, — я не понял что имел ввиду автор. Во-первых, каким образом при переполнении можно узнать адрес обработчика (в общем случае),


Наверное имеется в виду, что злоумышленник может намеренно вызвать какое-нибудь исключение, к примеру — переполнение буфера и наблюдая поведение программы (очевидно, в дизассемблере ), получить относительный адрес обработчика этого исключения. И поскольку этот обработчик в данном случае единственный, то достаточно его перезаписать своим кодом и вуаля — можно делать (теоретически) с программой все что хочешь. Я эту фразу так понял, хотя не совсем представляю как сделать описанное на практике .

DLM>а во-вторых, чем это может быть опасно?

По-моему относительно недавно была обнаружена дыра в безопасности Internet Explorer кажется как раз на переполнении буфера основанная...

DLM>Спасибо.
Re[2]: Совершенный код. Трудности перевода или неясная мысль
От: D1g174LM4n14c  
Дата: 07.11.05 15:38
Оценка:
Здравствуйте, Ignoramus, Вы писали:

DLM>>Этот подход может очень серьезно повлиять на безопасность. Если в программе возникнет переполнение буфера, злоумышленник сможет узнать адрес метода (объекта)-обработчика. Таким образом, при переполнении буфера во время работы приложения использовать этот способ небезопасно.


I>Наверное имеется в виду, что злоумышленник может намеренно вызвать какое-нибудь исключение, к примеру — переполнение буфера и наблюдая поведение программы (очевидно, в дизассемблере ), получить относительный адрес обработчика этого исключения. И поскольку этот обработчик в данном случае единственный, то достаточно его перезаписать своим кодом и вуаля — можно делать (теоретически) с программой все что хочешь. Я эту фразу так понял, хотя не совсем представляю как сделать описанное на практике .


Интересно, как его (обработчик) переписать?
Я понимаю, что можно адрес обработчика ПОДМЕНИТЬ.
Но это возможно только (поправьте?) в ситуации, когда обработчик является ОБЕРТКОЙ кода, то есть, его адрес имеется в стеке и его можно при переполнении перезаписать... Хотя смысла все равно не вижу.

DLM>>а во-вторых, чем это может быть опасно?


I>По-моему относительно недавно была обнаружена дыра в безопасности Internet Explorer кажется как раз на переполнении буфера основанная...


А чем ЗНАНИЕ АДРЕСА обработчика может помочь злоумышленнику?..
Что-то ум мой терзает, а что — не пойму
Re[3]: Совершенный код. Трудности перевода или неясная мысль
От: Ignoramus  
Дата: 08.11.05 08:42
Оценка:
Здравствуйте, D1g174LM4n14c, Вы писали:

DLM>Интересно, как его (обработчик) переписать?

DLM>Я понимаю, что можно адрес обработчика ПОДМЕНИТЬ.
DLM>Но это возможно только (поправьте?) в ситуации, когда обработчик является ОБЕРТКОЙ кода, то есть, его адрес имеется в стеке и его можно при переполнении перезаписать... Хотя смысла все равно не вижу.
DLM>А чем ЗНАНИЕ АДРЕСА обработчика может помочь злоумышленнику?..
DLM>Что-то ум мой терзает, а что — не пойму

Знаете ли, я сам не хакер и не интересовался подобными вопросами. Поэтому я склонен доверять опыту Макконнелла. Если он говорит "опасно" и примерно ясно направление, откуда исходит опасность, то значит действительно опасно, по крайней мере лучше так не делать...

Или Ваша проблема в том, что очень хочется сделать именно так (обрабатывать исключения централизованно) ?
Re[4]: Совершенный код. Трудности перевода или неясная мысль
От: D1g174LM4n14c  
Дата: 08.11.05 10:18
Оценка:
Здравствуйте, Ignoramus, Вы писали:

I>Или Ваша проблема в том, что очень хочется сделать именно так (обрабатывать исключения централизованно) ?


Я просто хочу понять, почему это "опасно". Я не улавливаю связи между переполнение буфера и обработчиком ошибок, и между знанием адреса обработчика и опасностью.
Re: Совершенный код. Трудности перевода или неясная мысль?
От: leper Россия  
Дата: 08.11.05 15:04
Оценка: 10 (2) +1
Здравствуйте, D1g174LM4n14c, Вы писали:

DLM>С. Макконнелл, книга "Совершенный Код".


DLM>

Этот подход может очень серьезно повлиять на безопасность. Если в программе возникнет переполнение буфера, злоумышленник сможет узнать адрес метода (объекта)-обработчика. Таким образом, при переполнении буфера во время работы приложения использовать этот способ небезопасно.


DLM>Я выделил жирным шрифтом тот момент, который остался для меня неясным. Хотя я знаю, что такое переполнение буфера и как это работает, — я не понял что имел ввиду автор. Во-первых, каким образом при переполнении можно узнать адрес обработчика (в общем случае), а во-вторых, чем это может быть опасно?


Вот как это звучит в оригинале:

This approach has an important security implication. If your code has encountered a buffer-overrun, it’s possible that an attacker has compromised the address of the handler routine or object. Thus, once a buffer overrun has occurred while an application is running, it is no longer safe to use this approach.


Может поможет...
Think for yourself. Question authory.
Re[2]: Совершенный код. Трудности перевода или неясная мысль
От: D1g174LM4n14c  
Дата: 08.11.05 16:14
Оценка:
Здравствуйте, leper, Вы писали:

DLM>>С. Макконнелл, книга "Совершенный Код".


DLM>>

L>Этот подход может очень серьезно повлиять на безопасность. Если в программе возникнет переполнение буфера, злоумышленник сможет узнать адрес метода (объекта)-обработчика. Таким образом, при переполнении буфера во время работы приложения использовать этот способ небезопасно.


L>Вот как это звучит в оригинале:


L>

L>This approach has an important security implication. If your code has encountered a buffer-overrun, it’s possible that an attacker has compromised the address of the handler routine or object. Thus, once a buffer overrun has occurred while an application is running, it is no longer safe to use this approach.


L>Может поможет...


Огромное спасибо! Это же все объясняет!
В целом перевод книги довольно неплох, но в этом месте, IMHO, облажались.
Т.к. в оригинале ясно сказано, compromised the address of the handler, что означает не просто "узнать". И последнее важное предложение "Thus, once a buffer overrun has occurred while an application is running, it is no longer safe to use this approach." означает, что если произойдет переполнение, то дальнейшее выполнение программы не есть безопасным!

Короче, кривовато перевели как-то, неясно...

leper, еще раз вам ОГРОМНОЕ спасибо! (даю + 3)
Теперь буду спать спокойно
Re[3]: Совершенный код. Трудности перевода или неясная мысль
От: kavlad Россия http://www.wavesoft.ru
Дата: 09.11.05 12:03
Оценка:
Здравствуйте, D1g174LM4n14c, Вы писали:

DLM>А чем ЗНАНИЕ АДРЕСА обработчика может помочь злоумышленнику?..


Заменяем первый байт джампом на любой адрес.
В этот любой адрес вносим наш код. Поищи что-нибудь на тему DLL injection, например.

DLM>Что-то ум мой терзает, а что — не пойму


Это ассемблер
Распознавание изображений на Delphi http://dfreader.sourceforge.net
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.