SlideShare uma empresa Scribd logo
1 de 7
Baixar para ler offline
Поиск уязвимостей в программах с
помощью анализаторов кода
Автор: Елена Харитонова

Дата: 10.08.2008


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


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

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

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


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

Классификация уязвимостей защиты в зависимости от программных ошибок:

   1. Переполнение буфера (buffer overflow). Эта уязвимость возникает из-за отсутствия
      контроля за выходом за пределы массива в памяти во время выполнения программы.
      Когда слишком большой пакет данных переполняет буфер ограниченного размера,
      содержимое посторонних ячеек памяти перезаписывается, и происходит сбой и
      аварийный выход из программы. По месту расположения буфера в памяти процесса
      различают переполнения буфера в стеке (stack buffer overflow), куче (heap buffer overflow)
      и области статических данных (bss buffer overflow).
   2. Уязвимости "испорченного ввода" (tainted input vulnerability). Уязвимости "испорченного
      ввода" могут возникать в случаях, когда вводимые пользователем данные без
      достаточного контроля передаются интерпретатору некоторого внешнего языка (обычно
это язык Unix shell или SQL). В этом случае пользователь может таким образом задать
      входные данные, что запущенный интерпретатор выполнит совсем не ту команду, которая
      предполагалась авторами уязвимой программы.
   3. Ошибки форматных строк (format string vulnerability). Данный тип уязвимостей защиты
      является подклассом уязвимости "испорченного ввода". Он возникает из-за
      недостаточного контроля параметров при использовании функций форматного ввода-
      вывода printf, fprintf, scanf, и т. д. стандартной библиотеки языка Си. Эти функции
      принимают в качестве одного из параметров символьную строку, задающую формат ввода
      или вывода последующих аргументов функции. Если пользователь сам может задать вид
      форматирования, то эта уязвимость может возникнуть в результате неудачного
      применения функций форматирования строк.
   4. Уязвимости как следствие ошибок синхронизации (race conditions). Проблемы, связанные с
      многозадачностью, приводят к ситуациям, называемым "состояние гонки": программа, не
      рассчитанная на выполнение в многозадачной среде, может считать, что, например,
      используемые ею при работе файлы не может изменить другая программа. Как следствие,
      злоумышленник, вовремя подменяющий содержимое этих рабочих файлов, может
      навязать программе выполнение определенных действий.

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


Обзор существующих анализаторов
Для обнаружения уязвимостей защиты в программах применяют следующие инструментальные
средства:

   •   Динамические отладчики. Инструменты, которые позволяют производить отладку
       программы в процессе её исполнения.
   •   Статические анализаторы (статические отладчики). Инструменты, которые используют
       информацию, накопленную в ходе статического анализа программы.

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

В данной статье предложен обзор нескольких существующих статических анализаторов.
Рассмотрим подробнее каждый из них.

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

2. CQual
CQual - Инструмент анализа для обнаружения ошибок в Си-программах. Программа расширяет
язык Си дополнительными определяемыми пользователем спецификаторами типа. Программист
комментирует свою программу с соответствующими спецификаторами, и cqual проверяет ошибки.
Неправильные аннотации указывают на потенциальные ошибки. Сqual может использоваться,
чтобы обнаружить потенциальную уязвимость форматной строки.
3. MOPS
MOPS (MOdel checking Programs for Security) - инструмент для поиска уязвимостей в защите в
программах на Си. Его назначение: динамическая корректировка, обеспечивающая соответствие
программы на Си статической модели. MOPS использует модель аудита программного
обеспечения, которая призвана помочь выяснить, соответствует ли программа набору правил,
определенному для создания безопасных программ.

4. ITS4, RATS, PScan, Flawfinder
Для поиска ошибок переполнения буфера и ошибок форматных строк используют следующие
статические анализаторы:

   1. ITS4. Простой инструмент, который статически просматривает исходный Си/Си++-код для
      обнаружения потенциальных уязвимостей защиты. Он отмечает вызовы потенциально
      опасных функций, таких, например, как strcpy/memcpy, и выполняет поверхностный
      семантический анализ, пытаясь оценить, насколько опасен такой код, а так же дает советы
      по его улучшению.
   2. RATS. Утилита RATS (Rough Auditing Tool for Security) обрабатывает код, написанный на
      Си/Си++, а также может обработать еще и скрипты на Perl, PHP и Python. RATS
      просматривает исходный текст, находя потенциально опасные обращения к функциям.
      Цель этого инструмента - не окончательно найти ошибки, а обеспечить обоснованные
      выводы, опираясь на которые специалист сможет вручную выполнять проверку кода. RATS
      использует сочетание проверок надежности защиты от семантических проверок в ITS4 до
      глубокого семантического анализа в поисках дефектов, способных привести к
      переполнению буфера, полученных из MOPS.
   3. PScan. Сканирует исходные тексты на Си в поисках потенциально некорректного
      использования функций, аналогичных printf, и выявляет уязвимые места в строках
      формата.
   4. Flawfinder. Как и RATS, это статический сканер исходных текстов программ, написанных на
      Си/Си++. Выполняет поиск функций, которые чаще всего используются некорректно,
      присваивает им коэффициенты риска (опираясь на такую информацию, как передаваемые
      параметры) и составляет список потенциально уязвимых мест, упорядочивая их по степени
      риска.

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

5. Bunch
Bunch - средство анализа и визуализации программ на Си, которое строит граф зависимостей,
помогающий аудитору разобраться в модульной структуре программы.

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

7. FlexeLint (PC-Lint)
FlexeLint (PC-Lint) - этот анализатор предназначен для анализа исходного кода с целью выявления
ошибок различного типа. Программа производит семантический анализ исходного кода, анализ
потоков данных и управления.

В конце работы выдаются сообщения нескольких основных типов:

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

8. Viva64
Инструмент Viva64, который помогает специалисту отслеживать в исходном коде Си/Си++-
программ потенциально опасные фрагменты, связанные с переходом от 32-битных систем к 64-
битным. Viva64 встраивается в среду Microsoft Visual Studio 2005/2008, что способствует удобной
работе с этим инструментом. Анализатор помогает писать корректный и оптимизированный код
для 64-битных систем.

9. Parasoft C++test
Parasoft C++test - специализированный инструмент для Windows, позволяющий автоматизировать
анализ качества кода Си++. Пакет C++test анализирует проект и генерирует код, предназначенный
для проверки содержащихся в проекте компонентов. Пакет C++test делает очень важную работу
по анализу классов C++. После того как проект загружен, необходимо настроить методы
тестирования. Программное обеспечение изучает каждый аргумент метода и возвращает типы
соответствующих значений. Для данных простых типов подставляются значения аргументов по
умолчанию; можно определить тестовые данные для определенных пользователем типов и
классов. Можно переопределить аргументы C++test, используемые по умолчанию, и выдать
значения, полученные в результате тестирования. Особого внимания заслуживает способность
C++test тестировать незавершенный код. Программное обеспечение генерирует код-заглушку для
любого метода и функции, которые еще не существуют. Поддерживается имитация внешних
устройств и входных данных, задаваемых пользователем. И та и другая функции допускают
возможность повторного тестирования. После определения тестовых параметров для всех
методов пакет C++test готов к запуску исполняемого кода. Пакет генерирует тестовый код,
вызывая для его подготовки компилятор Visual C++. Возможно формирование тестов на уровне
метода, класса, файла и проекта.

10. Coverity
Инструменты Coverity используются для выявления и исправления дефектов безопасности и
качества в приложениях критического назначения. Технология компании Coverity устраняет
барьеры в написании и внедрении сложного ПО посредством автоматизации поиска и устранения
критических программных ошибок и недостатков безопасности во время процесса разработки.
Инструмент компании Coverity способен с минимальной положительной погрешностью
обрабатывать десятки миллионов строк кода, обеспечивая 100-процентное покрытие трассы.
11. KlocWork K7
Продукты компании Klocwork предназначены для автоматизированного статического анализа
кода, выявления и предотвращения дефектов программного обеспечения и проблем
безопасности. Инструменты этой компании служат для выявления коренных причин недостатков
качества и безопасности программного обеспечения, для отслеживания и предотвращения этих
недостатков на протяжении всего процесса разработки.

12. Frama-C
Frama-C - открытый, интегрированный набор инструментов для анализа исходного кода на языке
Си. Набор включает ACSL (ANSI/ISO C Specification Language) - специальный язык, позволяющий
подробно описывать спецификации функций Си, например, указать диапазон допустимых
входных значений функции и диапазон нормальных выходных значений.

Этот инструментарий помогает производить такие действия:

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

13. CodeSurfer
CodeSurfer - инструмент анализа программ, который не предназначается непосредственно для
поиска ошибок уязвимости защиты. Его основными достоинствами являются:

   •   Анализ указателей;
   •   Различные анализы потока данных (использование и определение переменных,
       зависимость данных, построение графа вызовов);
   •   Скриптовый язык.

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

14. FxCop
FXCop предоставляет средства автоматической проверки .NET-сборок на предмет соответствия
правилам Microsoft .NET Framework Design Guidelines. Откомпилированный код проверяется с
помощью механизмов рефлексии, парсинга MSIL и анализа графа вызовов. В результате FxCop
способен обнаружить более 200 недочетов (или ошибок) в следующих областях:

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

15. JavaChecker
JavaChecker - это статический анализатор Java програм, основанный на технологии TermWare.

Это средство позволяет выявлять дефекты кода, такие как:

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

Набором проверок можно управлять, используя управляющие комментарии.

Вызов JavaChecker можно осуществлять из ANT скрипта.

16. Simian
Simian - анализатор подобия, который ищет повторяющийся синтаксис в нескольких файлах
одновременно. Программа понимает синтаксис различных языков программирования, включая
C#, T-SQL, JavaScript и Visual Basic®, а также может искать повторяющиеся фрагменты в текстовых
файлах. Множество возможностей настройки позволяет точно настраивать правила поиска
дублирующегося кода. Например, параметр порога (threshold) определяет, какое количество
повторяющихся строк кода считать дубликатом.

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

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


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


Библиографический список
   1. Alexey Kolosov. Using Static Analysis in Program Development. http://www.viva64.com/art-2-2-
      681473622.html
   2. Брайан Гетц. Избавьтесь от ошибок. http://www.viva64.com/go.php?url=163
   3. Криспин Кован. Безопасность систем с открытым
      кодом.http://www.viva64.com/go.php?url=160
   4. Павел Зуев. О компьютерной безопасности. http://www.viva64.com/go.php?url=161
   5. С.С. Гайсарян, А.В. Чернов, А.А. Белеванцев, О.Р. Маликов, Д.М. Мельник, А.В.
      Меньшикова. О некоторых задачах анализа и трансформации программ.
      http://www.viva64.com/go.php?url=487

Mais conteúdo relacionado

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

Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Expolink
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеTatyanazaxarova
 
Safety and Security of Web-applications (Document)
Safety and Security of Web-applications (Document)Safety and Security of Web-applications (Document)
Safety and Security of Web-applications (Document)MrCoffee94
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кодаTatyanazaxarova
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокSQALab
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программTatyanazaxarova
 
Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Alexey Kachalin
 
программное обеспечение пк
программное обеспечение пкпрограммное обеспечение пк
программное обеспечение пкpochtalion
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
 
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...Andrey Fadin
 
метод организации репозитория исходного кода
метод организации репозитория исходного кодаметод организации репозитория исходного кода
метод организации репозитория исходного кодаSergii Shmarkatiuk
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программTatyanazaxarova
 
Анализ защищенности интернет-проектов
Анализ защищенности интернет-проектовАнализ защищенности интернет-проектов
Анализ защищенности интернет-проектовDmitry Evteev
 

Semelhante a Поиск уязвимостей в программах с помощью анализаторов кода (20)

Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.Методические рекомендации по техническому анализу. О. Макарова.
Методические рекомендации по техническому анализу. О. Макарова.
 
по
попо
по
 
Регулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработкеРегулярное использование статического анализа кода в командной разработке
Регулярное использование статического анализа кода в командной разработке
 
Secure development
Secure developmentSecure development
Secure development
 
Safety and Security of Web-applications (Document)
Safety and Security of Web-applications (Document)Safety and Security of Web-applications (Document)
Safety and Security of Web-applications (Document)
 
Как мы тестируем анализатор кода
Как мы тестируем анализатор кодаКак мы тестируем анализатор кода
Как мы тестируем анализатор кода
 
Андрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибокАндрей Уразов - Методы раннего обнаружения ошибок
Андрей Уразов - Методы раннего обнаружения ошибок
 
пр 2 ПО.docx
пр 2 ПО.docxпр 2 ПО.docx
пр 2 ПО.docx
 
Применение статического анализа при разработке программ
Применение статического анализа при разработке программПрименение статического анализа при разработке программ
Применение статического анализа при разработке программ
 
Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)Безопасная разработка (СТАЧКА 2015)
Безопасная разработка (СТАЧКА 2015)
 
Java one presentation
Java one presentationJava one presentation
Java one presentation
 
спо
споспо
спо
 
спо
споспо
спо
 
программное обеспечение пк
программное обеспечение пкпрограммное обеспечение пк
программное обеспечение пк
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кода
 
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...
Аудит безопасности программного кода: Подходы, стандарты, технологии выявлени...
 
метод организации репозитория исходного кода
метод организации репозитория исходного кодаметод организации репозитория исходного кода
метод организации репозитория исходного кода
 
Отладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программОтладка и оптимизация многопоточных OpenMP-программ
Отладка и оптимизация многопоточных OpenMP-программ
 
лекция № 12
лекция № 12лекция № 12
лекция № 12
 
Анализ защищенности интернет-проектов
Анализ защищенности интернет-проектовАнализ защищенности интернет-проектов
Анализ защищенности интернет-проектов
 

Mais de Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 

Mais de Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибокУрок 7. Проблемы выявления 64-битных ошибок
Урок 7. Проблемы выявления 64-битных ошибок
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 

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

  • 1. Поиск уязвимостей в программах с помощью анализаторов кода Автор: Елена Харитонова Дата: 10.08.2008 Аннотация В настоящее время разработано большое количество инструментальных средств, предназначенных для автоматизации поиска уязвимостей программ. В данной статье будут рассмотрены некоторые из них. Введение Статический анализ кода - это анализ программного обеспечения, который производится над исходным кодом программ и реализуется без реального исполнения исследуемой программы. Программное обеспечение часто содержит разнообразные уязвимости из-за ошибок в коде программ. Ошибки, допущенные при разработке программ, в некоторых ситуациях приводят к сбою программы, а следовательно, нарушается нормальная работа программы: при этом часто возникает изменение и порча данных, останов программы или даже системы. Большинство уязвимостей связано с неправильной обработкой данных, получаемых извне, или недостаточно строгой их проверкой. Для выявления уязвимостей используют различные инструментальные средства, например, статические анализаторы исходного кода программы, обзор которых приведён в данной статье. Классификация уязвимостей защиты Когда требование корректной работы программы на всех возможных входных данных нарушается, становится возможным появление так называемых уязвимостей защиты (security vulnerability). Уязвимости защиты могут приводить к тому, что одна программа может использоваться для преодоления ограничений защиты всей системы в целом. Классификация уязвимостей защиты в зависимости от программных ошибок: 1. Переполнение буфера (buffer overflow). Эта уязвимость возникает из-за отсутствия контроля за выходом за пределы массива в памяти во время выполнения программы. Когда слишком большой пакет данных переполняет буфер ограниченного размера, содержимое посторонних ячеек памяти перезаписывается, и происходит сбой и аварийный выход из программы. По месту расположения буфера в памяти процесса различают переполнения буфера в стеке (stack buffer overflow), куче (heap buffer overflow) и области статических данных (bss buffer overflow). 2. Уязвимости "испорченного ввода" (tainted input vulnerability). Уязвимости "испорченного ввода" могут возникать в случаях, когда вводимые пользователем данные без достаточного контроля передаются интерпретатору некоторого внешнего языка (обычно
  • 2. это язык Unix shell или SQL). В этом случае пользователь может таким образом задать входные данные, что запущенный интерпретатор выполнит совсем не ту команду, которая предполагалась авторами уязвимой программы. 3. Ошибки форматных строк (format string vulnerability). Данный тип уязвимостей защиты является подклассом уязвимости "испорченного ввода". Он возникает из-за недостаточного контроля параметров при использовании функций форматного ввода- вывода printf, fprintf, scanf, и т. д. стандартной библиотеки языка Си. Эти функции принимают в качестве одного из параметров символьную строку, задающую формат ввода или вывода последующих аргументов функции. Если пользователь сам может задать вид форматирования, то эта уязвимость может возникнуть в результате неудачного применения функций форматирования строк. 4. Уязвимости как следствие ошибок синхронизации (race conditions). Проблемы, связанные с многозадачностью, приводят к ситуациям, называемым "состояние гонки": программа, не рассчитанная на выполнение в многозадачной среде, может считать, что, например, используемые ею при работе файлы не может изменить другая программа. Как следствие, злоумышленник, вовремя подменяющий содержимое этих рабочих файлов, может навязать программе выполнение определенных действий. Конечно, кроме перечисленных существуют и другие классы уязвимостей защиты. Обзор существующих анализаторов Для обнаружения уязвимостей защиты в программах применяют следующие инструментальные средства: • Динамические отладчики. Инструменты, которые позволяют производить отладку программы в процессе её исполнения. • Статические анализаторы (статические отладчики). Инструменты, которые используют информацию, накопленную в ходе статического анализа программы. Статические анализаторы указывают на те места в программе, в которых возможно находится ошибка. Эти подозрительные фрагменты кода могут, как содержать ошибку, так и оказаться совершенно безопасными. В данной статье предложен обзор нескольких существующих статических анализаторов. Рассмотрим подробнее каждый из них. 1. BOON Инструмент BOON, который на основе глубокого семантического анализа автоматизирует процесс сканирования исходных текстов на Си в поисках уязвимых мест, способных приводить к переполнению буфера. Он выявляет возможные дефекты, предполагая, что некоторые значения являются частью неявного типа с конкретным размером буфера. 2. CQual CQual - Инструмент анализа для обнаружения ошибок в Си-программах. Программа расширяет язык Си дополнительными определяемыми пользователем спецификаторами типа. Программист комментирует свою программу с соответствующими спецификаторами, и cqual проверяет ошибки. Неправильные аннотации указывают на потенциальные ошибки. Сqual может использоваться, чтобы обнаружить потенциальную уязвимость форматной строки.
  • 3. 3. MOPS MOPS (MOdel checking Programs for Security) - инструмент для поиска уязвимостей в защите в программах на Си. Его назначение: динамическая корректировка, обеспечивающая соответствие программы на Си статической модели. MOPS использует модель аудита программного обеспечения, которая призвана помочь выяснить, соответствует ли программа набору правил, определенному для создания безопасных программ. 4. ITS4, RATS, PScan, Flawfinder Для поиска ошибок переполнения буфера и ошибок форматных строк используют следующие статические анализаторы: 1. ITS4. Простой инструмент, который статически просматривает исходный Си/Си++-код для обнаружения потенциальных уязвимостей защиты. Он отмечает вызовы потенциально опасных функций, таких, например, как strcpy/memcpy, и выполняет поверхностный семантический анализ, пытаясь оценить, насколько опасен такой код, а так же дает советы по его улучшению. 2. RATS. Утилита RATS (Rough Auditing Tool for Security) обрабатывает код, написанный на Си/Си++, а также может обработать еще и скрипты на Perl, PHP и Python. RATS просматривает исходный текст, находя потенциально опасные обращения к функциям. Цель этого инструмента - не окончательно найти ошибки, а обеспечить обоснованные выводы, опираясь на которые специалист сможет вручную выполнять проверку кода. RATS использует сочетание проверок надежности защиты от семантических проверок в ITS4 до глубокого семантического анализа в поисках дефектов, способных привести к переполнению буфера, полученных из MOPS. 3. PScan. Сканирует исходные тексты на Си в поисках потенциально некорректного использования функций, аналогичных printf, и выявляет уязвимые места в строках формата. 4. Flawfinder. Как и RATS, это статический сканер исходных текстов программ, написанных на Си/Си++. Выполняет поиск функций, которые чаще всего используются некорректно, присваивает им коэффициенты риска (опираясь на такую информацию, как передаваемые параметры) и составляет список потенциально уязвимых мест, упорядочивая их по степени риска. Все эти инструменты схожи и используют только лексический и простейший синтаксический анализ. Поэтому результаты, выданные этими программами, могут содержать до 100% ложных сообщений. 5. Bunch Bunch - средство анализа и визуализации программ на Си, которое строит граф зависимостей, помогающий аудитору разобраться в модульной структуре программы. 6. UNO UNO - простой анализатор исходного кода. Он был разработан для нахождения таких ошибок, как неинициализированные переменные, нулевые указатели и выход за пределы массива. UNO позволяет выполнять несложный анализ потока управления и потоков данных, осуществлять как внутри- так и межпроцедурный анализ, специфицировать свойства пользователя. Но данный инструмент не доработан для анализа реальных приложений, не поддерживает многие
  • 4. стандартные библиотеки и на данном этапе разработки не позволяет анализировать сколь-нибудь серьёзные программы. 7. FlexeLint (PC-Lint) FlexeLint (PC-Lint) - этот анализатор предназначен для анализа исходного кода с целью выявления ошибок различного типа. Программа производит семантический анализ исходного кода, анализ потоков данных и управления. В конце работы выдаются сообщения нескольких основных типов: • Возможен нулевой указатель; • Проблемы с выделением памяти (например, нет free() после malloc()); • Проблемный поток управления (например, недостижимый код); • Возможно переполнение буфера, арифметическое переполнение; • Предупреждения о плохом и потенциально опасном стиле кода. 8. Viva64 Инструмент Viva64, который помогает специалисту отслеживать в исходном коде Си/Си++- программ потенциально опасные фрагменты, связанные с переходом от 32-битных систем к 64- битным. Viva64 встраивается в среду Microsoft Visual Studio 2005/2008, что способствует удобной работе с этим инструментом. Анализатор помогает писать корректный и оптимизированный код для 64-битных систем. 9. Parasoft C++test Parasoft C++test - специализированный инструмент для Windows, позволяющий автоматизировать анализ качества кода Си++. Пакет C++test анализирует проект и генерирует код, предназначенный для проверки содержащихся в проекте компонентов. Пакет C++test делает очень важную работу по анализу классов C++. После того как проект загружен, необходимо настроить методы тестирования. Программное обеспечение изучает каждый аргумент метода и возвращает типы соответствующих значений. Для данных простых типов подставляются значения аргументов по умолчанию; можно определить тестовые данные для определенных пользователем типов и классов. Можно переопределить аргументы C++test, используемые по умолчанию, и выдать значения, полученные в результате тестирования. Особого внимания заслуживает способность C++test тестировать незавершенный код. Программное обеспечение генерирует код-заглушку для любого метода и функции, которые еще не существуют. Поддерживается имитация внешних устройств и входных данных, задаваемых пользователем. И та и другая функции допускают возможность повторного тестирования. После определения тестовых параметров для всех методов пакет C++test готов к запуску исполняемого кода. Пакет генерирует тестовый код, вызывая для его подготовки компилятор Visual C++. Возможно формирование тестов на уровне метода, класса, файла и проекта. 10. Coverity Инструменты Coverity используются для выявления и исправления дефектов безопасности и качества в приложениях критического назначения. Технология компании Coverity устраняет барьеры в написании и внедрении сложного ПО посредством автоматизации поиска и устранения критических программных ошибок и недостатков безопасности во время процесса разработки. Инструмент компании Coverity способен с минимальной положительной погрешностью обрабатывать десятки миллионов строк кода, обеспечивая 100-процентное покрытие трассы.
  • 5. 11. KlocWork K7 Продукты компании Klocwork предназначены для автоматизированного статического анализа кода, выявления и предотвращения дефектов программного обеспечения и проблем безопасности. Инструменты этой компании служат для выявления коренных причин недостатков качества и безопасности программного обеспечения, для отслеживания и предотвращения этих недостатков на протяжении всего процесса разработки. 12. Frama-C Frama-C - открытый, интегрированный набор инструментов для анализа исходного кода на языке Си. Набор включает ACSL (ANSI/ISO C Specification Language) - специальный язык, позволяющий подробно описывать спецификации функций Си, например, указать диапазон допустимых входных значений функции и диапазон нормальных выходных значений. Этот инструментарий помогает производить такие действия: • Осуществлять формальную проверку кода; • Искать потенциальные ошибки исполнения; • Произвести аудит или рецензирование кода; • Проводить реверс-инжиниринг кода для улучшения понимания структуры; • Генерировать формальную документацию. 13. CodeSurfer CodeSurfer - инструмент анализа программ, который не предназначается непосредственно для поиска ошибок уязвимости защиты. Его основными достоинствами являются: • Анализ указателей; • Различные анализы потока данных (использование и определение переменных, зависимость данных, построение графа вызовов); • Скриптовый язык. CodeSurfer может быть использован для поиска ошибок в исходном коде, для улучшения понимания исходного кода, и для реинженерии программ. В рамках среды CodeSurfer велась разработка прототипа инструментального средства для обнаружения уязвимостей защиты, однако разработанное инструментальное средство используется только внутри организации разработчиков. 14. FxCop FXCop предоставляет средства автоматической проверки .NET-сборок на предмет соответствия правилам Microsoft .NET Framework Design Guidelines. Откомпилированный код проверяется с помощью механизмов рефлексии, парсинга MSIL и анализа графа вызовов. В результате FxCop способен обнаружить более 200 недочетов (или ошибок) в следующих областях: • Архитектура библиотеки; • Локализация; • Правила именования; • Производительность; • Безопасность.
  • 6. FxCop предусматривает возможность создания собственных правил с помощью специального SDK. FxCop может работать как в графическом интерфейсе, так и в командной строке. 15. JavaChecker JavaChecker - это статический анализатор Java програм, основанный на технологии TermWare. Это средство позволяет выявлять дефекты кода, такие как: • небрежная обработка исключений (пустые catch-блоки, генерирование исключений общего вида и.т.п.); • сокрытие имен (например, когда имя члена класса совпадает с именем формального параметра метода); • нарушения стиля (вы можете задавать стиль программирования с помощью набора регулярных выражений); • нарушения стандартных контрактов использования (например, когда переопределен метод equals, но не hashCode); • нарушения синхронизации (например, когда доступ к синхронизированной переменной находится вне synchronized блока). Набором проверок можно управлять, используя управляющие комментарии. Вызов JavaChecker можно осуществлять из ANT скрипта. 16. Simian Simian - анализатор подобия, который ищет повторяющийся синтаксис в нескольких файлах одновременно. Программа понимает синтаксис различных языков программирования, включая C#, T-SQL, JavaScript и Visual Basic®, а также может искать повторяющиеся фрагменты в текстовых файлах. Множество возможностей настройки позволяет точно настраивать правила поиска дублирующегося кода. Например, параметр порога (threshold) определяет, какое количество повторяющихся строк кода считать дубликатом. Simian - это небольшой инструмент, разработанный для эффективного поиска повторений кода. У него отсутствует графический интерфейс, но его можно запустить из командной строки или обратиться к нему программно. Результаты выводятся в текстовом виде и могут быть представлены в одном из встроенных форматов (например, XML). Хотя скудный интерфейс и ограниченные возможности вывода результатов Simian требуют некоторого обучения, он помогает сохранить целостность и эффективность продукта. Simian подходит для поиска повторяющегося кода как в больших, так и в маленьких проектах. Повторяющийся код снижает поддерживаемость и обновляемость проекта. Можно использовать Simian для быстрого поиска дублирующихся фрагментов кода во многих файлах одновременно. Поскольку Simian может быть запущен из командной строки, его можно включить в процесс сборки, чтобы получить предупреждения или остановить процесс в случае повторений кода. Вывод Итак, в данной статье были рассмотрены статические анализаторы исходного кода, которые являются вспомогательными инструментами программиста. Все инструментальные средства разные и помогают отслеживать самые различные классы уязвимостей защиты в программах.
  • 7. Можно сделать вывод, что статические анализаторы должны быть точными, восприимчивыми. Но, к сожалению, статические средства отладки не могут дать абсолютно надёжный результат. Библиографический список 1. Alexey Kolosov. Using Static Analysis in Program Development. http://www.viva64.com/art-2-2- 681473622.html 2. Брайан Гетц. Избавьтесь от ошибок. http://www.viva64.com/go.php?url=163 3. Криспин Кован. Безопасность систем с открытым кодом.http://www.viva64.com/go.php?url=160 4. Павел Зуев. О компьютерной безопасности. http://www.viva64.com/go.php?url=161 5. С.С. Гайсарян, А.В. Чернов, А.А. Белеванцев, О.Р. Маликов, Д.М. Мельник, А.В. Меньшикова. О некоторых задачах анализа и трансформации программ. http://www.viva64.com/go.php?url=487