Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Unix.docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.91 Mб
Скачать

6. Система безопасности Java

Важным достоинством Java-приложений является защищенность. Во-первых, сам язык способствует написанию более защищенных и устойчивых к сбоям программ. Во-вторых, язык имеет встроенную систему безопасности. К особенностям языка, заставляющим писать безопасный код относятся :

1) Строгая ориентация на объекты.

Технология объектно-ориентированного программирования значительно снижает вероятность возникновения ошибок в программах, из-за подхода к объекту как к завершенной автономной единице. Это исключает возникновение таких трудно обнаруживаемых ошибок, как ошибки, возникающие при взаимодействии двух по отдельности нормально работающих процедур, но ссылающихся на одну и ту же область памяти, в результате чего последствия их совместной работы не предсказуемы. Чем меньше таких ошибок - тем устойчивее работа программы и меньше возможности проникновения в систему из-за сбоев в ней.

2) Строгая типизация и безопасное преобразование типов.

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

3) Отсутствие указателей.

Все элементы данных всегда имеют имя. Каждая простая структура данных или фрагмент кода имеют идентификатор, позволяющий полностью контролировать их. Нельзя сослаться на область памяти (прочитать/записать), не относящейся к переменным Java-программы. Если бы указатели существовали

- это дало бы возможность писать (читать) в любую область памяти компьютера, несанкционированно подменять (получать) данные, выполнять свой код.

4) Позднее распределение памяти и связывание.

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

5) Автоматическая сборка мусора и неявное управление памятью.

В языках С и C++ программист явным образом распределяет память, освобождает ее и следит за всеми указателями на выделенную память. Зачастую это усложняет программы и является главным источником ошибок и уязвимости к атакам типа "переполнение буфера" (злоумышленник, передав программе слишком большой, не предусмотренный программистом, параметр может вызвать крушение системы или выполнение своего кода), нелегальное копирование, захват полномочий. В языке Java программист не должен явно управлять памятью. Выделение и освобождение памяти выполняются автоматически и корректно. При освобождении неиспользуемой памяти применяется механизм сборки мусора (дефрагментация памяти).

6) Классы и методы final.

Классы и методы можно объявлять как final, запрещая тем самым создание подклассов и переопреде­ление методов. Такое объявление препятствует злонамеренному изменению проверенного кода.

7) Проверка имен.

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

8) Синтаксические конструкции для защищенных потоковых структур данных.

Java является многопотоковым языком и обеспечивает защищенный потоковый доступ к структурам данных и объектам.

9) Уникальные манипуляторы для объектов.

С каждым объектом в языке Java связан уникальный хэш-код (hashcode). Это означает, что в любой момент возможен мониторинг состояния Java-программы.

10) Безопасность на уровне компиляции Java-кода.

Во время компиляции анализируются все механизмы защиты, существующие в синтаксисе языка Java, включая проверку согласованности объявлений private и public, правильности типов и инициализации всех переменных в соответствии с предопределенными значениями.

Как уже говорилось, помимо особенностей языка Java, "заставляющих" писать безопасный код, в Java имеется и встроенная система безопасности, которая состоит из следующих элементов:

  • ClassLoader (загрузчик классов)

  • Verifier (верификатор)

  • SecurityManager (менеджер безопасности)

Эта модель известна под названием sandbox (песочница). Все Java-приложения, загруженные из сети, выполняются "в песочнице", т.е. не имеют полного доступа к ресурсам компьютера (см. "Безопасность Java-апплетов") и контролируются системой безопасности Java.

Загрузчик классов определяет, когда и каким образом классы могут быть добавлены в работающую систему и защищает целостность системы, например запрещает загрузку поддельного менеджера безопасности. Он выполняют две основные функции:

  • собственно загрузку байт-кода (с локального диска, по сети, из области памяти)

  • определение пространства имен (namespaces) для различных классов и способов их взаимодействия (отделяя, к примеру, локальные классы от загруженных по сети).

Есть два вида загрузчиков - первичный (primordial) и реализованный в виде объекта (Class Loader Object). Первичный существует в единственном экземпляре и является составной частью виртуальной машины. Он занимается загрузкой доверенных классов (обычно находящихся на локальном диске). Загрузчик второго типа представляет собой обычный Java-объект. С его помощью можно осуществить загрузку класса по сети либо динамическое создание класса программой. Алгоритм действий загрузчика обычно выглядит так:

  1. Определить, не был ли загружен этот класс раньше, и, если да, вернуть его.

  2. Проконсультироваться с первичным загрузчиком на предмет существования внутреннего класса с этим именем (во избежание подмены внутренних классов Java классами загружаемыми по сети).

  3. Запросить у менеджера безопасности разрешение на загрузку данного класса.

  4. Считать файл класса в виде массива байтов - по сети, с диска и т. п.

  5. Создать экземпляр класса Class.

  6. Загрузить другие классы, используемые данным.

  7. Передать класс верификатору на проверку.

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

Класс SecurityManager (менеджер безопасности) отвечает за политику безопасности приложения. Он позволяет приложению перед выполнением потенциально опасной операции выяснить, выполняется ли она классом, загруженным первичным загрузчиком, либо с помощью некоторого ClassLoader по сети (к пос­леднему доверия должно быть гораздо меньше). Далее менеджер безопасности может определить, разре­шить ли эту операцию или запретить. Контролируется работа с файлами (создание, удаление, чтение, запись), запуск программ, подключение библиотек DLL, создание входящих и исходящих сетевых соедине­ний, подмена менеджера безопасности и загрузчика классов, обращение к системным ресурсам, к ресурсам виртуальной машины, защита потоков и групп потоков друг от друга и т. д. Для каждого кода (апплета, Java-программы) имеется возможность установить права доступ и указать, что код, обладающий определенными правами доступа, имеет право на определенные действия (например, создание сетевого соединения с другой машиной). Никакой Java-код не считается безопасным по умолчанию. Локальный код может быть подвер­жен тем же проверкам, что и код апплета, хотя, конечно, никто не мешает ослабить этот контроль с помощью настроек. В менеджере безопасности имеется также возможность цифровой подписи классов (аналог сертификатов в ActiveX). На классы подписанные солидной организацией можно не накладывать стандартные ограничения. В целом, система безопасности (версии JDK 1.1 и 1.2.) представлены ниже:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]