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

Стандартная разовая терапевтическая доза облучения составляет до 200 рад.

1000 рад — это смертельная доза, а взбунтовавшаяся машина сжигала беззащитных людей 20 000 рад.

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

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

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

Убийца

Therac-25 — это аппарат для лучевой терапии, медицинский линейный ускоритель производства компании Atomic Energy of Canada Limited (AECL).

План объекта показан на рисунке ниже.

А вот реклама для домохозяек.

https://vimeo.com/88604078

Убийца

В период с июня 1985 года по январь 1987 года эта машина стала причиной шести аварий с передозировкой радиации, когда некоторые пациенты получили десятки тысяч рад. По меньшей мере двое пациентов умерли от прямых последствий передозировок.

Техник вспомнил, что в тот день он изменил команду «x» на «e». Выяснилось, что достаточно быстрое выполнение приводило к передозировке радиации почти в 100% случаев.

Расследование

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

AECL построила три версии своей машины: Therac-6, Therac-20 и Therac-25. Версии 6 и 20 были изготовлены в партнерстве с французской компанией CGR. Партнерство распалось до того, как Therac-25 был разработан, но обе компании сохранили доступ к проектам и исходному коду более ранних моделей.

Кодовая база Therac-20 была разработана на основе Therac-6. Все три машины использовали компьютер PDP-11. Однако Therac-6 и 20 не нуждались в этом компьютере. Оба были разработаны для работы в качестве автономных устройств. В ручном режиме техник-радиотерапевт вручную настраивает различные части аппарата, включая поворотный стол, чтобы поместить одно из трех устройств на пути электронного луча.

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

На Therac-6 и 20 аппаратные блокировки не позволяли оператору сделать что-то опасное, например, выбрать мощный электронный луч без установленной рентгеновской мишени.

Попытка активировать ускоритель в недопустимом режиме приведет к срабатыванию протектора, остановив все. PDP-11 и связанное с ним оборудование были добавлены для удобства. Техник мог ввести рецепт на терминал VT-100, а компьютер использовал сервоприводы для позиционирования поворотного стола и других устройств.

Больницам понравилось, что компьютер настраивается быстрее, чем человек. Меньшее время настройки означало больше пациентов в день.

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

Ну ну…

В программном обеспечении Therac-25 были обнаружены как минимум четыре ошибки, которые могли вызвать передозировку радиацией.

  • Одна общая переменная использовалась как для анализа входных значений, так и для отслеживания положения поворотного стола. Таким образом, быстрый ввод данных в терминал может привести к тому, что поворотный стол останется в неправильном положении (состояние гонки).
  • Потребовалось около 8 секунд, чтобы изгибные магниты встали на место. Если за это время оператор изменит тип и мощность луча и переместит курсор в конечное положение, система не обнаружит эти изменения.
  • Деление на значение переменной, управляющей мощностью луча, в ряде случаев приводило к ошибке деления на ноль и, как следствие, увеличению мощности до максимально возможного значения.
  • Установка (однобайтовой) логической переменной в значение «истина» была выполнена с помощью команды «x=x+1», поэтому нажатие кнопки «Установить» привело бы к тому, что система не смогла идентифицировать сообщение о неправильном положении поворотного стола 1 тайм-аут. из 256.

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

Исправления

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

Полный список исправлений на английском языке:

Источник: Нэнси Дж. Левесон, Аварии Therac-25.

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

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

В данном случае производитель решил переиспользовать программный код от Therac-6 и Therac-20, при этом Therac-6 вообще не обеспечивал рентгеновского режима, а Therac-20 был оснащен аппаратными блокировками.

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

Дополнительные ресурсы о Therac-25 и связанных с ним авариях

Вывод

По данным Института программной инженерии, в среднем на 100 строк кода приходится 1 ошибка, а 98% сбоев в работе устройств, вызванных программными ошибками, можно было бы предотвратить путем надлежащего тестирования. Теперь, когда я это знаю, мне хочется присоединиться к движению дай мне посмотреть код. Конечно, после всех тех громких происшествий были приняты меры, но я бы не хотел однажды сходить к стоматологу и лечиться бормашиной, угловая скорость которой управляется переменной с добавленным по ошибке всего одним лишним нулем. Уважаемые тестировщики (а также программисты и разработчики), пожалуйста, выполняйте свою работу как следует.

УПД

Калифорнийский университет в Беркли: Информатика 61A - Лекция 35: Therac-25

https://www.youtube.com/watch?v=nxX-aAvZbmM

Эта статья изначально была опубликована (на русском языке) на habrahabr.ru. Оригинальная и переведенная версии были размещены в нашем блоге с разрешения автора.