Контакты
Подписка
МЕНЮ
Контакты
Подписка

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

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

В рубрику "Оборудование и технологии" | К списку рубрик  |  К списку авторов  |  К списку публикаций

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

Критические уязвимости в программах обычно появляются вследствие высокой структурной сложности кода и субъективных факторов, среди которых: проблемы организации работы над проектом больших коллективов разработчиков (нечеткая спецификация требований, недостаточность информации, проектные предположения и пр.); социально-психологические проблемы в коллективах разработчиков, конфликты интересов, технологический “волюнтаризм", склонность к игнорированию стандартов, невнимательность и пр.
Михаил Тарасюк
Ведущий системный аналитик
ЗАО “Институт Сетевых Технологий", к.т.н.

Меры обеспечения качества кода, в зависимости от требований конкретного проекта, могут включать мероприятия, предусмотренные стандартами в данной области, например:

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

Статические анализаторы

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

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

Применение статических анализаторов

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


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

  • широкое распространение кода с открытыми лицензиями, относительно которого отсутствуют юридические гарантии безопасности, подтвержденные независимыми экспертами;
  • значительный объем корпоративного сектора разработки специализированного ПО (бизнес-приложений). Такие приложения в подавляющем числе случаев разрабатываются в строго ограниченные сроки и в значительной степени ориентированы на функциональные требования (зачастую в ущерб качеству и безопасности). Характерно периодическое внесение изменений в такие приложения на протяжении жизненного цикла. Большинство компаний-разработчиков на данном рынке не имеют в штате специалистов, обладающих должным уровнем знаний и квалификации в области анализа уязвимостей кода;
  • миграция корпоративных ресурсов, разного рода платформ и инфраструктур в область облачных сервисов. В ряде случаев, учитывая высокую стоимость традиционных (необлачных) платформ, для небольших компаний-разработчиков кода может оказаться дешевле приобретение не платформы анализатора, как таковой, а соответствующей "услуги". Кроме того, эксплуатация средств анализа кода потребует соответствующего сопровождения потребителем, которое, впрочем, может оказаться не определяющим фактором;
  • значимость угроз внесения в код так называемых программных закладок (или недекларированных функций). На текущий момент противодействие подобного рода уязвимостям реализуется только для систем специального назначения в рамках его сертификации или тематических исследований в организациях, имеющих соответствующую аккредитацию ФСТЭК или ФСБ России.

Технологии выявления

Практически все доступные на текущий момент статические анализаторы используют в том или ином виде следующие технологии выявления уязвимостей в коде:

Задача выявления уязвимостей в коде не является полностью алгоритмизированной и автоматизируемой, в связи с чем для проведения внешнего аудита безопасности кода должны привлекаться эксперты. Соответственно облачная платформа для внешнего аудита кода должна обеспечивать удобные механизмы для взаимодействия эксперта и разработчика.
  • структурный анализ текстов программ – основывается на задании правил построения законченных и семантически целостных фрагментов кода, на соответствие которым оцениваются исходные тексты программ. Для задания указанного множества правил используются контекстно-свободные грамматики, БНФ-нотация, и другие формальные методы описания языков программирования. Данный метод обладает наивысшим уровнем абстракции и может использоваться для выявления широкого спектра уязвимостей. Его недостатком является относительно высокая вероятность ошибок классификации, включая ошибки первого (пропуск уязвимости) и второго (ложные выявления уязвимостей) рода;
  • структурная оценка сложности исходных текстов основывается на построении моделей покрытия кода, относительно которых могут оцениваться, например, межмодульная связность (маршруты, связывающие функциональные объекты по данным, по управлению), сложность покрытия кода (например, на основе оценки цикломатического числа в графе покрытия кода). Метод может использоваться для оценки качества кода в целом (то есть качества кодирования алгоритмов);
  • сигнатурный анализ кода – основывается на ранее имевшемся опыте выявления уязвимостей, сведенном в базу сигнатур уязвимостей. Сигнатура определятся заданием минимального множества фрагмента кода, по которым может быть идентифицирована уязвимость. Для описания сигнатур уязвимостей используются параметризованные шаблоны (например, регулярные выражения). Достоинство сигнатурного метода состоит в его относительно высокой точности.

Типы анализаторов

В зависимости от классов контролируемых уязвимостей все анализаторы уязвимостей можно отнести к одному из следующих типов:

  • анализаторы для выявления специальных классов ошибок работы с системными ресурсами (использование динамической памяти, синхронизация многопоточных вычислений и пр.). К числу таковых относится, например, анализатор PVS-Studio;
  • анализаторы общего назначения для выявления большинства типов ошибок, как правило, поддерживающие множество платформ разработки (Coverity SAVE и Klocwork);
  • анализаторы для выявления недекларированных функций программного кода, например анализаторы (АК-ВС и Appercut CCS).


В зависимости от специализации оцениваемых программных средств анализаторы кода можно отнести к одному из следующих типов:

  • анализаторы, ориентированные на поиск уязвимостей в бизнес-приложениях и функциональном ПО для ERP-систем (анализатор ERPscan для платформы SaaS);
  • анализаторы, предназначенные для поиска уязвимостей в общесистемном ПО, распространяемом по открытым лицензиям (анализаторы Coverity, Klocwork);
  • специализированные анализаторы, предназначенные для поиска уязвимостей в программном коде Web-приложений (например, анализатор IBM Rational APP Scan, APPS).

Итог

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

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

Опубликовано: Журнал "Information Security/ Информационная безопасность" #6, 2013

Приобрести этот номер или подписаться

Статьи про теме