Добавлен: 29.10.2018
Просмотров: 48108
Скачиваний: 190
9.10. Средства защиты
771
Рис. 9.34. Апплеты могут выполняться веб-браузером в режиме интерпретации
Программы на высокоуровневых языках сценариев также могут выполняться в ре-
жиме интерпретации. Они не используют машинные адреса, поэтому нет и опасений,
что сценарий попытается обратиться к памяти недопустимым способом. Недостатком
режима интерпретации является очень низкая скорость по сравнению со скоростью
работы скомпилированного кода.
9.10.7. Безопасность в системе Java
Язык программирования Java и сопровождающая его система поддержки исполнения
программ были разработаны для того, чтобы однажды разработанные и скомпилиро-
ванные программы поставлялись через Интернет в двоичном виде и работали на любой
машине, поддерживающей Java. Безопасность стала частью разработки Java с самого
начала. В данном разделе будет рассмотрена работа этой системы безопасности.
Java является языком, обеспечивающим безопасность при работе с типами. Это оз-
начает, что компилятор отклонит любую попытку использовать переменную таким
способом, который несовместим с ее типом. Для сравнения рассмотрим следующий
код на языке C:
naughty func( )
{
char *p;
p = rand();
*p=0;
}
Он генерирует случайное число и сохраняет его в указателе p. Затем он сохраняет
нулевой байт по адресу, содержащемуся в p, переписывая то, что было там до этого, —
код или данные. В Java конструкции, в которых подобным образом смешиваются
типы, запрещены самой грамматикой. Кроме того, в Java нет переменных-указателей,
привидения типов, распределения памяти, управляемого пользователем (например,
с помощью malloc и free), а все ссылки на массивы проверяются в ходе выполнения.
Java-программы компилируются в промежуточный двоичный код, называемый байт-
кодом JVM. В JVM есть около 100 команд, большинство из которых помещают объекты
определенного типа в стек, извлекают их из стека или арифметически объединяют две
записи в стеке. Эти JVM-программы, как правило, интерпретируются, хотя в некото-
772
Глава 9. Безопасность
рых случаях они могут быть скомпилированы в машинный язык для более быстрого
исполнения. В модели Java апплеты, отправляемые через Интернет для удаленного
исполнения, являются JVM-программами.
При поступлении апплета он попускается через процедуру проверки байт-кода JVM
на предмет соответствия определенным правилам. Правильно откомпилированный
апплет будет соответствовать им автоматически, но ничто не мешает злоумышленни-
кам написать JVM-апплет на языке ассемблера JVM. Процедура проверки включает
в себя поиск ответов на следующие вопросы:
1. Не пытается ли апплет подделать указатели?
2. Не нарушает ли он ограничения доступа к элементам закрытых классов?
3. Не пытается ли он использовать переменную одного типа как переменную другого
типа?
4. Не генерирует ли он переполнение стека или выход за его нижние границы?
5. Не совершает ли он недопустимые преобразования переменных одного типа
в переменные другого типа?
Если апплет проходит все эти тесты, он может быть запущен без опасений, что он будет
обращаться не к своим областям памяти.
Тем не менее апплеты все же могут выполнять системные вызовы за счет вызова Java-
методов (процедур), предоставляемых для этих целей. Способы, которые использова-
лись для этого в Java, все время совершенствовались. В первой версии Java, JDK (Java
Development Kit — инструментарий Java-разработчика) 1.0, апплеты подразделялись
на два класса: надежные и ненадежные. Апплеты, получаемые с локального диска, были
надежными и им разрешалось выполнять любой необходимый им системный вызов.
В отличие от них апплеты, получаемые через Интернет, считались ненадежными. Они
запускались в песочнице, как показано на рис. 9.33, и им практически ничего не раз-
решалось делать.
Набравшись опыта использования этой модели, компания Sun решила, что она имеет
слишком ограничивающий характер. В JDK 1.1 была задействована цифровая подпись
кода. Когда апплет поступал из Интернета, проводилась проверка, был он подписан
человеком или организацией, которой пользователь доверяет (что определялось поль-
зовательским списком доверенных владельцев цифровых подписей). Если подпи си
можно было доверять, апплет мог делать все что угодно, если нет, — он запускался
в песочнице со строгими ограничениями.
После приобретения дополнительного опыта эта система также была признана неудов-
летворительной, поэтому модель безопасности опять претерпела изменения. В JDK 1.2
была представлена конфигурируемая, тонко настраиваемая политика безопасности,
применяемая ко всем апплетам, как локальным, так и удаленным. Эта модель безопас-
ности настолько сложна, что ее описанию следует посвятить отдельную книгу (Gong,
1999), поэтому мы дадим лишь краткую обобщенную картину некоторых ее основных
особенностей. Каждый апплет характеризуется двумя вещами: тем, откуда он прибыл
и тем, кто его подписал. На вопрос, откуда он прибыл, отвечает его URL, а на вопрос,
кто его подписал, отвечает закрытый ключ, который был использован для его цифро-
вой подписи. Каждый пользователь может создать политику безопасности, состоящую
из перечня правил. В каждом правиле могут перечисляться URL, владелец подписи,
объект и действие, которое апплет может совершить с объектом, если URL апплета
9.11. Исследования в области безопасности
773
и владелец подписи совпадут с указанными в правиле. Концептуально предоставляе-
мая информация показана в табл. 9.3, хотя реально она отформатирована по-другому
и имеет отношение к иерархии классов Java.
Таблица 9.3. Ряд примеров защиты, которая может быть задана в JDK 1.2
URL
Владелец подписи
Объект
Действие
www.taxprep.com
TaxPrep
/usr/susan/1040.xls
Чтение
*
/usr/tmp/*
Чтение, запись
www.microsoft.com
Microsoft
/usr/susan/Office/–
Чтение, запись,
удаление
Один вид действий разрешает доступ к файлу. Действие может определять конкрет-
ный файл или каталог, набор всех файлов в заданном каталоге или набор всех файлов
и каталогов, рекурсивно содержащихся в заданном каталоге. Три строки в табл. 9.3
соответствуют этим трем случаям. В первой строке пользователь Сьюзен установила
свою запись прав доступа так, что апплеты, поступающие от машины обработчика ее
налоговых данных, которая называется
www.taxprep.com
, и подписанные компанией-
обработчиком, имеют доступ для чтения к ее налоговым данным в файле
1040.xls
. Они
могут читать только этот файл, который не могут читать никакие другие апплеты.
Кроме того, все апплеты из всех источников независимо от того, подписаны они или
нет, могут читать и записывать файлы в каталоге
/usr/tmp
.
Далее, Сьюзен доверяет корпорации Microsoft настолько, что разрешает апплетам,
получаемым с ее сайта и подписанным этой компанией, читать, записывать и удалять
файлы, находящихся ниже каталога Office в дереве каталогов, к примеру, для устра-
нения дефектов и установки новых версий программного обеспечения. Для проверки
подписей Сьюзен либо должна иметь необходимый открытый ключ на своем диске,
либо должна получать их в динамическом режиме, например в виде сертификата,
подписанного компанией, которой она доверяет и чей открытый ключ у нее имеется.
В качестве защищаемых ресурсов могут выступать не только файлы. Можно также защи-
тить доступ к сети. Здесь объектом будет конкретный порт на конкретном компьютере.
Компьютер указывается с помощью IP-адреса или DNS-имени; порты на этом компьюте-
ре указываются диапазоном чисел. Возможные действия включают в себя подключение
к удаленному компьютеру и прием подключений, исходящих от удаленного компью-
тера. Таким образом, апплет может получить доступ к сети, но этот доступ ограничен
обменом данными только с теми компьютерами, которые явным образом перечислены
в списке разрешений. Апплеты могут в случае необходимости динамически загружать
дополнительный код (классы), но предоставляемые пользователем загрузчики классов
могут осуществлять строгий контроль того, какие машины могут быть источниками этих
классов. Существует также множество других средств безопасности.
9.11. Исследования в области безопасности
Компьютерная безопасность — весьма актуальная тема. Исследования проводятся во
всех областях: криптографии, атаках, вредоносном коде, средствах обороны, компиля-
торах и т. д. Более или менее непрерывный поток громких инцидентов в области безо-
774
Глава 9. Безопасность
пасности гарантирует интерес к ней исследователей как в научных, так и в промыш-
ленных кругах, и похоже, что в ближайшие несколько он останется на прежнем уровне.
Одной из важных тем остается защита двоичных исполняемых программ. Чтобы оста-
новить все перенаправления потока управления и, следовательно, все вредоносные
средства ROP, существует довольно старая технология целостности потока управле-
ния — Control Flow Integrity (CFI). К сожалению, у нее слишком велики издержки
производительности. Наряду с продолжающимися на прежнем уровне исследованиями
в областях ASLR, DEP и стековых «канареек» самые последние работы посвящены
введению в практику и CFI.
Например, Zhang и Sekar (2013) из университета Стоуни-Брук разработали весьма
эффективную реализацию CFI для двоичных исполняемых программ Linux. Другая
группа разрабатывает еще более эффективную реализацию для Windows (Zhang,
2013b). Другие исследователи попытались обнаружить переполнение буфера как
можно раньше, в момент, когда оно настает, а не при попытке перенаправления по-
тока управления (Slowinska et al., 2012). Обнаружение самого переполнения имеет
одно главное преимущество. В отличие от большинства других подходов, оно позво-
ляет системе обнаружить атаку, изменяющую также данные, не имеющие отношения
к управлению ходом программы. Другие средства предоставляют похожую защиту
в ходе компиляции. Популярным примером может послужить разработанное компани-
ей Google средство AddressSanitizer (Serebryany, 2013). Если будут широко развернуты
любые из этих технологий, нам придется добавить в гонку вооружений, рассмотренную
в разделе о переполнении буфера, еще один абзац.
Одной из горячих тем в криптографии сегодня является гомоморфное шифрование.
Если говорить просто, гомоморфное шифрование позволяет обрабатывать (складывать,
вычитать и т. д.) закодированные данные без их раскодирования. Иными словами,
данные вообще никогда не преобразуются в простой текст. Исследования пределов
доказуемой безопасности для гомоморфного шифрования были проведены в работе
Bogdanov и Lee (2013).
По-прежнему весьма активными областями исследований являются возможности
и контроль доступа. Хорошим примером возможностей, поддерживаемых микроядром,
является ядро seL4 (Klein et al., 2009). Кстати, это также полностью проверенное ядро,
обеспечивающее дополнительную безопасность. Возможности теперь стали актуальной
темой и в UNIX. Robert Watson et al. (2013) реализовали упрощенные возможности
для FreeBSD.
И наконец, проделан большой объем работы по исследованиям технологий проведения
атак и вредоносных программ. Например, в работе Hund и др. (2013) показана прак-
тическая атака канала синхронизации (timing channel attack), призванная преодолеть
рандомизацию адресного пространства в ядре Windows. Также в работе Snowи др..
(2013) показано, что рандомизация адресного пространства в браузере не помогает,
если взломщик находит возможность раскрытия информации о памяти на основе
утечки всего лишь одного гаджета. Что касается вредоносных программ, недавнее ис-
следование, проведенное Rossow и др. (2013), касалось анализа тревожной тенденции
повышения устойчивости ботнетов. Создается впечатление, что в ближайшем будущем
будет невероятно трудно демонтировать именно те ботнеты, которые основаны на одно-
ранговом обмене данными. Некоторые из этих ботнетов сохраняли свою непрерывную
активность свыше пяти лет.
9.12. Краткие выводы
775
9.12. Краткие выводы
Компьютеры часто содержат ценные и конфиденциальные данные, включая налоговые
декларации, номера кредитных карт, бизнес-планы, производственные секреты и мно-
гое другое. Владельцы этих компьютеров очень хотят, чтобы эти данные оставались
закрытыми и неприкосновенными, из чего тут же следует, что операционные системы
должны предоставлять высокий уровень безопасности. В общем, безопасность системы
обратно пропорциональна размеру высоконадежной вычислительной базы.
Фундаментальный компонент безопасности операционных систем касается контроля
доступа к ресурсам. Права доступа к информации могут быть смоделированы в виде
большой матрицы, в которой строками будут домены (пользователи), а столбцами —
объекты (например, файлы). Каждая клетка определяет права доступа домена к объ-
екту. Из-за разреженности матрицы она может сохраняться по строкам, превращаясь
в перечень возможностей, определяющий, что конкретный домен может делать, или
по столбцам, превращаясь в таком случае в список управления доступом, который
определяет, кто и какой доступ к объекту может иметь. При использовании технологий
формальных моделей информационные потоки в системе могут быть смоделированы
и ограничены. Тем не менее временами возможна утечка потоков из-за использования
тайных каналов, образуемых, к примеру, за счет модуляции использования централь-
ного процессора.
Один из способов сохранения секретности информации заключается в ее шифровании
и бережном обращении с ключами. Криптографические схемы могут быть разбиты на
категории схем с секретным ключом и схем с открытым ключом. Метод, использую-
щий секретный ключ, требует от обменивающихся данными сторон предварительного
обмена секретным ключом с использованием какого-нибудь механизма, не использую-
щего их канал связи. Криптография с открытым ключом не требует предварительного
секретного обмена ключами, но она намного медленнее в использовании. Иногда нужно
подтвердить достоверность цифровой информации, в таком случае могут использо-
ваться криптографические хэши, цифровые подписи и сертификаты, подписанные
доверенным центром сертификации.
В любой надежной системе пользователи должны проходить аутентификацию. Она
может быть проведена на основе чего-нибудь известного пользователю, чего-нибудь
имеющегося у него и каких-нибудь его биометрических параметров. Для усиления мер
безопасности может быть проведена двойная идентификация, например сканирование
радужной оболочки глаз и ввод пароля.
Чтобы захватить власть над программами и системами, могут использоваться многие
дефекты кода. К их числу относятся дефекты, допускающие переполнение буфера,
а также позволяющие проводить атаки, использующие строки форматирования, атаки,
использующие указатели на несуществующие объекты, атаки возврата управления
в библиотеку libc, атаки, использующие разыменование нулевого указателя, атаки пере-
полнения целочисленных значений, внедрение программного кода и TOCTOU-атаки.
Существует также множество мер по предотвращению этих способов атаки. В качестве
примеров можно привести стековых «канареек», предотвращение выполнения данных,
рандомизацию распределения адресного пространства.
Инсайдеры, к которым относятся работники компании, могут нанести урон системе
безопасности различными способами. Они могут заложить логические бомбы замед-