Способ выполнения кода в режиме гипервизора
METHOD FOR CODE PERFORMANCE IN HYPERVISOR MODE

Область техники
Изобретение относится к антивирусным технологиям, а более конкретно к системам и способам обеспечения выполнения кода в режиме гипервизора.
Уровень техники
В настоящее время компьютерные угрозы (такие как троянские программы, вирусы, черви) развиваются все более стремительно и используют все большее количество способов обхода антивирусных приложений. Один из таких способов заключается в сокрытии определенных ресурсов компьютерной системы (например, файлов или веток реестра) от антивирусного приложения, которое производит антивирусную проверку. По классификации антивирусных компаний, вредоносные программы, которые используют подобный способ, называют руткитами или использующими руткит-технологии. Руткит-технологии оказываются еще более опасными в том случае, если удается использовать уязвимости в компонентах операционной системы (ОС), которые работают на уровне ядра (англ. kernel level). Это не позволяет современным антивирусным приложениям обнаружить вредоносные программы, которые используют подобные технологии.
Один из выходов в сложившейся ситуации заключается в использовании гипервизора, который обеспечивает изоляцию операционных систем друг от друга, разделение ресурсов между различными запущенными ОС и управление ресурсами. В то же время исполнение кода в режиме гипервизора осуществляется даже на более низком уровне, нежели выполнение кода на уровне ядра. Неудивительно, что подобным подходом заинтересовались компании, которые производят антивирусные приложения. Патентная заявка US 20140053272 описывает выполнение кода в режиме гипервизора для контроля изменений памяти, которые могут быть внесены вредоносным кодом.
Однако указанная публикация не раскрывает решения проблемы, связанной с обеспечением целостности подобного решения в целом, так как существуют угрозы (вредоносные приложения), позволяющие получить доступ к коду, работающему в режиме гипервизора.
Анализ предшествующего уровня техники позволяет сделать вывод о неэффективности и в некоторых случаях о невозможности применения предшествующих технологий, недостатки которых решаются настоящим изобретением, а именно системой и способом вызова выполнения кода в режиме гипервизора.
Раскрытие изобретения
Технический результат настоящего изобретения заключается в обеспечении выполнения кода в режиме гипервизора. Данный технический результат достигается с помощью способа выполнения кода в режиме гипервизора, в котором загружают в оперативную память код гипервизора до загрузки операционной системы; загружают в оперативную память доверенный модуль во время загрузки операционной системы, при этом доверенный модуль является приложением, работающим в операционной системе, и предназначен для вызова выполнения кода гипервизора; совершают первый запрос к гипервизору со стороны доверенного модуля с целью получения адреса гипервизора в оперативной памяти; генерируют криптографический ключ с помощью гипервизора; сохраняют указанный ключ в памяти гипервизора; выделяют страницу оперативной памяти; записывают в выделенную страницу оперативной памяти указанный ключ и адрес гипервизора в оперативной памяти; устанавливают защиту для выделенной страницы памяти; совершают запрос к гипервизору по адресу, записанному в выделенной странице, со стороны доверенного модуля для вызова выполнения кода гипервизора, при этом запрос включает в себя ключ, записанный в выделенной странице; проверяют ключ с помощью гипервизора, путем сравнения криптографического ключа, переданного в запросе к гипервизору со стороны доверенного модуля, с криптографическим ключом в памяти гипервизора; при положительном результате проверки выполняют код гипервизора в режиме гипервизора.
Согласно одному из вариантов реализации страницу памяти выделяет гипервизор.
Согласно еще одному варианту реализации страницу памяти выделяет доверенный модуль.
Согласно другому варианту реализации защита памяти включает бит только для исполнения, при установке которого страница не может быть перезаписана.
Согласно одному из вариантов реализации защиту для выделенной страницы памяти устанавливает доверенный модуль.
Согласно еще одному варианту реализации защиту для выделенной страницы памяти устанавливает гипервизор.
Краткое описание чертежей
Дополнительные цели, признаки и преимущества настоящего изобретения будут очевидными из прочтения последующего описания осуществления изобретения со ссылкой на прилагаемые чертежи, на которых:
Фиг. 1 приводит пример системы, в которой реализован механизм доверенного вызова кода в режиме гипервизора.
Фиг. 2 иллюстрирует вариант предоставления адреса вызова гипервизора для доверенного модуля.
Фиг. 3 показывает пример страницы памяти, где хранится адрес гипервизора для вызова со стороны доверенного модуля.
Фиг. 4 иллюстрирует способ защиты страниц памяти с использованием гипервизора.
Фиг. 5 показывает пример компьютерной системы общего назначения, с помощью которой может быть реализовано настоящее изобретение.
Описание вариантов осуществления изобретения
Объекты и признаки настоящего изобретения, способы для достижения этих объектов и признаков станут очевидными посредством отсылки к примерным вариантам осуществления. Однако настоящее изобретение не ограничивается примерными вариантами осуществления, раскрытыми ниже, оно может воплощаться в различных видах. Сущность, приведенная в описании, является ничем иным, как конкретными деталями, необходимыми для помощи специалисту в области техники в исчерпывающем понимании изобретения, и настоящее изобретение определяется в объеме приложенной формулы.
Введем несколько обозначений, которые будут использоваться в рамках настоящего описания.
Гипервизор-программа, обеспечивающая одновременное, параллельное выполнение нескольких операционных систем (ОС) на одном и том же компьютере. Гипервизоры бывают двух типов - первый имеет свои встроенные драйверы устройств, планировщик и поэтому не зависит от какой-либо ОС, в то время как второй тип работает в одном кольце с ядром основной ОС (kernel mode или нулевое кольцо, англ. ring 0). Первый тип гипервизоров также называется bare-metal и является предпочтительным вариантом реализации гипервизора в настоящем изобретении. Выполнение кода в режиме гипервизора происходит на еще более низком уровне, нежели выполнение кода в режиме ядра (kernel mode или ring 0).
Вызов кода, исполняющегося в режиме гипервизора (гипервызов) - переход к исполнению кода в режиме гипервизора (другое определение - исполнение), что требует аппаратной поддержки технологии виртуализации со стороны процессора.
Доверенная ОС - операционная система, использующая достаточные аппаратные и программные средства, чтобы обеспечить одновременную обработку информации разной степени секретности группой пользователей без нарушения прав доступа. Грубо говоря, доверенная ОС позволяет обеспечить конфиденциальность и целостность пользовательских данных. Более подробно с описанием доверенных систем можно ознакомиться в А Guide to Understanding Configuration Management in Trusted Systems (1988).
Доверенный вызов кода - вызов стороннего кода, во время которого гарантируется, что вызов производится из доверенного источника (страница памяти, которая принадлежит процессу доверенного приложения), что исключает возможность вызова стороннего кода со стороны вредоносных или недоверенных программ. Доверенным приложением является приложение, чей исполняемый файл обладает цифровой подписью и который не является вредоносным.
На Фиг. 1 приведен пример системы, в которой реализован механизм доверенного вызова кода в режиме гипервизора. В операционной системе 110 работают различные приложения 130, доверенный модуль 150, а также может находиться вредоносная программа 140. Приложения 130 включают различные пользовательские приложения, такие как браузер, текстовый редактор и другие. Вредоносная программа 140 может использовать различные способы сокрытия своего присутствия в операционной системе (руткит-технологии, англ. rootkit), что позволяет избежать обнаружения со стороны антивирусных приложений (не отображены на Фиг. 1, могут входить в состав приложений 130). Данный факт не позволяет считать ОС 110 доверенной и ставит под угрозу пользовательские данные. Про способы сокрытия присутствия вредоносных программ в операционной системе можно прочитать в различных источниках, например http://www.z-oleg.com/secur/articles/rootkit.php.
С целью обнаружить присутствие вредоносной программы 140, а также предотвратить возможность доступа со стороны вредоносной программы 140 к пользовательской информации, используется доверенный модуль 150 и гипервизор 120. Доверенный модуль 150 может быть выполнен как в виде отдельного приложения, так и в виде части антивирусной программы. Ключевой особенностью доверенного модуля 150 является его возможность производить вызовы выполнения кода гипервизора 120. Как уже отмечалось выше, выполнение кода в режиме гипервизора происходит на еще более низком уровне, нежели выполнение кода в режиме ядра, что позволяет игнорировать возможные руткит-технологии, используемые вредоносной программой 140. Код, который выполняется в режиме ядра (ring 0), не обладает возможностью доступа к коду, который будет выполняться в режиме гипервизора. Таким же образом, код выполняемый в режиме пользователя (ring 3 или user mode) не имеет доступа к коду, который выполняется в режиме ядра. Более подробно про кольца защиты можно посмотреть в различных публикациях, таких как Russinovich, Mark Е.; David A. Solomon (2005). Microsoft Windows Internals (4 ed.). Microsoft Press. Дополнительно отметим, что выполнение кода в ring 0 также называется выполнением на уровне ядра, а выполнение кода в ring 3 - выполнение на уровне пользователя.
Как уже отмечалось, доверенный модуль 150 производит вызовы выполнения кода гипервизора 150 (чей код будет выполнятся в режиме гипервизора), т.е. производит гипервызов. В рамках настоящего описания предполагается, что ОС 110 изначально является доверенной, но вредоносная программа 140 компрометирует доверенность ОС. Также подразумевается, что вредоносная программа 140 обладает сложной логикой (например, руткит-функционалом), что позволяет избежать ее обнаружения со стороны антивирусного приложения, установленного в ОС 110 (не отображено на Фиг. 1). Таким образом, требуется обеспечить защиту нужной пользователю информации от вредоносной программы 140.
В рамках современных ОС информацию можно защитить несколькими способами: использовать шифрование, контролировать доступ к носителям информации, обеспечить защиту виртуальной памяти тех процессов, которые работают с этой информацией. Технологии, направленные на шифрование и контроль доступа к носителям данных (как правило, это технологии предотвращения утечки данных, англ. Data Leak Prevention) не относятся к настоящей технологии, в настоящем изобретении рассматривается защита виртуальной памяти процессов.
Сам способ защиты виртуальной памяти процессов ненов. Например, NX-бит позволяет установить бит запрета исполнения для страницы памяти, для реализации возможности предотвращения выполнения данных как исполняемого кода. В патенте US 8990934 описана возможность контроля взаимоисключающей установки битов исполнения и записи для страницы памяти с целью предотвращения записи и выполнения эксплойта (англ. exploit).
Однако указанные технологии имеют недостаток, связанный с тем, что они работают на уровне ядра ОС, что оставляет возможность для выполнения вредоносного кода на этом же уровне привилегий, но с более ранним началом работы во время старта (инициализации) ОС после включения компьютера. Такой вредоносный код может отключать или даже хуже - контролировать описанные выше алгоритмы защиты памяти, что опять же не позволяет защитить информацию пользователя в таких случаях. Более подробно про старт (инициализацию) ОС после включения компьютера можно посмотреть в различных публикациях, таких как Russinovich, Mark Е.; David A. Solomon (2005). Microsoft Windows Internals (4 ed.). Microsoft Press.
Как уже отмечалось выше (патентная заявка US 20140053272), выполнение кода в режиме гипервизора позволяет контролировать изменения памяти со стороны вредоносного кода, даже если последний выполняется в режиме ядра. Однако для вызова выполнения кода в режиме гипервизора - выполнения гипервызовов - требуется отдельное приложение, код которого будет производить подобные гипервызовы. В настоящем изобретении таким приложением является доверенный модуль 150. В одном из вариантов реализации доверенным модулем 150 может быть антивирус.
Важно отметить, что код в режиме гипервизора 120 в виде монолитного участка кода, в котором будут содержаться проверки страниц виртуальной памяти процессов, запущенных в ОС 110, сделать очень сложно по нескольким причинам:
- код гипервизора оказывается "перегружен" (оказывается слишком сложным для написания и отладки), он начинает потреблять слишком много системных ресурсов, в частности, процессорного времени;
- код гипервизора работает слишком "низко", т.е. он не "знает" механизм работы ОС, который работает "выше" гипервизора, подобная проблема характерна для bare-metal гипервизоров.
Становится ясно, что требуется вынести часть настоящего изобретения в доверенный модуль 150, оставив в гипервизоре 120 лишь функционал проверки страниц памяти. Доверенный модуль 150 должен быть реализован с учетом специфики реализации ОС 110 (например, с учетом страничной организации памяти ОС Windows), позволяя сделать сам гипервизор 120 кроссплатформенным.
Основой настоящего изобретения является защищенный канал связи между доверенным модулем 150 и гипервизором 120. Для обеспечения подобного канала связи необходимо, чтобы только доверенный модуль 150 мог произвести вызов кода гипервизора 120 (гипервызов). Учитывая, что код гипервизора 120 хранится в оперативной памяти, требуется обеспечить конфиденциальность адреса, по которому данный код вызывается.
Фиг. 2 иллюстрирует вариант предоставления адреса вызова гипервизора 120 для доверенного модуля 150. На этапе 205 сразу после старта компьютерной системы происходит загрузка гипервизора 120 еще до инициализации ОС 110. Как правило, гипервизоры типа bare-metal инициализируются до старта гостевых ОС. Под гостевой ОС подразумевается любая ОС, которая запускается после инициализации гипервизора - в данном случае это ОС 110. На этапе 207 происходит загрузка доверенного модуля 150, который как правило реализован в виде драйвера ОС 110 и загружается как можно раньше. Такое требование необходимо для того, чтобы на этапе 207 ОС 110 считалась еще доверенной, так как ранний старт доверенного модуля 150 позволяет запустить его до того, как будет запущена вредоносная программа 140. На этапе 210 доверенный модуль 150 производит первый вызов кода гипервизора 120 (гипервызов), после которого возвращается адрес гипервизора 120 в памяти (так называемый адрес безопасного гипервызова). Далее следует этот адрес защитить от несанкционированного доступа, для чего на этапе 220 выделяется страница памяти 300, чья структура приведена на Фиг. 3. Сама страница памяти состоит из набора адресов в памяти, по которым будет производится вызов кода. В рамках настоящей реализации только один вызов приведет непосредственно к гипервызову, в то время как остальные вызовут исключение (англ. exception) и ошибку в работе ОС 110 с последующей перезагрузкой. Данная страница памяти 300 выделяется либо доверенным модулем 150, либо непосредственно гипервизором 120 при его первом вызове. Заполнение страницы кодом с вызовами производит гипервизор 150 на этапе 230. Страница памяти дополнительно защищается - на нее устанавливается (либо доверенным модулем 150, либо гипервизором 120) бит только для исполнения, что происходит на этапе 240, при установке которого страница не может быть перезаписана.
Рассмотрим механизм передачи правильного адреса вызова гипервизора 120 доверенному модулю 150. Так как хранить сам адрес в памяти процесса доверенного модуля 150 может быть небезопасно, так как не исключено вмешательство вредоносной программы 140 с целью его получения, то доверенный модуль 150 также хранит токен, который представляет собой случайным образом сгенерированный ключ, используя который можно произвести гипервызов. Сам токен генерируется гипервизором 120 в момент его первого вызова (этап 210 на Фиг. 2) и передается на сторону доверенного модуля 150 для того, чтобы при гипервызове сравнивать значение токена, что позволяет избежать ситуации с злонамеренным вызовом гипервизора 120. Токен генерируется один раз за время работы компьютерной системы (после включения питания) и для ОС 110 он является уникальным. Таким образом, при наличии в системе других гостевых ОС, гипервизор 120 сгенерирует для каждой из них свой собственный токен.
Фиг. 4 иллюстрирует способ защиты страниц памяти с использованием гипервизора. На этапе 410 доверенный модуль 150 совершает гипервызов, после чего на этапе 420 происходит проверка токена и, если токен от защищенного модуля 150 совпадает с сохраненным токена гипервизора 120 (проверка на этапе 430), то на этапе 450 доверенный модуль 150 передает адреса страниц памяти, которые требуют защиты. Защита памяти подразумевает установку битов на запрет/разрешение различных операций - чтение (Read), запись (Write), исполнение кода (eXecute). На этапе 460 назначается проверка контрольных сумм (англ. Cyclic redundancy check, CRC) для данных, которые хранятся в защищаемых страницах памяти. На этапе 470 со стороны гипервизора 120 назначается периодическая проверка по подсчету контрольных сумм для защищаемых страниц памяти из-за того, что возможна атака, связанная с работой по линейным адресам. Периодическая проверка может быть инициализирована как гипервизором 120, так и доверенным модулем 150 путем использования гипервызовов через равные промежутки времени. Гипервизор 120 может также проверять целостность контрольного модуля 150 для того, чтобы удостовериться, что последний не был изменен вредоносной программой 140. Проверка целостности включает подсчет контрольной суммы и сравнение ее с ранее сохраненным значением для определения изменения контрольного модуля 150. Данная проверка проходит на этапе 420. В том случае, если код контрольного модуля 150 был изменен, гипервизор может восстановить его в памяти, загрузив его с диска.
Приведем пример атаки, связанной с работой по линейным адресам. Например, IDT (Interrupt Dispatch Table) ОС 110 находится по линейному адресу 0×F1D10000, который является отображением (т.е. отображение адреса виртуальной страницы памяти на адрес физической) физического адреса 0×123000. Гипервизор 120 может установить вышеописанную защиту (без потери производительности) на физическую страницу по адресу 0×123000. Но вредоносная программа 140 может выделить физическую страницу, например 0×321000, скопировать туда содержимое оригинальной страницы 0×123000, подменив там нужные элементы (в приведенном случае это будет обработчик прерывания), и установить отображение 0×F1D10000->0×321000, тем самым гипервизор 120 не сможет заметить подмену, так как не имеет информации о логике работы виртуальной памяти в ОС 110. Поэтому доверенный модуль 150 должен периодически изнутри ОС 110 проверять корректность таблиц страниц (англ. page table), как в приведенном примере, то что 0×F1D1000 действительно соответствует 0×123000 и ничему другому.
Рассмотрим варианты хранения гипервизора 120 до его загрузки. Код гипервизора 120 хранится либо в качестве сервиса UEFI (Unified Extensible Firmware Interface), либо в отдельном устройстве на PCI-е плате, которое не определяется в ОС 110 (например, гипервизор 120 или доверенный модуль 150 самостоятельно обрабатывают прерывания от этого устройства), либо используя виртуализацию работы с диском (гипервизор 120 исключает секторы диска, на котором хранится его код, изменяя функционал драйвера диска).
Фиг. 5 представляет пример компьютерной системы общего назначения, персональный компьютер или сервер 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, представленного на Фиг. 5. В вычислительной сети могут присутствовать также и другие устройства, например маршрутизаторы, сетевые станции, пиринговые устройства или иные сетевые узлы.
Сетевые соединения могут образовывать локальную вычислительную сеть (LAN) 50 и глобальную вычислительную сеть (WAN). Такие сети применяются в корпоративных компьютерных сетях, внутренних сетях компаний и, как правило, имеют доступ к сети Интернет. В LAN- или WAN-сетях персональный компьютер 20 подключен к локальной сети 50 через сетевой адаптер или сетевой интерфейс 51. При использовании сетей персональный компьютер 20 может использовать модем 54 или иные средства обеспечения связи с глобальной вычислительной сетью, такой как Интернет. Модем 54, который является внутренним или внешним устройством, подключен к системной шине 23 посредством последовательного порта 46. Следует уточнить, что сетевые соединения являются лишь примерными и не обязаны отображать точную конфигурацию сети, т.е. в действительности существуют иные способы установления соединения техническими средствами связи одного компьютера с другим.
В заключение следует отметить, что приведенные в описании сведения являются примерами, которые не ограничивают объем настоящего изобретения, определенного формулой.