Работоспособность доверенной среды поддерживается естественно не на всех аппаратных платформах, слишком технически сложное решение и не везде есть необходимое для этого оборудование. Обязательным условием является наличие аппаратуры виртуализации и хотя бы двух процессорных ядер.
Для оборудования AMD этим ограничения и кончаются, с Intel все гораздо сложнее, там как уже говорилось выше стабильные и полнофункциональные версии аппаратуры виртуализации появились только года 3-4 тому назад и соответственно старые процессора поддерживать работу ДВС в полном объеме не будут.
Кроме аппаратных ограничений есть и ограничения на БИОС в части загрузчика UEFI, пока в образ загрузчика ОС не включен активатор ДВС, это дело будущего.
Из ограничений с программными компонентами есть только одно, официальные системы виртуализации совместимы с ГиперДрайвером только если они не используют аппаратною виртуализацию. Дело в том, что архитекторы систем виртуализации Intel и AMD пока нам не разрешают использовать их аппаратуру в мультиплексном режиме, и приходится с ней работать только монопольно.
Гипердрайвер, по праву «первой ночи», захватывает контроль над аппаратурой виртуализации и естественно больше никому ее не отдает, поэтому официальным гипервизорам приходится работать либо в режиме паравиртуализации, либо в режиме эмуляции нулевого уровня привилегий, что даже хорошо с точки зрения безопасности и контроля.
И теперь о главном, надежности функционирования, пока я, как разработчик могу сказать, что получившаяся система не пробиваема только на аппаратуре AMD. Про аппаратуру Intel такое сказать невозможно, в их процессорах много недокументированных возможностей (а по простому бекдоров). Я (и никто в России) не знает как ими воспользоваться, но это не значит что злоумышленники «в серых шляпах» не могут их использовать.
Кроме этого, в архитектуре системы безопасности Intel многое завязано на этап инициализации БИОС, именно на этом этапе система безопасности инициализируется и что самое важно там же блокируется возможность доступа к ней в дальнейшем.
После инициализации БИОС на платформе Intel мы получаем машину с уже настроенными системами безопасности, во многих случаях нет даже возможности посмотреть как они настроены. А если и можем, то ничего изменить уже нельзя, выполнена аппаратная блокировка попыток модификации параметров.
Так что надежность системы на платформе Intel, это вопрос к сборщикам БИОС и архитекторам Intel, я тут как говорится «умываю руки»….
Чтоб не быть голословным приведу пример, но начну издалека.
«День сурка»
Гипердрайверы которыми я занимаюсь пока не применялись в масштабных коммерческих проектах, но это не значит, что они вообще не использовались. Отнюдь, технология отработана, она надежна, но иногда встречаются аномалии. По началу это были мои собственные «косяки» в коде, но к настоящему времени эти «детские болезни» уже в прошлом, все работает безукоризненно.
И все равно «аномалии» бывают даже сейчас, конечно, по каждому случаю нужно разбираться, и разбираемся, как резюме могу сказать, проблем совместимости с софтом и ОС не бывает. Бывает несовместимость с БИОС и аппаратурой материнской платы.
Это не удивительно, Гипердрайвер в первую очередь работает с кремнием, и разные «беспределы» в нем (этому посвящены статьи цикла «Кремневый беспредел») сразу выявляются Гипердрайвером, это можно сказать «лакмусовая бумажка»,- засунул в материнскую плату и сразу видишь, «что такое хорошо, а что такое плохо».
Чтобы не быть голословным приведу конкретный пример, вот снимки того, что называется «хорошо»:
На фотографии экран тестовой программы замера времени выполнения команд и обработки исключений. Время считается в машинных тактах, замер произведен на эталонной машине без Гипердрайвера, реально чистая машина, вопросов к ней нет.
А вот эта же эталонная машина, но с загруженным Гипердрайвером:
Гипердрайвер «честный», он не пытается замаскировать свое присутствие в системе, к слову сказать, таких возможностей у систем виртуализации множество, но здесь все по-честному, на честной машине.
Видно, что время выполнения команд и исключений увеличивается при загрузке Гипердрайвера, и это нормально.
Увеличение времени выполнения бывает двух типов, первый тип, самый очевидный, время увеличивается из-за входа в хост гипервизора, на снимке это команда CPUID, XSETBV и RDMSR с некорректным номером регистра. Циклы выполнения этих команд всегда увеличиваются на 1200-1500 тактов, в зависимости от архитектуры и прошивки микрокода процессора.
Вторым типом увеличения длительности команд является появление дополнительных стадий выполнения команды без выхода в хост гипервизора. Примером может служить левая часть экрана, где выведены значения MSR регистров и время доступа к ним. Время под гипервизором увеличилось в среднем на 30 тактов, эти такты тратятся на проверку соответствия номера текущего регистра со списком номеров регистров требующих выхода в Хост. Тоже самое касается доступа к памяти и обработки исключений, но там естественно увеличение длительности выполнения будет другим, можете посмотреть сами на сколько тактов увеличивается время выполнения этих операций.
Короче говоря, это чистая эталонная машина, вопросов к ней нет.
А теперь посмотрите на снимки экрана той же программы замера времени выполнения на машине в которой все «плохо»:
Даже без Гипердрайвера сразу видны проблемы,- команда XSETBV не выполняется, но это вполне возможно, отрабатывается исключение UD - недействительный код команды. Теперь об однозначных проблемах:
- Команда CPUID с недействительным номером запроса выполняется слишком долго.
- Запредельное время доступа к MSR регистрам с номерами 3F8h-3FEh.
- Не отключилось кеширование ОП, MemAcc показывает время доступа к ОП через Кеш, а не время прямой транзакции в контроллер памяти.
Запускаем на этой плохой машине Гипердрайвер, теперь все стало совсем плохо:
Ну во первых, на этой машине Гипердрайвер установил мировой рекорд, он умудрился зайти и выйти из Хоста при обработке команды CPUID за 750 тактов, я такое вижу впервые, объяснение одно, счетчик тактов работает неправильно, чудес на свете не бывает…
Во вторых, установлен и антирекорд, при выполнении команды RDMSR с недействительным номером регистра вход/выход в Хост занял практически 3000 тактов, диагноз тот же, опять счетчик тактов отработал не правильно…
В третьих, не увеличилось время доступа к MSR регистрам, наблюдается полный хаос, но в среднем оно практически не изменилось...
В четвертых, опять не отработал доступ к оперативной памяти, время увеличилось только на 300 тактов, это время для теневой трансляции, но физический доступ все равно идет в Кеш…
Можно только гадать, что за чудеса творятся на этой машине, вариантов несколько, это может быть особенность реализации режима системного менеджмента, специфика прошивки микрокода, необычная активность сервисного процессора, но может быть и встроенный в БИОС гипервизор, по типу того, что был описан в статье «Китайские закладки».
Естественно на такой «паленой» машине не о какой доверенной среде говорить не приходится, да она и не загружается, виснет в середине загрузки ОС….
Эта «страшилка» озвучивалась исключительно для того, чтобы стало ясно, доверенная среда может быть действительно доверенной только если перед ее загрузкой выполняются проверки на корректность работы аппаратуры. Но и этого мало, нужно контролировать корректность работы аппаратуры на этапе работы ОС, проникнуть в систему можно на любом этапе ее функционирования. Делать это можно сторонними программами, а можно и саму доверенную среду «заточить» под обнаружение вторжений, но это уже совсем другая тема, о ней как ни будь в следующий раз.
«А напоследок я скажу…»
И скажу без лишней скромности, в муках родилась абсолютно новая концепция информационной безопасности.
Она не просто родилась как абстрактный фантом, а реализована в виде программной платформы. На эту платформу можно «навешивать» различные полезные нагрузки, но пока, насколько мне известно, владелец технологии (фирма Код Безопасности) планирует внедрение ее в области ДБО, что дальше будет, посмотрим.
Не думаю что процесс внедрения будет легким, слишком много инновационных решений пришлось применить для превращения этой «сказки» в «быль». Думаю что на этапе массового внедрения у команды разработчиков (и у меня в том числе) будет еще больше проблем, нежели при создании этой платформы.
Мне, честно говоря, страшно…
Но как говорится «глаза боятся, а руки делают», так что продолжение следует.
ВВЕДЕНИЕ
"... недостойно совершенства человеческого подобно рабам тратить часы на вычисления."
Лейбниц
За последние годы работа с информацией без помощи вычислительной техники становится практически немыслимой. Овладение навыками программирования на одном из языков высокого уровня является обязательным элементом образования и культуры каждого инженера.
Созданием языков программирования занимаются в большинстве случаев очень квалифицированные специалисты, часто группы программистов, а иногда даже международные коллективы. Однако подавляющее большинство языков программирования умирало, едва родившись. Лишь к немногим из них был проявлен интерес, и буквально единицы получили действительно широкое распространение. К таким "счастливым" языкам принадлежит язык Паскаль, разработанный Никлаусом Виртом в 1968-1971гг. в Цюрихском Институте информатики (Швейцария). Первоначальная цель разработки языка диктовалась необходимостью инструмента "для обучения программированию как системной дисциплине". Однако очень скоро обнаружилась чрезвычайная эффективность языка Паскаль в самых разнообразных приложениях: от решения небольших задач численного характера до разработки сложных программных систем – компиляторов, баз данных, операционных систем и т.д. Существуют многочисленные реализации языка практически для всех машинных архитектур; разработаны десятки диалектов и проблемно-ориентированных расширений языка Паскаль; обучение программированию и научно-технические публикации часто базируются на этом языке.
Для того чтобы хорошо овладеть программированием, необходимо знать, что такое компьютер. Слово "компьютер" означает "вычислитель", т.е. устройство для вычислений. Потребность в автоматизации обработки данных, в том числе вычислений, возникла очень давно. Многие тысячи лет назад для счета использовались счетные палочки, камешки и т.д. В дальнейшем стали использовать счеты. В 1642 г. Блез Паскаль разработал устройство, механически выполняющее сложение чисел, а в 1673 г. Готфрид Вильгельм Лейбниц сконструировал арифмометр, позволяющий механически выполнять четыре арифметических действия. В в. математик Чарльз Беббидж попытался построить вычислительное устройство, которое должнобыло выполнять вычисления без участия человека, т.е. уметь исполнять программы. Но осуществить эту мечту удалось ученым только в ХХ в., когда для построения вычислительных устройств стали использовать электромеханические реле. С 1943 г. группа специалистов под руководством Джона Мочли и Преспера Экерта в США начала конструировать вычислительную машину на основе электронных ламп. Машина работала достаточно быстро, но для задания её программы приходилось в течение нескольких часов или даже нескольких дней соединять провода. Вот тогда и стали конструировать машину, которая могла бы хранить программу в своей памяти. К этой работе был привлечен знаменитый математик Джон фон Нейман, который ясно и просто сформулировал основные принципы функционирования универсальных вычислительных устройств. Первый компьютер, в котором воплощены принципы фон Неймана, был построен в 1949 г. английским исследователем Морисом Уилксом. С той поры компьютеры стали гораздо более мощными, но подавляющее большинство из них работает в соответствии с принципами фон Неймана.
Фон Неймана описал, как должен быть устроен компьютер для того, чтобы он был универсальным и эффективным устройством для обработки информации [1]. Прежде всего компьютер должен иметь следующие устройства (рис.1):
Рис. 1
процессор, осуществляющий арифметические и логические операции, а также организующий процесс выполнения программ;
запоминающее устройство, или память для хранения программ и данных;
внешние (периферийные) устройства для ввода/вывода информации.
Память должна состоять из некоторого количества пронумерованных ячеек, в каждой из которых могут находиться или обрабатываемые данные, или инструкции программ. Все ячейки памяти должны быть одинаково доступны для других устройств компьютера.
На рис.1 одинарные линии показывают управляющие связи, двойные – информационные.
В общих чертах работу компьютера можно описать так. Вначале с помощью какого-либо периферийного устройства в память компьютера вводится программа. Процессор считывает содержимое ячейки памяти, где находится первая инструкция (команда) программы, и организует её выполнение. Эта команда может задавать выполнение арифметических или логических операций, чтение из памяти данных для выполнения арифметических или логических операций или запись их результатов в память, ввод данных из внешнего устройства в память или вывод данных из памяти на внешнее устройство.
Как правило, после исполнения одной команды процессор начинает обрабатывать команду из ячейки памяти, которая находится непосредственно за только что выполненной командой. Однако этот порядок может быть изменен с помощью команд управления (перехода). Эти команды указывают процессору, что ему следует продолжить выполнение программы, начиная с команды, содержащейся в некоторой другой ячейке памяти. Такой "скачок", или переход, осуществляется в программе не всегда, а только при соблюдении некоторых условий, например, если некоторые числа равны, если в результате предыдущей арифметической операции получился нуль и т.д. Это позволяет использовать одни и те же последовательности команд в программе много раз (т.е. организовывать циклы), выполнять различные последовательности команд в зависимости от соблюдения определенных условий и т.д., т.е. создавать сложные программы.
Таким образом, процессор выполняет инструкции программы автоматически, без вмешательства человека. Он может обмениваться информацией с памятью и внешними устройствами компьютера. Поскольку внешние устройства, как правило, работают значительно медленнее, чем остальные части компьютера, процессор может приостанавливать выполнение программы до завершения операции ввода-вывода с внешним устройством. Все результаты выполненной программы должны быть ею выведены на внешние устройства компьютера, после чего компьютер переходит к ожиданию каких-либо сигналов внешних устройств.
Еще раз следует заметить, что многие современные быстродействующие компьютеры осуществляют параллельную обработку данных на нескольких процессорах одновременно, обрабатывают прерывания от внешних устройств, но тем не менее в основных чертах соответствуют принципам фон Неймана.
Современный компьютер – это не просто вычислительное устройство, а целая вычислительная система – совокупность аппаратных и программных средств, обеспечивающих выполнение возложенных на систему функций. В самом общем случае с аппаратными средствами мы ознакомились, а теперь рассмотрим программные средствах.
Совокупность программных средств можно разделить на три категории:
* прикладные программы, непосредственно обеспечивающие выполнение необходимых пользователям работ: редактирование текстов, рисование картинок, обработка информационных массивов и т.д.;
* системные программы, выполняющие различные вспомогательные функции, например, создание копий используемой информации, выдача справочной информации о компьютере, проверка работоспособности устройств компьютера, обеспечивающщие диалог с пользователем и т.д.;
* инструментальные системы (системы программирования), обеспечиващие создание новых программ для компьютера.
Рассмотрим некоторые системные программы. Одной из важнейших системных программ является операционная система. Операционная система – это программа, которая загружается при включении компьютера. Она осуществляет диалог с пользователем, управление компьютером, его ресурсами (оперативной памятью, местом на дисках и т.д.), запускает другие (прикладные) программы на выполнение. Операционная система обеспечивает пользователю и прикладным программам удобный способ общения (интерфейс) с устройствами компьютера. Для компьютеров типа IBM PC чаще всего используется операционная система MS DOS, UNIX, OS/2.
Важным классом системных программ являются программы-драйверы. Они расширяют возможности DOS по управлению устройствами ввода-вывода компьютера (клавиатурой, жестким диском, мышью и т.д.). С помощью драйверов можно подключать к компьютеру новые устройства или нестандартно использовать имеющиеся устройства.
Турбо-Паскаль относится к инструментальным системам и включает в себя как язык программирования – одно из расширений языка Паскаль для ЭВМ типа IBM, так и среду, предназначенную для написания, отладки и запуска программ.