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