СИСТЕМА И СПОСОБ ПРОВЕРКИ ИСПОЛНЯЕМОГО КОДА ПЕРЕД ЕГО ВЫПОЛНЕНИЕМ
SYSTEM AND METHOD OF CHECKING EXECUTABLE CODE BEFORE EXECUTION THEREOF

Область техники
Изобретение относится к проверке программного кода, а более конкретно к проверке исполняемого кода перед его выполнением.
Уровень техники
В связи с ростом количества вредоносных программ, которые распространяются как через Интернет и локальные сети, так и с помощью переносных носителей, наиболее заметную роль в качестве средств для распространения вредоносного кода играют так называемые эксплойты - фрагменты кода или команд, которые используют уязвимости в программном обеспечении (http://www.securelist.com/m/threats/detect/troian-programs/exploit). Уязвимости являются результатом ошибок, допущенных при программировании или проектировании приложений. С ростом количества приложений и их сложности количество уязвимостей неизбежно растет, чем активно пользуются создатели вредоносных программ, используя уже не единичные эксплойты, а целые наборы, рассчитанные на целый ряд программ и их возможные версии. Эксплойты могут предназначаться для операционных систем, браузеров, сайтов и т.д.
Приведем пример работы одного из самых известных видов эксплойтов, который использует атаку на переполнение буфера. На Фиг.1 приведена схема загрузки исполняемого файла программы с диска в память. Каждый исполняемый файл имеет различные сегменты (секции) - код (text), данные (data), неинициализированные данные (bss), а также динамически распределяемую область памяти при загрузке - кучу (heap) и стек (stack). Каждый сегмент имеет собственное предназначение, например сегмент кода содержит непосредственно исполняемые инструкции. При загрузке для каждого сегмента выделяется некоторая область памяти (страницы памяти при страничной организации памяти).
При выполнении инструкций в сегменте кода используется регистр EIP, который содержит абсолютный адрес следующей инструкции, подлежащей выполнению. Как правило, указатель команд не выходит за пределы сегмента кода, однако подобное может произойти при срабатывании эксплойта, который может изменить адрес возврата выполняемой функции при переполнении буфера.
Для решения проблемы противодействия эксплойтам производители программного обеспечения постоянно выпускают обновления своих приложений с целью закрытия известных уязвимостей, производители операционных систем и антивирусные компании применяют различные способы борьбы с уже известными эксплойтами.
Одним из методов борьбы с эксплойтами является использование функции безопасности DEP (Data Execution Prevention), которая не позволяет приложению исполнять код из области памяти, помеченной как "только для данных", т.е. технология фактически реализует использования флага исполнение (eXecute) для страницы памяти. Данная технология успешно применяется для защиты от атак на переполнение буфера, когда приложение записывает данные за пределами выделенного в памяти буфера.
Другая технология - ASLR (Address Space Layout Randomization) позволяет случайным образом изменять расположение в адресном пространстве процесса важных структур, таких как образ исполняемого файла, подгружаемые библиотеки и стек, что значительно усложняет эксплуатацию определенных уязвимостей.
Можно выделить ряд патентных публикаций, которые описывают способы определения работы эксплойтов на основании операций модификации памяти. Патент US5949973 описывает технологию защиты от атаки на переполнение буфера (стека). Приведенный метод работы создает полную копию стека по случайному адресу в памяти и затем стирает старый стек. В патенте US7155741 приводится метод защиты от переполнения буфера. С этой целью реализуется программная логика (monitor layer), которая отслеживает попытки загрузки кода в память. В том случае, если загружаемый код имеет высокий уровень опасности (high-risk), то monitor layer загружает этот код в заранее отведенный сегмент памяти. Патент US7631292 описывает технологию, близкую к ASLR, что описывается в виде режима IREX (intrusion-resistant execution mode) для ОС. В подобном режиме происходит загрузка DLL по случайным адресам.
Стоит отметить, что приведенные технологии позволяют успешно бороться с большинством современных эксплойтов, однако в ряде случаев не удается отследить запуск самых последних версий эксплойтов, так как создатели эксплойтов ищут все новые способы для обхода имеющихся технологий защиты. Для решения данной задачи требуется разработать механизм отслеживания операций со страницами оперативной памяти для определения момента записи вредоносного исполняемого кода и попытки его выполнения.
Анализ предшествующего уровня техники и возможностей, которые появляются при комбинировании их в одной системе, позволяет получить новый результат, а именно способ для проверки исполняемого кода перед его выполнением.
Сущность изобретения
Технический результат настоящего изобретения заключается в обнаружении программного кода, использующего уязвимости в программном обеспечении (эксплойтов), с помощью проверки исполняемого кода перед его непосредственным выполнением.
Согласно одному из вариантов реализации предлагается способ проверки исполняемого кода перед его выполнением, включает этапы, на которых: определяют значения атрибутов страницы памяти в момент ее выделения или модификации атрибутов; сохраняют адрес страницы памяти при одновременно установленных значениях атрибутов страницы памяти, связанных с разрешением на запись и разрешением на выполнение исполняемого кода; меняют, по меньшей мере, один из атрибутов страницы памяти, связанный с разрешением на запись или выполнением исполняемого кода; получают исключение при обращении к странице памяти, адрес которой был сохранен; определяют атрибуты и адрес страницы памяти, при обращении к которой было получено исключение; производят проверку потока процесса, обращение которого к странице памяти вызвало исключение, и/или исполняемого кода, записанного в странице памяти, при обращении к которой было получено исключение.
Согласно одному из частных вариантов реализации исключение срабатывает при запрещенных действиях с данными, сохраненными в странице памяти, при обращении к которой было получено исключение.
В другом частном варианте реализации исключением является EXCEPTION_ACCESS_VIOLATION.
В еще одном из частных вариантов реализации проверка исполняемого кода включает анализ исполняемого кода, записанного в странице памяти, при помощи одного из: сигнатурной проверки, эвристического анализа, эмуляции.
Согласно одному из частных вариантов реализации проверка потока процесса включает анализ потока, обращение которого к странице памяти вызвало исключение, при помощи одного из: сигнатурной проверки, эвристического анализа, эмуляции.
Согласно одному из вариантов реализации предлагается система проверки исполняемого кода перед его выполнением, которая включает:
перехватчик, связанный с базой данных работы с памятью, при этом перехватчик отслеживает операции с атрибутами страницы памяти процесса, во время которых определяет значения атрибутов страницы памяти в момент ее выделения или модификации атрибутов, сохраняет адрес страницы памяти в базе данных работы с памятью при одновременно установленных значениях атрибутов страницы памяти, связанных с разрешением на запись и разрешением на выполнение исполняемого кода, меняет, по меньшей мере, один из атрибутов страницы памяти, связанный с разрешением на запись или выполнением исполняемого кода, получает исключение при обращении к странице памяти и передает антивирусному приложению информацию об исключении, которая включает, по меньшей мере, информацию о потоке процесса, обращение которого к странице памяти вызвало исключение, и/или адрес страницы памяти; базу данных работы с памятью, предназначенную для хранения адресов страниц памяти; антивирусное приложение, предназначенное для проверки, по меньшей мере, потока процесса, обращение которого к странице памяти вызвало исключение, и/или исполняемого кода, записанного в странице памяти, при обращении к которой было получено исключение.
Согласно одному из частных вариантов реализации исключение срабатывает при запрещенных действиях с данными, сохраненными в странице памяти, при обращении к которой было получено исключение.
В другом частном варианте реализации исключением является EXCEPTION_ACCESS_VIOLATION.
В еще одном из частных вариантов реализации проверка исполняемого кода включает анализ исполняемого кода, записанного в странице памяти, при помощи одного из: сигнатурной проверки, эвристического анализа, эмуляции.
Согласно одному из частных вариантов реализации проверка потока процесса включает анализ потока, обращение которого к странице памяти вызвало исключение, при помощи одного из: сигнатурной проверки, эвристического анализа, эмуляции.
В другом частном варианте реализации в качестве базы данных адресов используется Page Table, где в Page Table Entry (РТЕ) соответствующей страницы выставляется один из зарезервированных битов.
Краткое описание чертежей
Дополнительные цели, признаки и преимущества настоящего изобретения будут очевидными из прочтения последующего описания осуществления полезной модели со ссылкой на прилагаемые чертежи, на которых:
Фиг.1 иллюстрирует схему загрузки исполняемого файла программы с диска в память.
Фиг.2 иллюстрирует систему для обнаружения программного кода, использующего уязвимости в программном обеспечении.
Фиг.3 показывает способ работы перехватчика запросов при обращении потоков процесса на выделение страницы памяти.
Фиг.4 отображает способ отслеживания операций с памятью с помощью перехватчика запросов.
Фиг.5 иллюстрирует способ обнаружения потенциально опасного исполняемого кода перед его выполнением.
Фиг.6 показывает таблицу страниц (page table).
Фиг.7 приводит пример компьютерной системы общего назначения, на которой может быть реализовано настоящее изобретение.
Описание вариантов осуществления изобретения
Объекты и признаки настоящего изобретения, способы для достижения этих объектов и признаков станут очевидными посредством отсылки к примерным вариантам осуществления. Однако настоящее изобретение не ограничивается примерными вариантами осуществления, раскрытыми ниже, оно может воплощаться в различных видах. Сущность, приведенная в описании, является ничем иным, как конкретными деталями, обеспеченными для помощи специалисту в области техники в исчерпывающем понимании изобретения, и настоящее изобретение определяется только в объеме приложенной формулы.
Фиг.2 иллюстрирует систему для обнаружения программного кода, использующего уязвимости в программном обеспечении. Запущенный в операционной системе (ОС) 240 процесс приложения 210, такой как, например, Microsoft Internet Explorer или Mozilla Thunderbird, имеет ряд исполняемых в ОС потоков 220. При исполнении один из потоков 220 обращается к операционной системе 240 при необходимости выделить страницу памяти 250. Каждая выделяемая страница имеет ряд атрибутов - ее можно прочитать (R)ead, записать в нее данные (W)rite, а также исполнять записанный в ней код E(X)ecute. При работе кода эксплойта, записанного по определенному адресу в памяти, страница памяти должна иметь как атрибут W, так и атрибут Х для того, чтобы сначала можно было записать в эту страницу код эксплойта, а затем передать ему выполнение. При этом код эксплойта должен быть внедрен при выполнении одного из потоков 220, что требует анализа как операций с памятью, так и самих потоков для успешного обнаружения эксплойтов.
Для отслеживания операций со страницами памяти используется перехватчик 230, который перехватывает запросы, связанные с обращением к памяти. Например, при обработке запроса на выделение новой страницы памяти со стороны одного из потоков 220 перехватчик 230 записывает в базу данных 260 работы с памятью адрес страницы, ее атрибуты, а также идентификатор потока 220 (TID) после того, как операционная система 240 выделяет страницу в виртуальной памяти 250. В одном из вариантов реализации вместо адреса страницы в базу данных работы с памятью вставляется один из зарезервированных битов в Page Table Entry (РТЕ) соответствующей страницы. В одном из вариантов реализации запись в базу данных 260 происходит только в том случае, если страница памяти имеет атрибуты W и X. В другом варианте реализации настоящего изобретения в базе данных 260 сохраняется информация обо всех операциях со страницами памяти. В еще одном варианте реализации в базе данных 260 дополнительно сохраняется идентификатор процесса 210 (PID) и записи в базе данных 260 по всем запущенным процессам в операционной системе 240.
В системе на Фиг.2 также приведено антивирусное приложение 270, которое обращается к базе данных 260 работы с памятью для проверки состояния виртуальной памяти 250 процесса 210 с целью отслеживания изменения атрибутов страниц памяти, что более подробно раскрыто далее.
Фиг.3 показывает способ работы перехватчика запросов при обращении потоков процесса на выделение страницы памяти. На этапе 302 происходит запрос на выделение страницы памяти, который перехватывается с помощью перехватчика 230 после выделения страницы памяти. На этапе 304 перехватчик 230 определяет атрибуты страницы и в том случае, если у страницы отмечены атрибуты W и X, то на этапе 306 адрес страницы сохраняется в базе данных 260. Атрибуты W и Х могут означать, что в странице памяти может быть записан эксплойт, т.е. вредоносный код, который сначала будет записан в память, а затем выполнен. Для того чтобы не допустить выполнения кода, перехватчик 230 на этапе 308 убирает атрибут X, что не позволит выполнять код, записанный в этой странице. На этапе 310 способ заканчивает свою работу.
Фиг.4 отображает способ отслеживания операций с памятью с помощью перехватчика запросов. На этапе 401 происходит обнаружение исключения, когда один из потоков 220 пытается провести запрещенные действия с данными, сохраненными по определенному адресу в памяти 250, например прочитать или записать данные, в то время как атрибуты соответствующей страницы памяти не заданы (т.е. атрибуты (R)ead и (W)rite не имеют установленного значения "Да"). В операционной системе Windows подобным исключением является EXCEPTION_ACCESS_VIOLATION.
Далее на этапе 402 происходит определение адреса страницы путем запроса в базу данных 260 работы с памятью, в которой была сохранена информация о странице с заданными атрибутами W и X. Если страница была найдена, то алгоритм переходит к этапу 404. В том случае, если исключения сработало на неизвестной странице, то будет вызван стандартный обработчик исключения, который присутствует в операционной системе 240 (этап 420). На этапе 404 происходит определение, почему сработало данное исключение, а именно - на запись или на выполнение (этапы 406 и 407 соответственно). Данная информация передается антивирусному приложению 270, которое определяет ответ на запрос путем оценки риска (этапы 408 и 409 соответственно).
Оценка риска может быть выполнена с учетом известных решений по оценке риска для определенного приложения или запущенного процесса. В одном из вариантов реализации оценка риска может быть выполнена с помощью проверки страницы памяти на наличие известных сигнатур эксплойтов. В других вариантах реализации оценка риска может быть выполнена с помощью методов эвристического анализа или эмуляции. В еще одном варианте реализации могут использоваться и другие подходы, например в патенте US7530106 описывается метод оценки риска процесса путем присвоения ему специального рейтинга. При этом сам рейтинг складывается из двух частей: статической и динамической. Статическая часть считается на основе статических признаков исполняемого файла: размер, местоположение, импортируемые библиотеки, сжатие и т.д. Динамическая часть основана на результатах эмуляции, зависит от того, какие были проделаны операции со службами, файловой системой, реестром, сетью и т.д.
В том случае, если антивирусное приложение 270 разрешает запись или выполнение, то перед этим оно меняет флаги страницы на:
W=Нет, X=Да, если был запрос на выполнение (этап 414),
W=Да, Х=Нет, если был запрос на запись (этап 416). Таким образом, достигается защита от одновременной записи и выполнения. Каждое исключение обрабатывается приведенным выше образом, и информация о каждом подобном событии сохраняется с результатами анализа для последующего определения возможного эксплойта на этапе 418. На этапе 422 способ отслеживания операций с памятью с помощью перехватчика запросов заканчивает свою работу.
Фиг.5 иллюстрирует способ обнаружения потенциально опасного исполняемого кода перед его выполнением. Под потенциально опасным исполняемым кодом понимается как код эксплойта, так и, например, код распаковщика. После того как на этапе 418 происходит обработка исключения, на этапе 502 разбирается информация по исключению - на этапе 504 определяется причина исключения, была ли это попытка исполнения кода или попытка записи. При попытке исполнения кода на этапе 506 происходит анализ исполняемого кода, записанного в странице памяти. При попытке записи на этапе 508 происходит анализ потока 220, который пытается записать исполняемый код в страницу памяти. Анализ исполняемого кода может быть выполнен с помощью известных методов сигнатурной или эвристической проверки, которые позволяют обнаружить как уже известные эксплойты, так и их модификации. Даже если не получится распознать исполняемый код как код эксплойта, операции с атрибутами страницы памяти позволяют надежно предотвратить его исполнение. Если на этапе 510 был сделан вывод о том, что признаки эксплойта выявлены, т.е. анализ на этапе 506 или на этапе 508 дал положительные результаты, то на этапе 512 произойдет завершение работы с памятью процесса приложения 210. В противном случае способ возвращается к этапу 501 ожидания следующего исключения. Под этим может подразумеваться как завершение процесса 210 целиком, включая все потоки 220, так и остановку конкретного потока, в рамках которого возможно исполнение кода эксплойта.
Один из вариантов реализации настоящего изобретения предусматривает выполнение перехватчика 230 в виде драйвера операционной системы 240. Однако вариант использования драйвера для модификации атрибутов страниц может иметь недостатки, связанные с производительностью. Фиг.6 показывает таблицу страниц (page table). Как правило, подобные структуры являются многоуровневыми. Регистр CR3 хранит адрес в физической памяти для первой страницы в page directory. Каждая запись в page directory (PDE) ссылается на соответствующую page table, каждая запись в которой (РТЕ) ссылается уже непосредственно на страницу памяти. Непосредственно с РТЕ (т.е. со страницей) связан ряд флагов, часть из которых отвечает за доступ - чтение (R), запись (W). Также в CPU используется специальный кэш - TLB (Translation Lookaside Buffer). Подобный кэш предназначен для ускорения трансляции адреса виртуальной памяти в адрес физической памяти. Однако TLB сам по себе должен быть синхронизирован с page table, тем более что каждый процесс имеет свое собственное адресное пространство. При многих операциях с памятью TLB полностью или частично очищается (flush), что является ресурсоемкой операцией с точки зрения затрат на очищение буфера и его заполнение (т.к. ответ от буфера занимает максимум несколько тактов, в то время как запрос в память отнимет несколько тысяч тактов).
Другие варианты реализации включают модификацию диспетчера памяти операционной системы 240 или в виде части гипервизора. В одном из вариантов реализации модификация диспетчера памяти операционной системы 240, которая предусматривает поддержку создания событий при переключении атрибутов страниц памяти для использования этих событий перехватчиком 230, модификацию РТЕ с целью поддержки дополнительных полей, используемых настоящим изобретением (например, бит признака изменения атрибутов W и X).
Стоит отметить, что приведенный способ работы направлен не только на обнаружение эксплойтов, но также и на обнаружение самомодифицирующегося кода, распаковки кода с возможностью проверить код перед выполнением, обнаружение внедрение исполняемого кода в системные процессы и т.д. Таким образом, описанный способ направлен на обнаружение нового кода в адресном пространстве процесса перед его выполнением в сочетании с возможной антивирусной проверкой этого кода.
Фиг.7 представляет пример компьютерной системы общего назначения, персональный компьютер или сервер 20, содержащий центральный процессор 21, системную память 22 и системную шину 23, которая содержит разные системные компоненты, в том числе память, связанную с центральным процессором 21. Системная шина 23 реализована, как любая известная из уровня техники шинная структура, содержащая, в свою очередь, память шины или контроллер памяти шины, периферийную шину и локальную шину, которая способна взаимодействовать с любой другой шинной архитектурой. Системная память содержит постоянное запоминающее устройство (ПЗУ) 24, память с произвольным доступом (ОЗУ) 25. Основная система ввода/вывода (BIOS) 26 содержит основные процедуры, которые обеспечивают передачу информации между элементами персонального компьютера 20, например, в момент загрузки операционной системы с использованием ПЗУ 24.
Персональный компьютер 20, в свою очередь, содержит жесткий диск 27 для чтения и записи данных, привод магнитных дисков 28 для чтения и записи на сменные магнитные диски 29 и оптический привод 30 для чтения и записи на сменные оптические диски 31, такие как CD-ROM, DVD-ROM и иные оптические носители информации. Жесткий диск 27, привод магнитных дисков 28, оптический привод 30 соединены с системной шиной 23 через интерфейс жесткого диска 32, интерфейс магнитных дисков 33 и интерфейс оптического привода 34 соответственно. Приводы и соответствующие компьютерные носители информации представляют собой энергонезависимые средства хранения компьютерных инструкций, структур данных, программных модулей и прочих данных персонального компьютера 20.
Настоящее описание раскрывает реализацию системы, которая использует жесткий диск 27, сменный магнитный диск 29 и сменный оптический диск 31, но следует понимать, что возможно применение иных типов компьютерных носителей информации 56, которые способны хранить данные в доступной для чтения компьютером форме (твердотельные накопители, флеш карты памяти, цифровые диски, память с произвольным доступом (ОЗУ) и т.п.), которые подключены к системной шине 23 через контроллер 55.
Компьютер 20 имеет файловую систему 36, где хранится записанная операционная система 35, а также дополнительные программные приложения 37, другие программные модули 38 и данные программ 39. Пользователь имеет возможность вводить команды и информацию в персональный компьютер 20 посредством устройств ввода (клавиатуры 40, манипулятора «мышь» 42). Могут использоваться другие устройства ввода (не отображены): микрофон, джойстик, игровая консоль, сканнер и т.п. Подобные устройства ввода по своему обычаю подключают к компьютерной системе 20 через последовательный порт 46, который, в свою очередь, подсоединен к системной шине, но могут быть подключены иным способом, например, при помощи параллельного порта, игрового порта или универсальной последовательной шины (USB). Монитор 47 или иной тип устройства отображения также подсоединен к системной шине 23 через интерфейс, такой как видеоадаптер 48. В дополнение к монитору 47 персональный компьютер может быть оснащен другими периферийными устройствами вывода (не отображены), например колонками, принтером и т.п.
Персональный компьютер 20 способен работать в сетевом окружении, при этом используется сетевое соединение с другим или несколькими удаленными компьютерами 49. Удаленный компьютер (или компьютеры) 49 являются такими же персональными компьютерами или серверами, которые имеют большинство или все упомянутые элементы, отмеченные ранее при описании существа персонального компьютера 20, представленного на Фиг.7. В вычислительной сети могут присутствовать также и другие устройства, например маршрутизаторы, сетевые станции, пиринговые устройства или иные сетевые узлы.
Сетевые соединения могут образовывать локальную вычислительную сеть (LAN) 50 и глобальную вычислительную сеть (WAN). Такие сети применяются в корпоративных компьютерных сетях, внутренних сетях компаний и, как правило, имеют доступ к сети Интернет. В LAN- или WAN-сетях персональный компьютер 20 подключен к локальной сети 50 через сетевой адаптер или сетевой интерфейс 51. При использовании сетей персональный компьютер 20 может использовать модем 54 или иные средства обеспечения связи с глобальной вычислительной сетью, такой как Интернет. Модем 54, который является внутренним или внешним устройством, подключен к системной шине 23 посредством последовательного порта 46. Следует уточнить, что сетевые соединения являются лишь примерными и не обязаны отображать точную конфигурацию сети, т.е. в действительности существуют иные способы установления соединения техническими средствами связи одного компьютера с другим.
В заключение следует отметить, что приведенные в описании сведения являются примерами, которые не ограничивают объем настоящего изобретения, определенного формулой. Специалисту в данной области становится понятным, что могут существовать и другие варианты осуществления настоящего изобретения, согласующиеся с сущностью и объемом настоящего изобретения.