Внедрение неисправности

редактировать

Внедрение неисправности - это метод тестирования, который помогает понять, как [виртуальная / реальная] система ведет себя при необычных нагрузках. Этот метод основан на результатах моделирования или эксперимента, поэтому он может быть более достоверным (или более приближенным к реальности) по сравнению со статистическими методами.

В тестировании программного обеспечения внедрение ошибок - это метод улучшения покрытия теста путем введения ошибок в пути кода теста, в частности обработки ошибок кодовых путей, которые в противном случае могли бы использоваться редко. Он часто используется с стресс-тестированием и широко считается важной частью разработки надежного программного обеспечения. Тестирование устойчивости (также известное как тестирование синтаксиса, Fuzzing или Fuzz testing ) - это тип внедрения ошибок, обычно используемый для тестирования уязвимостей в интерфейсах связи, таких как протоколы, параметры командной строки или API.

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

Содержание

  • 1 История
  • 2 Реализованная модель внедрения неисправностей
  • 3 Внедрение неисправностей, реализованная программным способом
    • 3.1 Внедрение неисправностей программного обеспечения протокола
  • 4 Аппаратная реализация внедрения неисправностей
  • 5 Эффективная инъекция неисправностей
  • 6 Инструменты внедрения неисправностей
    • 6.1 Инструменты исследования
    • 6.2 Коммерческие инструменты
    • 6.3 Библиотеки
  • 7 Внедрение неисправностей в функциональные свойства или тестовые примеры
  • 8 Применение внедрения неисправности
  • 9 См. Также
  • 10 Ссылки
  • 11 Внешние ссылки

История

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

Модель реализовала внедрение неисправностей

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

Программно реализованная инъекция ошибок

Методы SWIFI для программной инъекции ошибок можно разделить на два типа: внедрение во время компиляции и внедрение во время выполнения.

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

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

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

int pFunc (int value) {return value + 20; } int main (int argc, char * argv) {int a = pFunc (aFunction (atoi (argv [1]))); if (a>20) {/ * сделать что-то * /} else {/ * сделать что-то еще * /}}

В данном случае pFunc - это функция возмущения, и она применяется к возвращаемому значению функции, которая имеет был вызван внесением неисправности в систему.

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

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

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

Эти методы часто основаны на средствах отладки, предоставляемых архитектурами компьютерных процессоров.

Внедрение ошибок программного обеспечения протокола

Сложные программные системы, особенно распределенные системы различных производителей, основанные на открытых стандартах, выполняют операции ввода / вывода для обмена данными через структурированные обмены с отслеживанием состояния, известные как «протоколы. " Одним из видов внедрения ошибок, который особенно полезен для тестирования реализаций протокола (тип программного кода, который имеет необычную характеристику, заключающуюся в том, что он не может предсказать или контролировать свой ввод), является фаззинг. Нечеткое изображение - особенно полезная форма тестирования черного ящика, поскольку различные недопустимые входные данные, отправляемые в программную систему, не зависят от деталей кода, выполняющегося внутри, и не создаются на их основе. система.

Аппаратная реализация внедрения неисправностей

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

Эффективная регистрация неисправностей

Неисправности имеют три основных параметра.

  • Тип: какой тип неисправности следует ввести? Например, застревание на значении, задержка, игнорирование некоторых функций, игнорирование некоторых параметров / переменных, случайные ошибки, ошибка смещения, шум и т. Д. Также важна амплитуда каждой ошибки.
  • Время: когда должен быть активирован? Например, время активации неисправности или условие активации неисправности.
  • Местоположение: Где должно быть в системе? Например, сбой в канале / соединении между системами, сбои в системах / подсистемах / функциях и т. Д.

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

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

Инструменты для внесения сбоев

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

Инструменты исследования

Был разработан ряд инструментов SWIFI, некоторые из которых представлены здесь. Шесть наиболее часто используемых инструментов для ввода неисправностей: Ferrari, FTAPE, Doctor, Orchestra, Xception и Grid-FIT.

  • MODIFI (внедрение неисправностей, реализованных на моделях) - это инструмент внедрения неисправностей для оценки устойчивости моделей поведения Simulink. Он поддерживает моделирование сбоев в XML для реализации моделей сбоев, зависящих от предметной области.
  • Ferrari (Fault and ERRor Automatic Real-time Injection) основана на программных ловушках, которые вводят ошибки в систему. Ловушки активируются либо вызовом определенной области памяти, либо тайм-аутом. Когда ловушка вызывается, обработчик вводит ошибку в систему. Неисправности могут быть временными или постоянными. Исследования, проведенные с Ferrari, показывают, что обнаружение ошибок зависит от типа сбоя и места его вставки.
  • FTAPE (Fault Tolerance and Performance Evaluator) может вводить ошибки не только в память и регистры, но и в обращения к диску. также. Это достигается путем вставки в систему специального драйвера диска, который может вносить ошибки в данные, отправляемые и получаемые с дискового устройства. FTAPE также имеет модуль синтетической нагрузки, который может имитировать определенные количества нагрузки для целей тестирования устойчивости.
  • DOCTOR (Среда устранения ошибок интегрированного программного обеспечения) позволяет вводить ошибки памяти и регистрировать ошибки, а также сбои сетевой связи. Он использует комбинацию тайм-аута, прерывания и модификации кода. Триггеры тайм-аута вводят временные сбои памяти, а ловушки вводят временные эмулируемые аппаратные сбои, такие как повреждение регистра. Модификация кода используется для внедрения постоянных ошибок.
  • Orchestra - это управляемый скриптом инжектор неисправностей, который основан на внедрении неисправностей на сетевом уровне. Его основное использование - оценка и проверка отказоустойчивости и временных характеристик распределенных протоколов. Первоначально Orchestra был разработан для операционной системы Mach и использует определенные функции этой платформы для компенсации задержек, вызванных инжектором неисправностей. Он также был успешно перенесен на другие операционные системы.
  • Xception разработан для использования преимуществ расширенных функций отладки, доступных на многих современных процессорах. Он написан так, чтобы не требовать модификации исходного кода системы и вставки программных прерываний, поскольку возможности процессора по обработке исключений запускают внедрение ошибок. Эти триггеры основаны на доступе к определенным ячейкам памяти. Такой доступ может быть либо для данных, либо для инструкций по извлечению. Таким образом, можно точно воспроизвести тестовые прогоны, поскольку триггеры могут быть привязаны к определенным событиям, а не к тайм-аутам.
  • Grid-FIT (Grid - Fault Injection Technology) - это метод оценки надежности и инструмент для оценки грид-сервисов с помощью закачка неисправностей. Grid-FIT является производным от более раннего инжектора ошибок WS-FIT, который был нацелен на веб-службы Java, реализованные с использованием транспорта Apache Axis. Grid-FIT использует новый механизм внедрения неисправностей, который позволяет использовать внедрение неисправностей на сетевом уровне для обеспечения уровня контроля, аналогичного внедрению неисправностей при вставке кода, но при этом менее агрессивно.
  • LFI (инжектор неисправностей на уровне библиотеки) представляет собой набор инструментов для автоматического тестирования, используемый для моделирования в контролируемой среде тестирования исключительных ситуаций, которые программы должны обрабатывать во время выполнения, но которые нелегко проверить только с помощью входного тестирования. LFI автоматически определяет ошибки, обнаруживаемые совместно используемыми библиотеками, находит потенциально ошибочный код восстановления ошибок в двоичных файлах программ и вводит требуемые ошибки на границе между разделяемыми библиотеками и приложениями.
  • ChaosMachine, инструмент, который создает хаос в приложении уровень в JVM. Он концентрируется на анализе возможности обработки ошибок каждого блока try-catch, задействованного в приложении, путем внедрения исключений.
  • TripleAgent, система оценки устойчивости и улучшения приложений Java. Уникальная особенность TripleAgent состоит в том, чтобы объединить автоматизированный мониторинг, автоматическое внесение возмущений и автоматическое повышение устойчивости.
  • FIBlock (блок инжекции разломов), основанный на модели метод инжекции разломов, реализованный в виде настраиваемого блока Simulink. Он поддерживает внедрение в модели MATLAB Simulink типичных неисправностей важных гетерогенных компонентов киберфизических систем, таких как датчики, вычислительное оборудование и сеть. Дополнительные триггерные входы и выходы блока позволяют моделировать условные неисправности. Кроме того, два или более FIB-блоков, связанных с сигналами запуска, могут моделировать так называемые связанные ошибки.

Коммерческие инструменты

  • Beyond Security beSTORM - это коммерческий инструмент анализа безопасности программного обеспечения черного ящика. Он часто используется в процессе разработки производителями оригинального оборудования, но также используется для тестирования продуктов перед внедрением, особенно в аэрокосмической, банковской и оборонной сферах. Процесс тестирования beSTORM начинается с наиболее вероятных сценариев атаки, а затем прибегает к исчерпывающей генерации на основе фаззинга. beSTORM предоставляет модули для общих протоколов и "автоматически изучает" новые или собственные протоколы, включая атаки на основе мутаций. Основные характеристики: двоичный и текстовый анализ, тестирование пользовательских протоколов, отладка и трассировка стека, независимость от языка разработки, совместимость с CVE.
  • ExhaustiF - это коммерческий программный инструмент, используемый для тестирования серого ящика на основе программного сбоя внедрение (SWIFI) для повышения надежности программно-ресурсоемких систем. Этот инструмент можно использовать на этапах системной интеграции и системного тестирования любого жизненного цикла разработки программного обеспечения, а также в дополнение к другим инструментам тестирования. ExhaustiF может вносить ошибки как в программное, так и в аппаратное обеспечение. При вводе смоделированных ошибок в программное обеспечение ExhaustiF предлагает следующие типы ошибок: переменное повреждение и нарушение процедуры. Каталог для инъекций аппаратных сбоев включает сбои в памяти (ввод / вывод, ОЗУ) и ЦП (целочисленный блок, плавающий блок). Существуют разные версии для RTEMS / ERC32, RTEMS / Pentium, Linux / Pentium и MS-Windows / Pentium.
  • Holodeck - это инструмент тестирования, разработанный Security Innovation, который использует внедрение ошибок для моделирования реальных приложений и системные ошибки для приложений и служб Windows. В число клиентов Holodeck входят многие крупные компании по разработке коммерческого программного обеспечения, включая Microsoft, Symantec, EMC и Adobe. Он предоставляет контролируемую, повторяемую среду для анализа и отладки кода обработки ошибок и поверхностей для атак приложений для проверки уязвимости и безопасности. Он имитирует сбои фаззинга файлов и сети, а также широкий спектр других сбоев ресурсов, системы и пользовательских сбоев. Он анализирует код и рекомендует планы тестирования, а также выполняет ведение журнала вызовов функций, перехват API, стресс-тестирование, анализ покрытия кода и многие другие функции обеспечения безопасности приложений.
  • Платформа Chaos Engineering от Proofdock ориентирована на Microsoft Облачная платформа Azure. Он внедряет сбои на уровне инфраструктуры, на уровне платформы и на уровне приложений.
  • Gremlin - это платформа «отказ как услуга», которая помогает компаниям создавать более устойчивые системы с помощью практики хаос инженерии. Gremlin воссоздает наиболее распространенные сбои по трем категориям - Ресурс, Сеть и Состояние - путем безопасного внедрения сбоев в системы для проактивного выявления и исправления неизвестных.
  • Codenomicon Defensics - это среда автоматизации тестирования черного ящика, которая выполняет внедрение ошибок в более чем 150 различных интерфейсов, включая сетевые протоколы, интерфейсы API, файлы и структуры XML. Коммерческий продукт был запущен в 2001 году после пяти лет исследований в Университете Оулу в области внедрения программных ошибок. Тезисная работа, объясняющая используемые принципы фаззинга, была опубликована VTT, одним из членов консорциума PROTOS.
  • Mu Service Analyzer - это инструмент тестирования коммерческих сервисов, разработанный Mu Dynamics. Mu Service Analyzer выполняет черный ящик и белый ящик тестирование служб на основе их открытых программных интерфейсов, используя моделирование отказа в обслуживании, вариации трафика на уровне обслуживания (для генерации неверных входных данных).) и воспроизведение известных триггеров уязвимости. Все эти методы осуществляют проверку входных данных и обработку ошибок и используются вместе с мониторами допустимых протоколов и SNMP для характеристики воздействия тестового трафика на программную систему. Mu Service Analyzer позволяет пользователям устанавливать и отслеживать показатели надежности, доступности и безопасности на уровне системы для любой открытой реализации протокола. Инструмент доступен на рынке с 2005 года для клиентов в Северной Америке, Азии и Европе, особенно на критических рынках сетевых операторов (и их поставщиков) и промышленных систем управления (включая Критическая инфраструктура ).
  • Xception - это коммерческий программный инструмент, разработанный Critical Software SA, используемый для тестирования черного ящика и белого ящика на основе внедрения ошибок программного обеспечения (SWIFI) и внедрения ошибок цепи сканирования (SCIFI).. Xception позволяет пользователям тестировать надежность своих систем или их части, позволяя как внедрение программных ошибок, так и аппаратных ошибок для определенного набора архитектур. Инструмент используется на рынке с 1999 года и имеет клиентов в Америке, Азиатские и европейские рынки, особенно на критически важном рынке аэрокосмической и телекоммуникационной отрасли. Полное семейство продуктов Xception включает: a) основной инструмент Xception, современный лидер в технологии внедрения программно-реализованных ошибок (SWIFI); б) дополнительные инструменты Easy Fault Definition (EFD) и Xtract (Xception Analysis Tool); c) Расширенный инструмент Xception (eXception) с расширениями внедрения неисправностей для цепочки сканирования и форсирования на уровне контактов.

Библиотеки

  • libfiu (внедрение ошибок в пользовательском пространстве), библиотека C для имитации ошибок в подпрограммах POSIX без изменения исходного кода. Включен API для моделирования произвольных сбоев во время выполнения в любой точке программы.
  • TestApi - это библиотека API с общим исходным кодом, которая предоставляет средства для тестирования с внедрением ошибок, а также других типов тестирования, данных - структуры и алгоритмы для приложений.NET.
  • Fuzzino - это библиотека с открытым исходным кодом, которая предоставляет богатый набор эвристик фаззинга, генерируемых из спецификации типа и / или допустимых значений.

Внедрение ошибок в функциональные свойства или тестовые примеры

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

Применение инжекции неисправности

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

В зависимости от сложности API для уровня, на котором вводятся неисправности тесты с внесением неисправностей часто должны быть тщательно разработаны, чтобы минимизировать количество ложных срабатываний. Даже хорошо спроектированный тест с внесением неисправностей иногда может создавать ситуации, которые невозможны при нормальной работе программного обеспечения. Например, представьте, что есть две функции API , Commitи PrepareForCommit, и каждая из этих функций по отдельности может дать сбой, но если PrepareForCommitвызывается и выполняется успешно, последующий вызов Commitгарантированно завершится успешно. Теперь рассмотрим следующий код:

error = PrepareForCommit (); если (ошибка == УСПЕХ) {ошибка = Зафиксировать (); assert (ошибка == УСПЕХ); }

Часто для реализации внедрения сбоя невозможно отслеживать достаточное состояние, чтобы гарантировать, что функции API обеспечивают. В этом примере тест с внедрением неисправности в приведенном выше коде может вызвать assert, тогда как при нормальной работе этого не произойдет.

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

См. Также

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-20 11:51:34
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте