- •Защита информации в компьютерных системах
- •Информационная безопасность
- •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аботать?
Литература
Романец Ю.В., Тимофеев П.А., Шаньгин В.Ф. Защита информации в компьютерных системах и сетях. Под ред. В.Ф. Шаньгина. - 2-е изд., перераб. и доп. - М.:Радио и связь, 2001. - 376 с.: ил.
Защита исходных текстов и двоичного кода
Крупные производители тиражного программного обеспечения отказались от защиты своих продуктов, сделав ставку на их массовое распространение. Пусть лицензионные копии приобретает лишь несколько процентов пользователей, но, если число этих копий измеряется миллионами, даже считанные проценты выливаются в солидную сумму, с лихвой окупающую разработку. Однако для небольших коллективов и индивидуальных программистов такая тактика неприемлема. Им необходимо предотвратить "пиратское" копирование своего продукта.
Предоставление исходных текстов часто является обязательным условием заказчика и закрепляется в контракте. Той же цели добиваются сторонники популярного движения открытых исходных текстов, ратующие за их свободное распространение. Кроме того, исходные тексты могут банальным образом украсть. Поэтому, стоит внимательно отнестись к организации технологической защиты интеллектуальной собственности.
Противодействие изучению исходных текстов
Вообще говоря, открытость исходных текстов - понятие расплывчатое. Вопрос: "Является ли бинарная программа в 1 Kбайт более открытой, чем миллион строк исходников без адекватной инфраструктуры и документации?" В самом деле, мало иметь исходный текст - в нем еще предстоит разобраться. Достаточно удалить все или, по крайней мере, большую часть комментариев, дать переменным и функциям бессмысленные, ничего не говорящие имена, как в программе не разберется и сам автор. А наличие и полнота комментариев к исходному тексту в контракте, как правило, не оговаривается. Получается, что контракт может быть формально выполнен, а предоставленный заказчику исходный текст практически бесполезен. "Практически" не означает "полностью": такой простой прием не позволит обеспечить абсолютную защиту.
Воспрепятствовать анализу можно отделением, абстрагированием алгоритма от языка реализации. Например, реализовать критичные для раскрытия компоненты на машине Тьюринга, а ее поддержку обеспечить на целевом языке. Уровней абстракции может быть несколько - чем их больше, тем труднее осуществлять анализ. Помимо машины Тьюринга для этой цели подходят стрелка Пирса, сети Петри и т.д. Такой подход дает превосходный результат, но требует глубоких математических знаний и значительных накладных расходов - программировать на машине Тьюринга намного сложнее, чем на ассемблере. Отдельный вопрос - эффективность полученной программы. Для многих проектов это неприемлемо, поэтому приходится использовать другие приемы.
Динамическое ветвление
Программу, состоящую из нескольких сотен тысяч строк, невозможно рассматривать как простую совокупность команд. На таком уровне детализации "за деревьями леса не видно". Сначала необходимо проанализировать взаимосвязь отдельных функций друг с другом, выделить интересующие фрагменты и лишь затем изучать реализацию самих функций. Чем выше степень дробления программы, тем труднее анализ. Элементарные функции, состоящие из десятка строк, сами по себе дают мало информации. Для формирования целостной картины необходимо рассмотреть вызывающий их код, поднимаясь по иерархии вызовов до тех пор, пока не удастся реконструировать весь алгоритм целиком или, по крайней мере, охватить его ключевой фрагмент. Чтобы построить дерево вызовов, нужно уметь отслеживать перекрестные ссылки в обоих направлениях: определять, какой функции передается управление данным вызовом, и, наоборот, находить все вызовы, передающие управление данной функции.
Этому легко воспрепятствовать, воспользовавшись динамическим ветвлением - т.е. вычислением адреса перехода непосредственно перед передачей управления. Если функция возвращает не результат своей работы, а указатель на следующую выполняемую функцию (результат работы можно возвратить через аргументы, переданные по ссылке), то статический анализ не позволит определить порядок выполнения программы и построить дерево вызовов станет невозможно. Попутно исчезнет масса дублируемого кода, в частности, станет ненужной проверка результата завершения на корректность - в случае возникновения ошибки функция сама передаст управление нужной ветви программы.
Здесь стоит сделать одну оговорку. Язык Си не позволяет объявить функцию, возвращающую указатель на функции - это объявление рекурсивное. Приходится объявлять функцию, возвращающую бестиповой указатель void *. Аналогично - если функция в ходе своей работы вызывает какие-то другие функции, лучше делать это не напрямую, а передавать указатели на вызываемые функции как аргументы. Такой подход не только препятствует анализу, но еще и увеличивает гибкость программы, облегчая повторное использование старого кода в новых проектах - при должной культуре программирования каждая функция представляет "вещь в себе" и не привязана ко всем остальным.
