Публикация научных статей.
Вход на сайт
E-mail:
Пароль:
Запомнить
Регистрация/
Забыли пароль?

Научные направления

Поделиться:
Разделы: Информационные технологии
Размещена 13.03.2016. Последняя правка: 12.03.2016.
Просмотров - 7201

АНАЛИЗ УГРОЗ, УЯЗВИМОСТЕЙ, ОШИБОК КОДА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Нестеренко Максим Алексеевич

нет

Федеральное государственное автономное образовательное учреждение высшего образования «Волгоградский государственный университет»

студент

Умницын Михаил Юрьевич, старший преподаватель, Волгоградский государственный университет


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


Abstract:
The aim of the study is to identify the causes of threats to the security of the software. Lifecycle phases were analyzed and identified by characteristics which may lead to errors and security vulnerabilities in software code. Three most important stages identified: design, coding and testing. As a result, causal link between the errors, vulnerabilities and malicious attacks on software compiled. Sample code vulnerabilities identified and analyzed the effects of exploitation by attacker in the implementation of the attack.


Ключевые слова:
исполняемый код; исходный код; уязвимость

Keywords:
executable code; source code; vulnerability


УДК 004.056.57

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

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

1. Системный анализ.

2. Анализ требований.

3. Проектирование.

4. Кодирование.

5. Тестирование.

6. Сопровождение.

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

Использование при создании ПО сложных операционных систем, инструментальных средств разработки ПО импортного производства увеличивают потенциальную возможность внедрения в программы преднамеренных дефектов диверсионного типа. Помимо этого, при создании целевого ПО всегда необходимо исходить из возможности наличия в коллективе разработчиков программистов - злоумышленников, которые в силу тех или иных причин могут внести в разрабатываемые программы недокументированные возможности и  разрушающие программные средства (РПС) [1, с.54].

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

На этапе проектирования определяются внутренние свойства ПО и детализируются её внешние свойства на основе выданных заказчиком требований к ПО. Архитектура должна соответствовать требованиям, предъявляемым к системе, а также принятым проектным стан­дартам и методам.
Одним из важнейших частей проектирования является разработка общего метода решения задачи (алгоритмизация), на котором важно продумать всё до мелочей, потому что ошибки на этом этапе очень опасны. Ход процесса проектирования и его результаты зависят не только от заданных требований, но так же и от выбранной модели процесса, опыта проектировщика.
Наиболее опасны ошибки - на этапе проектирования. Они обнаруживаются и устраняются с большим трудом. В этом случае, уязвимость свойственна проекту или алгоритму и, следовательно, даже совершенная его реализация  не избавит от заложенных в нем ошибок. При этом ошибки могут различного типа и провялятся и/или не проявляться в процессе функционирования ПО.
Примерами подобных ошибок могут быть:

-   использование стека протоколов TCP/IP, не учитывая большого количества уязвимостей в реализации его безопасности;

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

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

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

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

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

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

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

Этап сопровождения заключается в конфигурировании и внесение изменений в эксплуатируемое ПО. Цели изменений:

-   исправление ошибок;

-   адаптация к изменениям внешней для ПО среды;

-   усовершенствование ПО в соответствии с требованиями заказчика.

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

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

Таблица 1. Ошибки на этапах разработки ПО

Этап ЖЦ ПО

Ошибки

Проектирование

1)  логическая несогласованность требований;

2)  несогласованность протокола взаимодействия аппаратуры и программ;

3)   неточности алгоритмов;

4)   алгоритмические закладки;

5)  внедрение неоптимальных информационных технологий;

6)  неточности в интерфейсах между модулями

Кодирование

1)  нерациональная организация вычислительного процесса;

2)  создание программной закладки, которая может воздействовать на другие части ПО;

3)  синтаксические ошибки;

4)  логические ошибки.

Тестирование

1) формирование набора тестовых данных, не позволяющих выявить программную закладку или ошибки;

2) отсутствие тестов на испытание недокументированных возможностей программы;

3)ошибки в тестах

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

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

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

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

Таблица 2. Последствия использования уязвимостей программного кода

Уязвимости

Последствия использования злоумышленником

Использование MessageBox

 

Позволяет злоумышленнику установить точки прерывания на все вызовы MessageBoxи узнать, при каком условии возникает это окно и обойти это условие.

Использование функций GetFileTime, CompareFileTime, FindFirstFile и т.п.

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

Использование глобальных переменных

 

Может изменить значение переменной, что повлияет на результат проверки серийного номера на правильность, число запусков до истечения демонстрационного периода и т.д.

Использование констант для сравнения

Может найти и изменить сами константы, либо условие проверки.

 

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

Библиографический список:

1. Багров Е.В. Мониторинг и аудит информационной безопасности на предприятии//Вестник Волгоградского государственного университета. Инновационная деятельность.2011.№5. С 50-56
2. Мартин, Р. Чистый код: создание, анализ и рефакторинг / Р. Мартин. – СПб.: Питер, 2010. – 464 с.




Рецензии:

13.03.2016, 21:37 Феофанов Александр Николаевич
Рецензия: В статье описываются проблемы, которые возникают при разработке ПО. Приведенные автором риски, прежде всего, связаны с уязвимыми фрагментами программного кода, а так же с обеспечением безопасности стека протоколов TCP/IP. Эта тема является актуальной для большинства разработчиков ПО. Определены этапы разработки, при которых задача минимизации рисков имеет приоритетное значение. Так же выделены основные ошибки, возникающие на таких этапах жизненного цикла ПО, как проектирование, кодирование, тестирование. Автор статьи приводит в пример способ, каким образом злоумышленник может воспользоваться уязвимостью ПО, однако это только один из методов получения доступа к исходному коду программы. Стоит обратить внимание и на другие способы взлома ПО. Так же в статье отсутствует конкретика в отношении способов решения проблемы: рассмотрены лишь потенциальные уязвимости, но не предложены конкретные мероприятия для решения проблемы. При развёртывании этих погрешностей в статье, то её возможно рекомендовать к опубликованию. Над статьёй необходимо поработать. Д.т.н., профессор Феофанов А.Н.



Комментарии пользователей:

Оставить комментарий


 
 

Вверх