Обзор компьютерных программ, предназначенных для тестирования ПО
Автор: Канаматова А.А.
Журнал: Мировая наука @science-j
Рубрика: Естественные и технические науки
Статья в выпуске: 9 (9), 2017 года.
Бесплатный доступ
Компьютерная программа - это набор инструкций, выполняемых вычислительной техникой (компьютерами). В большинстве случаев программы могут быть представлены в виде объектного (бинарного) и исходного кода. Данная статья представляет собой обзор компьютерных программ, потенциально пригодных для тестирования программного обеспечения.
Динамический анализ, программное обеспечение
Короткий адрес: https://sciup.org/140262981
IDR: 140262981
Текст научной статьи Обзор компьютерных программ, предназначенных для тестирования ПО
Долгое время считалось, что динамический анализ программ является тяжелым подходом к обнаружению программных дефектов, и полученные в итоге результаты не оправдывают, усилий и ресурсов, затраченных на них. Но существуют две важные тенденции развития современной индустрии производства программного обеспечения, которые позволяют по-другому взглянуть на эту проблему. При постоянном увеличении объема и сложности ПО любые автоматические средства обнаружения ошибок и контроля качества могут оказаться полезными и востребованными – это с одной стороны, а с другой – производительность современных вычислительных систем, который непрерывно растет, позволяет эффективно решать все более сложные вычислительные задачи. Такие программы, как SAGE, KLEE и Avalanche, являющиеся одними из последних исследовательских работ в области динамического анализа, демонстрируют, что его использование оправдано, несмотря на присущую этому подходу сложность.
Фаззинг (fuzzing) - процесс генерации различных наборов входных данных с последующей передачей их программе, целью которого является получение набора данных, выявляющих дефекты работы целевой программы. При этом не все пути исполнения программы представляют интерес, и с целью более интеллектуальной генерации входных данных необходимо учитывать трассу выполнения программы. Для решения этой проблемы программа исполняется определенным транслятором, который дает возможность исследовать пути выполнения, инструментировать исполняемый код либо снимать трассу исполнения для дальнейшего анализа.
Попытка сгенерировать все вероятные сочетания входных данных приводит к экспоненциальному увеличению их объема. А, следовательно, от транслятора требуется возможность: осуществлять исследование выбранных или интересующих для анализа путей (к примеру, применяя технологию символьного выполнения для некоторых путей); генерации входных данных, которые обеспечивают переход по интересующим путям с целью увеличения покрытия; возможность параллельного запуска системы с разными входными данными для ускорения анализа.
Образцом систем осуществляющих динамическую бинарную трансляцию, считаются QEMU и Valgrind.
QEMU – эмулятор процессоров и вычислительных систем, способен эмулировать всю вычислительную систему, в этом случае динамической трансляции подвергается код программы, все библиотеки и операционная система. В режиме эмуляции приложения транслируется только код программы и необходимые библиотеки. В свою очередь, QEMU выполняет обработку системных вызовов [1].
Valgrind является инфраструктурой для отладки и профилирования программ, в которой транслируется лишь пользовательская программа в том же окружении, что и при обычном выполнении. Valgrind включает в себя ряд инструментов, реализованных поверх базовой инфраструктуры трансляции, самым популярным из которых является Memcheck, ориентированный для анализа утечек памяти и обращений к невыделенной памяти, позволяет транслировать программу в промежуточное представление, находящееся в SSA-форме, затем код инструментируется и транслируется в машинный код [2].
KLEE – инструмент для символьного исполнения [3], анализ производится над внутренним представлением компиляторной инфраструктуры LLVM [4]. Инструмент позволяет запускать «символьные» процессы, при этом в ходе интерпретации инструкции внутреннего представления LLVM отображаются в систему уравнений, которые затем решаются с использованием инструмента STP [5] для получения новых путей выполнения, которые требуется обойти. Для ускорения анализа система позволяет выполнять несколько путей одновременно.
S2E - система выборочного символьного исполнения, построенная на базе QEMU и KLEE. S2E основывается на двух базовых идеях: выборочном символьном выполнении, позволяющем автоматически минимизировать количество кода, который будет исполнен символьно, и модели консистентности, обеспечивающей при анализе контроль баланса производительность/точность. Ключевые возможности системы заключаются в одновременном анализе нескольких путей, возможности анализа всей системы (программ пользователя, библиотек, ядра, драйверов), возможность анализа бинарного кода [6].
Avalanche - система динамического анализа, разрабатываемая в ИСП РАН [24]. Avalanche решает задачи отслеживания уязвимостей в ходе выполнения программы и интеллектуальной генерации входных данных для увеличения покрытия путей через собственные инструменты на основе инфраструктуры Valgrind и упомянутый решатель STP. Для поддержки языка Java используется статическая инструментация кода, но сохраняется общая схема итеративного динамического анализа.
Mayhem - система автоматического поиска эксплуатируемых уязвимостей в бинарном коде [7]. Каждая найденная уязвимость сопровождается рабочим эксплоитом. Ключевые особенности инструмента: гибридное онлайн-оффлайн исполнение кода, эмуляция на уровне приложения, а не всей системы, набор различных эвристик для работы с символьными указателями. Система основана на инфраструктуре двоичной трансляции PIN [8], обеспечивающей инструментирование бинарного кода, для перевода во внутреннее представление используется BAP [9], в качестве решателя используется Z3.
Таким образом, системы динамического анализа предполагают совокупность некоторых модулей-инструментов (зачастую, с открытым начальным кодом), решающих главные сформулированные задачи анализа. Экспоненциальная сложность рассмотрения и использования в случае нетривиальных алгоритмов обработки входных данных и/или модели исполнения (к примеру, обратные вызовы процедур на мобильных платформах) преодолевается новейшими эвристиками, позволяющими осуществлять наиболее полное исследование программы.
Список литературы Обзор компьютерных программ, предназначенных для тестирования ПО
- QEMU - Open Source Processor Emulator [Электронный ресурс]. - Режим доступа: http://wiki.qemu.org/Main_ Page.
- Nicolas Nethercote, Julina Seward. Valgrind: A Framework for Heavyweight Dynamic Binary Instrumentation. Proceedings of ACM SIGPLAN 2007 Conference on Programming Languages Design and Implementation, 2007.
- C. Cadar, D. Dunbar, and D. R. Engler. KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs. In OSDI, 2008.
- Компиляторная инфраструктура LLVM [Электронный ресурс]. - Режим доступа: http://llvm.org.
- Инструмент STP [Электронный ресурс]. - Режим доступа: https://sites.google.com/ site/stpfastprover/STP-FastProver.
- Инструмент S2E [Электронный ресурс]. - Режим доступа: https://sites.google.com/ site/dslabepfl /proj/s2e.
- Sang Kil Cha, Thanassis Avgerinos, Alexandre Rebert, David Brumley, Unleashing Mayhem on Binary Code, Proceedings of the 2012 IEEE Symposium on Security and Privacy, p.380- 394, May 20-25, 2012.
- C.-K. Luk, R. Cohn, R. Muth, H. Patil, A. Klauser, G. Lowney, S. Wallace, V. J. Reddi, and K. Hazelwood. Pin: Building customized program analysis tools with dynamic instrumentation. In Proc. of the ACM Conference on Programming Language Design and Implementation, Jun. 2005.
- I. Jager, T. Avgerinos, E. J. Schwartz, and D. Brumley. BAP: A binary analysis platform. In Proc. of the Conference on Computer Aided Verifi cation, 2011. 28. L. M. de Moura and N. Bjоrner. "Z3: An effi cient smt solver". In TACAS, 2008, pp. 337-340.