Научная статья на тему 'Методы сокращения количества уязвимостей в специальном программном обеспечении реального времени'

Методы сокращения количества уязвимостей в специальном программном обеспечении реального времени Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
217
56
i Надоели баннеры? Вы всегда можете отключить рекламу.
i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Методы сокращения количества уязвимостей в специальном программном обеспечении реального времени»

Мастер

Слэйв1

i i

I MAINTENANCE_WRITE(Старт1) ч |

<-

^ Данное1_1

MAINTEN¡ANCE_READ (Данное1_(М - 1))

MAINTENANCE_WRITE(СтартN)

MAINTENANCE_READ (Ожидает_передачу1)

MAINTENANCE_READ(Данное1_1) ,

^ Данное1_(М - 1)

MAINTENANCE_READ(Данное1_М) h

<-

MAINTENANCE_READ (Ожидает_передачу^

<-

MAINTENANCE_READ(ДанноеN_1)

<-

MAINTENANCE_READ (ДанноеN_(М - 1))

MAINTENANCE_READ(ДанноеN_М)

СлэйвЫ

^ ДанноеN_(М - 1)________^_____________

< конец

, I .

Рис. 3. Диаграмма последовательности UML протокола обмена по RapidIO пакетами типа MAINTENANCE READ и MAINTENANCE WRITE

ДанноеN 1

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

в режиме Мастер-Слэйв, облегчают построение тестовых стендов, исключая подключение дополнительных кабелей, а иногда и инструментальных ЭВМ. Данные способы тестирования многопроцессорных систем применяются в системах на основе процессорных микросхем 1890ВМ6Я.

Литература

1. Fuller S. RapidIO. The Embedded Systems Interconnect. John Wiley & Sons, Ltd, 2005.

2. Бобков С. Г. Методика тестирования микросхем для компьютеров серии «багет» // Программные продукты и системы. 2007. № 3.

3. RapidIO Interconnect Specification. Part 2: Messsage Passing Logical Specification. Revision 2.2. RapidIO Trade Association, 2011. URL: http://www.rapidio.org/specs/current/RapidIO_ Rev_ 2.2_Specification.zip (дата обращения: 07.05.2012).

4. RapidIO Interconnect Specification. Part 1: Input/Output Logical Specification. Revision 2.2. RapidIO Trade Association, 2011. URL: http://www.rapidio.org/specs/current/RapidIO_Rev_ 2.2_Specification.zip (дата обращения: 07.05.2012).

5. RapidIO Interconnect Specification. Annex 2: Session Management Protocol Specification. Revision 2.2. RapidIO Trade Association, 2011. URL: http://www.rapidio.org/specs/current/Ra-pidIO_Rev_2.2_Specification.zip (дата обращения: 07.05.2012).

References

1. Fuller S., RapidIO. The Embedded Systems Interconnect. John Wiley & Sons, Ltd, 2005.

2. Bobkov S.G., Programmnye Produkty i Sistemy, 2007, no. 3.

3. RapidIO Interconnect Specification. Part 2: Messsage Passing Logical Specification. Revision 2.2. RapidIO Trade Association, 2011, available at: www.rapidio.org/specs/current/Ra-pidIO_Rev_2.2_ Specification.zip (accessed 07.05.2012).

4. RapidIO Interconnect Specification. Part 1: Input/Output Logical Specification. Revision 2.2. RapidIO Trade Association, 2011, available at: www.rapidio.org/specs/current/RapidIO_Rev_ 2.2_Specification.zip (accessed 07.05.2012).

5. RapidIO Interconnect Specification. Annex 2: Session Management Protocol Specification. Revision 2.2. RapidIO Trade Association, 2011, available at: www.rapidio.org/specs/current/Ra-pidIO_Rev_2.2_Specification.zip (accessed 07.05.2012).

УДК 658.512.011.56:004.42

МЕТОДЫ СОКРАЩЕНИЯ КОЛИЧЕСТВА УЯЗВИМОСТЕЙ В СПЕЦИАЛЬНОМ ПРОГРАММНОМ ОБЕСПЕЧЕНИИ РЕАЛЬНОГО ВРЕМЕНИ

К.Г. Нархов

(НИИСИРАН, г. Москва, [email protected])

Настоящая статья посвящена вопросам автоматизации деятельности программиста, в частности, сокращению количества уязвимостей и ошибок в программном коде. Рассмотрены особенности разработки программ в среде технологических средств автоматизированной генерации специального программного обеспечения (ТСАГ СПО), а также приемы использования библиотеки, входящей в состав ТСАГ СПО для сокращений потенциальных уязвимостей в разрабатываемых программах. Приводится классификация типовых уязвимостей в программном обеспечении реального времени, анализируется каждый класс потенциальных уязвимостей с точки зрения частоты появления в программах, причин возникновения и методов их предотвращения средствами ТСАГ СПО. Некоторые потенциальные уязвимости рассмотрены с учетом особенностей конфигурации операционной системы реального времени. Для классификации уязвимостей были использованы статический анализатор и набор исходных текстов программ реального времени, разработанных в НИИСИ РАН. Общая база исходных текстов насчитывает 204 программных модуля (более 111 700 строк). Представлен пример сокращения потенциальных уязвимостей в программе генерации исходных текстов реального времени (ПГЕН РВ), которая входит в состав ТСАГ СПО. Продемонстрирован способ сокра-

щения уязвимостей за счет использования в библиотеке ТСАГ СПО типовых шаблонов программ, который позволил устранить все найденные статическим анализатором уязвимости в ПГЕН РВ.

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

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

TECHNIQUES PROVIDED FOF VALNERABILITIES REDUCTION IN SPECIAL REAL TIME SOFTWARE

NarkhovK.G. (SRISA RAS, Moscow, [email protected])

Abstract. This article is dedicated to automation of a programmer's work, particularly in the area of vulnerabilities reduction and bugs in the program code. The article reviews details of the program design in technical facilities of automated code generation for special software (TFACG SS) and use of library contained in TFACG SS that reduces potential vulnerabilities appearing in new programs. The author provides taxonomy of typical vulnerabilities in real time programs, he makes review of each class of vulnerability, how often and why does the vulnerability occur, and its prevention using TFACG SS facilities. Some potential vulnerabilities take in account configuration of real time operating system.

Taxonomy of vulnerabilities was made with a static estimating device and set of real time source code designed by Institute for Scientific Research of Russian Academy of Sciences. Set of the source codes includes 204 of the program modules (more than 111700 lines).

The article finishes with example of reduction of potential vulnerabilities in real time source code generation program (PVSC RT), which is a part of TFACG SS. The article shows method of reduction of vulnerabilities using standard program patterns provided by TFACG SS, this method repaired all vulnerabilities that were found by static estimating device in PVSC RT.

The library expansion for standard TFACG SS patterns and the supplementation of the static analyzer rules, which will include tests and conditions specific for real time operating system, are the main prospects of solutions presented in the article.

Keywords: programming, real time systems, source code generation, software vulnerabilities, runtime errors, XML, UML, model, modeling, reliability, source code.

К специальному программному обеспечению (СПО), выполняющемуся в реальном масштабе времени, предъявляются жесткие с точки зрения обеспечения надежности и отказоустойчивости требования. Сокращение уязвимостей и ошибок, результатом которых может стать частичный или полный отказ системы реального времени, является трудоемкой задачей, для автоматизации которой в НИИСИ РАН были разработаны технологические средства автоматизированной генерации СПО (ТСАГ СПО). Эти средства позволяют сокращать количество уязвимостей при разработке СПО реального времени за счет применения типовых программных компонентов, входящих в состав поставляемой вместе с ТСАГ СПО библиотеки. К ним относятся синтаксические конструкции языка, утверждения и выражения вызовов функций ОС2000 [1], пакет поддержки модуля (ППМ -набор драйверов устройств, необходимых для функционирования ОС2000, например, системные часы и контроллер прерываний) и шаблоны программ реального времени.

Синтаксические конструкции языка Си, вошедшие в библиотеку, являются подмножеством Си - множества конструкций языка Си, определенного нотацией в приложении «А» стандарта языка (КОЛЕС 9899::1999). Конструкции из этого множества были проанализированы на предмет использования в базе исходных текстов СПО реального времени, имеющейся в распоряжении разработчиков ТСАГ СПО. Конструкции, найденные в базе исходных текстов более одного раза, были объединены в подмножество. Из этого под-

множества исключены повторяющиеся и взаимозаменяемые конструкции. Таким образом, в библиотеку ТСАГ СПО вошло 225 конструкций языка Си.

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

Библиотека, в состав которой входят синтаксические конструкции языка Си (например, циклы и условия), утверждения и выражения вызовов функций ОС2000 и ППМ, является достаточной для написания программ в ТСАГ СПО. Тем не менее для сокращения уязвимостей в СПО требуется добавить в библиотеку шаблоны программ реального времени (программы работы с памятью, средствами синхронизации, прерываниями и т.д.), в которых заранее исключены потенциальные уязвимости. Использование таких шаблонов при разработке позволит увеличить надежность и отказоустойчивость ПО. Для того чтобы определить, какие именно шаблоны нужно включить в библиотеку, требуется составить классификацию уяз-вимостей, на ее основании выбрать типовые уязвимости и сделать для них шаблоны программ.

ТСАГ СПО совместно с расширенной дополнительными шаблонами библиотекой позволяет автоматизировать проверку исходных текстов разрабатываемых программ на соответствие синтаксису языка и корректное использование функций ОС2000 и ППМ, а также предоставляет воз-

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

Методы сокращения количества уязвимостей

Разработка программ в ТСАГ СПО выполняется в соответствии со стандартами унифицированного языка моделирования UML (ISO/IEC 19501:2005(E)) и расширяемого языка разметки XML [2]. По стандарту UML особенности моделируемого объекта должны изображаться графически в виде совокупности связанных между собой графических элементов.

В процессе проектирования программ ТСАГ СПО строятся диаграммы, для этого используется библиотека ТСАГ СПО. Библиотека содержит XML-документы, которые визуализируются ТСАГ СПО графическими вершинами (graphic node) типа action. XML-документы содержат представления конструкций языка программирования, утверждений и выражений вызовов функций ОС2000 и ППМ, шаблонов программ реального времени на языке XML. В XML-документах также содержатся данные, требуемые для отображения на диаграммах (количество графических вершин, отображаемый в графических вершинах текст). Все XML-документы, входящие в библиотеку ТСАГ СПО, соответствуют XML-схеме [3], разработанной на основе данных из стандарта языка программирования Си и позволяющей устанавливать синтаксическую и семантическую правильность проектируемых в ТСАГ СПО программ без предварительной компиляции. Далее по тексту будем называть эту схему XML-схемой языка Си, а XML-документы из библиотеки - заготовками UML.

Разработка программ в ТСАГ СПО выполняется с использованием диаграмм программной деятельности (ДПД), которые являются особым видом диаграмм деятельности UML. Создавая программу, разработчик копирует заготовки UML из библиотеки на ДПД и заполняет значения параметров этих заготовок. Копирование заготовки UML на ДПД может предполагать вставку заготовки UML внутрь уже имеющейся. Параметры заготовки UML задаются в диалоговом окне «Параметры группы» ДПД (см. рис. 1).

Для каждой ДПД можно построить результирующий XML-документ, объединяющий в себе заготовки UML из библиотеки, которые используются на ДПД. Порядок объединения XML-доку-ментов соответствует порядку следования заготовок UML на конкретной ДПД. ДПД считается корректной, если построенный из нее результи-

Рис. 1. Пример программы «Hello, world!» на диаграмме ДПД

рующий XML-документ соответствует XML-схеме языка Си. Проверка корректности ДПД выполняется в процессе генерации результирующего XML-документа из ДПД.

ТСАГ СПО представляют собой совокупность следующих взаимодействующих программных средств:

- подсистема графического интерфейса ТСАГ СПО (обеспечивает управление проектами ТСАГ СПО, а также запуск подсистем ТСАГ СПО в режиме графического интерактивного диалога);

- подсистема графического представления ВС РВ (предназначена для визуального проектирования приложений);

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

- подсистема генерации текстов программ в исходном виде [4] (предназначена для перевода диаграмм программной деятельности в набор файлов с текстом программ в исходном виде на языке Си).

Классификация уязвимостей

Для сбора информации об уязвимостях использовались статический анализатор clang и набор исходных текстов программ (ИТП) реального времени (ППМ для ОС2000, примеры к графической библиотеке реального времени, тесты и программы, разработанные в отделе математического обеспечения НИИСИ РАН). Статический анализатор clang после обработки исходного текста программного модуля создает протокол, в который входят общая статистика по программному модулю и детализация конкретных уязвимостей (см. листинг 1).

Листинг 1.

/home/osuser/rtos/rtos-baget-

2.50.20/bsp/compile2 05/scsi/am53c974.c:1824:64 Warning: use of GNU old-style field designator extension /home/osuser/rtos/rtos-baget-

2.50.20/bsp/compile2 05/scsi/am53c974.c:337:28 Dead

store: Value stored to 'temp' during its initialization is never read /homfi/osuser/rtos/rtos-baget-

2.50.20/bsp/compile205/scsi/am53c974.c:353:5 Dead store: Value stored to 'temp' is never read /home/osuser/rtos/rtos-baget-

2.50.20/bsp/compile205/scsi/am53c974.c:1303:6 Dead store: Value stored to 'device' is never read

3 Dead store , 1 Warning , 4 total

Формат протокола следующий: каждая строка соответствует некоторой уязвимости, в строке содержатся информация о файле программного модуля (абсолютный путь), номер строки в исходном тексте, где найдена уязвимость, тип уязвимости и ее краткое описание. В конце протокола выводится общая статистика по обработанному программному модулю. В результате анализа ИТП программой clang (204 программных модуля с исходными текстами - в общей сложности более 111 700 строк) были обнаружены типы уязвимо-стей (в соответствии с протоколами clang), приведенные в таблице.

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

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

- уязвимости, проявляющиеся при синхронизации потоков управления, например, клинчи;

- предупреждения.

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

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

Семантические уязвимости

В результате исследования ИТП было установлено, что более 70 % уязвимостей связаны с семантическими ошибками (например, неучтенное состояние данных, непредусмотренное ветвление). Частыми, но менее распространенными являются ошибки, возникающие при работе с памятью (утечка памяти, доступ к памяти по некорректным указателям). Редки ошибки синхронизации (клинчи, опережения).

Количество семантических ошибок может быть минимизировано за счет заготовок UML, в которых предусмотрены обработка условий и отсутствие зацикливаний. В них не применяются такие конструкции языка Си, как goto или switch/case. В этих заготовках предусмотрены проверка возвращаемых значений функций 0С2000 и МММ. а также корректная инициализация аргументов этих функций (например, атрибуты потока управления). Количество ошибок доступа к памяти может быть минимизировано аналогичным способом. Например, известно, что утечки памяти зачастую вызваны отсутствием функции free() или ей подобной. В связи с этим предлагается использовать универсальную заготовку выделения динамической памяти, в состав которой, помимо maloc(), будет входить и функция free(). Количество ошибок синхронизации может быть минимизировано за счет использования шаблонов программ, в которых представлены основные способы синхронизации для систем реального времени (семафоры, очереди сообщений, таймеры и сигналы). К сожалению, такие шаблоны нельзя назвать универсальными и пригодными к применению в программах в существующем виде.

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

Конфигурирование ОС2000

Наиболее распространенной является ошибка инициализации 0С2000, при возникновении которой блокируется запуск прикладной программы. Например, ОС2000 сконфигурирована таким образом, что после загрузки выполняется запрос

Тип уязвимости Шифр Комментарий Набор ИТП

Dead code DC Уязвимость в семантике программы: исходный код никогда не будет исполнен This statement is never executed The left operand to A is always 0 The right operand to A is always 0

Dead store DS Уязвимость в семантике программы: значение, присвоенное переменной, никогда не будет использоваться Value stored to A is never read

Security S Использование уязвимых функций фгсру, stгcat, ...) Call to function 'mktemp' is insecure as it always creates or uses insecure temporary file. Use 'mkstemp' instead Call to function 'strcat' is insecure as it does not provide bounding of the memory buffer. Replace it with 'strncat'. CWE-119 Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace it with 'strncpy'. CWE-119

Lock checker LC Уязвимость при синхронизации потоков управления This lock has already been acquired

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Warning W Предупреждения (синтаксические, семантические) A within B /* within block comment macro redefined assigning to A from B discards qualifiers assigning to A from B converts between pointers to integer types with different sign comparison between pointer and integer comparison of unsigned expression < 0 is always false control may reach end of non-void function control reaches end of non-void function conversion specifies type A but the argument has type B data argument not used by format string excess elements in array initializer format string contains \0 within the string body format string is not a string literal (potentially insecure) implicit declaration of function A is invalid in C99 implicit truncation from A to bitfield changes value from 64 to 0 implicitly declaring C library function A with type B incompatible integer to pointer conversion initializing A with an expression of type B incompatible integer to pointer conversion passing A to parameter of type B incompatible integer to pointer conversion returning A from a function with result type B incompatible pointer to integer conversion assigning to A from B incompatible pointer to integer conversion passing A to parameter of type B incompatible pointer to integer conversion returning A from a function with result type B incompatible pointer types assigning to A from B incompatible pointer types passing A to parameter of type B initializing A with an expression of type B discards qualifiers initializing A with an expression of type B converts between pointers to integer types with different sign passing A to parameter of type B converts between pointers to integer types with different sign passing A to parameter of type B discards qualifiers passing A to parameter of type B discards qualifiers in nested pointer types passing A to parameter of type B converts between pointers to integer types with different sign pointer type mismatch A and B the computation of the size of the memory allocation may overflowtype specifier missing, defaults to A unknown escape sequence A use of GNU old-style field designator extension use of logical A with constant operand using the result of an assignment as a condition without parentheses

Error E Неправильное использование конструкций Си, функций POSIX 'main' must return 'int' non-void function A should return a value static declaration of A follows non-static declaration use of undeclared identifier A variable has incomplete type A void function A should not return a value

Logic L Ошибка в логике программы (например зацикливание) The code calls sizeof() on a pointer type. This can produce an unexpected result

Logic error LE Логическая ошибка, как правило, ведущая к неправильному использованию ресурсов Access out-of-bound array element (buffer overflow) Access to field A results in a dereference of a null pointer (loaded from variable B) Allocated memory never released. Potential memory leak Assigned value is garbage or undefined Branch condition evaluates to a garbage value Cast a region whose size is not a multiple of the destination type size Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption Function call argument is an uninitialized value The left operand of A is a garbage value Undefined or garbage value returned to caller Using a fixed address is not portable because that address will probably not be valid in all environments or platforms

времени по сети. Если на инструментальной ЭВМ служба времени настроена корректно, целевая ЭВМ с ОС2000 физически соединена по сети с инструментальной ЭВМ, а также корректно настроены сетевые адреса, то ОС2000 успешно получит

показания времени и передаст управление прикладной программе. Если разорвать соединение целевой и инструментальной ЭВМ, 0С2000 выдаст ошибку инициализации (System Init Error) и прикладная программа не будет запущена.

Конфигурация ОС2000 может являться условием переключения на ошибочное поведение программы: например, предположим, что в ОС2000 задан размер стека потока управления в 16 384 байта, а программа использует буфер для обработки данных большего объема (например, 17 000 байт). В этом случае часть данных будет утеряна или в процессе обработки появится исключение. Таким образом, процедура конфигурирования ОС2000 является важным этапом в процессе классификации и поиска ошибок.

Задача поиска уязвимости при выполнении программы

Эффекты, оказываемые уязвимостью на программу реального времени, можно разделить на две категории: вызывающие зависание программы (исключения) и приводящие к некорректной работе ее алгоритма. В ТСАГ СПО используются заготовки UML, в которых предусмотрена обработка исключений (try_begin - try_catch - try_end). Пользователю предоставляется гибкий механизм поиска, анализа и исправления ошибок, приводящих к исключениям. Следует отметить, что механизм обработки исключительных ситуаций позволяет реагировать на уязвимость на лету.

Вообще говоря, проблема поиска уязвимостей напрямую связана с эффектом, который они оказывают. Например, уязвимости, вызывающие исключения, легко выявляются, так как в командном интерпретаторе ОС2000 предусмотрены инструменты для вывода на экран состояния потока управления и вывода содержимого его стека (команды интерпретатора ОС2000 tt и ti). Программа для работы с трассами выполнения ОС2000 позволяет выявить и устранить подавляющее большинство уязвимостей, однако требует запуска непосредственно на целевой ЭВМ для получения протокола с трассами.

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

Примеры

Алгоритмы работы подсистемы генерации текстов программ в исходном виде, входящей в состав ТСАГ СПО, были рассмотрены в [4], в частности, функция PgenfileParse(), которая является основополагающей в данной подсистеме. В этой функции реализован алгоритм обработки XML-данных, выполняющий генерацию текста программы в исходном виде на языке Си. Функция

PgenfileParse() была проанализирована статическим анализатором исходного кода clang. В результате анализа выявлены следующие уязвимости [5]:

- потенциальная возможность утечки памяти (Resource Management Bug: memory leak);

- неучтенное состояние данных (Resource Management Bug: file handle/socket leak);

- ошибки данных (Data Bug: unchecked return values).

Протокол обработки функции PgenfileParse() анализатором исходного кода clang представлен в листинге 2. Листинг 2.

[osuser@localhost staticAnalize]$ sh staticAnalize.sh PgenfileParse.c

PgenfileParse.c:226:2 Dead store: Value stored to 'foundinline' is never read

PgenfileParse.c:246:49 Security: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with 'strncpy'. CWE-119

PgenfileParse.c:307:7 Security: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with 'strncpy'. CWE-119

PgenfileParse.c:321:3 Dead store: Value stored to 'error' is never read

PgenfileParse.c:323:38 Dead store: Value stored to 'error' is never read

PgenfileParse.c:330:6 Security: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with 'strncpy'. CWE-119

PgenfileParse.c:341:3 Security: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with 'strncpy'. CWE-119

PgenfileParse.c:357:2 Security: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with 'strncpy'. CWE-119

PgenfileParse.c:448:4 Dead store: Value stored to 'error' is never read

PgenfileParse.c:464:47 Logic error: Opened File never closed. Potential Resource leak

4 Dead store , 1 Logic error , 5 Security , 10 total

На основании выявленных уязвимостей была дополнена библиотека UML-заготовок ТСАГ СПО. В ее состав включены три подгруппы заготовок: vulnerables, recommend и secure. В подгруппу заготовок vulnerables включены потенциально опасные функции библиотеки языка Си string.h.

Идея объединения уязвимых функций в подгруппу предполагает привлечение внимания программиста, уже на этапе разработки предупрежденного системой о потенциальной опасности используемых функций. В подгруппу заготовок recommend была добавлена UML-заготовка вызова функции, в которой, помимо вызова функции, выполняется анализ кода возврата этой функции.

Данная UML-заготовка составлена из вызова функции (rc = func(argList);) и условия if-then-else, которые входят в стандартную библиотеку ТСАГ СПО. Идея объединения рассмотренных заготовок в подгруппу имеет рекомендательный характер. Программист, как правило, прислушивается к рекомендациям разработчика среды проектирова-

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

В подгруппу заготовок secure была добавлена UML-заготовка безопасного вызова функции fopen(). Это составная заготовка, в которой выполняется вызов функции fopen(), анализируется код возврата этой функции и на основании анализа выполняется либо вывод диагностического сообщения об ошибке (в случае, если вызов fopen() завершился неудачей), либо вход в ветвь условия, в которой выполняются некоторые действия (например чтение) над открытым дескриптором и его последующее закрытие. Данная заготовка исключает неучтенное состояние данных, например, использование несуществующего файлового дескриптора или невыполнение закрытия файлового дескриптора после завершения операций над ним.

Функция PgenfileParse() была реализована средствами ТСАГ СПО с использованием расширенной библиотеки заготовок, рассмотренной выше. В состав проекта функции PgenfileParse() вошли 19 диаграмм программной деятельности. Принципиальная схема проекта представлена на рисунке 2.

При реализации функции PgenfileParse() использовались UML-заготовки из подгрупп vulnerables, recommend и secure. Эти заготовки включены в те места функции PgenfileParse(), где статический анализатор показал потенциальные уязвимости. Составлена Главная диаграмма программной деятельности функции PgenfileParse(), из которой был сгенерирован исходный код. При его повторной проверке статическим анализатором потенциальных уязвимостей выявлено не было (листинг 3), что подтвердило корректность использования в местах возникновения потенциальных уязвимостей UML-заготовок из подгрупп vulnerables, recommend и secure.

Листинг 3.

[osuser@localhost staticAnalize]$ sh staticAnalize.sh PgenfileParse.c Errors not found

Сгенерированный исходный код функции PgenfileParse() был скомпилирован в составе программного модуля pgenparse.c подсистемы генерации текстов программ в исходном виде. Подсистема была протестирована на предмет корректной работы, в частности, была выполнена повторная генерация исходного текста из диаграммы программной деятельности функции Pgenfile-Parse(). Первоначально сгенерированный исходный текст и исходный текст, сгенерированный повторно, оказались идентичными (совпадение байт в байт), следовательно, изменение функции PgenfileParse() не повлияло на работу подсистемы генерации текстов программ в исходном виде.

В заключение можно отметить, что в статье были сформулированы основные классы ошибок,

Программа ПГЕН РВ

PgenfileParse()

vars_declaration

preparser_init

parserCycle

foun.d.lnllne_cycle

foundinline_init I I I I interpret_header

start_1line_XMLcomtr]ents start_long_XMLcomments

end_long_XMLcomments

In_long_comments

no_in_comments

sysIncludes userlncludes lexemms_block

c_h_namings write_file_to_disk print_XML_tree

log_estimated_time

Рис. 2. Принципиальная схема проекта функции PgenfileParse ()

которые могут быть локализованы и устранены посредством использования ТСАГ СПО. В приведенном примере для устранения ошибок применена расширенная библиотека ТСАГ СПО, которая является экспериментальной и должна быть дополнена. Развитие библиотеки будет выполняться в соответствии с классификацией типов ошибок и уязвимостей, рассмотренных в данной статье.

Литература

1. Введение в ОС2000. Вопросы кибернетики. Информационная безопасность. Операционные системы реального времени. Базы данных / В.Л. Безруков, А.Н. Годунов, П.Е. Назаров [и др.]; [под. ред. В.Б. Бетелина]. М.: НИИСИ РАН, 1999. С. 76-109.

2. Extensible Markup Language (XML) 1.0 (Fourth Edition) W3C Recommendation 16 August 2006, edited in place 29 September 2006. URL: http://www.w3.org/TR/REC-xmi/ (дата обращения: 07.06.2012).

3. XML Schema Part 0: Primer (Second Edition) W3C Recommendation 28 October 2004. URL: http://www.w3.org/TR/2004/ REC-xmlschema-0-20041028/ (дата обращения: 07.06.2012).

4. Нархов К.Г., Генератор текста программ в исходном виде для систем реального времени // Программные продукты и системы. 2010. № 4. С. 24-30.

5. Laune Harris, A Software Bug Taxonomy, NY: New York University personal page. URL: www.cs.nyu.edu/~lharris/content/ bugtaxonomy.html (дата обращения: 07.06.2012).

References

1. Bezrukov V.L., Godunov A.N., Nazarov P.E., Solda-tov V.A., Khomenkov I.I., [ed. by V.B. Betelin], Moscow, SRISA RAS, 1999, pp. 76-109.

2. Extensible Markup Language (XML) 1.0 (Fourth Edition) W3C Recommendation 16 August 2006, ed. in place 29 September 2006, available at: www.w3.org/TR/REC-xml/ (accessed 07.06.2012).

3. XML Schema Part 0: Primer (Second Edition) W3C Recommendation 28 October 2004, available at: www.w3.org/TR/2004/ REC-xmlschema-0-20041028/ (accessed 07.06.2012).

4. Narhov K.G, Programmnye Produkty i Sistemy, 2010, no. 4, pp. 24-30.

5. Laune Harris, New York University personal page, available at: www.cs.nyu.edu/~lharris/content/bugtaxonomy.html (accessed 07.06.2012).

i Надоели баннеры? Вы всегда можете отключить рекламу.