- •Проблема защиты информации и подходы к ее решению.
- •Основные понятия защиты информации.
- •Угрозы безопасности и каналы утечки информации.
- •Классификация методов и средств защиты информации. Специфика программных средств.
- •Правовое обеспечение защиты информации.
- •Способы нарушения защищенности информации и защиты от него в компьютерных системах.
- •Организация базы учетных записей пользователей в ос Unix.
- •Организация базы учетных записей пользователей в ос Windows
- •Способы аутентификации пользователей.
- •Аутентификация пользователей на основе паролей.
- •Аутентификация пользователей на основе модели «рукопожатия».
- •Программно-аппаратная защита от локального несанкционированного доступа.
- •Аутентификация пользователей на основе их биометрических характеристик.
- •Протоколы прямой аутентификации.
- •Протоколы непрямой аутентификации.
- •Протокол ipSec.
- •Виртуальные частные сети.
- •Разграничение прав пользователей в ос Windows.
- •Дискреционное, мандатное и ролевое разграничение доступа к объектам.
- •Подсистема безопасности ос Windows.
- •Разграничение доступа к объектам в ос Windows.
- •Разграничение прав пользователей в ос Unix.
- •Разграничение доступа к объектам в ос Unix.
- •Аудит событий безопасности в ос Windows и Unix.
- •Средства защиты информации в глобальных компьютерных сетях.
- •Стандарты оценки безопасности компьютерных систем и информационных технологий.
- •Часть 1 «Введение и общая модель». Определение методологии оценки безопасности и требований безопасности (функциональных требований и требований доверия).
- •Часть 2 «Функциональные требования безопасности». Универсальный систематизированный каталог с возможностью добавления новых требований.
- •Часть 3 «Требования доверия к безопасности». Систематизированный каталог требований доверия и шкала оценочных уровней доверия (от 1 до 7).
- •Элементы теории чисел.
- •Способы симметричного шифрования.
- •Абсолютно стойкий шифр. Генерация, хранение и распространение ключей.
- •Криптографическая система des и ее модификации.
- •Криптографическая система гост 28147-89.
- •Применение и обзор современных симметричных криптосистем.
- •Принципы построения, свойства и применение асимметричных криптосистем.
- •Криптографическая система rsa.
- •Криптографические системы Диффи-Хеллмана, Эль-Гамаля и эллиптических кривых.
- •Электронная цифровая подпись и ее применение. Функции хеширования.
- •Протокол ssl.
- •Криптографический интерфейс приложений ос Windows.
- •Файловая система с шифрованием в ос Windows.
- •Компьютерная стеганография и ее применение.
- •Принципы построения систем защиты от копирования.
- •Защита инсталляционных дисков и установленного программного обеспечения.
- •Защита программных средств от изучения.
- •Вредоносные программы, их признаки и классификация.
- •Программные закладки и защита от них.
- •Методы обнаружения и удаления вредоносных программ.
-
Защита программных средств от изучения.
Защита программных средств от изучения
-
Противодействие использованию отладчиков.
-
Противодействие дизассемблерам и декомпиляторам.
-
Искусственное запутывание механизма защиты (obfuscation, обфускация) как общий метод защиты.
Методы «снятия» защиты
-
Изучение алгоритма проверки ключевой информации для генерации правильных регистрационных ключей (например, программной эмуляции работы поставляемого с программой USB-ключа).
-
Изучение алгоритма проверки ключевой информации для отключения работы соответствующего участка кода программы защиты.
Противодействие использованию отладчиков
-
Обнаружение работы программы под управлением отладчика или программы мониторинга типа FileMon или RegMon.
-
Реакция на обнаружение отладчика.
Обнаружение работы программы под управлением отладчика
-
Использование функций из набора Windows API (EnumWindows, IsDebuggerPresent, функций библиотеки toolhelp.dll).
-
Проверка установки точек прерывания (байт 0xCC) на функции программы или Windows API.
-
Изучение переменных системного окружения (функция Windows API GetEnvironmentStrings).
-
Измерение времени выполнения критических участков кода программы.
Реакция на обнаружение отладчика
-
Вызов аварийного завершения отладчика:
-
«порча» стека или вызов функции Windows API DestroyWindow для главного окна отладчика;
-
некорректное взаимодействие с отладчиком по протоколам DDE или COM (передача «мусора», преждевременный вызов метода Release).
-
Выключение механизма защиты (для «обмана» взломщика и выигрыша о времени).
Противодействие дизассемблированию
-
Создание самомодифицирующегося кода (шифрование и расшифрование фрагментов кода, полное изменение исполнимого кода путем замены команд на эквивалентные в соответствии с некоторой таблицей и т..). Требуется использование языка ассемблера.
-
Использование методов запутывания (обфускации).
Методы запутывающего кодирования
-
Лексические трансформации (запутывание кода).
-
Запутывание структур данных.
Изменение потока выполнения программы
Запутывание кода
-
Асимметричная криптография:
-
Данные, представленные покупателем, шифруются на закрытом ключе изготовителя и передаются покупателю вместе с защищенной программой и открытым ключом.
-
При запуске программы блок проверки расшифровывает сохраненные данные с помощью открытого ключа и сравнивает их с информацией, введенной пользователем.
-
Использование при проверке ключевой информации необратимой функции (например, хеширования).
-
Использование функции преобразования проверяемых данных F (Y=F(X)), являющейся суперпозицией функций H1 и H2, и реализация в системе защиты Z1=H1 (X), Z2=H2-1(Y), сравнения Z1 и Z2 (X – хранящийся в системе защиты эталон, Y – вводимая информация).
-
Разбиение проверки ключевой информации на несколько частей (функций), вызываемых в произвольном порядке.
-
Имитация проверки введенных данных в разных местах программы.
-
Использование в программе различных функций с одинаковым действием.
Запутывание структур данных
-
Использование системных ресурсов (памяти окна, атомов и т.п.) для хранения данных, используемых при проверке ключевой информации.
-
Создание нескольких различных переменных с разными значениями для представления одного и того же результата.
-
Использование косвенной адресации для доступа к переменным, участвующим в процессе проверки.
Изменение потока выполнения программы
-
Вынесение проверки ключевой информации в обработчик исключительной ситуации (например, ввод правильных данных приводит к извлечению корня квадратного из отрицательного числа, а сравнение с эталоном производится при обработке математической ошибки).
-
Вынесение проверки в обработку сообщений типа WM_PAINT (подмена кодов сообщений может выполняться непосредственно в цикле обработки сообщений).
Виды обфускации
-
на уровне исходного кода;
-
на уровне машинного кода;
-
на уровне промежуточного кода (например, на уровне байт-кода программ на языке Java).
Пример обфускации на уровне исходного кода на языке C++
int nCount = 100;
float fTaxRate = 0.2, orig_price[1000], tax[1000], price [1000];
for (int i=0; i< nCount; i++)
{
tax[i] = orig_price[i] * fTaxRate;
price[i] = orig_price[i] + tax[i];
}
-
Код после обфускации:
float b[1000], c[1000], d[1000];
for(int a=0;a<100;a++){b[a]=c[a]*0.2;d[a]=c[a]+b[a];}
Достоинства программ-обфускаторов
Помимо эффекта запутывания программы могут обеспечить и ее оптимизацию: в интерпретируемых языках программирования обфусцированный код занимает меньше места, чем исходный, и зачастую выполняется быстрее, чем исходный (обфускаторы заменяют константы числами, оптимизируют код инициализации массивов, и выполняют другую оптимизацию, которую на уровне исходного текста провести проблематично или невозможно).
Недостатки обфускаторов
-
код программы после ее обфускации может стать более зависимым от программно-аппаратной платформы или компилятора;
-
обфускатор не даёт постороннему выяснить, что делает код, но и не даёт разработчику отлаживать его, поэтому при отладке системы защиты приходится отключать обфускатор;
-
ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности, сопоставимой с уровнем современных криптографических алгоритмов;
-
зачастую в обфускаторах, несмотря на их тщательное проектирование и тестирование, содержатся ошибки, поэтому существует ненулевая вероятность, что прошедший через обфускатор код потеряет работоспособность (чем сложнее разрабатываемая программа, тем больше эта вероятность);
-
большинство языков с промежуточным кодом могут создавать или вызывать объекты по именам их классов, а обфускаторы позволяют защитить указанные классы от переименования, однако подобные ограничения сокращают гибкость программ.