Мой сайт
Главная
Вход
Регистрация
Среда, 08.05.2024, 22:25Приветствую Вас Гость | RSS
Меню сайта

Категории раздела
Охрана окружающей среды [4]
Охрана окружающей среды
Гражданская оборона [11]
Гражданская оборона
Безопасность воздушного движения [10]
Безопасность воздушного движения

Мини-чат

Наш опрос
Оцените мой сайт
Всего ответов: 2

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » 2017 » Июль » 1 » Безопасность доступа к памяти
14:31
Безопасность доступа к памяти
Безопасность доступа к памяти — концепция в разработке программного обеспечения, целью которой является избежание программных ошибок, которые ведут к уязвимостям, связанным с доступом к оперативной памяти компьютера, таким как переполнения буфера и висячие указатели.

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

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

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

Первую огласку ошибки памяти получили в 1972 году. И далее они являлись проблемой многих программных продуктов, средством, позволяющим применять эксплоиты. Например, червь Морриса использовал множество уязвимостей, часть из которых была связана с ошибками работы с памятью
Типы ошибок памяти
Различают несколько видов ошибок памяти (уязвимостей), которые могут возникать в некоторых языках программирования:

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


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

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

Ошибки при работе с динамической памятью — неправильное распоряжение динамически выделяемой памятью и указателями. В данном случае выделение памяти под объекты осуществляется во время выполнения программы, что может повлечь за собой ошибки времени исполнения. Данной уязвимости подвержены языки программирования с низким уровнем абстракций, поддерживающие непосредственный доступ к памяти компьютера (Си, Си++).


Висячий указатель — указатель, не ссылающийся на допустимый объект соответствующего типа. Данный вид указателей возникает, когда объект был удалён (или перемещён), но значение указателя не изменили на нулевое. В данном случае он всё ещё указывает на область памяти, где находился данный объект. В некоторых случаях это может стать причиной получения конфиденциальной информации злоумышленником; либо, если система уже перераспределила адресуемую память под другой объект, доступ по висячему указателю может повредить расположенные там данные. Особый подтип ошибки — использование после освобождения (use after free) (обращение к освобожденной области памяти) — является распространённой причиной ошибок программ, например, уязвимостей веб-обозревателей.

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

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

Использование различных менеджеров памяти — ошибка, заключающаяся в разрыве связки аллокатор-деаллокатор памяти и использованием различных средств для работы с одним сегментом. Например, в Си++ использованием free для участка памяти, выделенного с помощью new или, аналогично, использованием delete после malloc. Стандарт Си++ не описывает какую-либо связь между new / delete и функциями работы с динамической памятью из Си, хотя new / delete в общем случае реализованы как обёртки malloc / free. Смешанное использование может стать причиной неопределённого поведения.

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

Неинициализированные переменные (англ.) — переменные, которые были объявлены, но не установлены в какое-либо значение, известное до времени их использования. Переменные будут иметь значение, но, в общем случае, труднопредсказуемое. Уязвимость для памяти могут возникнуть при наличии 

неинициализированных («диких») указателей. Эти указатели в своём поведении схожи с висячими указателями, попытка обращения по ним в большинстве случаев будет сопровождаться ошибками доступа или повреждением данных. Однако, возможно получение конфиденциальной информации, которая могла остаться в данной области памяти после предыдущего использования.

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


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

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

Способы обеспечения безопасности

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

Чтобы избежать утечек памяти и ресурсов, обеспечить безопасность в плане исключений, в современном Си++ используются умные указатели. Обычно они представляют из себя класс, имитирующий интерфейс обыкновенного указателя и добавляющего дополнительную функциональность, например проверку границ массивов и объектов, автоматическое управление выделением и освобождением памяти для используемого объекта. Они помогают реализовать идиому программирования Resource Acquisition Is Initialization (RAII), заключающуюся в том, что получение объекта неразрывно связано с его инициализацией, а освобождение — с его уничтожением.

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

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

На нижних уровнях абстракций существуют специальные системы, обеспечивающие безопасность памяти. На уровне операционной системы это менеджер виртуальной памяти, разделяющий доступные области памяти для отдельных процессов (поддержка многозадачности), и средства синхронизации для поддержания многопоточности. Аппаратный уровень также, как правило, включают некоторые механизмы, такие как кольца защиты.
Просмотров: 456 | Добавил: medergrup | Теги: Безопасность доступа к памяти | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт


Поиск

Календарь
«  Июль 2017  »
ПнВтСрЧтПтСбВс
     12
3456789
10111213141516
17181920212223
24252627282930
31

Архив записей

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • База знаний uCoz