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

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

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

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

История

Техника внедрения неисправностей восходит к 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) {
      /* do something */
    } else {
      /* do something else */
    }
  }

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

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

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

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

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

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

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

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

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

Характеристики закачки неисправностей

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

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

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

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

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

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

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

Был разработан ряд инструментов 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 также имеет модуль синтетической нагрузки, который может моделировать определенные количества нагрузки для целей тестирования устойчивости.
  • ДОКТОР (Среда устранения сбоев интегрированного программного обеспечения) позволяет вводить ошибки памяти и регистры, а также отказы сетевой связи. Он использует комбинацию тайм-аута, прерывания и модификации кода. Триггеры тайм-аута вводят временные сбои памяти, а ловушки вводят временные эмулируемые аппаратные сбои, такие как повреждение регистров. Модификация кода используется для внесения постоянных ошибок.
  • 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();
  if (error == SUCCESS) {
    error = Commit();
    assert(error == SUCCESS);
  }

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

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

Смотрите также

использованная литература

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