Усовершенствованная защита памяти в Internet Explorer 10

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

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

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

Атаки на веб-браузеры

Задача атакующего, использующего уязвимость, связанную с памятью, — вызвать отклонение пути выполнения кода в браузере и запустить код, выбранный злоумышленником. Для этого злоумышленникам требуются две вещи. Им нужен доступный код на компьютере жертвы, который они хотят запустить. Способы получения такого кода можно сгруппировать в два класса. Злоумышленник может поместить в память собственный вредоносный код, используя такие приемы, как распыление кучи. Или он может выбрать для выполнения код, который уже имеется в памяти, используя прием под названием "возвратно-ориентированное программирование".

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

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

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

Другие типы атак относятся к уязвимостям, связанным с обращением к уже освобожденным областям памяти (use-after-free). Используя эти уязвимости, можно заставить приложение обратиться к освобожденному объекту, память которого была повторно использована для некой другой цели.

Защита браузера

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

Применяемые в Internet Explorer технологии предотвращения воздействия на память изменялись с течением времени, чтобы обеспечить защиту от новых способов атак по мере их разработки и распространения. Многие средства защиты, такие как флаг компилятора /GS, использовались еще в предыдущих версиях Internet Explorer, но с течением времени они обновляются и совершенствуются. Некоторые средства защиты, такие как ForceASLR (описано вкратце), являются новыми для Internet Explorer 10 и опираются на новые компоненты операционной системы.

Средства предотвращения воздействия на время компиляции

Для разработчиков программного обеспечения доступны способы предотвращения воздействия на компилятор, которые рекомендуется применять при разработке. Группа разработчиков Internet Explorer использует эти способы во время разработки Internet Explorer как обязательную часть жизненного цикла разработки безопасного ПО (SDL). Мы призываем разработчиков ПО выработать собственный процесс SDL, включающий реализацию этих способов уменьшения воздействия на время компиляции.

Флаг /GS был впервые представлен в Visual Studio .NET 2002 и с тех пор используется всеми поддерживаемыми версиями Internet Explorer. Это технология компилятора, добавляющая возможность обнаружения переполнения буфера в стек приложения. Секретные данные безопасности, известные под названием "канарейки", добавляются в границы стека приложения в среде выполнения. Например, "канарейка", помещенная между буфером стека и обратным адресом, будет перезаписана во время атаки на переполнение буфера, направленной на обратный адрес. Это действие позволит процессу определить, что произошло переполнение буфера. Будет создано исключение, и процесс можно будет безопасно прекратить, прежде чем запустится код злоумышленника.

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

Эта базовая концепция защиты улучшалась в каждой новой версии Visual Studio. Последняя версия Enhanced /GS, используемая в Internet Explorer 9+, включает значительно улучшенную эвристику для защиты большего числа функций, в том числе массивов не указателей и чистых структур данных. Помимо этого, улучшение оптимизации позволило исключить ненужные проверки, уменьшив тем самым воздействие средств защиты на производительность.

Флаг /SAFESEH — это параметр компоновщика, предоставляющий механизм хранения зарегистрированных обработчиков исключений приложения в таблице подстановки в безопасном местоположении в памяти. В случае исключения выполняется проверка адресов обработчиков исключений в стеке приложения по таблице подстановки. Если значения не совпадут, процесс будет прекращен.

Схема, показывающая сравнение адресов регистрации исключений со значениями, хранимыми в таблице подстановки. Если значения не совпадают, создается исключение и процесс прекращается.

Проблема с флагом /SAFESEH заключается в том, что для надежной защиты процесса требуется, чтобы все модули DLL поддерживали средства защиты. Если какой-либо модуль не поддерживает их, защита будет менее эффективной. В то время как для SDL требуется, чтобы весь код Майкрософт компилировался с SAFESEH, надстройки сторонних разработчиков могут быть скомпилированы без использования этого флага.

Флаг /DYNAMICBASE — это параметр компоновщика, позволяющий использовать в приложении технологию предотвращения воздействия на операционную систему, известную как Address Space Layout Randomization (ASLR) . Мы рассмотрим ее более подробно далее в этой записи.

Так же как и с флагом /SAFESEH, проблема с флагом /DYNAMICBASE состоит в том, что любой модуль DLL, не поддерживающий эту технологию защиты, сокращает ценность ASLR как средства предотвращения эксплуатации уязвимостей. Любой модуль в предсказуемом местоположении может стать мишенью для злоумышленника, а для средства эксплуатации уязвимости может требоваться всего одна такая предсказуемая мишень. Многие появившиеся недавно средства эксплуатации уязвимостей направлены на надстройки браузеров, которые не поддерживают защиту ASLR. Например, средство эксплуатации уязвимости Adobe Reader и Acrobat 0-day в прошлом году опиралось на предсказуемое местоположение функций в модуле icucnv36.dll, который не поддерживал ASLR.

Средства предотвращения воздействия на среду выполнения

Средства предотвращения воздействия на среду выполнения позволяют операционной системе обеспечивать безопасность процесса.

DEP/NX — это средство предотвращения воздействия на операционную систему, опирающееся на ключевые компоненты безопасности (предотвращение выполнения данных или No eXecute) современных ЦП. Это средство позволяет помечать страницы памяти как неисполняемые (данные). Процессор откажется запускать код на странице памяти с такой пометкой.

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

Поддержка DEP/NX была впервые активирована по умолчанию в Internet Explorer 8 и остается активированной в Internet Explorer 10.

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

Поддержка SEHOP была впервые активирована в Internet Explorer 9 и остается активированной в Internet Explorer 10.

Технология Address Space Layout Randomization была впервые представлена в Windows Vista и с тех пор значительно улучшена в Windows 8. Когда приложения впервые загружаются в память, ASLR назначает им случайный базовый адрес памяти. Кроме того, другим структурам памяти, таким как PEB (Process Environment Blocks), TEB (Thread Environment Blocks), стеки и кучи, также назначаются случайные местоположения в памяти.

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

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

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

В Windows 8 было реализовано множество улучшений ASLR, все они используются в Internet Explorer 10.

Все выделения памяти снизу вверх и сверху вниз теперь выполняются случайным образом с использованием 8 битов энтропии. Это улучшение значительно сокращает предсказуемые области памяти, в том числе VirtualAlloc и MapViewOfFile.

Технология High Entropy Address Space Layout Randomization (HEASLR) использует преимущества 64-разрядного пространства адресов и назначает больше битов энтропии. В результате получается значительное увеличение числа потенциальных адресов, которые могут назначаться 64-разрядному процессу. Все 64-разрядные процессы могут поддерживать увеличенную энтропию, которая стала доступной благодаря HEASLR. Процессы могут применять это средство защиты либо во время компоновки (/HIGHENTROPYVA), либо во время загрузки через новый параметр Image File Execution Option.

По умолчанию браузер в стиле Metro запускается в 64-разрядном режиме на 64-разрядных компьютерах. Это обеспечивает значительное увеличение пространства адресов и тем самым более случайное распределение памяти.

ForceASLR — это, возможно, наиболее важное изменение ASLR в Windows 8. ForceASLR представляет собой новый параметр загрузчика, используемый Internet Explorer 10 для передачи операционной системе команды выбирать случайным образом местоположение всех модулей, загружаемых браузером, даже если данный модуль не был скомпилирован с флагом /DYNAMICBASE. Защита ForceASLR была добавлена в ядро Windows 8, и этот компонент теперь доступен как обновление для Windows 7, которое будет устанавливаться при установке Internet Explorer 10 на этой платформе.

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

Заключение

Я надеюсь, что этот краткий обзор средств защиты памяти в Windows 8 и Internet Explorer 10 был полезен. Не выставляя напоказ свою работу, мы разработали много других усовершенствований системы безопасности, но многие из них настолько скрыты, что даже не имеют названий. Скоро мы объявим о других наработках, относящихся к безопасности, поэтому следите за обновлениями, ведь мы продолжаем выполнять нашу миссию по созданию безопасной платформы для веб-браузеров.

— Форбес Хигман (Forbes Higman), руководитель программы безопасности, Internet Explorer