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

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

![0438_Therac_25_ru/image1.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image1.png)

Типичная разовая терапевтическая доза радиации составляет до 200 [рад](https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B4_(%D0%B5%D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D0%B8%D0%B7%D0%BC%D0%B5%D1%80%D0%B5%D0%BD%D0%B8%D1%8F))\.

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

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

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

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

## Убийца

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

![0438_Therac_25_ru/image3.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image3.png)

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

![0438_Therac_25_ru/image5.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image5.png)

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

<https://vimeo.com/88604078>

## Убийство

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

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

![0438_Therac_25_ru/image6.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image6.png)

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

![0438_Therac_25_ru/image7.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image7.png)

Во время ведения судебных дел против AECL прокуратура штата Техас обратилась к [Нэнси Ливесон](https://en.wikipedia.org/wiki/Nancy_Leveson) \(профессор компьютерных наук Калифорнийского Университета в Ирвайне\) как к эксперту для расследования\. Она внесла весомый вклад в компьютерную безопасность\. Нэнси с Кларком Тёрнером в течение трех лет занимались сбором материалов и реконструкцией событий, связанных с 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](https://ru.wikipedia.org/wiki/PDP-11)\. Предыдущим моделям он не требовался, так как они были спроектированы как автономные устройства\. Техник по лучевой терапии настраивал различные параметры **вручную**, в том числе и положение поворотного диска для настройки режима работы аппарата\. 

![0438_Therac_25_ru/image8.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image8.png)

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

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

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

![0438_Therac_25_ru/image10.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image10.png)

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

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

Ну ну\.

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

* Одна и та же переменная применялась как для анализа введённых чисел, так и для определения положения поворотного круга\. Поэтому при быстром вводе данных через терминал Therac\-25 мог иметь дело с неправильным положением поворотного круга \([состояние гонки](https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8)\)\.
* Настройка положения отклоняющих магнитов занимает около 8 секунд\. Если за это время параметры типа и мощности излучения были изменены, а курсор установлен на финальную позицию, то система не обнаруживала изменений\.
* Деление на величину излучения, приводящее в некоторых случаях к ошибке деления на ноль и к соответствующему увеличению величины облучения до максимально возможной\.
* Установка булевской переменной \(однобайтовой\) в значение "истина" производилось командой "x\=x\+1"\. Поэтому с вероятностью 1/256 при нажатии кнопки "Set" программа могла пропустить информацию о некорректном положении диска\.

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

## Исправления

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

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

![0438_Therac_25_ru/image11.png](https://import.viva64.com/docx/blog/0438_Therac_25_ru/image11.png)

Источник — Nancy G\. Leveson, [Therac\-25 Accidents](http://sunnyday.mit.edu/papers/therac.pdf)

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

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

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

После несчастных случаев Therac\-25 [FDA](https://ru.wikipedia.org/wiki/Food_and_Drug_Administration) изменило своё отношение к множеству проблем систем, связанных с безопасностью, и особенно в отношении к программному обеспечению\. Как результат, FDA запустило процесс улучшения своих процедур, директив и системы отчетности, и включило в них программное обеспечение\. Данный урок был важным не только для FDA, но и для всех промышленных систем, критичных к безопасности\.

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

* [My professor investigated the Therac\-25 incident and was a part of the prosecution\. Got any questions for me to ask him?](https://www.reddit.com/r/programming/comments/mzht1/my_professor_investigated_the_therac25_incident/)
* [What is the name of the programmer who wrote the Therac\-25 software?](https://www.quora.com/What-is-the-name-of-the-programmer-who-wrote-the-Therac-25-software)
* [Fatal Defect: Chasing Killer Computer Bugs](https://www.amazon.com/Fatal-Defect-Chasing-Killer-Computer/dp/0679740279/)
* Nancy Leveson, Clark S\. Turner [An Investigation of the Therac\-25 Accidents](https://web.stanford.edu/class/cs240/old/sp2014/readings/therac-25.pdf)
* Nancy G\. Leveson, [Therac\-25 Accidents](http://sunnyday.mit.edu/papers/therac.pdf)
* Nancy G\. Leveson [Safeware: System Safety and Computer](https://www.amazon.com/Safeware-Computers-Nancy-G-Leveson/dp/0201119722)
* [Infusion Pump Software Safety Research at FDA](https://www.fda.gov/medical-devices/infusion-pumps/infusion-pump-software-safety-research-fda)
* The University of California, Berkeley: Computer Science 61A — Lecture 35: Therac\-25 [https://www\.youtube\.com/watch?v\=nxX\-aAvZbmM](https://www.youtube.com/watch?v=nxX-aAvZbmM)

## Заключение

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

## 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](http://www.infocobuild.com/education/audio-video-courses/computer-science/CS61A-Spring2011-Berkeley/lecture-35.html)

_Эта статья впервые была [опубликована](https://habr.com/ru/company/pvs-studio/blog/307788/) \(на русском языке\) на сайте habrahabr\.ru\. Статья размещена в нашем блоге и переведена с разрешения автора\._