- •Защита информации в компьютерных системах
- •Информационная безопасность
- •1. Системы идентификации и аутентификации пользователей
- •2. Системы шифрования дисковых данных
- •3. Системы шифрования данных, передаваемых по сетям
- •4. Системы аутентификации электронных данных
- •5. Средства управления криптографическими ключами
- •"Оранжевая книга" сша
- •Основные элементы политики безопасности
- •Произвольное управление доступом
- •Безопасность повторного использования объектов
- •Метки безопасности
- •Принудительное управление доступом
- •Классы безопасности
- •Требования к политике безопасности
- •Произвольное управление доступом:
- •Повторное использование объектов:
- •Метки безопасности:
- •Целостность меток безопасности:
- •Принудительное управление доступом:
- •Требования к подотчетности Идентификация и аутентификация:
- •Предоставление надежного пути:
- •Требования к гарантированности Архитектура системы:
- •Верификация спецификаций архитектуры:
- •Конфигурационное управление:
- •Тестовая документация:
- •Описание архитектуры:
- •Простые криптосистемы
- •Стандарт шифрования данных Data Encryption Standard
- •Режимы работы алгоритма des
- •Алгоритм шифрования данных idea
- •Отечественный стандарт шифрования данных
- •Электронная цифровая подпись
- •1. Проблема аутентификации данных и электронная цифровая подпись
- •2. Однонаправленные хэш-функции
- •Основы построения хэш-функций
- •Однонаправленные хэш-функции на основе симметричных блочных алгоритмов
- •Алгоритм md5
- •Алгоритм безопасного хэширования sна
- •Отечественный стандарт хэш-функции
- •3. Алгоритмы электронной цифровой подписи
- •Алгоритм цифровой подписи rsа
- •Алгоритм цифровой подписи Эль Гамаля (еgsа)
- •Алгоритм цифровой подписи dsа
- •Отечественный стандарт цифровой подписи
- •Пользователь а вычисляет значения
- •Пользователь в проверяет полученную подпись, вычисляя
- •Литература
- •Романец ю.В., Тимофеев п.А., Шаньгин в.Ф. Защита информации в компьютерных системах и сетях. Под ред. В.Ф. Шаньгина. - 2-е изд., перераб. И доп. - м.: Радио и связь, 2001. - 376 с.: ил.
- •Конеев и.Р., Беляев а.В. Информационная безопасность предприятия. - сПб.: бхв-Петербург, 2003. Защита от копирования
- •Привязка к дискете
- •Перестановка в нумерации секторов
- •Введение одинаковых номеров секторов на дорожке
- •Введение межсекторных связей
- •Изменение длины секторов
- •Изменение межсекторных промежутков
- •Использование дополнительной дорожки
- •Ведение логических дефектов в заданный сектор
- •Изменение параметров дисковода
- •Технология "ослабленных" битов
- •Физическая маркировка дискеты
- •Применение физического защитного устройства
- •"Привязка" к компьютеру.
- •Физические дефекты винчестера
- •Дата создания bios
- •Версия используемой os
- •Серийный номер диска
- •Тип компьютера
- •Конфигурация системы и типы составляющих ее устройств
- •Получение инженерной информации жесткого диска
- •Опрос справочников
- •Введение ограничений на использование программного обеспечения
- •Защита cd от копирования
- •Сравнение различных защит.
- •Краткий справочник по методам взлома и способам защиты от них (1) Взлом копированием и эмулированием
- •(2) Взлом программного модуля
- •Дополнительные способы противодействия
- •Защиты от несанкционированного доступа
- •Идентификация и аутентификация пользователя
- •Взаимная проверка подлинности пользователей
- •Литература
- •Защита исходных текстов и двоичного кода
- •Противодействие изучению исходных текстов
- •Динамическое ветвление
- •Контекстная зависимость
- •Противодействие анализу двоичного кода
- •Заключение
- •Литература
- •Три ключа
- •Средства отладки и взлома программ
- •Отладчики реального режима
- •Отладчики защищенного режима
- •Эмуляторы
- •Автоматические распаковщики
- •Дизасемблеры
- •Прочие программы
- •Отладчик SoftIce
- •1. Загрузка отлаживаемой программы
- •2. Управление SoftIce'ом
- •3. Трассировка программы
- •4. Просмотр локальных переменных
- •5. Установка точек останова на выполнение
- •6. Использование информационных команд
- •7. Символьные имена
- •8. Условные точки останова
- •Как заставить SoftIce pаботать?
- •Как заставить SoftIce/Win/w95 pаботать?
Противодействие анализу двоичного кода
Отсутствие исходных текстов отнюдь не является непреодолимым препятствием для изучения и модификации кода приложения. Методики обратного проектирования позволяют автоматически распознавать библиотечные функции, локальные переменные, стековые аргументы, типы данных, ветвления, циклы и т.д. В недалеком будущем дизассемблеры, вероятно, научатся генерировать листинги, близкие по внешнему виду к языкам высокого уровня.
Сегодня трудоемкость анализа двоичного кода не настолько велика, чтобы надолго остановить злоумышленников. Огромное число постоянно совершаемых взломов - лучшее тому подтверждение. В идеальном случае знание алгоритма защиты не должно влиять на ее стойкость, но это достижимо далеко не всегда. Например, если производитель серверной программы решит установить в демонстрационной версии ограничение на количество одновременно обрабатываемых соединений, злоумышленнику достаточно найти инструкцию процессора, осуществляющую такую проверку и удалить ее. Модификации программы можно воспрепятствовать постоянной проверкой контрольной суммы, но опять-таки код, который вычисляет эту контрольную сумму и сверяет ее с эталоном, можно найти и удалить.
Сколько бы уровней защиты не предусмотреть, один или миллион, программа может быть взломана - это только вопрос времени и затраченных усилий. Но в отсутствии действенных правовых регуляторов защиты интеллектуальной собственности разработчикам приходится больше полагаться на стойкость своей защиты, чем на закон. Бытует мнение, что если затраты на нейтрализацию защитного механизма будут не ниже стоимости легальной копии, ее никто не будет взламывать. Это неверно. Материальный стимул - не единственное, что движет хакером. Гораздо более сильной мотивацией оказывается интеллектуальная борьба с автором защиты, спортивный азарт, любопытство, повышение своего профессионализма, да и просто интересное времяпровождение. Многие молодые люди могут неделями корпеть над отладчиком, снимая защиту с программы стоимостью в несколько долларов, а то и вовсе распространяемой бесплатно (например, диспетчер файлов FAR для жителей России абсолютно бесплатен, но это не спасает его от взлома).
Тем не менее, есть опыт создания защит, сломать которые почти невозможно. (Точнее, их взлом потребовал бы многих тысяч, а то и миллионов лет на типичном бытовом компьютере.)
Гарантированно воспрепятствовать анализу кода позволяет только шифрование программы. Но сам процессор не может непосредственно исполнять зашифрованный код, поэтому перед передачей управления его необходимо расшифровать. Если ключ содержится внутри программы, стойкость такой защиты близка к нулю. Все, чего может добиться разработчик, - затруднить поиск и получение этого ключа, тем или иным способом препятствуя отладке и дизассемблированию программы. Другое дело, если ключ содержится вне программы. Тогда стойкость защиты определяется стойкостью используемого криптоалгоритма (конечно, при условии, что ключ перехватить невозможно). Опубликованы и детально описаны многие криптостойкие шифры, взлом которых заведомо недоступен рядовым злоумышленникам.
В общих чертах идея защиты заключается в описании алгоритма с помощью некой математической модели, одновременно с этим используемой для генерации ключа. Разные ветви программы зашифрованы различными ключами, и чтобы вычислить этот ключ, необходимо знать состояние модели на момент передачи управления соответствующей ветви программы. Код динамически расшифровывается в процессе выполнения, а чтобы расшифровать его целиком, нужно последовательно перебрать все возможные состояния модели. Если их число будет очень велико (этого нетрудно добиться), восстановить весь код станет практически невозможно.
Для реализации этой идеи был создан специальный событийно-ориентированный язык программирования, где события являются единственным средством вызова подпрограммы. Каждое событие имеет свой код, один или несколько аргументов и какое угодно количество обработчиков, а может не иметь ни одного (в последнем случае вызываемому коду возвращается ошибка).
На основе кода события и значения аргументов диспетчер событий генерирует три ключа - первый только на основе кода события, второй - только на основе аргументов, и третий на основе кода и аргументов. Затем он пытается полученными ключами последовательно расшифровать всех обработчиков событий. Если расшифровка происходит успешно, это означает, что данный обработчик готов обработать данное событие, и тогда ему передается управление.
Алгоритм шифрования должен быть выбран так, чтобы обратная операция была невозможна. При этом установить, какое событие данный обработчик обрабатывает, можно только полным перебором. Для блокирования возможности перебора в язык была введена контекстная зависимость - генерация дополнительной серии ключей, учитывающих некоторое количество предыдущих событий. Это позволило устанавливать обработчики на любые последовательности действий пользователя, например, на открытие файла с именем "Мой файл", запись в него строки "Моя строка" и переименование его в "Не мой файл".
Очевидно, перебор комбинаций всех событий со всеми возможными аргументами займет бесконечное время, а восстановить исходный код программы, защищенной таким образом, удастся не раньше, чем все ее ветви хотя бы однократно получат управление. Однако частота вызова различных ветвей не одинакова, а у некоторых и вовсе очень мала. Например, можно установить на слово "сосна", введенное в текстовом редакторе, свой обработчик, выполняющий некоторые дополнительные проверки на целостность кода программы или на лицензионную чистоту используемого ПО. Взломщик не сможет быстро выяснить, до конца ли взломана программа или нет. Ему придется провести тщательное и кропотливое тестирование, но даже после этого он не будет в этом уверен.
Таким же точно образом осуществляется ограничение срока службы демонстрационных версий. Разумеется, обращаться к часам реального времени бесполезно, их очень легко перевести назад, вводя защиту в заблуждение. Гораздо надежнее опираться на даты открываемых файлов: даже если часы переведены, созданные другими пользователями файлы в большинстве случаев имеют правильное время. Но взломщик не сможет узнать ни алгоритм определения даты, ни саму дату окончания использования продукта. Впрочем, дату в принципе можно найти и полным перебором, но что это дает? Модификации кода воспрепятствовать очень легко: достаточно, чтобы длина зашифрованного текста была чувствительна к любым изменениям исходного. В этом случае взломщик не сможет подправить "нужный" байт в защитном обработчике и вновь зашифровать его. Придется расшифровывать и вносить изменения во все остальные обработчики (при условии, что они контролируют смещение, по которому расположены), а это невозможно, поскольку соответствующие им ключи заранее неизвестны.
Существенными недостатками предлагаемого решения являются низкая производительность и высокая сложность реализации. Если со сложностью реализации можно смириться, то скорость налагает серьезные ограничения на сферу применения. Впрочем, можно значительно оптимизировать алгоритм или оставить все критичные к быстродействию модули незашифрованными (или расшифровывать каждый обработчик только один раз). Интересно другое: действительно ли эта технология позволяет создавать принципиально неизучаемые приложения или в приведенные рассуждения вкралась ошибка?
