Приходя сегодня в больницы, никто из нас, пожалуй, не удивляется современным аппаратам для лечения и диагностики, не задумывается о том, насколько они сложны, и не боится, что они могут оказаться ненадежны или опасны. Мы привыкли доверять медицинской технике, полагая, что ведущие мировые производители относятся к ее качеству крайне серьезно. Вряд ли меньшим было это доверие и 40 лет назад, в 1980-х, когда технический прогресс достиг невероятных скоростей и набирала обороты компьютеризация. Это сулило прекрасное будущее и уже улучшало настоящее — например, сделало лечение многих болезней эффективнее, чем когда-либо ранее. Однако была у этого и обратная сторона: за развитием техники не всегда успевало развитие этики, процедур обеспечения качества, ответственных подходов к безопасности, да и просто не хватало квалифицированных программистов. Некоторые ошибки стали фатальными и повлияли на всю индустрию. Так случилось с аппаратом для лучевой терапии Therac-25, погубившим несколько человек. Рассказываем об этом случае, который считается одной из ужаснейших ошибок программирования в истории.
Лучевая терапия — один из основных методов лечения рака, который применяется уже больше века. Принцип ее работы основан на том, что раковые клетки делятся намного активнее нормальных, а значит, более уязвимы к радиации. Точно направленное излучение убивает опухоль, при этом здоровые ткани страдают гораздо меньше. Это лечение в сочетании с операциями и химиотерапией успешно спасает людей по всему миру.
Навылет
В начале июня 1985 года Кэти Ярборо, 61-летняя мастер маникюра из Мариетты, штат Джорджия, приехала в онкологический центр Кеннстоун. Несколько месяцев назад ей удалили опухоль из левой груди, и теперь она проходила курс облучения, чтобы убедиться, что рак не вернется. Это был уже двенадцатый сеанс. Процедура казалась рутинной: раздеться до пояса, лечь на стол, подождать несколько секунд, пока аппарат сделает свое дело. Пациентке была прописана средняя доза в 200 рад. Кэти не должна была ничего почувствовать: радиотерапия безболезненна, и она это уже хорошо знала.
Но в тот день что-то пошло не так. В момент включения аппарата женщина ощутила, как тело пронзила жгучая боль.
— Вы меня обожгли! — воскликнула она.
— Это невозможно, — ответил техник, управлявший аппаратом.
Физик центра Тим Стилл и лечащий врач Кэти тоже не нашли причин для беспокойства: кожа выглядела нормально, разве что была чуть теплой на ощупь. «Я не понимаю, что могло это вызвать», — сказал тогда Стилл. Выполняя свой долг, он позвонил производителю аппарата, канадской AECL Medical — подразделению госкомпании Atomic Energy of Canada. Может ли их новейший линейный ускоритель Therac-25 каким-то образом выпустить мощный луч? Там ответили все то же: это невозможно.
Через две недели Кэти вернулась в клинику и пожаловалась на нарастающую боль и странное покалывание. На груди появилось красное пятнышко, а на спине напротив — большой розовый круг. У Стилла перевернулось все внутри, когда он это увидел.
— Похоже на выходное отверстие от электронного луча, — сказал он Кэти и ее врачу.
Как опытный физик, он понял: пациентка получила чудовищное переоблучение — возможно, в 75−100 раз выше назначенного. Повреждения от радиации зависят от ее мощности, площади облучения и того, какие органы оно затрагивает. По оценкам Стилла, в тот день Кэти получила от 15 до 20 тысяч рад на участок размером с монету. Тогда как даже 1000 рад могут быть смертельными, если облучить все тело.
В ту ночь Стилл задержался в центре допоздна. Он раз за разом пытался заставить аппарат выдать такой же мощный луч — стрелял в воздух, в резервуары с водой, менял все возможные настройки. Но система безопасности Therac-25 каждый раз останавливала процесс. Казалось, машина работала безупречно.
Новейший аппарат
В последующие недели тело Кэти стало выглядеть так, словно его прострелили из невидимого оружия. Точка входа радиационного луча превратилась в зияющую рану. Хирурги дважды пытались пересадить туда здоровую кожу, но каждый раз она отмирала. Левую руку женщины парализовало — она только иногда чувствовала судороги в ней. Кэти наняла адвоката и подала в суд на AECL и больницу.
Но в компании продолжали настаивать: их аппарат не мог причинить такой вред. Therac-25 был уникальной разработкой и считался вершиной прогресса — компьютеризированный линейный ускоритель, способный работать в двух режимах. Он мог генерировать либо пучок электронов малой мощности для лечения поверхностных опухолей, либо более мощное рентгеновское излучение для глубоко расположенных новообразований. Раньше для этого требовались разные аппараты, что было дороже и неудобнее для больниц, и Therac-25 стал революционным решением. Важным новшеством стало и то, что все функции безопасности в нем впервые были доверены компьютеру — это должно было сделать аппарат надежнее и проще в использовании. Машины продали пяти клиникам в США и шести в Канаде, большинство было запущено в 1983 году. К моменту инцидента они провели 20 000 успешных процедур.
— Мы так и не получили от AECL нормального объяснения произошедшего, — вспоминал позже адвокат Кэти Билл Берд. — Когда мы запросили взятие показаний — процедуру, где их можно было бы допросить в присутствии представителя суда, — они сразу предложили сделку.
Кэти согласилась на нее. Она, к слову, прожила еще пять лет, пока не погибла в автокатастрофе.
Этот случай стал лишь первым в череде страшных инцидентов с Therac-25.
Умолчание
Семь недель спустя, 30 июля 1985-го, в онкологическом центре Гамильтона в канадской провинции Онтарио сорокалетняя женщина с раком шейки матки во время рутинной процедуры на Therac-25 получила дозу примерно в 17 000 рад. На бедре образовался большой отек и покраснение. Пациентку госпитализировали. Женщина, имя которой не называлось, умерла в ноябре от своего рака, но вскрытие показало: если бы она выжила, ей потребовалась бы трансплантация бедра из-за радиационного поражения.
После этого случая AECL разослала операторам Therac-25, американскому профильному ведомству — Управлению по контролю за продуктами и медикаментами (FDA) и канадскому Бюро радиационной защиты уведомление: техники должны проверять механизм позиционирования луча — поворотный стол — во время каждой процедуры. При этом о травмах пациентов не упоминалось. Физики в Онтарио знали об инциденте из разговоров между собой, но никто из них не знал о более раннем случае в Джорджии. А сама AECL не спешила соединять эти точки и делать информацию публичной.
Инженеры компании проверили гамильтонский аппарат и решили, что проблема в микропереключателях поворотного стола. Их модифицировали, изменили программное обеспечение, чтобы переключатели постоянно проверялись. В сентябре 1985 года AECL разослала новое письмо пользователям, заявив, что Therac-25 теперь «безопаснее старой системы как минимум на пять порядков».
«Обожглась грелкой»
Через три месяца после этого оптимистичного заявления, в декабре 1985 года, модифицированный AECL Therac-25 в больнице Якима в штате Вашингтон выдал такую же чудовищную дозу облучения еще одной пациентке с раком шейки матки. На этот раз ожог на бедре имел странный полосатый узор. Впоследствии женщине потребовалась пересадка кожи.
Физик центра Дэвид Джадд помнил то самое письмо об «увеличении безопасности на пять порядков».
— Основываясь на этом письме, мы решили, что дело не может быть в аппарате, — рассказывал он позже.
Не зная о случаях в Онтарио и Джорджии, врачи искали другие объяснения. Пациентка сказала, что регулярно пользуется грелкой — к версии, что ожог именно от нее, и стали склоняться.
Когда больница отправила отчет об инциденте в AECL, компания ответила с поразительной уверенностью: «После тщательного рассмотрения мы пришли к выводу, что такие повреждения не могли быть вызваны неисправностью Therac-25 или ошибкой оператора». В том же письме утверждалось — возможно, имея в виду необычный полосатый узор ожога, — что «очевидно, не было других случаев подобных повреждений у этой или других пациентов». Персонал в Якиме решил, что причину им не найти, и, поскольку аппарат, казалось, работал нормально, снова начал применять его в лечении пациентов.
К тому моменту физики, работавшие с Therac-25 в разных клиниках США и Канады, начали делиться беспокойством по телефону и в письмах. Их озадачивали проблемы с машиной, которая была в целом качественной. Они чувствовали, что кто-то должен докопаться до сути.
Однако пока специалисты пытались разобраться, что происходит, случилось непоправимое. Два инцидента, произошедших один за другим, наконец помогли найти истинную причину трагедий — но страшной ценой.
«Ошибка 54»
21 марта 1986 года Рэй Кокс, нефтяник из Восточного Техаса, приехал в онкологический центр в Тайлере на девятый сеанс облучения: ему удалили опухоль из спины, и требовался курс лучевой терапии. К тому моменту местный Therac-25 успешно пролечил более 500 пациентов за два года работы.
Кокс лег на процедурный стол. В тот день неудачно совпало несколько мелочей: внутренняя связь между процедурной и пультовой оказалась неисправна, а видеомонитор для наблюдения за пациентом отключился. Техник ушла в пультовую и закрыла дверь. Она ввела данные для электронного луча мощностью 180 рад, но заметила ошибку: вместо режима «e» (электронный луч) она случайно выбрала «x» (рентген). Техник быстро передвинула курсор вверх по экрану, поправила ошибку, проверила остальные параметры и включила аппарат.
Машина остановилась, на экране появилось сообщение «Malfunction 54» — «Ошибка 54». О ней не было ни слова в руководстве пользователя. Сообщения об ошибках на Therac-25 не были редкостью. Аппарат мог выдавать до четырех предупреждений в день, показывая просто Malfunction и число от 1 до 64. Никаких объяснений этим кодам не было ни на экране, ни в инструкции. Техники привыкли просто нажимать клавишу P (proceed — продолжить), чтобы обойти эти раздражающие сбои. Они считали, что аппарат безопасен и в худшем случае просто не выдаст дозу, как это обычно происходило.
После этого в процедурной Кокса ударило мощным зарядом. Он знал по предыдущим сеансам, что так быть не должно. Мужчина попытался подняться, но техник, не видя и не слыша его из-за неработающей связи, подумала, что аппарат не сработал, и просто нажала «p». Кокса ударило снова. Он смог встать, шатаясь, добрался до двери и начал колотить в нее кулаками, — лишь тогда процедуру прервали.
Как и в случае с Кэти Ярборо, на теле мужчины образовался ожог размером с монету — место попадания луча мощностью около 16 500 рад. Кокса отправили домой, но через несколько недель он вернулся в больницу, кашляя кровью. Радиационное поражение вскоре парализовало его левую руку, обе ноги, левую голосовую связку и диафрагму. Через пять месяцев он умер.
В день инцидента представитель AECL заявил руководству больницы, что их модифицированный Therac-25 просто не способен причинить вред пациенту и что компании неизвестно о других подобных случаях.
— Что действительно выводит из себя, — рассказывал позже на условиях анонимности сотрудник больницы, — в наших кабинетах сидели люди из AECL и уверяли, что машина не может никому навредить, хотя прекрасно знали, что это не так.
Компания заявила, что Кокс мог получить удар током. Персонал больницы нанял независимого эксперта-электрика, который установил, что такого случиться не могло. Машину проверяли снова и снова. Но никто — ни из AECL, ни из больницы — не смог заставить ее сделать что-то неправильное.
7 апреля 1986 года лечение на аппарате возобновили. Уже 11 апреля на экране снова появилось сообщение об «Ошибке 54» — на этот раз во время лечения 66-летнего водителя автобуса Вердона Кидда, проходившего терапию от рака кожи в районе уха. Он потерял ориентацию, впал в кому и умер три недели спустя от радиационного поражения мозга.
Смерть Кидда, опередившая смерть Кокса на четыре месяца, вошла в историю медицины как первый официально зарегистрированный случай гибели от передозировки во время лучевой терапии.
Восемь секунд
В день инцидента с Киддом лечение на Therac-25 в Тайлере остановили. Физик центра Фриц Хагер и техник, работавшая с аппаратом в обоих фатальных случаях, остались у пульта управления после того, как все разошлись на выходные. Они снова и снова вводили указания в компьютер, пытаясь воспроизвести таинственную «Ошибку 54». Они спускались в конец экрана, затем поднимали курсор вверх, чтобы изменить режим лечения с рентгена на электронный луч. Час за часом — пока наконец не получилось.
В Therac-25 был механизм под названием «поворотный стол», который должен был устанавливать необходимые компоненты на пути излучения. Для рентгеновского режима требовалось установить специальную мишень и рассеивающие фильтры, для электронного режима — другое оборудование. От правильности положения этого стола буквально зависела жизнь пациента.
Ключ к разгадке «Ошибки 54» крылся в том, как оператор взаимодействовал с машиной. Он должен был выбрать режим работы — рентгеновский или электронный луч — и ввести ряд других параметров. При этом многие техники уже наловчились работать с интерфейсом очень быстро. И вот что происходило: если оператор случайно выбирал рентгеновский режим, а затем в течение менее чем восьми секунд исправлял ошибку на электронный, возникал опасный сбой (о том, что в течение этих восьми секунд изменять параметры нельзя, никто не знал). На экране все выглядело правильно, но компьютер не успевал обработать изменение. В результате луч оставался настроенным на гораздо более мощную дозу, необходимую для рентгеновского режима, но без специального рассеивающего механизма, который должен был использоваться, — поворотный стол находился в позиции для электронного луча. Результат был смертельным: пациент получал концентрированный пучок электронов огромной мощности, способный за доли секунды выжечь плоть насквозь.
Это была катастрофическая ошибка проектирования. В прежних моделях — Therac-6 и Therac-20 — подобный сбой был невозможен благодаря аппаратным блокировкам безопасности. Но в погоне за «современностью» в Therac-25 эти механические системы защиты заменили программными. При этом код был написан настолько небрежно, что даже не проверял соответствие между выбранным режимом и фактическим положением механизмов аппарата.
«Все дело в кнопке»
В ту ночь Хагер позвонил в AECL сообщить, что аварии не были случайными. Он знал, как превратить Therac-25 в смертоносное оружие, и передал им все объяснения. Какой была реакция компании?
AECL немедленно разослала пользователям письмо: «Начиная с настоящего момента и до дальнейшего уведомления клавиша, используемая для перемещения курсора назад по последовательности назначения, не должна… использоваться для редактирования или любых других целей. Чтобы избежать случайного использования этой кнопки, ее нужно вырвать, а контакты зафиксировать в разомкнутом положении с помощью изоленты или другого изоляционного материала».
Это формальное уведомление возмутило FDA, уже расследовавшее безопасность Therac-25 после первого тайлерского инцидента. В письме не было ни слова о том, что может произойти при использовании клавиши курсора, не упоминались погибшие пациенты. Более того, как отметил директор отдела по контролю FDA, тон письма предполагал, что исправления нужно внести лишь ради удобства операторов.
FDA потребовало от компании план корректирующих действий, но AECL не спешила с радикальными мерами. Аппараты продолжали работать — во многом потому, что альтернативы просто не было, пациентам было необходимо лечение.
Тем временем встревоженные люди, работавшие с Therac-25, собрались на ежегодной конференции Американской ассоциации физиков в медицине в Сиэтле в августе 1986 года. Они узнали друг от друга подробности инцидентов, включая самый первый случай в Мариетте, который до того был неизвестен. Оказалось, в одной из больниц Канады, прежде чем вводить в эксплуатацию свой новый Therac-25, установили в нем электронный монитор дозы, который мгновенно останавливал луч в случае превышения уровня радиации. Физики создали собственный информационный бюллетень, чтобы делиться информацией по безопасности.
AECL тем временем пыталась удовлетворить строгие требования FDA. Частью поправок стало переработанное программное обеспечение, которое отслеживало положение курсора, чтобы «Ошибка 54» больше не возникала. К концу 1986 года аппараты вернули в эксплуатацию.
Но уже в январе 1987 года выяснилось, что «Ошибка 54» была не единственным смертельно опасным дефектом в программе Therac-25.
Один байт
17 января в больнице Якима мужчина, который проходил лечение от рака с небольшой дозой в 86 рад, внезапно получил удар в 8000−10000 рад в грудь. На теле образовался тот же характерный полосатый узор ожога, что и при аварии в этой же больнице в декабре 1985 года.
— Мы были в полном ужасе, — вспоминал физик центра Дэвид Джадд. — У нас было то самое письмо от AECL о повышении безопасности, но уже два пациента получили передозировку. Мы просто остановили использование машины.
Последняя жертва Therac-25 умерла в апреле 1987 года от сочетания терминального рака и осложнений после передозировки.
Расследование показало, что эти случаи, как и более ранняя авария в Гамильтоне, были вызваны другой программной ошибкой. В Therac-25 часть программы постоянно проверяла правильность положения поворотного стола. Ноль на счетчике показывал оператору, что стол в правильном положении. Любое другое значение означало, что он не на месте, и лечение не могло начаться.
Но программист допустил фатальную ошибку. Он использовал для счетчика один байт памяти, который мог хранить числа только от 0 до 255. В итоге, если число проверок было 256 и больше, система автоматически сбрасывалась на ноль и говорила, что все в порядке. Хотя это было не так.
Это опять же было вопиющее нарушение базовых принципов безопасности. Если бы аппарат имел механические блокировки, они бы не допустили такого, отключив механизм. Но в Therac-25 их не было, системы защиты были только программными.
Физики добились улучшений
После второго случая в Якиме FDA потребовало, чтобы AECL «немедленно уведомила всех покупателей и рекомендовала прекратить использование устройства». Аппарат можно было применять только, «если необходимость лечения конкретного пациента перевешивает потенциальный риск».
Физики отказались мириться с полумерами AECL. В марте 1987 года они организовали в Канаде встречу с представителями компании и потребовали установить на все машины аппаратные системы безопасности. AECL наконец осознала серьезность ситуации. К лету 1987 года компания модифицировала все аппараты, добавив не только монитор дозы, но и еще пять механических систем защиты. «Старомодное» железо пришло на помощь ненадежному программному обеспечению.
После этого в больнице Якимы Дэвид Джадд и представитель AECL проверили обновленный аппарат. Они пытались воспроизвести аварию: стреляли лучом в пластик на процедурном столе, отключали защитные механизмы один за другим, загружали старое программное обеспечение. Но теперь монитор дозы неизменно останавливал машину при любой попытке выдать смертельный луч.
С тех пор на модифицированных Therac-25 не произошло ни одной аварии. Их продолжили успешно использовать. Только онкологический центр в Тайлере отправил свой аппарат обратно в Канаду, потребовав возврата денег: персонал отказывался использовать машину, убившую двух пациентов.
Один программист и никакого контроля
Расследование вскрыло тревожную картину того, как AECL разрабатывала программное обеспечение для аппарата, способного убить человека. Ядро Therac-25 было скопировано со старых моделей — Therac-6 и Therac-20. Казалось бы, логичное решение: те аппараты работали надежно. Но была критическая разница: в старых моделях множество механических блокировок делало программные ошибки неопасными. Когда тот же код перенесли в Therac-25, где все защитные функции были переложены на программу, старые баги превратились в смертельные ловушки.
Более того, выяснилось, что всю программу писал всего один человек, который не имел даже специальной квалификации. Причем писал на ассемблере, низкоуровневом языке программирования, что делало код особенно сложным для проверки. В нем практически отсутствовали комментарии, не было никаких доказательств проведения анализа возможных рисков. К моменту разбирательств этот программист уже не работал в компании, его имя никогда не было раскрыто.
Но дело было не только в конкретном программисте. Документы FDA указывали, что у AECL вообще не было формальных требований для программного обеспечения, не было плана тестирования. Код никогда не проверялся независимыми экспертами, что могло бы помочь избежать предвзятости внутри организации. Большая часть разработки велась на симуляторе из-за сложности безопасного тестирования реального оборудования.
Эта небрежность в создании программного обеспечения резко контрастировала с тщательностью, с которой обычно проектировались механические части медицинского оборудования.
Показательно, что одна из фатальных ошибок — переполнение счетчика — была настолько элементарной, что о ней предупреждали студентов первых курсов компьютерных специальностей. Но в AECL не было системы контроля качества кода, которая могла бы выявить даже такие очевидные проблемы.
К слову, больше компания не производила такую технику. Ее медицинское подразделение упразднили и зарегистрировали как отдельную компанию под новым названием, власти пытались продать ее в частные руки, но безуспешно. Она продолжила техническую поддержку аппаратов, но при этом так никогда и не приняла на себя публичную ответственность за трагедии, давала журналистам лишь формальные комментарии. Все споры с потерпевшими были улажены через досудебные сделки, никто не понес наказания по закону.
Урок для программирования
История Therac-25 изменила не только подходы к разработке медицинского оборудования, но и само отношение к программному обеспечению в критически важных системах. FDA ввело новые требования: теперь производители должны были документировать весь процесс разработки так же тщательно, как и создание механических частей.
Появилось понимание, что программное обеспечение нужно разрабатывать с учетом возможных рисков. Компании обязали проводить анализ того, что может пойти не так, и создавать защиту от каждого выявленного сценария. Любые изменения в программах теперь должны были проходить тщательное тестирование и проверку независимыми экспертами.
Возникло важное правило: критически важные системы не должны полагаться только на программное обеспечение. Даже самый хорошо написанный код может содержать ошибки, поэтому нужны независимые аппаратные системы безопасности, способные предотвратить катастрофу при сбое программы.
Случай Therac-25 стал одним из самых известных примеров того, как фатальные ошибки в программном обеспечении могут привести к человеческим жертвам. Эта история демонстрирует, что даже небольшая ошибка в коде — а ошибки допускает любой программист — может стать смертельной, если за ней нет надежного контроля. Базовые принципы безопасности программирования сложной техники, выработанные после трагедии с Therac-25, остаются неизменными: многоуровневая защита, независимое тестирование, тщательная документация. Эта история напоминает, что никакая технологическая новинка и прибыль от нее не стоят человеческой жизни.