Баг-убийца. Фигак, фигак и Therac-25




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

Picture 3

Типичная разовая терапевтическая доза радиации составляет до 200 рад.

1000 рад — смертельная доза. Восставшая машина фигачила в беззащитных землян 20 000 рад.

Рассмотрим случай, когда поэтапное, но не согласованное внедрение улучшений софта привело к системной ошибке. К худшей в истории программной ошибке.

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

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

Убийца

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

Picture 5

Схема аппарата представлена на рисунке ниже.

Picture 9

Реклама аппарата для домохозяек.

https://vimeo.com/88604078

Убийство

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

Медсестра вспомнила, что в тот день она заменяла "x" на "e". Выяснилось, что, если сделать это достаточно быстро, переоблучение случалось практически со 100-процентной вероятностью.

Picture 14

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

Picture 15

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

Канадская государственная организация "Atomic Energy of Canada Limited" (далее AECL) выпустила три версии: Therac-6, Therac-20 и Therac-25. 6 и 20 были произведены совместно с французской компанией CGR. Партнёрство прекратилось перед проектировкой Therac-25, но у обеих компаний остался доступ к проектам и исходным кодам ранних моделей.

Программный код в Therac-20 основывался на коде Therac-6. На всех трёх аппаратах был установлен компьютер PDP-11. Предыдущим моделям он не требовался, так как они были спроектированы как автономные устройства. Техник по лучевой терапии настраивал различные параметры вручную, в том числе и положение поворотного диска для настройки режима работы аппарата.

Picture 1

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

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

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

Picture 17

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

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

Ну ну.

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

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

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

Исправления

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

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

Picture 20

Источник — Nancy G. Leveson, Therac-25 Accidents

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

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

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

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

Еще материалы по теме Therac-25

Заключение

Software Engineering Institute говорит о среднем числе в 1 баг на каждые 100 строк кода и 98% случаев сбоев устройств, случающихся по причинам багов в ПО, легко можно было бы избежать при должном уровне тестирования кода. Зная об этом, хочется примкнуть к движению "дайте код посмотреть". Вроде бы меры после громких случаев приняты, но все равно не очень хочется столкнуться с бормашиной, где в переменной, отвечающей за угловую скорость, "ошиблись на нолик". Уважаемые тестировщики (программисты, разработчики), делайте свою работу хорошо.

UPD

The University of California, Berkeley: Computer Science 61A — Lecture 35: Therac-25

http://www.infocobuild.com/education/audio-video-courses/computer-science/CS61A-Spring2011-Berkeley/lecture-35.html

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



Найдите ошибки в своем C, C++, C# и Java коде

Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

goto PVS-Studio;


Найденные ошибки

Проверено проектов
361
Собрано ошибок
13 417

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;