Архивы: по дате | по разделам | по авторам

Технологии компьютерной безопасности. Часть 3. «Эльбрус» — защита без латания дыр

АрхивПлатформа
автор : Алекс Карабуто   22.03.2004

В третьей статье цикла мы познакомимся с еще одним оригинальным взглядом на защиту информационных систем, которого придерживается знаменитый российский разработчик микропроцессоров семейства «Эльбрус» Борис Бабаян.

См. остальные части нашего обзора:
Часть 1. Intel LaGrande Technology — архитектура компьютерной безопасности;
Часть 2. AMD Execution Protection — маленькая революция;
Часть 4. AMD Alchemy Au1550 — алхимия сетевой защиты.

В третьей статье цикла мы познакомимся с еще одним оригинальным взглядом на защиту информационных систем, которого придерживается знаменитый российский разработчик микропроцессоров семейства «Эльбрус» Борис Бабаян.

Борис Арташесович Бабаян — один из первых выпускников Физтеха, кандидат в мастера спорта по альпинизму, а ныне — семидесятилетний патриарх с мировым именем в области архитектуры и программного обеспечения вычислительных комплексов, устойчивых к отказам и сбоям, директор Института микропроцессорных вычислительных систем РАН, главный конструктор вычислительных средств систем ПРО и ПКО, генеральный конструктор микропроцессорных вычислительных комплексов «Эльбрус», научный руководитель ТОО «Московский центр SPARC-технологий» (www.elbrus.ru), с 1984 года — член-корреспондент РАН, профессор, заведующий кафедрой в МФТИ. Главным достижением считает создание современной архитектуры, системы команд и программного обеспечения высокопроизводительных микропроцессоров. Удостоен Ленинской и Государственной премий СССР, награжден несколькими орденами.

Еще во времена СССР команда создателей вычислительных комплексов «Эльбрус» 1 и 2 (1978, 1985) имела за плечами успешный опыт разработки и эксплуатации системы, в которой, в частности, была успешно решена проблема защищенности вычислений. Архитектура последующих микропроцессоров «Эльбрус» 3М и Е2К адаптирует эту технологию для современного окружения. Защищенная технология «Эльбруса» основана на использовании контроля типов данных и аргументов на всех уровнях системы: в аппаратуре, в языке и в ОС системе, что позволило создать эффективную коммерческую систему, не имеющую аналогов в мире.

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


Стратегический подход

Основными составными частями любых вычислений и любой информационной системы являются обрабатывающие устройства и память всех уровней. Обрабатывающие устройства, работающие по программе, не требуют специальной защиты от внешних воздействий. Проблему здесь представляют ошибки в самой программе вычислений, от которых следует защищаться и которые являются предметом наших забот. В памяти же, напротив, во главу угла ставится защита от внешних воздействий. Обе эти проблемы (собственные ошибки и внешние атаки) в технологии «Эльбрус», в отличие от многих современных систем, решены единообразно на фундаментальном уровне.

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

Технология «Эльбрус» радикально отличается от традиционного подхода — базовые решения, развитые в языках, эффективно поддержаны в аппаратуре и в операционной системе «Эльбрус». Технология «Эльбрус» была разработана 70-е годы, но актуальность ее неизмеримо возросла в последнее время, когда незащищенность информационных систем создала критическую ситуацию для развития всего индустриального сообщества. Реализация технологии требует, конечно, некоторых аппаратных ресурсов и ведет к небольшому снижению производительности, однако, думается, это вполне разумная цена за столь нужное свойство.

Важное отличие технологии защищенности «Эльбрус» заключается в том, что она обеспечивается простым и небольшим ядром (базовыми идеями), тогда как в других системах приходится штопать огромное и непредсказуемое число дыр (причем нет уверенности, что найдены все дыры и/или не допущены ошибки в громадном числе «штопок»). Реализация этих базовых идей в аппаратуре и позволила создать эффективную систему защищенных вычислений.

Одним из базовых принципов организации системы «Эльбрус», выполнение которого в значительной степени ответственно за обеспечение защищенности информационной системы в целом, является правило работы со ссылкой. Система должна следить за тем, чтобы в операциях, использующих в качестве аргументов ссылки, не применялись данные других типов (целые, вещественные и т. д.), а в операциях с аргументами других типов ссылка не могла быть модифицирована. То есть при работе со ссылками нужен строгий контроль типов.

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

1. Никто не тронет меня. Благодаря механизму ссылки, только вычислительный процесс, создавший некоторую область данных, имеет к ней доступ. Если, конечно, ссылка на эту область не была добровольно передана ее владельцем кому-либо другому.

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

В описываемой системе элементарным звеном защиты является контекст. Любой контекст защищен от ошибочных или злонамеренных действий программ, работающих в других контекстах. Иными словами, обеспечивается защита одной процедуры от другой. Эта защита (в «Эльбрусе» она называется контекстной) существенно отличается от других подобных схем (Unix или Windows), таких, например, как защита между двумя виртуальными пространствами, когда невозможно никакое взаимодействие — в нашем случае два контекста могут активно взаимодействовать, работая в одной задаче. Это выгодно отличает данную систему от других, в которых правильность работы программы зависит от правильности работы или степени злонамеренности другой программы, и нет возможности избежать отрицательных последствий этого.

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

Важной чертой описываемой системы является простота и естественность ее использования. Программисту нет необходимости делать что-либо специальное для обеспечения защищенности4. Например, нет ограничений на запуск нескольких независимо откомпилированных программ внутри одной виртуальной памяти. Программы, отлаженные на «Эльбрусе» после перетрансляции, должны работать на других системах. Мало того, отлаженные гораздо лучше, они не будут представлять угрозы для других программ даже на существующих машинах. Таким образом, «Эльбрус» может стать системой, на которой будет необходимо проверять любые программные системы перед выпуском на рынок. Читать дальше >>>


1. Мы предлагаем вам конспект основных положений стостраничной статьи Бориса Бабаяна «Защита информационных систем», опубликованной в 2003 году на www.elbrus.ru/mcst/secure_information_system_v5_2r.pdf и излагающей взгляды автора на защиту информационных систем. За деталями желающие могут обратиться к первоисточнику. [вернуться]

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

3. В результате сильно облегчается сборка всей программной системы, а значит, и отладка больших программных комплексов. В качестве объективного подтверждения этого факта можно привести два примера. Первый: на машины «Эльбрус» переносилось много отлаженных программ с других систем. Во всех случаях в отлаженных программах обнаруживались ошибки. При прогоне в системе симуляторов Э3-Е2К широко распространенных тестов SPEC92 было обнаружены около трех десятков ошибок. Второй: система имеет большой эффект при разработке ОС, так как отпадает необходимость заботится о внутренней защите между модулями самой системы. По своему характеру системное программирование становится подобным прикладному. Алгоритмы ОС, вызванные из пользовательской программы или по прерыванию, работают на стеках пользователя и т. д. Иными словами, ОС превращается в набор описаний, глобальных для любой пользовательской программы. [вернуться]

4. Нет необходимости отдельно оговаривать права доступа и т. д. Если по алгоритму необходимо что-то передать, то передача одновременно означает и передачу прав. В практике других систем известны случаи, когда сложные действия в принципе могли бы улучшить защищенность, но их сложность приводит к тому, что программисты ими не пользуются. Логика здесь простая. Действия для обеспечения защищенности не ощущаются программистом как абсолютно необходимые, поскольку не очевидно, будет ли нарушена защита именно в этом месте. А раз так, программист о них благополучно «забывает». [вернуться]

Практика разработки трех поколений машин с архитектурой «Эльбрус» показала, что правильным подходом является следующий. Архитектура поддерживает реализацию в аппаратуре базовых типов (с обязательным включением всех адресных типов), типовый контроль и формирование контекста с помощью ссылок. На первом этапе («Эльбрус» 1 и 2) в аппаратуру были введены ссылки (дескрипторы) на простые массивы и эффективная поддержка контекста статически вложенных процедур. На втором этапе («Эльбрус» 3М, Е2К) введены ссылки (объектные дескрипторы) на объекты объектно-ориентированного программирования, но контекст поддержан простой одноуровневый с глобальными данными.

Обе реализации достаточно универсальны и допускают применение любых языков программирования. На «Эльбрусе» 1 и 2 были реализованы все распространенные в то время (70-80-е годы) языки, разрабатывать языковые системы было удобно, и качество реализации было высоким. На втором этапе («Эльбрус» 3М, Е2К) в аппаратуре были поддержаны механизмы объектно-ориентированного программирования, используемого в широком спектре объектно-ориентированных языков. Кроме того, поддерживались и отдельные черты языка С++, повышающие эффективность его реализации.

Проблемой традиционных систем является то, что информационное пространство размещается в памяти (физической, виртуальной, в файлах). В качестве ссылки в них используется машинное слово, оно не сопровождается указанием типа (ссылка) и представляет адрес в памяти данных, на которые указывает ссылка. Такая реализация страдает как минимум двумя недостатками. Подход «Эльбруса» заключается в том, что ссылки не выбрасываются из языка подобно языку Java, напротив, работа с ними делается эффективной и не требует статического контроля благодаря аппаратной поддержке. В этом случае нет необходимости как-либо ограничивать язык, и даже ассемблер такой машины не нарушает защищенности, подобно самым строгим языкам высокого уровня. А все проблемы можно условно разбить на две группы: реализация ссылки и контекста.

Одно из важнейших отличий описываемой системы от традиционных — введение дополнительных разрядов в памяти, которые описывают тип данных, хранящихся в каждом слове памяти, — тег. К сожалению, для этого нужны дополнительные разряды, так как все информационные разряды доступны для обработки обычными операциями, и их число нельзя сокращать, чтобы выделить разряды под тип. Число дополнительных битов (тег) зависит от выбранного подхода. В «Эльбрусе» 1, 2 каждое 64-разрядное слово сопровождалось дополнительными восемью битами, в которых кодировался тип данных и контрольная информация для обнаружения сбоев. Для защиты памяти от внешнего воздействия достаточно кодировать только ссылки и, быть может, еще несколько специальных типов данных.

При проектировании Э3-Е2К было введено только по два дополнительных бита на каждое 32-разрядное слово. В Э3-Е2К используются стандартные кристаллы памяти и/или SIMM, DIMM, RIMM. Для хранения тегов служат ЕСС-биты (биты контроля и коррекции аппаратных ошибок). При этом корректирующие возможности не сокращаются, просто увеличивается объем битов, охватываемых одним ЕСС-кодом, и в освободившихся кодовых комбинациях хранятся теги. В пользовательских файлах не следует реализовывать ссылки в память, а значит, не нужно вводить теги.

Помимо этого, в системе команд «Эльбруса» реализованы аппаратные операции со ссылками, компактировка, аппаратная поддержка программно определяемых типов данных и ряд других функций. Основой философии «Эльбруса» является аппаратная поддержка и строгий контроль правильности работы с типами данных.

В «Эльбрусе» 1, 2 архитектурно поддержаны базовые типы данных, для которых существуют аппаратные операции. В «Эльбрусе» 3М-Е2К аппаратно поддержаны все типы данных, содержащие адреса (указатели и т. д.) и «пусто». Переменные этих базовых типов укладываются в 32-128 бит. Вся работа с внутренним содержимым переменных обеспечивается аппаратными операциями (что эквивалентно отдельному программному модулю), которые и производят контроль типов на своем входе. Проблема аппаратных типов решается введением тегов и типового контроля в аппаратных операциях обработки. В «Эльбрусе» 3М-Е2К, кроме аппаратных, архитектурно поддержаны и программно-определяемые типы данных. По существу, в значительной степени поддержка программно определяемых типов данных — это и есть поддержка объектно-ориентированного программирования. Класс — это и есть программно-определяемый тип данных, а объект — есть конкретный экземпляр данных этого типа.

Основная идея реализации тИпового контроля заключается в следующем. Система должна обеспечить возможность произвольного распространения данных определенного типа пользовательскими программами, разумеется, в соответствии с принципами, изложенными выше (ограничения контекста, доступ через ссылки и т. д.). То есть эти данные должны быть расположены в контексте пользовательских программ. Но вся работа с внутренним содержимым переменных этого типа (включая их генерацию) должна быть сосредоточена в определенном программном или аппаратном модуле (в отдельном контексте), вообще говоря, отличном от того контекста, где располагается объект в целом. Это свойство должно быть обеспечено независимо от ошибок в программах, использующих переменные. Для надежного выполнения этих требований без введения ограничений на языки необходима явная идентификация типа переменных в памяти — чтобы алгоритм обработки мог провести контроль правильности типов данных, поданных ему на вход, и отсеять возможные ошибки в программах пользователя. Набор базовых регистров для доступа к данным из программы использовался и в традиционных архитектурах. Существенная деталь, необходимая в реализации «Эльбрус», заключается в том, что каждый базовый регистр — не просто адрес, но полноправная ссылка. На регистрах, кроме адреса, хранится и размер доступной области. Аппаратура проверяет и отсеивает попытки выхода за ее пределы. Это касается не только адресов памяти, но и адресов в регистровом файле.

При реализации процедурного механизма в «Эльбрусе», как и во всех других машинах, чтобы повысить эффективность выделения памяти для локальных данных процедур, используется механизм стека5. При выделении памяти в стеке по существу происходит повторное использование памяти, освободившейся от других переменных, что, как уже отмечалось, порождает некоторые проблемы. Во-первых, в памяти может оказаться «мусор», в том числе содержащий ссылки, которые не должны попасть к новому владельцу. То есть память необходимо почистить «пустышками». Во-вторых, память в стеке, в отличие от других случаев, благодаря стековому принципу переиспользуется. Поэтому на эту область могут остаться ссылки у старого владельца, и, если не принять меры, он получит доступ к информации, ему не принадлежащей. Обе эти проблемы аппаратно устраняются в архитектуре «Эльбрус», причем «ошибка переполнения буфера» невозможна.6 Читать дальше >>>


5. В «Эльбрусе» 1, 2 реализован единый стек в памяти, верхушка которого хранится в процессоре на регистрах. Эти регистры адресуются только стековыми операциями. В Э3-Е2К реализованы окна переменной длины на прямо адресуемых регистрах, работающих как стек и имеющих продолжение в памяти. Кроме того, имеется стек в памяти, как во всех современных машинах. [вернуться]

6. В аппаратуре регистрового файла Э3-Е2К предусмотрен один бит на каждый регистр. Единица в бите означает, что в данном регистре храниться «пусто», независимо от реального его содержания. При считывании из него выдается «пусто». Любая запись в регистр обнуляет этот бит. Похожее решение реализовано для стека в памяти. В процессоре существует битовая шкала, когерентно соответствующая верхушке стека в памяти. Как и в регистрах, бит в шкале означает, что соответствующая ячейка памяти пуста. Отличие в том, что здесь нет процесса откачки/подкачки, который превращает помеченную ячейку в настоящее «пусто» и обнуляет (освобождает) бит. Поэтому, если шкала близка к переполнению, аппаратура сама прописывает наиболее удаленные от вершины ячейки стека «пустышками» и обнуляет (освобождает) биты шкалы. Кроме того, в стеке все ссылки смотрят только в тот же стек и только в сторону его дна. Это значит, что все ссылки будут уничтожены раньше, чем информация, на которую они указывают. Запрещаются все другие виды ссылок на стек (из любых других областей памяти и внутри стека из его более глобальной области на более локальную). [вернуться]

Достижение защищенности находится в очевидном противоречии с задачей обеспечения эффективной совместимости. Во-первых, само определение наиболее распространенных языков С и С++ не полностью соответствует требованиям защищенности в той части, которая была обсуждена выше. Во-вторых, выполнение не всех требований языка контролируется реализацией (например, выход за границы массивов или использование неинициализированных данных), в результате программы обычно содержат ошибки (в том числе приводящие к нарушению защищенности), которые обнаруживаются системой «Эльбрус».

Практика переноса программ на «Эльбрус» показывает, что почти во всех сколько-нибудь солидных программах имеются ошибки. То есть защищенная система не может быть совместима с существующими реализациями с точностью до нарушений защищенности. В связи с этим в «Эльбрусе» реализована технология полной двоичной совместимости с архитектурой Intel х86. Исполнение программ в этом режиме соответствует семантике двоичного кода с точностью до незащищенных черт внутри виртуального пространства, в котором решается задача. Существует защищенный режим, в котором исполняются программы, оттранслированные с языков, с учетом обозначенных ограничений. Наконец, существует смешанный вариант, когда защищенная программа может, например, вызывать незащищенные библиотеки. При этом задача будет работать в двух пространствах: защищенном и незащищенном. Во втором из них не гарантируется защищенность друг от друга незащищенных компонентов задачи. Все же защищенные компоненты будут защищены, как друг от друга, так и от незащищенных частей.

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

Однако самым серьезным вопросом в связи с организацией системы файлов на современных машинах является борьба с вирусами и злонамеренными атаками. Будем называть такие программы агрессивными (АП). Защита от АП в «Эльбрусе» — это не борьба с конкретными приемами авторов АП, как в распространенных антивирусных программах, но скорее создание системы, обеспечивающей защиту от любых АП.

Две причины порождают проблемы в связи с АП: наличие ошибок в разработке и реализации системных программ, которые позволяют АП проникнуть на чужую машину и быть запущенной, и организация файлов, открывающая доступ к файлам пользователя и любой запущенной программе. Первую причину можно существенно ослабить, с помощью технологии, описанной в разделе «Реализация». Вторая причина может быть полностью исключена с помощью организации системы файлов, реализованной в «Эльбрусе». Она не потребовала дополнительной аппаратной поддержки по сравнению с описанной в предыдущих разделах и представляет собой не традиционную древовидную, а сетевую структуру.

Предположим, что в системе «Эльбрус» запущена агрессивная программа (АП). Невзирая на то, как это произошло, легально или нет, не будем считать этот факт успехом АП, так как сам по себе он не привел к нарушению защищенности. При правильной работе механизма ссылок и контекста, программе не будет передан какой-либо локальный контекст, она будет иметь доступ лишь к своим параметрам, если запущена легально, и к системным процедурам. Задача АП — нанести вред и/или размножиться. АП не может без использования ссылок добраться до чужих ячеек памяти или до файлов и тем самым нанести вред или размножиться. Она может попытаться это сделать либо через параметры, либо через системные вызовы. Но в системе «Эльбрус» вероятность реального размножения этими способами близка к нулю, то есть труд создателей вирусов становится совершенно неэффективным. Радикальное снижение вероятности достигается, во-первых, благодаря большей отлаженности системы (вирусописателю гораздо труднее добиться запуска АП), а во-вторых, благодаря ликвидации огромной дыры, когда считанной из сети программе обеспечивается доступ ко всем файлам пользователя. Тем самым, если даже АП оказалась запущенной, на что ушли все «творческие» силы автора вируса, то теперь ему еще надо, используя какие-то ошибки системы, добиться доступа к чувствительным файлам, что при более отлаженной системе сделать еще труднее.

Данная технология защищенной системы в аппаратуре, в ОС, в системах программирования и остальных системных программах была полностью реализована и прошла тщательную проверку практикой на двух поколениях вычислительных систем («Эльбрус» 1 и 2), широко распространенных у нас. Одним из наиболее типичных применений этих машин были системы реального масштаба времени; была продемонстрирована высокая эффективность машин, гораздо большая, чем у других отечественных систем того времени. В проекте Э3-Е2К была проведена значительная модернизация архитектуры, повышающая ее эффективность. Система «Эльбрус» позволяет надеяться на полное решение такой актуальной для компьютерной индустрии задачи, как борьба с вирусами и другими агрессивными программами, и упростить создание распределенных информационных систем. Несмотря на все свои преимущества, надежда на использование этой технологии в распространенных микропроцессорах и системных программах исчезающе мала, по крайней мере в ближайшее время. И причины здесь носят далеко не технический характер. Однако было бы разумно рассмотреть те шаги, которые могли бы привести к использованию системы «Эльбрус».

© ООО "Компьютерра-Онлайн", 1997-2019
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.