You are currently viewing Анализ кода на безопасность

Анализ кода на безопасность

Проблема безопасности программного кода

Указанная проблема явилась толчком к широкому развитию во многих странах аудита безопасности программного кода, получившего название security code reviews. Процедуры security code reviews могут быть реализованы в системе менеджмента качества крупных корпораций (например, в SDL-системе компании Microsoft), либо отдаются на откуп независимым лабораториям, специализирующимся на тестировании безопасности прикладных программных продуктов и их обновлений. Как правило, аудит безопасности кода проводят в рамках комплексного тестирования программных продуктов, реже при аудите безопасности информационной системы.

Активное внедрение технологий аудита безопасности кода поддерживается рядом международных объединений и правительственных проектов в области ИБ. К наиболее известным следует отнести деятельность QWASP в области создания методологии анализа безопасности кода и деятельность MITRE в области стандартизации уязвимостей программ (проект CWE).

Понятие аудита безопасности программного кода

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

Важной особенностью технологий security code reviews является то, что основной задачей аудита является выявление не всевозможных уязвимостей, а только уязвимостей кода, которые могут быть использованы злоумышленником, то есть представлять угрозу ИБ системы.

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

Некорректности кодирования как основой класс уязвимостей

Уязвимости программного кода могут являться некорректностями кодирования или ошибкам проектирования, а также иметь злоумышленный или непреднамеренный характер. Однако, согласно открытым публикациям, основные приемы security code reviews, используемые при проверках кода, ориентированы на выявление некорректностей кодирования подсистем безопасности. Перечислим основные классы указанных уязвимостей:

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

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

Очевидно, что выявление некорректностей кодирования полностью не решает проблему обеспечения безопасности кода. К важному классу уязвимостей относят ошибки проектирования подсистем защиты и преднамеренные (логические) программные закладки. Наиболее известными из них являются: наличие недекларированных отладочных и деструктивных функций, неверные реализации протоколов или алгоритмов шифрования, использование собственных механизмов псевдобезопасности, наличие встроенных мастерпаролей и внедрение «логических бомб».

Методы аудита безопасности кода

Выделяют несколько методов аудита безопасности кода:

  • Просмотр (инспекция) кода вручную;
  • Статический анализ кода по шаблону;
  • Динамический анализ выполнения кода.

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

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

Статический анализ кода по шаблону заключается в использовании средств автоматизации поиска и анализа потенциально опасных конструкций кода (сигнатур) в исходном коде программ. Данный метод эффективен при поиске несложных уязвимостей и немаскируемых закладок, таких как переполнение буфера, парольные константы или «логические бомбы». К автоматизированным средствам проведения статического метода по шаблону относят сканеры уязвимостей кода PREfix, PREfast, АК-ВС, UCA, FlawFinder, ITS4, RATS, FxCop.

Современные сканеры кода позволяют в той или иной степени автоматизировать:

  • поиск уязвимостей переполнения буфера;
  • поиск OS-инъекций (выполнения произвольных команд);
  • поиск SQL-инъекций;
  • поиск XSS-запрсов (межсайтовый скриптинг);
  • поиск ошибок входных и выходных значений;
  • проводить структурный разбор подпрограмм, реализующих функции защиты.

Исследования авторов показало, что выявление уязвимостей с использованием средств автоматизации позволяет сократить время проверок в десять-двадцать раз. Пример результатов аудита кода с помощью сканера уязвимостей кода АК-ВС.

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

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

  • мониторинг работы программы и анализ трассы;
  • ручной просмотр в отладочном режиме работы подсистем безопасности.

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

Часто в качестве методики проверки ПО применяется рандомизированное тестирование по методу «серого ящика»  (fuzzing, «фаззинг»). Метод заключается в генерации случайных входных данных из заданного диапазона, определенного на этапе структурного анализа безопасности продукта. Фаззинг легко автоматизируется и может выполняться непрерывно. Однако основная проблема фаззинга состоит в ограниченности его использования для проверки критичных (с точки зрения безопасности) маршрутов. Поэтому фаззинг популярен, главным образом, при тестировании качества и надежности ПО.

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

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

Планирование аудита безопасности программного кода

Надо понимать, что невозможно провести полномаршрутное тестирование сложных программ с учетом всевозможных входных данных и условий среды в сколь угодно обозримое для человечества время. Технология security code reviews оптимизирует процесс аудита путем выделения фрагментов повышенного риска, которые затем анализируется ручным или полуавтоматизированным способом.

Для идентификации потенциально опасных фрагментов и их ранжирования  могут быть использованы различные подходы, например: использование опросных листов (checklist), оценка метрической сложности ПО, предварительный анализ потенциально опасных операций (сигнатур). Технологии security code reviews опираются на определение подпрограмм и фрагментов кода, непосредственно связанных с безопасностью системы, например с:

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

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

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

Конечно, в идеале аудит безопасности программного кода начинается с анализа проекта ПО, формирования моделей угроз ПО и идентификации классов уязвимостей, свойственных конкретному языку программирования.

  1. Формирование политики безопасности программ, которая может соотноситься с техническими условиями на объект информатизации;
  2. Сигнатурно-эвристический анализ исходного и выполнимого кода по потенциально опасным операциям и некорректностям кодирования;
  3. Анализ подсистем безопасности (трассировка подсистемы парольной защиты) и др.;
  4. Функциональное, стрессовое, нагрузочное тестирование и тестирование производительности;
  5. Структурный анализ избыточности дистрибутива и контроль над целостностью;
  6. Анализ наличия скрытых каналов;
  7. Формирование ограничений на использование продукта в соответствии с политикой безопасности;
  8. Формирование условий обновления и модификации политики безопасности.

Добавить комментарий