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

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

Эксплуатация

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

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

  1. Злоумышленник может заставить указатель выйти за границы, используя различные ошибки программирования, например, увеличение/уменьшение указателя массива в цикле без надлежащей проверки границ вызывает переполнение/недостаточное переполнение буфера или инициирование запуска сбоя выделения, вызывающего нулевой указатель.
  2. В качестве альтернативы злоумышленник может сделать указатель «висячим», используя неправильный обработчик исключений, который освобождает объект, но не повторно инициализирует указатель на него. Область памяти освобожденного объекта может быть повторно использована новым объектом, несоответствие типов между старым и новым объектом может позволить злоумышленнику получить доступ к непреднамеренной памяти.
  3. Когда значение считывается из памяти путем разыменования указателя, контролируемого злоумышленником, значение может быть повреждено. Злоумышленник заставляет указатель указывать на место, находящееся под его / ее контролем, и отклоняет поток управления. Одним из примеров является ошибка строки формата printf, когда строка формата контролируется злоумышленником, который создает недопустимый указатель и позволяет злоумышленнику читать/записывать произвольные области памяти.

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

Повреждение памяти может привести к другим атакам, таким как атака с повреждением кода, атака с перехватом потока управления, атака только с данными, утечка информации и т. д.

Защита

К числу широко используемых решений относятся защита от разрушения стека, DEP/W+X и ASLR. Платформа Windows также предлагает механизмы защиты, такие как SafeSEH и SEHOP.11.

Защита от разрушения стека обнаруживает переполнение буфера. SafeSEH и SEHOP проверяют указатели обработчиков исключений в стеке, проверяя целостность только определенных указателей кода, и их можно обойти. Файлы cookie, например, могут обнаруживать атаку переполнения буфера, но не прямую перезапись. DEP/W+X может защитить от внедрения кода, но не защищает от атак повторного использования кода, таких как ROP.

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

Безопасность памяти

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

Некоторые другие механизмы защиты, которые следует учитывать:

Общая защита от атак

  1. Целостность данных
  2. Целостность потока данных

Защита от захвата потока управления

  1. Целостность указателя кода
  2. Целостность потока управления

Вывод

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

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

Отказ от ответственности

Эта статья представляет собой краткий обзор статьи SoK: Eternal War in Memory, написанной Ласло Секересом, Матиасом Пайером, Тао Вей, Доун Сонг. Вы можете найти полную статью здесь.