.
Начертательная геометрия Геометрическое черчение Инженерная графика Интегралы Математический анализ Матрицы Производные Векторная алгебра

 

7.3. Методы защиты информации

 

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

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

 

7.3.1. Классификация и особенности программных
методов защиты от копирования

 

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

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

Эффективной и надежной является та система, "взлом" которой достаточно долог и трудоемок. Основным параметром, определяющим эффективность средства защиты, является время, необходимое на снятие защиты.

Существуют две проблемы:

·  не потеряет ли программа за время снятия ее защиты своей актуальности, т. е. не устареет ли ее информация;

·  не превысят ли затраты на снятие защиты стоимости программы.

На сегодняшний день защита строится на внедрении в защищаемый модуль дополнительного модуля, осуществляющего некоторую проверку перед запуском основного модуля. В случае совпадения сравниваемых признаков осуществляется передача управления основному модулю. Иначе обычно происходит выход в операционную систему или "зависание" программы.

Более эффективной является встроенная защита, которая может отрабатывать как до начала, так и в процессе работы функционального модуля. Для создания эффективной встроенной защиты наиболее приемлемы такие защитные механизмы, которые проверяют какие-то специфические характеристики компьютера. Наиболее типичными характеристиками компьютера, к которым чаще всего осуществляется "привязка" защищаемой программы, являются:

·  временные характеристики (быстродействие различных компонент компьютера: процессор, память, контроллеры и т. д.; скорость вращения двигателей дисководов; время реакции на внешние воздействия);

·  тип микропроцессора и конфигурация машины (тип микропроцессора и разрядность шины данных, наличие и тип контроллеров внешних
устройств);

·  характерные особенности компьютера (контрольная сумма BIOS; содержимое СМОS-памяти; длина конвейера шины данных; аномальные явления при программировании микропроцессора).

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

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

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

Наиболее эффективным методом программной защиты выполняемых программ от НСК является их защита на этапе разработки. Модули защиты могут располагаться в нескольких местах программы, что значительно затруднит работу "взломщика" по поиску в дизассемблированной программе тех мест, где производится проверка каких-либо параметров машины. Это особенно эффективно, если программа написана не на Ассемблере, а на языке высокого уровня (С, ПАСКАЛЬ и др.).

Можно отметить два существенных момента:

·  не использовать для защиты нескольких программ стандартные программные модули;

·  не оформлять эти модули в виде процедур и функций, вызов которых производится в основной программе.

Первое обусловлено тем, что стандартный защитный модуль может быть обнаружен "взломщиком" при сопоставлении нескольких защищенных таким образом программ. Этот модуль будет иметь один и тот же вид в дизассемблированных кодах различных программ.

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

Все вышеизложенное позволяет сделать следующий вывод: для создания достаточно эффективной и надежной программной защиты от НСК необходим индивидуальный подход к созданию нестандартных механизмов защиты и включению их в основную программу на этапе ее разработки.

 

7.3.2. Способы увеличения эффективности
и надежности защиты от копирования

 

Остановимся на существенных недостатках известных программных механизмов защиты от НСК и укажем основные пути и способы увеличения их эффективности и надежности;

·  большинство защитных механизмов является пристыковочными и отрабатывает, как правило, один раз перед передачей управления на исполняемый код защищенной программы;

·  отсутствует возможность теоретической оценки надежности системы защиты от НСК. Сегодня качество защитных механизмов того или иного пакета оценивается субъективно по времени, которое требуется для снятия защиты с защищенной программы конкретному человеку;

·  в большинстве случаев в системах защиты от НСК используются аппаратные заглушки или специальным образом физически помеченные дискеты. Этот метод недостаточно эффективен, так как сейчас хорошо проработаны способы вскрытия такой защиты;

- для аппаратной заглушки используется способ сканирования компьютеров при помощи подключения через "прозрачную" аппаратную заглушку второго компьютера, который отслеживает все передаваемые между компьтером и заглушкой сигналы;

- для физически испорченной дискеты с помощью специальной резидентной программы осуществляется захват соответствующего аппаратного прерывания от устройства и подмена выдаваемых им кодов возврата на требуемые;

·  используемые дефектные секторы на дискете всегда можно определить предварительным тестовым считыванием ключевой дискеты, после чего ключевая дискета уже не нужна.

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

Наличие механизмов защиты от дизассемблеров и отладчиков становится первым и наиболее сложным препятствием для "взломщика". Задача таких механизмов защиты – недопущение или максимально возможное затруднение анализа исполняемого кода программы.

Наиболее распространенные методы скрытия исходного текста программы от стандартных средств дизассемблирования – шифрование и архивация. Непосредственное дизассемблирование защищенных таким способом программ, как правило, не дает нужных результатов. Но так как зашифрованная или архивированная программа чаще всего выполняет обратную операцию (дешифрацию или разархивирование) в первых же командах, на которые передается управление сразу после запуска программы, то для снятия такой защиты необходимо определить лишь момент дешифрации или разархивирования, а затем программными средствами можно "снять" в файл дамп памяти, занимаемой преобразованной программой, и прогнать этот файл через какой-нибудь дизассемблер.

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

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

Еще один способ защиты от дизассемблера – использование самогенерируемых кодов. Самогенерируемые коды – это исполняемые коды программы, полученные в результате выполнения некоторого набора арифметических и/или логических операций над определенным, заранее рассчитанным, массивом данных. Самогенерируемые коды вырабатываются непосредственно защищаемой программой, которая по ходу выполнения как бы сама себя "достраивает". Для большей эффективности в качестве массива исходных данных самогенерируемых кодов можно использовать часть исполняемого кода защищаемой программы.

Следующий способ борьбы с дизассемблером – это применение нестандартных приемов выполнения некоторых команд с нарушением общепринятых соглашений. Среди них:

·  использование нестандартной структуры программы;

·  скрытые переходы, скрытые вызовы программ и прерываний;

·    переходы и вызовы подпрограмм по динамически изменяемым адресам.

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

Второй способ предполагает использование нестандартной реализации команд типа JMP, CALL, INT, RET, IRET.

Третий способ подразумевает модификацию байтов адреса перехода или вызова подпрограммы.

Не менее сложная задача для "взломщика" – преодолеть недопущение исследования программ стандартными отладчиками.

Эффективным средством против пошагового выполнения программы отладчиком является назначение стека в тело программы. Если в целях недопущения переназначения стека за пределы исполняемого кода в стек помещены данные, необходимые для работы программы, то проблема вскрытия защиты еще более осложняется. Для повышения эффективности метода можно часто менять местоположение стека в программе. Защитные механизмы, которые будут использовать стек, делают практически невозможным применение стандартных отладочных средств.

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

Противодействовать средствам дизассемблирования и отладки можно контролируя время выполнения некоторых участков программы. Пользуясь этим методом, необходимо заранее подсчитать по таймеру время выполнения какого-либо участка программы, а затем в процессе работы программы вычислить его заново, сравнивая с эталоном. Если программа работает под отладчиком, то очевидно, что время выполнения контрольного участка будет значительно большим, чем время его "чистой" работы. Данный метод эффективен в сочетании с механизмом защиты от НСК, имеющим привязку к аппаратным особенностям машины.

Один из способов затруднения работы "взломщика" при анализе работы программы – это метод использования так называемых "пустышек". В качестве их выделяются участки программы достаточно большого объема, производящие некоторые значительные вычисления, но не имеющие никакого отношения к работе программы. В "пустышки" необходимо включать какие-либо фрагменты, которые могли бы заинтересовать "взломщика". Например, это могут быть вызовы таких прерываний, как 13Н, 21Н, 25Н, 26Н, их перехват и т. п.

Принципиально новый подход к защите программного обеспечения от исследований отладочными средствами и дизассемблерами является метод динамического изменения кода исполняемого модуля. Полное изменение исполняемого кода становится возможным благодаря адекватной замене одной или нескольких команд программы другой последовательностью команд без изменения выполняемых программой функций. Например, команда MOV может быть заменена парой команд PUSH и POP, команда CALL – парой PUSH и YMP и т. д. Всегда можно организовать работу программы так, чтобы при каждом ее выполнении происходила замена исполняемых команд на эквивалентные, которые выбирались бы из специальной таблицы эквивалентных команд, хранящейся в определенном месте программы. При этом необходимо постоянно изменять и саму таблицу эквивалентных команд, переставляя в ней местами эквивалентные команды. Можно также внести в таблицу случайный признак модификации таблицы. В результате после каждого выполнения программы ее код будет изменен до неузнаваемости (случайным образом), однако все свои функции программа будет выполнять точно так же, как и раньше. Единственное, что может при этом изменяться – это время выполнения программы.

 

7.3.3. Особенности защиты информации в компьютерных сетях

В последнее время в связи с широким распространением локальных и глобальных компьютерных сетей необычайно остро встала проблема защиты информации при передаче или хранении в сети. Дело в том, что разработанные программы и подготовленные данные для отдельного компьютера и предназначенные для локального использования, практически не содержали средств защиты. Теперь, когда любой пользователь сети может попытаться заглянуть в чужой файл, защита информации в сети необычайно актуально. Особенно это важно в распространенной сегодня технологии типа "клиент–сервер".

Работа в сети на принципах "клиент–сервер" необычайно привлекательна своей открытостью. Однако построение систем защиты информации в них усложняется тем, что в одну сеть объединяется разнообразное ПО, построенное на различных аппаратно-программных платформах. Поэтому система защиты должна быть такой, чтобы владелец информации мог быстро ею воспользоваться, а не имеющий соответствующих полномочий испытывал значительные затруднения в овладении информацией. Системы защиты информации в них тоже различны. Даже простой вариант смены паролей требует согласования, ибо ПО защиты типа RACF для мейнфреймов требует смены пароля с периодичностью в 30 дней, а сетевая ОС – ежеквартально. Для доступа к информации требуется преодолеть несколько охранных рубежей. В связи с этим возникает задача синхронизации работы средств безопасности всех платформ, т. е. создание своеобразного "зонта безопасности" для всей компьютерной системы.

Работа в распределенных вычислительных средах в связи с наличием различных точек входа: рабочие станции, серверы баз данных, файл-серверы LAN – усложняет решение проблемы безопасности.

Многие разработчики баз данных (БД) перекладывают функции контроля доступа к данным на ОС, чтобы упростить работу пользователя ПК. Особенно это показательно для ОС Unix, где реализована надежная защита информации. Однако такой подход позволяет хакерам, маскируясь под клиентов Unix, иметь доступ к данным.

Более того, распределенные системы имеют, как правило, несколько БД, функционирующих по принципу локальной автономии и позволяющих иметь собственный механизм защиты. В распределенных системах однотипная информация может быть размещена в различных (территориально удаленных) БД или информация из одной (по семантике) таблицы может храниться на различных физических устройствах. Однако для головного пользователя распределенной системы необходимо организовать работу так, чтобы по одному запросу он мог получить полную информацию по всем дочерним фирмам, т. е. с точки зрения пользователя должен соблюдаться принцип географической прозрачности.

В БД Oracle, например, принцип географической прозрачности и фрагментарной независимости реализуется через механизм связей (links) и синонимов (synonyms). Посредством связей программируется маршрут доступа к данным: указываются реквизиты пользователя (регистрационное имя и пароль), тип сетевого протокола (например, TCP/IP) и имя БД. К сожалению, все эти параметры приходится описывать в тексте сценариев (scripts). Чтобы засекретить указанную информацию, пароли можно хранить в словаре данных в зашифрованном виде.

Наличие нескольких БД в распределенных системах в некоторой степени усложняет работу пользователей, не имеющих соответствующих полномочий по доступу к данным, ибо код должен преодолевать автономные защиты данных в различных БД.

Защита информации в распределенной среде многоуровневая. Чтобы прочесть пользователю необходимые данные, например, с помощью штатных программ администрирования, ему необходимо сначала попасть в компьютер (уровень защиты рабочей станции), потом в сеть (сетевой уровень защиты), а уже затем на сервер БД. При этом оперировать конкретными данными пользователь сможет лишь при наличии соответствующих прав доступа (уровень защиты БД). Для работы с БД через клиентское приложение придется преодолеть еще один барьер – уровень защиты приложения.

В арсенале администратора системы “клиент – сервер” имеется немало средств обеспечения безопасности, в частности встроенные возможности БД и различные коммерческие продукты третьих фирм. Важность внутренних средств защиты состоит в том, что контроль доступа происходит постоянно, а не только в момент загрузки приложения.

Каждый пользователь системы имеет свои полномочия по работе с данными. В широко известных базах данных Sybase и Microsoft SQL Server, например, тип доступа регулируется операторами GRANT и REVOKE, допускающими или запрещающими операции чтения, модификации, вставки и удаления записей из таблицы, а также вызова хранимых процедур. К сожалению, во многих БД минимальным элементом данных, для которого осуществляется контроль доступа, является таблица. Во многих практических задачах контроль доступа требуется осуществлять даже по отдельным полям или записям. Эта задача может быть реализована либо с помощью табличных фильтров (на уровне приложения), либо путем модификации структуры БД через денормализацию таблиц.

 

На главную