.
На экране приведен код PDF простого одностраничного документа PDF с текстом «Hello World». Здесь он содержит только самые необходимые элементы, которые образуют документ, и только ASCII-символы, чтобы можно было прочитать составные части документа.
Экран. Код PDF документа «Hello World» |
Документ PDF представляет собой древовидную структуру объектов со всеми командами, необходимых программе для чтения данных PDF при обработке страниц документа. В нашем примере корневым является объект 1 (1 0 obj), который находится на абсолютной позиции 12. Корневой объект ссылается на коллекцию страниц, найденных в документе PDF (например, объект 3). В нашем примере документ содержит только одну страницу, определенную внутри объекта 4. Содержание страницы описано в объекте 5 — вы можете найти текст Hello World в круглых скобках. Другие ключевые слова определяют свойства текста, такие как используемый шрифт и расположение на странице.
Этот PDF пример легко понять, поскольку он использует несжатый текст. Как правило, документы PDF используют сжатый текст и их не так просто прочитать без соответствующих инструментов.
Язык программирования PDF и большинство программ, предназначенных для чтения PDF, поддерживают язык сценариев JavaScript. Сценарии могут быть встроены в документ PDF и выполнены «движком» JavaScript программы при чтении PDF-документа. Взаимодействие этого «движка» с операционной системой ограничено. Например, не существует выражений или функций JavaScript, которые позволяют читать произвольные файлы или записывать в них. JavaScript в PDF-документах часто используется для обработки форм, например бланков заказа для расчета итогов или налога с продаж.
Так как же авторы вредоносных программ создают PDF-документы, которые заражают системы? Они это делают, используя ошибки (уязвимые места), которые активно ищут в популярных программах для чтения PDF, например Adobe Reader. Эти уязвимые места часто обнаруживают в «движке» PDF или механизмах JavaScript. Еще в 2008 году одна из таких ошибок была найдена в Adobe Reader в функции JavaScript util.printf. Компания Adobe исправила ее, и в последних версиях Adobe Reader такой ошибки нет.
Util.printf — это функция, которая принимает аргументы и возвращает строку, отформатированную в соответствии с переданными аргументами. Но когда в функцию util.printf передаются некоторые специфические аргументы, возникает ошибка во внутреннем коде функции. При вызове с этими аргументами внутренний код функции util.printf из-за ошибки ведет себя не так, как рассчитывали программисты. Вместо того чтобы отформатировать текст и вернуть управление, программа активирует прерывание, переадресовывающее выполнение внутреннего кода по адресу вне тела программы, где кода не существует. Когда приложение Windows пытается выполнить код, которого не существует, возникает ошибка. Эта ошибка завершает процесс Adobe Reader.
Передача управления программой на произвольный адрес в памяти является «святым Граалем» для авторов вредоносных программ и создателей программ-«взломщиков». Именно таким образом они делают приложения уязвимыми для выполнения их собственного кода. Опытные создатели «взломщиков» могут добиться полного контроля над адресом, по которому передается управление. Это называется управлением расширенным указателем команд — EIP; EIP является указателем команды процессора, то есть регистром, который указывает на адрес в памяти, содержащий исполняемый код. Авторы «взломщиков» сначала помещают собственный код по данному адресу, а затем используют уязвимые места, чтобы при выполнении программы управление передавалось на этот адрес.
Однако вирусы с полным контролем EIP во вредоносных PDF-документах редко можно встретить «на воле». Имеются в виду вредоносные программы, распространяющиеся без ограничений в Интернете, не включая не распространяемые пробные версии вредоносного программного обеспечения или вредоносные программы, используемые в узконаправленных атаках. Часто встречаются «на воле» вредоносные PDF-программы с кодом, обеспечивающим достижение частичного контроля EIP. Авторы вредоносных программ могут создать код для перехода к определенному адресу в памяти, за пределами нормального выполнения программы, но они не в состоянии написать «взломщик», обеспечивающий переход к произвольному адресу в памяти. Они используют технику массового распространения в JavaScript, чтобы внедрить свой вредоносный код в память: заполняют динамическую память («кучу») уязвимой программы вредоносным shell-кодом. Shell-код, или код оболочки, — это небольшая программа, написанная на машинном языке, которая может корректно выполняться в любом месте в памяти.
Код оболочки, используемый в распространенных вредоносных PDF-документах, очень мал и обычно выполняет следующие действия: загружает исполняемый файл с веб-сервера в Интернете с помощью запроса HTTP, записывает этот файл на диск в папку system32 и запускает его. Код оболочки не имеет реальной вредоносной начинки, это просто программа-загрузчик, которая загружает и запускает реальный вирус-троянец из Интернета. Загрузка троянца из Интернета обеспечивает авторам вредоносных программ большую гибкость; они могут изменить код троянца на веб-сервере после того, как выпустят свой вредоносный документ PDF «на волю». Троянская программа и является той «болезнью», что в конечном счете заражает ваш компьютер, например делая его частью бот-сети.
В целом именно так типичный вредоносный документ PDF делает свое «черное дело». При просмотре документа с помощью программы для чтения PDF автоматически выполняется сценарий JavaScript. Этот сценарий заполняет «кучу» программы кодом оболочки, а затем вызывает ошибку (в коде PDF или в коде JavaScript). Это действие приводит к выполнению кода оболочки и в итоге к загрузке и запуску троянской программы.
Методы борьбы
Что могут сделать ИТ-специалисты, чтобы предотвратить использование ошибок в выполнении кода авторами вредоносных программ? Одно из решений, которое часто рекомендуют поставщики программного обеспечения PDF, — отключить механизмы JavaScript. Это действие полезно для защиты недавно обнаруженных уязвимых мест, поскольку оно предотвращает использование техники массового распространения.
Другим способом борьбы является применение учетных записей пользователей с минимальными привилегиями. Поскольку код оболочки во многих вредоносных PDF-документах записывает троянцы в папку system32, ему требуется административный доступ. Отключение прав администратора не позволяет коду оболочки выполнять свой алгоритм. Он сможет загрузить файлы троянца, но не сможет записать их в папку system32 и, следовательно, не сможет запустить троянскую программу. Кроме того, многим троянцам требуются права администратора для внедрения себя в механизмы операционной системы.
Предотвращение выполнения данных DEP представляет собой еще один важный метод противодействия. В операционной системе Windows память помечается как данные или как исполняемый файл. «Куча» на самом деле является данными — она не предназначена для содержания исполняемого машинного кода. Но до появления технологии DEP в системе Windows XP SP2 микропроцессоры выполняли команды, хранящиеся в памяти и обозначенные как данные без каких-либо проблем. DEP изменяет поведение микропроцессора — он уже не выполняет код (в том числе код оболочки), хранящийся в памяти данных (например, в «куче»).
Для предотвращения использования ошибок производители программ для чтения PDF должны определить «кучу» как память данных и включить механизмы DEP для своих программ. Если производители этого не сделали, администраторы могут использовать средства Microsoft Enhanced Mitigation Experience Toolkit (EMET), чтобы активировать механизмы DEP для определенных программ.
Тем не менее разработчики «взломщиков» обнаружили способы обойти DEP. Вместо того чтобы прописывать код оболочки в «кучу», они строят собственный код за счет заимствования существующих команд из кода, который уже загружен в адресное пространство процесса через исполняемые файлы (.exe и .dll файлы). Эта техника называется обратно-ориентированным программированием (ROP), а участки заимствованного кода называются ROP-устройствами. Если опытные авторы вредоносных программ смогут предсказать, в каких местах исполняемые файлы загружаются в память, они смогут заимствовать код из этих файлов для своих ROP-устройств и таким образом использовать уязвимые места в приложениях, защищенных DEP. Для решения этой проблемы в систему Windows Vista добавлен механизм Address Space Layout Randomization (ASLR). ASLR гарантирует, что исполняемые файлы загружаются в случайные или частично случайные адреса памяти, — такой подход не позволяет авторам вредоносных программ предсказать, в каких местах памяти можно будет найти их ROP-устройства.
Для того чтобы воспользоваться средствами ASLR, необходимо работать с последней версией системы Windows, поддерживающей данную технологию (система XP не поддерживает ее). Кроме того, для использования ASLR исполняемые файлы должны быть помечены разработчикам приложений. Если производитель программного обеспечения не обеспечивает поддержку ASLR, вы можете задействовать средства EMET для самостоятельной настройки поддержки.
Даже программные приложения, которые поддерживают ASLR, могут быть уязвимы для атак ROP, если они включают в себя библиотеки DLL, не поддерживающие механизмы ASLR. Например, эта проблема возникает при работе с некоторыми DLL-расширениями оболочки. Расширения оболочки обеспечивают дополнительную функциональность для Windows (например, в вызываемом щелчком правой кнопки мыши контекстном меню приложения Explorer). При развертывании приложения, такого как WinZip, программа установки устанавливает расширение оболочки, которое обеспечивает интеграцию WinZip в контекстное меню приложения Explorer, а также в другие приложения, использующие стандартные диалоговые окна «открыть» и «сохранить». К счастью, библиотека DLL расширения оболочки в WinZip поддерживает технологию ASLR, поэтому она не предоставляет ROP-атакам доступ к приложениям. Но не все производители программного обеспечения так обеспокоены безопасностью, как WinZip, некоторые из них устанавливают DLL-расширения оболочки, не поддерживающие ASLR, и эти библиотеки DLL предоставляют доступ к приложениям для атак ROP. Такие приложения, как Explorer и Adobe Reader, используют библиотеки DLL расширений оболочки.
Другим способом борьбы, который становится популярным, является «песочница». Благодаря «песочнице» уязвимое приложение более или менее изолировано от ресурсов операционной системы. Как администратор, вы можете воспользоваться специальными приложениями «песочницы», чтобы изолировать уязвимые приложения. Кроме того, производители начинают включать «песочницы» в собственные продукты (например, Internet Explorer 7.0, Microsoft Office 2010, Adobe Reader X). «Песочница» использует механизмы безопасности Windows, такие как уровни целостности и ограничение маркеров, чтобы сдерживать «взломщики» и вредоносные программы внутри «песочницы». Атакующий код оболочки, запущенный внутри «песочницы», ограничен ее рамками. В зависимости от типа «песочницы», он имеет доступ «только чтение» к файловой системе и реестру (например, в Adobe Reader X) или полностью изолирован (например, в Google Chrome).
Многоуровневая защита
Лучшим решением для борьбы с уязвимыми местами PDF является использование самых последних версий приложений и операционных систем. Если производители приложений не оправдывают ожиданий, надо бороться самостоятельно с помощью средств EMET и программ «песочницы». Хотя в этой статье акцент сделан на файлы PDF и приложение Adobe Reader, предлагаемые решения распространяются на все типы приложений, которые создают документы и управляют ими, в том числе и на пакет Microsoft Office.
Обратите внимание, что эта статья посвящена методам противодействия вредоносным программам, которые могут встретиться «на воле». Противодействие более целенаправленным атакам может оказаться более сложной задачей, в зависимости от подготовленности агрессора. При целенаправленных атаках противник знает вашу среду и создает специально разработанную вредоносную программу, способную успешно и незаметно работать в этой среде. Если ваша компания — привлекательная мишень, а противник опытен и обеспечен ресурсами, необходимо выйти за рамки мер, описанных выше, например ввести белые списки программ.
Дидье Стивенс (didier.stevens@gmail.com) — работает в компании Contraste Europe NV, имеет звание Microsoft Consumer Security MVP