Апокалипсис в коде: как смертельные ошибки Therac-25 стали худшим программным сбоем в истории
Стремление минимизировать расходы — вещь похвальная, порой двигающая технический прогресс вперед. Однако чрезмерная экономия нередко граничит с абсурдом: в одних случаях она лишь раздражает, а в других, помноженная на халатность, представляет смертельную угрозу.
Именно такое трагическое стечение обстоятельств легло в основу печально известного инцидента с аппаратом Therac-25.
Предыстория катастрофы
Апрель 1986 года. Молодая сотрудница онкологического центра в Восточном Техасе проводит стандартную процедуру. Ей необходимо настроить недавно доставленный из Канады медицинский комплекс Therac, чтобы направить слабый поток электронов на ухо пациента. Шестидесяти шестилетний Вердон Кидд, работавший водителем автобуса, незадолго до этого столкнулся с онкологией кожи ушной раковины, и врачи назначили ему курс дистанционной лучевой терапии.
Therac-25. Источник: Wikipedia.

На этот аппарат возлагали огромные надежды: он представлял собой усовершенствованный линейный ускоритель медицинского назначения, генерирующий пучки мегаэлектронов (МэВ) малой мощности, которые эффективно справлялись с различными патологиями тканей.
Вердону довелось стать лишь вторым пациентом, проходившим лечение на Therac-25. Как только оператор ввела необходимый набор команд, устройство тихо зашуршало. Секунду спустя раздался резкий, полный боли крик: спокойный по жизни Вердон выругался сорванным голосом так громко, что это было слышно на весь этаж. По его собственным воспоминаниям, в тот короткий миг его буквально окатило невидимым кипятком — и это сравнение удивительно точно отражало реальность: пациент поглотил гигантскую дозу облучения в диапазоне от 15 000 до 25 000 рад, тогда как выживание после 400 рад уже само по себе является чудом.
Переживший суровые годы Великой депрессии и Второй мировой войны, Вердон скончался спустя двадцать дней. Его смерть указала на главного виновника трагедии — аппарат Therac-25, а заодно и на производителя, выпустившего его на рынок.
Благие намерения с фатальным исходом
Модель Therac-25 создавалась как эволюционное продолжение предыдущих поколений ускорителей — Therac-6 и Therac-20, выдававших соответственно 6 и 20 МэВ. Эта линейка оборудования стала плодом коллаборации двух гигантов индустрии: французской компании CGR и канадской AECL («Атомная энергия Канады Лимитед»), находившейся в государственной собственности.
Схема ускорителя Therac-20. Источник: carleton.ca.

Тем не менее, проект Therac-25 канадские инженеры разрабатывали уже самостоятельно. «Сердцем» системы, как и в более ранних версиях, выступал мини-компьютер DEC PDP-11, ценимый за архитектуру с шестнадцатибитными регистрами и удобную ортогональность, упрощавшую адресацию в большинстве команд.
Все три модификации функционировали на единой базе устаревшего кода, уходящего корнями к самой первой машине. Каждое новое поколение устройства обрастало дополнительными строками на языке ассемблера для PDP-11, что в итоге и привело к роковой системной ошибке в Therac-25.
Компьютер PDP-11/ Источник: Wikipedia.

Очевидно, что аппарат задумывался как массовый экспортный продукт. Главными достоинствами его конструкции были компактность и универсальность: в частности, разработчики внедрили концепцию двойного прохода пучка для ускорения электронов в ограниченном объеме, заменив традиционный клистрон на более компактный магнетрон.
Схематическое устройство Therac-25.

Благодаря этим нововведениям установка умела производить как электронное, так и рентгеновское излучение, что делало её крайне привлекательным приобретением для клиник, избавляя их от необходимости покупать два разных аппарата.
Кроме того, в устройстве предусматривалось три режима работы: «световое поле» для точной наводки коллиматора, прямая электронная терапия с использованием мягкого потока высокой энергии (5–25 МэВ) и рентгеновское излучение мощностью 25 МэВ. На бумаге это выглядело как революционное устройство с массой конкурентных плюсов.
Технические изъяны ценой в жизнь
Тем не менее, выпустить столь сложный коммерческий прибор без жесткой экономии на всем подряд менеджмент компании посчитал невозможным.
Главным и фатальным отличием Therac-25 от предшественников стало полное отсутствие дублирующих механических блокировок. На старых моделях они служили последним рубежом обороны на случай сбоя, предотвращая запуск оборудования в опасных для пациента конфигурациях, например при неправильном положении лечебного стола.
В новой модели от железобетонной механики отказались. Всю ответственность за безопасность возложили на программный код, унаследовавший громоздкую структуру и старые уязвимости.
Пример использования ускорителя на практике. Источник: Wikipedia.

Как уже отмечалось, управляющий компьютер PDP-11 выполнял множество процессов одновременно: считывал команды с пульта, контролировал готовность узлов, позиционировал магниты и только после этого активировал излучатель. Обмен данными между задачами происходил через глобальные флаги в памяти, однако эффективной синхронизации потоков разработчики не предусмотрели.
В результате итоговый результат зависел от миллисекундных интервалов между нажатиями клавиш и быстродействия фоновых процедур. Это привело к первой катастрофе в онкоцентре Кеннестона: оператор случайно ввела настройки для рентгеновского режима, но тут же исправила ошибку на электронный режим, быстро нажимая стрелки на клавиатуре.
Принцип вращения поворотного стола в Therac-25/ Источник: Wikipedia.

Эта последовательность действий вызвала критическое состояние гонки и переполнение 8-битного счетчика — простой переменной памяти, сбрасывавшейся каждые 256 циклов проверки параметров, что случайно заблокировало проверку уровня радиации. Зато разработка программы обошлась дешевле.
Из-за этого сбоя Кэтрин Ярброу — первая известная жертва дефектов Therac-25 — в июне 1985 года получила дозу радиации, превышающую назначенную норму в сто раз. Аппарат выдал полную мощность в 25 МэВ, но защитный металлический фильтр не встал на свое место. Обезумевшая от жгучей боли женщина выбежала из процедурного кабинета в полуразобранном виде. Позднее она описывала это ощущение так, будто ей в плечо вогнали раскаленный металлический прут.
Примечательно, что Кэтрин не была первой погибшей непосредственно от сбоев машины, но она получила тяжелейший ожог, вызвавший частичный паралич и хронические боли, из-за которых несчастная могла спать лишь по полчаса. Чудом пережив последствия аварии и вернувшись к относительно сносной жизни, она погибла несколько лет спустя в автомобильной аварии.
Расследование и сияние Вавилова-Черенкова
К слову, Вердон Кидд тоже не был первооткрывателем в этом трагическом списке. Весной того же года смертельную дозу получил другой пациент, лечивший спину. По его словам, это ощущалось так, будто на него вылили ковшик кипятка. Мужчина скончался через несколько месяцев. Именно тогда на терминале впервые высветилась печально известная «Ошибка 54» («Malfunction 54»).
Об инциденте доложили медицинскому физику техасского центра Фрицу Хагеру. Прервав поездку на профильную выставку, он попытался разобраться в случившемся, но руководство клиники всячески препятствовало расследованию и запретило ему контактировать с пострадавшими.
Эффект Вавилова-Черенкова, зафиксированный во время эксперимента Фрица Хагера. Источник: kitv.com.

По настоянию руководства центра прибыли канадские инженеры для проверки оборудования. Их вердикт оказался предсказуемым: техника исправна, а опасения физика — беспочвенные домыслы. Однако после повторения аналогичного случая с Вердоном Киддом картина стала очевидной.
Хагер с помощником начали независимое расследование. Поставив задачу воспроизвести сбой, они добились результата всего за три часа:
«Программа некорректно переключала системные параметры, оставляя аппарат в гибридном состоянии, при котором на пациента обрушивался мощнейший поток электронов. За одну десятую секунды доза достигала 15 000 сантигреев — объема, достаточного для лечения трех пациентов на протяжении пяти недель».
Еще один пример сияния Вавилова-Черенкова. Источник: Spacegid.com.

Для наглядности: люди, пережившие атомную бомбардировку Хиросимы в самом эпицентре, получили около 946 сантигреев, судя по анализу костей. Замерив показатели ионизационной камерой, Хагер коротко бросил администратору клиники: «Мы только что кого-то убили».
Эксперимент повторили в присутствии специалистов онкоцентра Андерсона на более точных приборах. При очередном искусственном сбое экран устройства мгновенно погас, и наблюдатели собственными глазами увидели «голубое свечение» — черенковский эффект, характерный для ядерных реакторов. Вспышка длилась долю секунды, а дозиметры зафиксировали те же 15 000 сантигреев.
Восторжествовало ли правосудие?
Отвергать неопровержимые доказательства, собранные Фрицем Хагером и его коллегами, было уже невозможно. Сначала представители канадской компании пытались отрицать проблемы с программным обеспечением, предлагая в качестве решения просто заблокировать клавишу со стрелкой вниз.
Фриц Хагер. Источник: Reddit.

Однако масштабы скандала уже вышли наружу. Хагер начал обзванивать все медицинские учреждения, использовавшие Therac-25, предупреждая об опасности. Вскоре вмешались регуляторы США и Канады: Управление по санитарному надзору за качеством пищевых продуктов и медикаментов (FDA) потребовало полностью запретить эксплуатацию аппарата. Все машины на американской территории были отозваны для доработки и оснащения надежными механическими средствами защиты, присутствовавшими на прошлых моделях.
Компания AECL столкнулась с лавиной судебных исков от потерпевших и членов их семей. Все разбирательства завершились мировыми соглашениями без оглашения сумм, однако, по имеющимся данным, общие выплаты составили около 150 миллионов долларов. Техасский онкоцентр получил компенсацию в размере 1 миллиона долларов, а также оплату услуг психотерапевтов для персонала, тяжело переживавшего гибель пациентов.
Любопытно, что имя разработчика злополучного кода так и осталось тайной, хотя принято считать, что всю логику для Therac-25 написал единственный программист. В истории индустрии он остался собирательным образом «тот самый разработчик».
АЭС Пойнт-Лепро, Канада. Источник: neutrons.ca.

В результате этих событий в 1990 году в США приняли Закон о безопасности медицинской техники (SMDA), обязавший производителей контролировать работу своих устройств на протяжении всего срока их службы.
Эти изменения повлияли на мировые стандарты, заложив основы современного надзора за безопасностью медоборудования (materiovigilance). А в сфере разработки программного обеспечения начали уделять гораздо больше внимания тестированию и качеству кода, особенно в критически важных областях, где ошибка может стоить человеческой жизни.
Сравнительно легко среди пострадавших отделалась Дженис Тильман из клиники города Якима, штат Вашингтон. После передозировки излучения у нее развился частичный некроз тканей бедра и сильный болевой синдром, но после лечения она сумела восстановиться, хотя и осталась инвалидом на всю жизнь. Ее дальнейшая судьба осталась неизвестной.
ИИ заберет тексты и код, но это никогда не было главной работой человека. Часть 1
Зачем искусственному интеллекту душа: филологический анализ манифеста Никиты Михалкова
Главные новости ИИ за неделю (05.09.26–11.09.26): пока вы спали, вышло ещё три модели
ООН предупреждает: глобальное потепление превысит 1,8 °C, а «хороших сценариев не осталось»
Инструкция по обеспечению рутинного функционирования окружающей действительности
Создание ИИ-дайджеста биологических новостей: мой опыт
От кухонной воронки до бронебоя: как работают кумулятивные струи