39988

Переполнение буфера

Контрольная

Информатика, кибернетика и программирование

Условия для переполнения буфера параметры функций передаются через стек; адрес возврата также помещается в стек; локальные переменные располагаются в стеке; стек растет вниз; данные в стеке могут интерпретироваться как команды; должны существовать процессы или программы имеющие уязвимый код; некоторые процессы или функции должны иметь высокие привилегии. Переполнение буфера Переполнение буфера Buffer Overflow явление возникающее когда компьютерная программа записывает данные за пределами выделенного в памяти буфера....

Русский

2013-10-13

240.81 KB

21 чел.

  1.  Наиболее распространенные атаки: переполнение буфера и подбор пароля.

Условия для переполнения буфера

  1.  параметры функций передаются через стек;
  2.  адрес возврата также помещается в стек;
  3.  локальные переменные располагаются в стеке;
  4.  стек «растет» вниз;
  5.  данные в стеке могут интерпретироваться как команды;
  6.  должны существовать процессы или программы, имеющие уязвимый код;
  7.  некоторые процессы или функции должны иметь высокие привилегии.


Переполнение буфера

Переполнение буфера (Buffer Overflow) — явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера.

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

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

Переполнение буфера может вызывать аварийное завершение или зависание программы, ведущее к отказу обслуживания (denial of service, DoS). Отдельные виды переполнений, например переполнение в стековом кадре, позволяют злоумышленнику загрузить и выполнить произвольный машинный код от имени программы и с правами учетной записи, от которой она выполняется.

Известны примеры, когда переполнение буфера намеренно используется системными программами для обхода ограничений в существующих программных или программно-аппаратных средствах. Например, операционная система iS-DOS (для компьютеров ZX Spectrum) использовала возможность переполнения буфера встроенной TR-DOS для запуска своего загрузчика в машинных кодах (что штатными средствами в TR-DOS сделать невозможно).

Безопасность

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

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

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

Даже опытным программистам бывает трудно определить, насколько то или иное переполнение буфера может быть уязвимостью. Это требует глубоких знаний об архитектуре компьютера и о целевой программе. Было показано[кем?], что даже настолько малые переполнения, как запись одного байта за пределами буфера, могут представлять собой уязвимости.

Переполнения буфера широко распространены в программах, написанных на относительно низкоуровневых языках программирования, таких как язык ассемблера, Си и C++, которые требуют от программиста самостоятельного управления размером выделяемой памяти. Устранение ошибок переполнения буфера до сих пор является слабо автоматизированным процессом. Системы формальной верификации программ не очень эффективны при современных языках программирования.

Многие языки программирования, например, Java и Lisp, управляют выделением памяти автоматически, и используют комбинацию статического анализа и проверки корректности действий программы во время выполнения. Это делает ошибки, связанные с переполнением буфера, маловероятными или невозможными. Perl для избежания переполнений буфера обеспечивает автоматическое изменение размера массивов. Однако системы времени выполнения и библиотеки для таких языков всё равно могут быть подвержены переполнениям буфера, вследствие возможных внутренних ошибок в реализации этих систем проверки. В Windows доступны некоторые программные решения, которые предотвращают выполнение кода за пределами переполненного буфера, если такое переполнение было осуществлено. Среди этих решений — DEP в Windows XP SP2, OSsurance и Anti-Execute.

Краткое техническое изложение

Описание

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

Когда динамический буфер, представляющий собой автоматический массив, выделяется в функции, он создаётся на стеке во время вызова этой функции. В архитектуре x86 стек растёт от бо́льших адресов к меньшим (или справа налево, в приведённых ниже диаграммах), то есть новые данные помещаются перед теми, которые уже находятся в стеке. Здесь,(DATA) (DATA) (…) представляет существующий стек, и (NEWDATA) — это некоторое новое значение, которое ЦП поместил в стек:

(NEWDATA)(DATA)(DATA)(...)

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

(ADDR)(DATA)(DATA)(...)

Когда выделяется динамический буфер, стек растёт влево на размер буфера. Так, если функция начинается с объявления char a[10], результатом будет:

(.a........)(ADDR)(DATA)(DATA)(...)

В конце подпрограммы память, занятая буфером, освобождается, и вызывается операция RET. Она извлекает адрес возврата из стека и выполняет переход по этому адресу, возвращая управление туда, откуда была вызвана подпрограмма.

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

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

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

Предотвращение

Для того, чтобы сделать переполнение буфера менее вероятным, используются различные приёмы.

Системы обнаружения вторжения

С помощью систем обнаружения вторжения (СОВ) можно обнаружить и предотвратить попытки удалённого использования переполнения буфера. Так как в большинстве случаев данные, предназначенные для переполнения буфера, содержат длинные массивы инструкций No Operation (NOP или NOOP), СОВ просто блокирует все входящие пакеты, содержащие большое количество последовательных NOP-ов. Этот способ, в общем, неэффективен, так как такие массивы могут быть записаны с использованием разнообразных инструкций языка ассемблера. В последнее время крэкеры начали использовать шелл-коды с шифрованием, самомодифицирующимся кодом, полиморфным кодом и алфавитно-цифровым кодом, а также атаки возврата в стандартную библиотеку для проникновения через СОВ.

Защита от повреждения стека

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

Существуют две системы: StackGuard и Stack-Smashing Protector (старое название — ProPolice), обе являются расширениями компилятора gcc. Начиная с gcc-4.1-stage2, SSP был интегрирован в основной дистрибутив компилятора. Gentoo Linux и OpenBSD включают SSP в состав распространяемого с ними gcc.

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

Защита пространства исполняемого кода для UNIX-подобных систем

Защита пространства исполняемого кода может смягчить последствия переполнений буфера, делая большинство действий злоумышленников невозможными. Это достигается рандомизацией адресного пространства (ASLR) и/или запрещением одновременного доступа к памяти на запись и исполнение. Неисполняемый стек предотвращает большинство эксплойтов кода оболочки.

Существует два исправления для ядра Linux, которые обеспечивают эту защиту — PaX и exec-shield. Ни один из них ещё не включен в основную поставку ядра. OpenBSD с версии 3.3 включает систему, называемую W^X, которая также обеспечивает контроль исполняемого пространства.

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

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

Некоторые процессоры, такие как Sparc фирмы Sun, Efficeon фирмы Transmeta, и новейшие 64-битные процессоры фирм AMD и Intel предотвращают выполнение кода, расположенного в областях памяти, помеченных специальным битом NX. AMD называет своё решение NX (от англ. No eXecute), а Intel своё — XD (от англ. eXecute Disabled).

Защита пространства исполняемого кода для Windows

Сейчас существует несколько различных решений, предназначенных для защиты исполняемого кода в системах Windows, предлагаемых как компанией Майкрософт, так и сторонними компаниями.

Майкрософт предложила своё решение, получившее название DEP (от англ. Data Execution Prevention — «предотвращение выполнения данных»), включив его в пакеты обновлений для Windows XP и Windows Server 2003. DEP использует дополнительные возможности новых процессоров Intel и AMD, которые были предназначены для преодоления ограничения в4 ГиБ на размер адресуемой памяти, присущий 32-разрядным процессорам. Для этих целей некоторые служебные структуры были увеличены. Эти структуры теперь содержат неиспользуемый (зарезервированный) бит NX. DEP использует этот бит для предотвращения атак, связанных с изменением адреса обработчика исключений (так называемый SEH-эксплойт). DEP обеспечивает только защиту от SEH-эксплойта, он не защищает страницы памяти с исполняемым кодом.

Кроме того, Майкрософт разработала механизм защиты стека, предназначенный для Windows Server 2003. Стек помечается с помощью так называемых «осведомителей» (англ. canary), целостность которых затем проверяется. Если «осведомитель» был изменён, значит, стек повреждён.

Существуют также сторонние решения, предотвращающие исполнение кода, расположенного в областях памяти, предназначенных для данных или реализующих механизм ASLR.

Использование безопасных библиотек

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

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


Атаки методом подбора пароля (Brute force attacks) — так называемые атаки методом "грубой силы". Как правило, пользователи применяют простейшие пароли, например "123", "admin" и т.д. Этим и пользуются компьютерные злоумышленники, которые при помощи специальных троянских программ вычисляют необходимый для проникновения в сеть пароль методом подбора - на основании заложенного в эту программу словаря паролей или генерируя случайные последовательности символов.

Многие пользователи показывают свою компьютерную безграмотность, устанавливая на личные файлы и на интернет страницы пароли типа: “12345”, “qwerty”, “admin”, “parol”, и т.д. Такие пароли абсолютно ничего не защищают, так как их можно взломать за 1 секунду.Кому может быть выгоденвзлом паролей? Да кому угодно: вашему парню (девушке), которые хотят взломать страничку в «Одноклассниках» или «Вконтакте», конкуренту по бизнесу, который «спит и видит», как раскрыть ваши коммерческие секреты, хакерам, взламывающим чужие компьютеры в надежде раздобыть информацию о кредитных карточках и банковских счетах, и т.д.Для того чтобы узнать пароль от файла Excel или архива WinRar, достаточно запустить специальную программу, «брутфорс», которая выберет нужный пароль из своего словаря или подберет «ключ» к вашим тайнам случайным образом, генерируя комбинации паролей. Сколько времени уйдет на «разгадывание» паролей зависит от двух параметров: длины и сложности пароля, а также от мощности компьютера злоумышленника. Если хакер каким-то образом узнает, что пароль состоит из Н-ого количества символов, то он подберет его в разы быстрее.Подобрать пароль к сайту (например, к страничке в «Одноклассниках») немного сложнее: сервер отслеживает попытки залогиниться с одного IP. Поэтому в таком случае обращаются за помощью к владельцам ботнетов – целых сетей зараженных компьютеров. Они имеют доступ к миллионам машин – а это колоссальные вычислительные мощности для подбора паролей, рассылки спама и даже вирусов, троянов.Составляя пароль, старайтесь, чтобы он не состоял только из букв или только из цифр. Крайне желательно, чтобы в него входили и знаки препинания. В таком случае взломать пароль практически не представляется возможным. Используйте программное обеспечение для генерации паролей и их хранения на компьютере – такое ПО упростит вашу жизнь в разы.Если вдруг надумаете заказать подбор пароля или рассылку спама, подумайте, а нужно ли делать это – ведь таким образом, вы поддерживаете мошенников. Деньги, которые вы заплатили, пойдут на разработку заразы, которая завтра вполне может быть и на вашем компьютере.

Атаки методом подбора пароля

Атаки методом подбора пароля (Brute force attacks) — атаки методом "грубой силы". Как правило, пользователи применяют простейшие пароли, например "123", "admin" и т.д. Этим и пользуются компьютерные злоумышленники, которые при помощи специальных троянских программ вычисляют необходимый для проникновения в сеть пароль методом подбора - на основании заложенного в эту программу словаря паролей или генерируя случайные последовательности символов.

Использующий этот метод злоумышленник просто перебирает вероятные комбинации символов, которые могут быть использованы пользователем в качестве пароля. Такой подход обычно оказывается на удивление эффективным. Специалисты по компьютерной безопасности не перестают удивляться, до чего часто пользователи используют в качестве пароля такие "загадочные" комбинации как, 1234, qwerty или собственное имя, написанное задом наперед. Серьезные хакеры, подбирая заветный пароль, могут досконально изучить человека, этот пароль использующего. Имена членов семьи и прочих родственников, любимой собаки/кошки; за какие команды и в каких видах спорта "объект" болеет; какие книги и кинофильмы любит, какую газету читает по утрам - все эти данные и их комбинации идут в дело. Спастись от подобных атак можно, только используя в качестве пароля случайную комбинацию букв и цифр, желательно сгенерированную специальной программой. Защититься от таких атак, помимо обычной бдительности, помогает система "одноразовых паролей". Впрочем, из-за своей сложности она до сих пор не получила достаточно широкого распространения.


 

А также другие работы, которые могут Вас заинтересовать

54166. Означення квадратного рівняння. Неповні квадратні рівняння та їх розв’язки 747.5 KB
  Мета: домогтися свідомого розуміння учнями означення квадратного рівняння зведеного квадратного рівняння неповного квадратного рівняння назви коефіцієнтів квадратного рівняння; сформувати первинні вміння формулювати означення квадратного рівняння та його видів зведеного та неповного визначати коефіцієнти квадратного рівняння та за ними визначити вид квадратного рівняння підготувати учнів до сприйняття розв’язування неповних квадратних рівнянь. Чи рівносильні рівняння: а 3х – 2 = х...
54167. Математический футбол. Параллельность прямых и плоскостей в пространстве 610 KB
  Прямая а не лежит в плоскости квадрата АВСD и параллельна его стороне АВ. Прямая в не лежит в плоскости квадрата КМLN и параллельна его стороне М L.Каково взаимное расположение прямой и плоскости в пространстве Слайд № 18 Прямая а лежит в плоскости. Прямая а параллельна плоскости .
54168. Множення раціональних чисел 603.5 KB
  Для цього обчислимо приклади усно записані на веслах нашого корабля і прочитаємо ім’я відомого математика який сформував правила множення ділення віднімання і додавання раціональних чисел. Математика кібернетика...
54169. Новорічна математична ялинка 286.5 KB
  Мета: перевірити якість знань і вмінь учнів з теми; зацікавити математикою; розвивати логічне мислення культуру математичних записів, мовлення. Тип уроку: урок узагальнення та систематизації знань.
54170. Урок-казка. Чарівні слова. Розвязування рівнянь 165 KB
  Таблиці плакати до казки про ІванаЦаревича і Чахлика Невмирущого. Клас розбивається на 3 команди і вибирається ІванЦаревич. Там під дубом вчений кіт Русалонька за принцем плаче КоникГорбоконик на підмогу скаче Привид Кентервільський всіх лякає ІванЦаревич Змія перемагає. Учитель: В деякому царстві живбув ІванЦаревич.
54171. Особливості навчання математиці дітей із затримкою психічного розвитку в умовах якісної освіти 450.5 KB
  Поданий матеріал може бути використаний вчителями математики, які працюють як в спеціалізованих класах корекції для дітей із затримкою психічного розвитку, так і звичайних класах загальноосвітньої школи. В посібнику відображені питання класифікації дітей із затримкою психічного розвитку, зазначені причини затримки розвитку, подана характеристика дітей даної категорії та визначені особливості їх навчальної діяльності на уроках математики.
54172. Применение свойств действий при вычислениях и решении уравнений в 5-м и 6-м классах 151.5 KB
  На усвоение этих свойств достаточно на такой ранней стадии устные упражнения с дальнейшим переходом к письменным упражнениям, развивая у учеников умение и навыки работы с числовыми выражениями, решении уравнений без использования правил нахождения неизвестного компонента действия: развивая у учеников творческий подход к решению математических задач.
54173. Система практичних завдань при вивченні математики у 5-6 класах 199.5 KB
  Звичайно в шкільних підручниках є задачі-розрахунки, в основу яких покладено залежності між величинами, які часто зустрічаються в житті, між компонентами руху; між ціною, кількістю і вартістю; між продуктивністю праці, часом роботи і одержаною продукцією; розрахунки часу; знаходження периметрів, площ; обчислення витрат різних матеріалів тощо.
54174. Система дидактичних умов пізнавальної діяльності учнів на уроках математики 119.5 KB
  Система дидактичних розумів розвитку пізнавальної діяльності учнів на уроках математики. Розвиток пізнавального інтересу учнів. Прийоми активізації пізнавальної діяльності учнів на уроках математики. Інтерактивні технології навчання – спосіб створення умов залучення учнів до пізнавальної діяльності.