Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теоретические основы защиты информации. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
новной заинтересованной стороной. Поддержка руководства ком­пании является необходимым условием для проведения аудита.
Аудит представляет собой комплекс мероприятий, в которых помимо самого аудитора, оказываются задействованными предста­вители большинства структурных подразделений компании. Дей­ствия всех участников этого процесса должны быть скоординиро­ваны. Поэтому на этапе инициирования процедуры аудита должны быть решены следующие организационные вопросы:
– права и обязанности аудитора должны быть четко определе­ны и документально закреплены в его должностных инструкциях, а также в положении о внутреннем (внешнем) аудите;
– аудитором должен быть подготовлен и согласован с руко­водством план проведения аудита;
– в положении о внутреннем аудите должно быть закреплено, в частности, что сотрудники компании обязаны оказывать содей­ствие аудитору и предоставлять всю необходимую для проведения аудита информацию.
На этапе инициирования процедуры аудита должны быть определены границы проведения обследования. Одни информаци­онные подсистемы компании не являются достаточно критичными и их можно исключить из границ проведения обследования. Дру­гие подсистемы могут оказаться недоступными для аудита из-за соображений конфиденциальности.
Границы проведения обследования определяются в следую­щих терминах:
– список обследуемых физических, программных и информа­ционных ресурсов;
– площадки (помещения), попадающие в границы обследования;
– основные виды угроз безопасности, рассматриваемые при проведении аудита;
– организационные (законодательные, административные и процедурные), физические, программно-технические и прочие ас­пекты обеспечения безопасности, которые необходимо учесть в ходе проведения обследования, и их приоритеты (в каком объеме они должны быть учтены).
181
Контрольные вопросы
1. Дайте определение аудита информационной безопасности.
2. Для чего предназначен механизм аудита?
3. Поясните роли пользователей механизма аудита.
4. Аудит каких операций необходимо производить?
5. Опишите основные методы выбора событий аудита.
6. Что обычно включают в себя записи аудита?
7. Какие дополнительные требования могут быть предъявле-
ны к подсистеме аудита?
8. Какие журналы аудита имеет операционная система Win-
dows?
9. Опишите функционирование механизма аудита.
10.
11. Определите события, которые должна фиксировать подси-
стема аудита в системе, построенной на основании модели Белла и Лападула.
12. Определите события, которые должна фиксировать подси-
стема аудита в системе, построенной на основании модели Кларка– Вилсона.
13. С какой целью проводят аудит информационной безопас-
ности предприятия
14. Назовите цели проведения аудита безопасности.
15. Какие этапы включают в себя работы по аудиту безопас-
ности информационных систем?
182
13. УЯЗВИМОСТИ
13.1. Основные определения
Под уязвимостью [7] понимается некая слабость, которую можно использовать для нарушения безопасности системы или содержащейся в ней информации. Уязвимости могут возникать вследствие следующих причин.
1. Логическая ошибка – ошибка реализации механизма без-
опасности, использование которой приводит к успешной атаке на систему. Логическая ошибка может содержаться в операционной системе или пользовательском приложении.
2. Слабость – механизм безопасности, реализованный так, что
его использование может при определенных условиях привести к нарушению безопасности. Слабость может возникнуть из-за обес­печения безопасности посредством сокрытия (безопасности, бази­рующейся на том, что никто не знает деталей реализации механиз­мов безопасности), устаревшего программного и аппаратного обеспечения, небезопасных конфигураций.
3. Некорректное использование системы – пользователи си-
стемы могут сами нарушать политику безопасности системы, со­здавая условия для успеха атаки.
Уязвимость может быть описана с помощью следующих ха­рактеристик.
1. Ошибка – тип ошибки, приведшей к образованию уязвимо-
сти; систематизация уязвимостей по типу ошибки приведена в ра­ботах Лендвера, Аслама и Спаффорда.
2. Последствия – степень компрометации безопасности си-
стемы; примером систематизации последствий могут служить сле­дующие типы последствий:
– получение нарушителем прав администратора;
– получение нарушителем доступа к системе с правами авто­ризованного пользователя;
– получение нарушителем несанкционированного доступа к защищенным файлам;
– отказ системы или ее функциональной части в обслуживании.
3. Авторизация – права, необходимые нарушителю для осу-
ществления атаки, определяющие его уровень возможности.
183
По уровню возможностей нарушитель может быть классифициро­ван так, как показано в документах Гостехкомиссии.
4. Местонахождение – описывает необходимость физического
доступа нарушителя для проведения атаки на систему; может быть систематизирована следующим образом:
– доступ к системному серверу;
– доступ к клиенту системы;
– доступ к сети.
Три последние характеристики уязвимости характеризуют требования к нарушителю, который может выполнить атаку с ис­пользованием уязвимости.
Говоря об описании уязвимостей, следует упомянуть список уязвимостей CVE (Common Vulnerabilities Exposures), разработан- ный организацией MITRE. Список уязвимостей CVE является сло­варем, используемым для определения общих имен известных уяз­вимостей. Данный список можно найти по интернет-адресу
http://cve.mitre.org.
Список уязвимостей CVE можно рассматривать как стандар­тизованный список, содержащий все известные уязвимости, при­сваивающий каждой уязвимости уникальное, стандартное имя, су­ществующий независимо от различных существующих взглядов на уязвимости, открытый и распространяемый без каких-либо огра­ничений.
До разработки списка CVE каждая организация давала свое наименование известным уязвимостям, что приводило к неопреде­ленности понятий и несовместимости программных продуктов, работающих с уязвимостями (таких, как сканеры безопасности или системы обнаружения атак). При этом необходимо отметить, что очень многие программные продукты, созданные для поддержания информационной безопасности, обладают той или иной базой дан­ных уязвимостей различных систем.
Процесс занесения уязвимости в список CVE состоит из сле­дующих этапов:
– обнаружение уязвимости;
– оповещение пользователей об уязвимости (с помощью списков рассылки, групп новостей и т. д.) – информация об уязвимости дово­дится до лиц, отвечающих за поддержание списка уязвимостей;
184
– присвоение уязвимости – кандидату в список CVE иденти­фикатора в том случае, если она еще не входит в список; уязви­мость в дальнейшем именуется на основании присвоенного иден­тификатора;
– предложение – соответствующий комитет рассматривает предложенную для включения в список уязвимость и проводит голосование, на основании которого описание уязвимости включа­ется в список CVE, отвергается или модифицируется; результаты голосования публикуются на WEB-сайте CVE;
– модификация – при необходимости описание уязвимости переделывается в соответствии с пожеланиями комитета; если тре­буются незначительные изменения описания, то повторное голосо­вание не требуется и уязвимость включается в список;
– публикация – после того как уязвимости присвоено имя и она включена в список, новая версия списка CVE публикуется на WEB-сайте CVE;
– переоценка – при необходимости изменить описание эле­мента списка CVE должна быть осуществлена процедура, анало­гичная процедуре включения нового элемента.
В настоящее время список уязвимостей CVE стал стандартом де-факто идентификации уязвимостей и поддерживается многими программными продуктами. Для того чтобы программный продукт удовлетворял требованиям совместимости со списком уязвимостей
CVE, необходимо выполнение следующих условий.
1. Поиск CVE – пользователь должен иметь возможность
найти информацию об уязвимости на основании ее идентификато­ра CVE.
2. Представление CVE – при выводе информации об уязвимо-
сти необходимо выводить ее CVE-идентификатор.
3. Отображение CVE – в программе должно поддерживаться
отображение между используемыми уязвимостями и некоторой версии списка CVE.
Для лучшего понимания природы уязвимостей рассмотрим более подробно типы ошибок, приводящих к уязвимостям.
185
13.2. Ошибки, приводящие к уязвимостям
Ошибки реализации
К ошибкам реализации относятся следующие ошибки.
1.Ошибки синхронизации – временные проблемы (существо-
вание временного окна между операциями) или проблемы после­довательности операций в программном обеспечении системы.
Примером существования временного окна может служить ошибка, связанная с тем, что программа привилегированного поль­зователя создает файл, который может быть в течение короткого промежутка времени модифицирован любой программой в систе­ме. Другим примером данной ошибки является ошибка создания временных файлов программным обеспечением привилегирован­ного пользователя в каталогах, доступных по чтению и записи всем пользователям системы. Модификация данных файлов может привести к нарушению безопасности системы.
2.Ошибки проверки условий. Различаются три основные ошибки: предикат в условном выражении пропущен (выбирается некорректный путь выполнения), условие пропущено (операция будет выполнена, невзирая на условия), условие некорректно определено (выбирается некорректный путь выполнения, или опе­рация будет выполнена, невзирая на условия). Примером ошибки данного рода является неспособность программы обработать ис­ключение.
3.Ошибка проверки входных данных. Программа может быть вызвана с любыми параметрами, передаваемыми в командной строке. Такая программа может быть вызвана с любыми перемен­ными окружения, устанавливаемыми родительским процессом. Как следствие этого программа, опирающаяся в своей работе на значения внешних переменных и не проверяющая их, может быть уязвимой.
Программа, делающая предположения об открытых и закры­тых файлах, также является уязвимой. В связи с тем, что наруши­тель может открыть или закрыть любой файл перед запуском про­граммы, предположения об открытых файлах могут быть ложны­ми. В том числе могут быть закрыты файлы stdin, stdout и stderr.
Ввод данных в приложения WEB (в частности, выполняющие­ся на доверенных серверах, осуществляется различными пользова-
186
телями и должен тщательно проверяться. Многие сценарии CGI принимают в качестве входных данных URL, который записывает­ся с использованием символов %НН (НН – шестнадцатеричный код символа). Таким образом, сценарии CGI должны преобразовы­вать это значение и после этого проверять допустимость ресурса.
Кроме этого, приложения WEB могут использовать при работе cookies (небольшой фрагмент данных о предыстории обращений пользователя к некоторому WEB-серверу, автоматически создава­емый сервером на машине пользователя). Cookies могут быть мо­дифицированы пользователями и должны проверяться программа­ми. Пользователи могут запретить использование cookies (как нарушающие безопасность данных), так что приложения WEB должны проектироваться с учетом данной ситуации.
Использование HTML форм в приложениях WEB может быть также небезопасно. Некоторые HTML формы используют провер­ку параметров на стороне клиента (осуществляется с помощью Javascript/Java). Эта проверка полезна для пользователя (коррект­ность ввода может быть оценена сразу, без пересылки данных по сети), но бесполезна в смысле безопасности (данные можно пере­дать напрямую, минуя всякие проверки). Таким образом, сервер должен проводить собственную проверку данных в формах.
Дополнительным источником уязвимостей могут служить ло­кализация и интернационализация программного обеспечения (ло­кализация – процесс адаптации программы к национальному язы­ку; интернационализация – процесс адаптации программы к не­скольким языкам). В процессе данной адаптации возможны ошиб­ки, приводящие к некорректной обработке данных, введенных на языке, не предусмотренном программой. Информация о поддержи­ваемой в системе кодировке устанавливается переменными окру­жения. Эти переменные должны проверяться программой на кор­ректность перед приемом пользовательских данных. Приложения WEB должны выделять эту информацию из заголовков запросов. Однако некоторые приложения WEB выделяют данную информа­цию из форм HTML, что может служить причиной уязвимости. Таким образом, программа должна фильтровать кодировки (или самостоятельно устанавливать желательные переменные окруже­ния), с которыми она предполагает работать. В некоторых случаях
187
вводимые пользователем символы могут ограничиваться регуляр­ным выражением [A-Za-z][A-Za-z0-9_,+@\-\.]*.
Некоторые приложения могут принимать данные от наруши­теля и передавать их другому приложению. Данная ситуация (ча­сто встречающаяся в приложениях WEB) может вызвать проблемы безопасности второго приложения. Например, приложение WEB может разрешить использование HTML-тегов во вводе пользовате­ля. Данный ввод позже передается другому пользователю (напри­мер, гостевая книга). При этом нарушитель может использовать HTML-теги для атаки других пользователей с использованием вставки сценариев, Java апплетов, DHTML-тегов, признаков ранне­го окончания документов (</HTML>), запросов некорректного размера шрифта и т. д. Как следствие описанной проблемы все вы­ходные данные приложения WEB (URL, данные форм, cookies, за­просы к БД, запросы к CORBA ORB, а также данные пользователя, сохраненные в файлах) должны фильтроваться (некорректные символы должны удаляться), декодироваться (все символы долж­ны быть декодированы) или проверяться (относительно коррект­ных регулярных выражений).
4. Ошибка переполнения буфера. Данная ошибка состоит
в том, что некоторый буфер в программе имеет фиксированную длину, программа не проверяет количество байт, которые в него копируются. При этом правильно подобранные записываемые в буфер данные могут дать нарушителю дополнительные полно­мочия. Рассмотрим данный тип ошибок более подробно.
Буфер – это непрерывный блок памяти, используемый для хранения набора элементов, относящихся к одному типу данных. При программировании на языке Си под буфером обычно понима­ется массив данных (чаще всего массив символов). Переполнение буфера – это просто помещение в область памяти, отведенную под буфер, данных большей длины, чем этот буфер может содержать, при отсутствии проверки выхода за границы буфера. Большинство компиляторов языка Си такую проверку не осуществляет, поэтому все нижесказанное следует воспринимать в контексте именно этого языка.
Для того чтобы понять суть уязвимости переполнения буфера, рассмотрим фрагмент программы:
188
void func (char *str)
{
char buffer[256];
strcpy(buffer, str);
return;
}
void main(int argc, char * argv[])
{
…
char *BigString;
…
func(BigString);
return;
}
Подобные фрагменты программ, в которых функция принима­ет строку как один из нескольких аргументов, имеет локальный буфер ограниченного размера и использует вызовы типа strcpy() или sprintf(), можно встретить в большом количестве программ.
Параметры функции func передаются через стек – туда зано­сятся указатели на параметры или сами параметры, а вызванная функция извлекает их оттуда. После того как параметры занесены в стек, а процессор встречает инструкцию вызова функции, он за­носит в стек некоторую информацию о текущем состоянии – как правило, это смещение следующей после команды вызова. Таким образом, функция, завершив свою работу, будет знать адрес воз­врата управления. Функции надо запомнить указатель на текущую верхушку стека (ВР), который будет использоваться в ссылке на параметры. Поэтому независимо от архитектуры выполняются следующие две инструкции: push bp; mov bp,sp.
Теперь в верхушке стека лежит предыдущее значение реги­стра ВР, а сам он указывает на верхушку стека и может быть ис­пользован в качестве базового регистра при ссылке на параметры. В программе был объявлен размер буфера в 256 байт. Поскольку не использовались функции malloc() или new для выделения требу­емого объема памяти и не указывался модификатор static, этот бу­фер будет зарезервирован в стеке. Таким образом, строка длиной более 256 байт, передаваемая в функцию func, затрет адрес возвра-
189
та из функции и изменит нормальное выполнение программы. При отсутствии проверки выхода за границы буфера искажается содер­жимое других переменных состояния и параметров программы, которые входят в область переполнения буфера. Типы искажаемых объектов-переменных определяют способ передачи управления коду атакующего. Можно выделить три основные группы объек­тов, являющихся целью атаки на переполнение буфера.
1. Адрес возврата из функции. Изменяется таким образом,
чтобы при возврате из функции управление было передано на код нарушителя.
2. Указатель на функцию. Изменяется таким образом, чтобы при
вызове функции управление было передано на код нарушителя.
3. Указатель на данные. Результатом изменения значения ука-
зателя может быть как подстановка данных нарушителя вместо оригинальных данных в ходе нормального исполнения атакуемой программы, так и передача управления на код нарушителя (с по­мощью модификации некоторых управляющих структур).
Необходимо отметить, что уязвимость переполнения буфера может содержаться в библиотечных функциях, таких как strcpy(3), strcat(3), sprintf(3), vsprintf(3) и gets(3).
Таким образом, для недопущения уязвимости переполнения буфера следует предпринять следующие меры.
1.При использовании статически размещенных буферов рас-
сматривать размер аргументов приемника и источника, а также использовать проверку вводимых и результирующих данных.
2.По возможности использовать динамические буферы в связи с тем, что при данном подходе возможна обработка ситуаций, свя­занных с вводом данных различной длины (до тех пор, пока они не исчерпают свободную память). При этом необходимо учитывать, что память может исчерпаться в любой точке программы (не обя­зательно в месте предотвращения переполнения буфера), что при­ведет к отказу в обслуживании. Даже наличие виртуальной памяти может привести к ситуации, при которой система будет произво­дить обмен данными между диском и памятью, не выполняя ника­кой полезной работы. Некоторые ограничения на размер вводимых данных могут предотвратить описанную проблему.
190
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]