stringtranslate.com

Впрыскивание неисправности

В информатике инъекция неисправностей — это метод тестирования для понимания того , как ведут себя вычислительные системы при необычных нагрузках. Этого можно достичь с помощью физических или программных средств или с помощью гибридного подхода. [1] Широко изученные физические инъекции неисправностей включают применение высоких напряжений, экстремальных температур и электромагнитных импульсов к электронным компонентам, таким как компьютерная память и центральные процессоры . [2] [3] Подвергая компоненты воздействию условий, выходящих за пределы их предполагаемых эксплуатационных пределов, вычислительные системы могут быть вынуждены неправильно выполнять инструкции и искажать критически важные данные.

В тестировании программного обеспечения инъекция неисправностей — это метод улучшения покрытия теста путем введения неисправностей в пути кода тестирования; в частности, пути кода обработки ошибок , которые в противном случае редко соблюдались бы. Он часто используется при стресс-тестировании и широко считается важной частью разработки надежного программного обеспечения. [4] Тестирование надежности [5] (также известное как синтаксическое тестирование, фаззинг или фаззинг-тестирование ) — это тип инъекции неисправностей, обычно используемый для проверки уязвимостей в интерфейсах связи, таких как протоколы, параметры командной строки или API.

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

История

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

Программное обеспечение, реализующее инъекцию неисправностей

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

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

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

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

 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 является функцией возмущения и применяется к возвращаемому значению функции, которая была вызвана, внося неисправность в систему.

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

Методы внедрения во время выполнения могут использовать ряд различных методов для внесения неисправностей в систему посредством триггера.

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

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

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

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

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

Характеристики инъекции неисправностей

Разломы имеют три основных параметра. [8]

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

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

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

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

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

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

Библиотеки

Внесение ошибок в функциональные свойства или тестовые случаи

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

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

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

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

 ошибка = PrepareForCommit (); если ( ошибка == УСПЕХ ) { ошибка = Фиксация (); утверждать ( ошибка == УСПЕХ ); }              

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

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

Ссылки

  1. ^ Моради, Мехрдад; Ван Акер, Берт; Ванхерпен, Кен; Денил, Иоахим (2019). «Реализованная на основе модели гибридная инъекция неисправностей для Simulink (демонстрации инструментов)». В Чемберлене, Роджере; Таха, Валид; Торнгрен, Мартин (ред.). Киберфизические системы. Проектирование на основе моделей . Конспект лекций по информатике. Том 11615. Springer International Publishing. С. 71–90. doi :10.1007/978-3-030-23703-5_4. ISBN 9783030237035. S2CID  195769468.
  2. ^ Шеперд, Карлтон; Маркантонакис, Константинос; Ван Хейнинген, Нико; Абулкассими, Дрисс; Гейн, Клемент; Хекманн, Тибо; Наккаш, Дэвид (2021). «Внедрение физических неисправностей и атаки по сторонним каналам на мобильные устройства: комплексный анализ». Компьютеры и безопасность . 111 (102471). Elsevier: 102471. arXiv : 2105.04454 . doi : 10.1016/j.cose.2021.102471. S2CID  236957400.
  3. ^ Бар-Эл, Хагай; Шукри, Хамид; Наккаш, Дэвид; Танстолл, Майкл; Уилан, Клэр (2004). «Руководство ученика чародея по атакам с ошибками». Труды IEEE . 94 (2). IEEE: 370–382. doi :10.1109/JPROC.2005.862424. S2CID  2397174.
  4. ^ Дж. Воас, «Внедрение ошибок для масс», Компьютер, т. 30, стр. 129–130, 1997.
  5. ^ ab Каксонен, Раули. Функциональный метод оценки безопасности реализации протокола. 2001.
  6. ^ А. Авизиенис, Ж.-К. Лапри, Брайан Рэнделл и К. Ландвер, «Основные концепции и таксономия надежных и безопасных вычислений», Надежные и безопасные вычисления, т. 1, стр. 11–33, 2004.
  7. ^ ab JV Carreira, D. Costa и SJ G, «Выборочная проверка надежности компьютерной системы путем внесения неисправностей», IEEE Spectrum, стр. 50–55, 1999.
  8. ^ Бенсо, Альфредо; Принетто, Паоло, ред. (2003). Методы и инструменты инъекции неисправностей для оценки надежности встроенных систем. Frontiers in Electronic Testing. Springer US. ISBN 978-1-4020-7589-6.
  9. ^ «Оптимизация внесения неисправностей в совместное моделирование FMI посредством разбиения чувствительности | Труды Летней конференции по моделированию 2019 года». dl.acm.org . Получено 14.06.2020 .
  10. ^ Моради, М., Оукс, Б.Дж., Сараоглу, М., Морозов, А., Яншек, К. и Денил, Дж., 2020. ИССЛЕДОВАНИЕ ПРОСТРАНСТВА ПАРАМЕТРОВ НЕИСПРАВНОСТЕЙ С ИСПОЛЬЗОВАНИЕМ ВНЕДРЕНИЯ НЕИСПРАВНОСТЕЙ НА ОСНОВЕ ОБУЧЕНИЯ С ПОДКРЕПЛЕНИЕМ.
  11. ^ Рикард Свеннингссон, Джонни Винтер, Хенрик Эрикссон и Мартин Торнгрен, «MODIFI: инструмент для инъекции неисправностей, реализованный на основе модели», Конспект лекций по информатике, 2010, том 6351/2010, стр. 210–222.
  12. ^ GA Kanawati, NA Kanawati и JA Abraham, «FERRARI: гибкая программная система обнаружения и устранения неисправностей», IEEE Transactions on Computers, т. 44, стр. 248, 1995.
  13. ^ T. Tsai и R. Iyer, «FTAPE: инструмент для внесения неисправностей для измерения отказоустойчивости», представленный на конференции Computing in aerospace, Сан-Антонио, Техас, 1995.
  14. ^ S. Han, KG Shin и HA Rosenberg, «DOCTOR: Интегрированная среда для внесения неисправностей в программное обеспечение для распределенных систем реального времени», представленная на Международном симпозиуме по производительности и надежности компьютеров, Эрланген; Германия, 1995.
  15. ^ S. Dawson, F. Jahanian и T. Mitton, «ORCHESTRA: среда зондирования и внесения неисправностей для тестирования реализаций протоколов», представленная на Международном симпозиуме по производительности и надежности компьютеров, Урбана-Шампейн, США, 1996.
  16. Веб-сайт Grid-FIT Архивировано 2 февраля 2008 г. на Wayback Machine
  17. ^ Н. Лукер, Б. Гвинн, Дж. Сюй и М. Манро, «Основанный на онтологии подход к определению надежности сервисно-ориентированных архитектур», в трудах 10-го Международного семинара IEEE по объектно-ориентированным надежным системам реального времени, США, 2005 г.
  18. ^ Н. Лукер, М. Манро и Дж. Сюй, «Сравнение внедрения неисправностей на сетевом уровне с вставкой кода», в трудах 29-й Международной конференции IEEE по компьютерному программному обеспечению и приложениям, Шотландия, 2005 г.
  19. ^ Веб-сайт LFI
  20. ^ Flatag (2020-05-16), Flatag/FIBlock , получено 2020-05-16
  21. ^ Информация о продукте beSTORM
  22. ^ ExhaustiF SWIFI Инструмент Сайт
  23. ^ Обзор продукта Holodeck Архивировано 13 октября 2008 г. на Wayback Machine
  24. ^ Обзор продукта Codenomicon Defensics
  25. ^ Анализатор сервисов Mu
  26. ^ Mu Dynamics, Inc.
  27. ^ Веб-сайт Xception
  28. ^ Критическое программное обеспечение SA
  29. ^ Аббасинасаб, Али; Мохаммади, Мехди; Мохаммади, Сиамак; Янушкевич, Светлана; Смит, Майкл (2011). «Внедрение мутантных неисправностей в функциональные свойства модели для улучшения метрик покрытия». 2011 14-я конференция Euromicro по проектированию цифровых систем . стр. 422–425. doi :10.1109/DSD.2011.57. ISBN 978-1-4577-1048-3. S2CID  15992130.
  30. ^ Н. Лукер, М. Манро и Дж. Сюй, «Моделирование ошибок в веб-сервисах», Международный журнал систем моделирования, науки и технологий, т. 5, 2004.

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