← all shorts

Engineering

Therac-25

#011 · 5 min read

A patient lies on a bed in front of a large white Therac-25 radiation therapy machine, surrounded by medical equipment in a clinical setting.

Between 1985 and 1987 a Canadian-built radiation therapy machine delivered overdoses a hundred times the prescribed level to at least six cancer patients. The hardware was fine. The fault was a race condition nobody had thought to test.

On 3 June 1985, a woman in her sixties at the Kennestone Regional Oncology Center in Marietta, Georgia, lay down for a routine follow-up dose after a lumpectomy. The technician set the Therac-25 for a 10 MeV electron beam to her clavicle. The patient felt a jolt of heat "like a hot cup of coffee" being poured into her shoulder. She walked out with a faint red mark. Within weeks the skin sloughed off, her arm went dead, and her breast had to be amputated. The hospital physicist asked the manufacturer, Atomic Energy of Canada Limited, whether the machine could have malfunctioned. He was told it could not.

Over the next twenty-one months the same machine, or its five siblings installed across North America, did the same thing five more times. A man in Hamilton, Ontario. A man in Yakima, Washington. Two patients in Tyler, Texas, three weeks apart. A patient in Yakima again. Three of the six died of the radiation injuries. The others were left paralysed or maimed. In every case the operator's screen had displayed a curt error — "Malfunction 54" — and a dose readout suggesting the patient had received either nothing or a normal fraction. The treatment log said everything was fine.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Two modes, one interlock

The Therac-25 was a linear accelerator that could deliver radiation in two modes. In electron mode it produced a low-current beam, around 200 rads, used for shallow tumours. In photon mode it ran the beam current up by a factor of roughly a hundred and slammed it into a tungsten target, producing the X-rays that did the deep work. The X-ray mode was only safe because a thick metal flattening filter and a beam-spreading magnet sat between the target and the patient. Without them, an unattenuated 25 MeV electron beam hit the skin directly.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Its predecessors, the Therac-6 and Therac-20, had used the same dual-mode design. They had also used electromechanical interlocks — physical microswitches that confirmed the turntable holding the target and filter was in the correct position before the beam could fire. The Therac-25 removed those interlocks. The safety check was moved entirely into the control software, a PDP-11 assembly program written, largely alone, by a single AECL programmer who had also written the code for the earlier models.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

The code reused routines from the Therac-20. On the older machine, hardware would have caught any software slip. On the new one, nothing would.

The eight-second window

Nancy Leveson, the computer scientist who eventually wrote up the definitive forensic account, traced the lethal sequence to a race condition in the data-entry routine. When the operator typed the prescription on the VT100 terminal, the software set magnet positions and beam parameters in a particular order. If the operator selected X-ray mode, then noticed a mistake, cursored back up, changed it to electron mode, and pressed return, all within roughly eight seconds, the magnet-setting subroutine would already have committed to one configuration while a separate flag flipped to the other. The turntable rotated to the electron-mode position — no target, no filter — while the beam parameters stayed at photon strength.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

The machine then fired a raw 25 MeV electron pencil into the patient at something like 25,000 rads per pulse. The dosimetry system, calibrated for the diffuse photon beam, saw almost nothing pass through its ion chamber and reported an underdose. The operator, trained to retry on underdose errors, pressed P to proceed. The machine fired again.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

The bug only surfaced once operators became fast enough at the data-entry screen to beat the eight-second window. Tyler's technician was averagely quick. The accidents clustered in late 1985 and 1986 because that was when the typing got fast.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

What we still don't know

We do not know how many overdoses went unreported. Six is the official count from the FDA investigation, but the failure mode produced injuries that mimicked radiation burns from ordinary treatment and deaths that mimicked tumour progression. The Tyler accidents were only diagnosed because a physicist named Fritz Hager spent days re-typing the prescription at the same speed as the operator, trying to reproduce the fault, and finally did.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

We do not know how much of the original source code has survived. AECL's submissions to the FDA were partial. Leveson and Clark Turner reconstructed the bug from operator logs, hardware traces, and AECL's own patches, not from a clean reading of the program.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

And we do not know who exactly the programmer was. AECL declined to name him in any public document. He is referred to in the literature only as "the programmer." He had no formal training in software engineering, which in 1982 was not unusual.

The Therac-25 is now the case study every safety-critical engineering course opens with — a machine whose only safety system was a piece of code nobody had read carefully enough, written by a man whose name we are not allowed to know, killing patients who had come in to be cured.

1985年至1987年间,一台加拿大制造的放射治疗仪向至少六名癌症患者输送了百倍于预设剂量的辐射。硬件并无故障。症结在于一种从未有人想到去测试的竞态条件。

1985年6月3日,在佐治亚州玛丽埃塔市的肯尼通区域肿瘤中心,一位六十多岁的女性躺下接受乳房肿块切除术后的常规后续剂量治疗。技术人员将Therac-25设置为10 MeV电子束,瞄准她的锁骨。患者感到一阵灼热,“就像一杯热咖啡”泼在了肩膀上。她离开时身上只有微弱的红印。几周内,她的皮肤开始脱落,手臂失去知觉,乳房最终不得不切除。医院的物理学家询问制造商Atomic Energy of Canada Limited机器是否可能发生故障。他得到的答复是不可能。

在接下来的21个月里,这台机器及其安装在北美的五台姊妹机又先后五次重演了同样的惨剧。安大略省汉密尔顿市的一名男子。华盛顿州雅基马市的一名男子。德克萨斯州泰勒市的三周内两名患者。雅基马市的又一名患者。六人中有三人死于放射性损伤,其余的人则留下了瘫痪或残疾。在每起案例中,操作员的屏幕上都只显示出简短的错误提示——“Malfunction 54”(54号故障)——而剂量读数则显示患者要么完全没有收到放射量,要么只收到了正常的微小部分。治疗日志显示一切正常。

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

两种模式,一种联锁

Therac-25是一款linear accelerator,能以两种模式输出放射线。在电子模式下,它产生低电流束,约200拉德,用于治疗表浅肿瘤。在光子模式下,它将束流提高约一百倍并轰击钨靶,产生用于深层治疗的X射线。X射线模式之所以安全,是因为在靶材和患者之间放置了厚金属平坦过滤器和束流扩散磁铁。如果没有这些装置,未经衰减的25 MeV电子束将直接击中皮肤。

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

它的前代产品Therac-6和Therac-20采用了相同的双模式设计。它们还使用了机电联锁装置——物理微动开关,用以确保装载靶材和过滤器的转盘在射线发射前处于正确位置。Therac-25移除了这些联锁。安全检查完全转移到了控制软件中,这是一个PDP-11汇编程序,主要由一名AECL程序员独自编写,他也曾编写过早期型号的代码。

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

代码重用了来自Therac-20的例程。在旧机器上,硬件能捕捉到任何软件失误;而在新机器上,却没有任何屏障。

八秒窗口

计算机科学家Nancy Leveson最终撰写了权威的取证报告,她将这一致命序列追溯到了数据录入例程中的一个竞态条件。当操作员在VT100终端上输入处方时,软件会按特定顺序设置磁铁位置和束流参数。如果操作员选择了X射线模式,随后发现错误,向上移动光标改为电子模式并按下回车,而整个过程在大约八秒钟内完成,那么磁铁设置子程序可能已经确认了一套配置,而另一个独立的标志位却切换到了另一套。转盘转到了电子模式位置——无靶材,无过滤器——而束流参数却留在了光子强度。

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

机器随后向患者发射出一道原始的25 MeV电子细束,每脉冲剂量高达约25,000拉德。剂量测定系统针对弥散的光子束进行了校准,其电离室几乎察觉不到通过的物质,从而报告剂量不足。习惯于在剂量不足错误时重试的操作员按下“P”键继续。机器再次发射。

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

只有当操作员在数据输入界面上的速度快到足以击穿那八秒窗口时,这个漏洞才会显现。泰勒市的技术人员手速处于平均水平。事故在1985年底和1986年集中爆发,正是因为那时打字速度提上来了。

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

依然未知的谜团

我们不知道有多少次过量照射未被上报。FDA调查得出的官方计数是六起,但这种失效模式造成的伤害极像常规治疗产生的放射性灼伤,导致的死亡也与肿瘤恶化极其相似。泰勒市的事故之所以被确诊,是因为一位名叫Fritz Hager的物理学家花费数天时间,以和操作员相同的速度重新输入处方,试图重现故障,并最终成功了。

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

我们不知道原始源代码还有多少存世。AECL提交给FDA的只是部分内容。Leveson和Clark Turner是通过操作员日志、硬件轨迹和AECL自己的补丁重构了该漏洞,而非通过对程序的清晰解读。

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

我们也不知道那名程序员具体是谁。AECL拒绝在任何公开文件中透露他的姓名。在文献中,他仅被称为“那个程序员”。他没有接受过正规的软件工程培训,这在1982年并不罕见。

Therac-25现在已成为每一门安全关键工程课程的开篇案例——这台机器唯一的安全系统是一段没人仔细阅读过的代码,由一个我们不被允许知晓姓名的男人编写,夺走了那些本为寻求治愈而来的患者的生命。

Entre 1985 y 1987, una máquina de radioterapia de fabricación canadiense administró sobredosis cien veces superiores al nivel prescrito a al menos seis pacientes con cáncer. El hardware estaba bien. El fallo fue una condición de carrera que nadie había pensado en probar.

El 3 de junio de 1985, una mujer de sesenta y tantos años en el Kennestone Regional Oncology Center de Marietta, Georgia, se recostó para recibir una dosis rutinaria de seguimiento tras una lumpectomía. El técnico configuró el Therac-25 para un haz de electrones de 10 MeV dirigido a su clavícula. La paciente sintió una sacudida de calor, «como si le vertieran una taza de café caliente» en el hombro. Salió de allí con una leve marca roja. En cuestión de semanas, la piel se le desprendió, su brazo quedó inerte y hubo que amputarle el pecho. El físico del hospital preguntó al fabricante, Atomic Energy of Canada Limited, si la máquina podía haber fallado. Le respondieron que era imposible.

Durante los siguientes veintiún meses, la misma máquina, o sus cinco hermanas instaladas por toda Norteamérica, hicieron lo mismo cinco veces más. Un hombre en Hamilton, Ontario. Un hombre en Yakima, Washington. Dos pacientes en Tyler, Texas, con tres semanas de diferencia. Un paciente en Yakima de nuevo. Tres de los seis murieron a causa de las lesiones por radiación. Los demás quedaron paralizados o mutilados. En cada caso, la pantalla del operador había mostrado un error seco —«Malfunction 54»— y una lectura de dosis que sugería que el paciente no había recibido nada o bien una fracción normal. El registro del tratamiento indicaba que todo estaba en orden.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Dos modos, un enclavamiento

El Therac-25 era un linear accelerator que podía suministrar radiación en dos modos. En el modo de electrones, producía un haz de baja corriente, de unos 200 rads, utilizado para tumores superficiales. En el modo de fotones, elevaba la corriente del haz en un factor de aproximadamente cien y lo proyectaba contra un blanco de tungsteno, produciendo los rayos X necesarios para el trabajo profundo. El modo de rayos X solo era seguro porque un grueso filtro aplanador de metal y un imán dispersor del haz se interponían entre el blanco y el paciente. Sin ellos, un haz de electrones de 25 MeV sin atenuar golpeaba la piel directamente.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Sus predecesores, el Therac-6 y el Therac-20, habían utilizado el mismo diseño de modo dual. También habían empleado enclavamientos electromecánicos: microinterruptores físicos que confirmaban que el plato giratorio que sostenía el blanco y el filtro estaba en la posición correcta antes de que el haz pudiera dispararse. El Therac-25 eliminó esos enclavamientos. La comprobación de seguridad se trasladó enteramente al software de control, un programa en ensamblador para el PDP-11 escrito, en gran medida en solitario, por un único programador de AECL que también había escrito el código de los modelos anteriores.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

El código reutilizaba rutinas del Therac-20. En la máquina antigua, el hardware habría detectado cualquier error de software. En la nueva, nada lo haría.

La ventana de ocho segundos

Nancy Leveson, la informática que finalmente redactó el informe forense definitivo, rastreó la secuencia letal hasta una condición de carrera en la rutina de entrada de datos. Cuando el operador escribía la prescripción en la terminal VT100, el software configuraba las posiciones de los imanes y los parámetros del haz en un orden determinado. Si el operador seleccionaba el modo de rayos X y luego advertía un error, subía con el cursor, lo cambiaba al modo de electrones y pulsaba retorno, todo en un margen de unos ocho segundos, la subrutina de configuración de imanes ya se habría comprometido con una configuración mientras una bandera independiente cambiaba a la otra. El plato giratorio rotaba hacia la posición del modo de electrones —sin blanco ni filtro— mientras los parámetros del haz permanecían con la potencia de los fotones.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

La máquina disparaba entonces un haz filiforme de electrones puros de 25 MeV contra el paciente a unas 25.000 rads por pulso. El sistema de dosimetría, calibrado para el haz difuso de fotones, no detectaba casi nada al pasar por su cámara de ionización e informaba de una dosis insuficiente. El operador, entrenado para reintentar el proceso ante errores de subdosis, pulsaba la tecla P para proceder. La máquina disparaba de nuevo.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

El error solo afloró una vez que los operadores se volvieron lo bastante rápidos ante la pantalla de entrada de datos como para superar la ventana de ocho segundos. El técnico de Tyler tenía una rapidez media. Los accidentes se concentraron a finales de 1985 y en 1986 porque fue entonces cuando la velocidad de escritura aumentó.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

Lo que todavía no sabemos

No sabemos cuántas sobredosis quedaron sin reportar. Seis es la cifra oficial de la investigación de la FDA, pero el modo de fallo producía lesiones que imitaban las quemaduras por radiación del tratamiento ordinario y muertes que imitaban la progresión del tumor. Los accidentes de Tyler solo se diagnosticaron porque un físico llamado Fritz Hager pasó días volviendo a escribir la prescripción a la misma velocidad que el operador, intentando reproducir el fallo, hasta que finalmente lo logró.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

No sabemos cuánto del código fuente original ha sobrevivido. Las presentaciones de AECL ante la FDA fueron parciales. Leveson y Clark Turner reconstruyeron el error a partir de los registros de los operadores, rastreos de hardware y los propios parches de AECL, no mediante una lectura limpia del programa.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

Y no sabemos exactamente quién era el programador. AECL se negó a identificarlo en cualquier documento público. En la literatura técnica se le menciona únicamente como «el programador». No tenía formación formal en ingeniería de software, algo que en 1982 no era inusual.

El Therac-25 es hoy el caso de estudio con el que se abren todos los cursos de ingeniería crítica para la seguridad: una máquina cuyo único sistema de seguridad era un fragmento de código que nadie había leído con suficiente atención, escrito por un hombre cuyo nombre no se nos permite conocer, matando a pacientes que habían acudido para ser curados.

Entre 1985 e 1987, uma máquina de radioterapia de fabricação canadense administrou doses cem vezes superiores ao nível prescrito a pelo menos seis pacientes com câncer. O hardware estava em ordem. A falha foi uma condição de corrida que ninguém pensara em testar.

Em 3 de junho de 1985, uma mulher na casa dos sessenta anos no Kennestone Regional Oncology Center em Marietta, Geórgia, deitou-se para uma dose de rotina de acompanhamento após uma lumpectomia. O técnico configurou o Therac-25 para um feixe de elétrons de 10 MeV em sua clavícula. A paciente sentiu um sobressalto de calor "como se uma xícara de café quente" estivesse sendo despejada em seu ombro. Ela saiu com uma leve marca vermelha. Em poucas semanas, a pele começou a desprender-se, seu braço paralisou e seu seio teve de ser amputado. O físico do hospital perguntou ao fabricante, a Atomic Energy of Canada Limited, se a máquina poderia ter falhado. Disseram-lhe que não.

Ao longo dos vinte e um meses seguintes, a mesma máquina, ou suas cinco irmãs instaladas pela América do Norte, fizeram a mesma coisa mais cinco vezes. Um homem em Hamilton, Ontário. Um homem em Yakima, Washington. Dois pacientes em Tyler, Texas, com três semanas de intervalo. Novamente um paciente em Yakima. Três dos seis morreram devido aos ferimentos causados pela radiação. Os outros ficaram paralisados ou mutilados. Em todos os casos, a tela do operador exibira um erro seco — "Mau funcionamento 54" — e uma leitura de dose sugerindo que o paciente não recebera nada ou apenas uma fração normal. O registro do tratamento dizia que estava tudo bem.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Dois modos, um intertravamento

O Therac-25 era um linear accelerator que podia emitir radiação em dois modos. No modo de elétrons, produzia um feixe de baixa corrente, em torno de 200 rads, usado para tumores superficiais. No modo de fótons, a corrente do feixe era elevada por um fator de aproximadamente cem vezes e lançada contra um alvo de tungstênio, produzindo os raios X que realizavam o trabalho profundo. O modo de raios X só era seguro porque um espesso filtro nivelador de metal e um ímã espalhador de feixe ficavam posicionados entre o alvo e o paciente. Sem eles, um feixe de elétrons de 25 MeV não atenuado atingia a pele diretamente.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Seus antecessores, o Therac-6 e o Therac-20, utilizaram o mesmo design de modo duplo. Eles também utilizavam intertravamentos eletromecânicos — microchaves físicas que confirmavam se a mesa giratória que segurava o alvo e o filtro estava na posição correta antes que o feixe pudesse ser disparado. O Therac-25 removeu esses travamentos. A verificação de segurança foi transferida inteiramente para o software de controle, um programa em assembly para o PDP-11 escrito, em grande parte sozinho, por um único programador da AECL que também escrevera o código para os modelos anteriores.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

O código reutilizava rotinas do Therac-20. Na máquina mais antiga, o hardware teria detectado qualquer lapso do software. Na nova, nada o faria.

A janela de oito segundos

Nancy Leveson, a cientista da computação que eventualmente escreveu o relato forense definitivo, rastreou a sequência letal até uma condição de corrida na rotina de entrada de dados. Quando o operador digitava a prescrição no terminal VT100, o software configurava as posições dos ímãs e os parâmetros do feixe em uma ordem específica. Se o operador selecionasse o modo de raios X, percebesse um erro, voltasse com o cursor, alterasse para o modo de elétrons e pressionasse "return", tudo em aproximadamente oito segundos, a sub-rotina de configuração dos ímãs já teria se comprometido com uma configuração enquanto um sinalizador separado mudava para a outra. A mesa giratória rodava para a posição do modo de elétrons — sem alvo, sem filtro — enquanto os parâmetros do feixe permaneciam na intensidade de fótons.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

A máquina então disparava um feixe concentrado de elétrons puros de 25 MeV no paciente a cerca de 25.000 rads por pulso. O sistema de dosimetria, calibrado para o feixe difuso de fótons, via quase nada passar por sua câmara de ionização e relatava uma subdose. O operador, treinado para tentar novamente em erros de subdose, pressionava P para prosseguir. A máquina disparava outra vez.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

O erro só aparecia quando os operadores se tornavam rápidos o suficiente na tela de entrada de dados para vencer a janela de oito segundos. O técnico de Tyler tinha uma agilidade média. Os acidentes concentraram-se no final de 1985 e em 1986 porque foi nessa época que a digitação se tornou veloz.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

O que ainda não sabemos

Não sabemos quantas overdoses não foram relatadas. Seis é a contagem oficial da investigação do FDA, mas o modo de falha produzia ferimentos que imitavam queimaduras de radiação de um tratamento comum e mortes que imitavam a progressão tumoral. Os acidentes de Tyler só foram diagnosticados porque um físico chamado Fritz Hager passou dias redigitando a prescrição na mesma velocidade do operador, tentando reproduzir a falha, até que finalmente conseguiu.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

Não sabemos quanto do código-fonte original sobreviveu. As submissões da AECL ao FDA foram parciais. Leveson e Clark Turner reconstruíram o erro a partir de registros de operadores, rastros de hardware e das próprias correções da AECL, não de uma leitura limpa do programa.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

E não sabemos exatamente quem era o programador. A AECL recusou-se a nomeá-lo em qualquer documento público. Ele é referido na literatura apenas como "o programador". Ele não tinha formação formal em engenharia de software, o que em 1982 não era incomum.

O Therac-25 é hoje o estudo de caso com o qual todo curso de engenharia de sistemas críticos começa — uma máquina cujo único sistema de segurança era um trecho de código que ninguém lera com cuidado suficiente, escrito por um homem cujo nome não nos é permitido saber, matando pacientes que vieram para serem curados.

بين عامي ١٩٨٥ و١٩٨٧، وجّه جهاز كندي الصنع للعلاج الإشعاعي جرعات مفرطة بلغت مئة ضعف المستوى المقرر لستة من مرضى السرطان على الأقل. كان العتاد سليماً؛ إذ كمن الخلل في "حالة تسابق" لم يخطر ببال أحد اختبارها.

في الثالث من حزيران/يونيو 1985، استلقت سيدة في الستينيات من عمرها في مركز كينيستون الإقليمي لعلاج الأورام في ماريتا بولاية جورجيا، لتلقي جرعة متابعة روتينية بعد عملية استئصال ورم. ضبط الفني جهاز Therac-25 على شعاع إلكتروني بقوة 10 ميجا إلكترون فولت ليوجه نحو ترقوتها. شعرت المريضة بصدمة حرارة "كأن كوباً من القهوة الساخنة" يُسكب على كتفها. غادرت المركز وهي تحمل علامة حمراء شاحبة، لكن في غضون أسابيع، تهرأ جلدها، وشُلت ذراعها، واضطر الأطباء لاستئصال ثديها. سأل فيزيائي المستشفى الشركة المصنعة، Atomic Energy of Canada Limited، عما إذا كان من الممكن أن يكون الجهاز قد تعطل، فقيل له إن ذلك مستحيل.

وعلى مدى الأشهر الواحد والعشرين التالية، كرر الجهاز نفسه، أو أجهزته الخمسة الشبيهة المثبتة في أنحاء أمريكا الشمالية، الفعلة ذاتها خمس مرات أخرى. رجل في هاميلتون بأونتاريو، ورجل في ياكيما بواشنطن، ومريضان في تايلر بتكساس بفارق ثلاثة أسابيع بينهما، ومريض آخر في ياكيما. توفي ثلاثة من الستة متأثرين بإصابات إشعاعية، بينما تُرِك الآخرون مصابين بالشلل أو بعاهات مستديمة. وفي كل حالة، كانت شاشة المشغل تعرض خطأً مقتضباً — "عطل 54" (Malfunction 54) — مع قراءة للجرعة تشير إلى أن المريض لم يتلقَّ شيئاً أو تلقى جزءاً طبيعياً من الجرعة، بينما سجل علاج المريض يؤكد أن كل شيء على ما يرام.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

نمطان، وقفل أمان واحد

كان جهاز "ثيراك-25" عبارة عن linear accelerator (مسرع خطي) يمكنه تقديم الإشعاع في نمطين. في "نمط الإلكترون"، يُنتج شعاعاً منخفض التيار، بحدود 200 راد، يُستخدم للأورام السطحية. أما في "نمط الفوتون"، فيرتفع تيار الشعاع بمعامل يصل إلى مئة ضعف تقريباً ويصطدم بهدف من التنجستن، لينتج الأشعة السينية التي تنفذ إلى الأورام العميقة. لم يكن نمط الأشعة السينية آمناً إلا بسبب وجود مرشح تسوية معدني سميك ومغناطيس لنشر الشعاع يقعان بين الهدف والمريض. وبدونهما، يضرب شعاع إلكتروني غير مخفف بقوة 25 ميجا إلكترون فولت الجلد مباشرة.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

استخدم سلفاه، "ثيراك-6" و"ثيراك-20"، التصميم ثنائي النمط نفسه، لكنهما استخدما أيضاً أقفال أمان كهروميكانيكية — وهي مفاتيح مادية دقيقة تؤكد أن الطاولة الدوارة التي تحمل الهدف والمرشح في الموضع الصحيح قبل أن ينطلق الشعاع. أما في "ثيراك-25"، فقد أزيلت تلك الأقفال، ونُقِل فحص السلامة بالكامل إلى برنامج التحكم، وهو برنامج مكتوب بلغة التجميع (Assembly) لمعالج PDP-11، صاغه بمفرده إلى حد كبير مبرمج واحد من شركة "AECL" كان قد كتب أيضاً الكود الخاص بالموديلات السابقة.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

أعاد الكود استخدام روتينيات من "ثيراك-20". في الجهاز القديم، كانت الأجزاء الصلبة (Hardware) لتلتقط أي هفوة برمجية، أما في الجهاز الجديد، فلا شيء يمكنه فعل ذلك.

نافذة الثواني الثماني

تمكنت Nancy Leveson، عالمة الحاسوب التي كتبت لاحقاً التقرير الجنائي الحاسم عن الواقعة، من تتبع التسلسل القاتل وصولاً إلى "حالة تسابق" (race condition) في روتين إدخال البيانات. فعندما يكتب المشغل الوصفة الطبية على طرفية "VT100"، يقوم البرنامج بضبط أوضاع المغناطيس ومعاملات الشعاع بترتيب معين. وإذا اختار المشغل نمط الأشعة السينية، ثم لاحظ خطأً، وحرك المؤشر للأعلى، وغيره إلى نمط الإلكترون، وضغط على زر الإدخال، كل ذلك في غضون ثماني ثوانٍ تقريباً، يكون الروتين الفرعي لضبط المغناطيس قد التزم بالفعل بتهيئة واحدة بينما انتقلت "علامة" (flag) منفصلة إلى التهيئة الأخرى. وهكذا تدور الطاولة إلى وضع نمط الإلكترون — بلا هدف ولا مرشح — بينما تظل معاملات الشعاع عند قوة الفوتون.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

عندئذٍ يطلق الجهاز شعاعاً إلكترونياً خاماً بتركيز القلم وبقوة 25 ميجا إلكترون فولت نحو المريض، بجرعة تقارب 25,000 راد لكل نبضة. ونظراً لأن نظام قياس الجرعات معاير لشعاع الفوتون المنتشر، فإنه لا يكاد يرى شيئاً يمر عبر غرفته الأيونية، فيبلغ عن نقص في الجرعة. وبسبب تدريب المشغلين على إعادة المحاولة عند حدوث أخطاء نقص الجرعة، يضغط المشغل على مفتاح "P" للمتابعة، فيطلق الجهاز شعاعه مرة أخرى.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

لم تظهر هذه الثغرة إلا بعد أن أصبح المشغلون سريعين بما يكفي في التعامل مع شاشة إدخال البيانات ليتفوقوا على نافذة الثواني الثماني. كان فني مستشفى "تايلر" متوسط السرعة، وقد تجمعت الحوادث في أواخر عام 1985 وعام 1986 لأن ذلك كان الوقت الذي وصلت فيه سرعة الطباعة إلى ذروتها.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

ما لا نزال نجهله

لا نعرف كم عدد حالات الجرعات الزائدة التي لم يتم الإبلاغ عنها. الرقم الرسمي هو ست حالات وفقاً لتحقيقات الـ FDA، لكن طبيعة العطل أنتجت إصابات تشبه حروق الإشعاع الناتجة عن العلاج العادي، ووفيات تشبه تطور الورم. ولم تُشخص حوادث "تايلر" إلا لأن فيزيائياً يُدعى فريتز هاجر قضى أياماً في إعادة كتابة الوصفة الطبية بالسرعة نفسها التي كان يكتب بها المشغل، محاولاً إعادة إنتاج الخطأ، حتى نجح في النهاية.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

ولا نعرف مقدار ما تبقى من كود المصدر الأصلي؛ إذ كانت الوثائق التي قدمتها شركة "AECL" إلى إدارة الغذاء والدواء جزئية. وقد أعادت "ليفسون" وكلارك تيرنر بناء الثغرة من سجلات المشغلين، وتتبعات الأجزاء الصلبة، والترقيعات البرمجية التي أجرتها الشركة نفسها، وليس من قراءة مباشرة ونظيفة للبرنامج.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

كما أننا لا نعرف على وجه التحديد من كان ذلك المبرمج؛ فقد رفضت الشركة تسميته في أي وثيقة عامة، ويُشار إليه في المراجع فقط بلقب "المبرمج". لم يكن لديه تدريب رسمي في هندسة البرمجيات، وهو أمر لم يكن غير مألوف في عام 1982.

أصبح جهاز "ثيراك-25" الآن هو الحالة الدراسية التي تبدأ بها كل دورة هندسية حول الأنظمة الحساسة للسلامة؛ جهاز كان نظام أمانه الوحيد عبارة عن قطعة من الكود لم يقرأها أحد بعناية كافية، كتبها رجل لا يُسمح لنا بمعرفة اسمه، لتقضي على مرضى جاؤوا طلباً للشفاء.

Antara 1985 dan 1987, sebuah mesin terapi radiasi buatan Kanada memapar setidaknya enam pasien kanker dengan dosis seratus kali lipat dari kadar yang ditentukan. Perangkat kerasnya baik-baik saja. Kesalahannya terletak pada sebuah *race condition* yang tak pernah terpikir untuk diuji.

Pada 3 Juni 1985, seorang wanita berusia enam puluhan di Pusat Onkologi Regional Kennestone di Marietta, Georgia, berbaring untuk dosis tindak lanjut rutin setelah prosedur lumpektomi. Teknisi mengatur Therac-25 untuk berkas elektron 10 MeV ke tulang selangkanya. Pasien merasakan sengatan panas "seperti secangkir kopi panas" yang ditumpahkan ke bahunya. Ia keluar dengan tanda merah samar. Dalam hitungan minggu, kulitnya mengelupas, lengannya lumpuh, dan payudaranya harus diamputasi. Fisikawan rumah sakit bertanya kepada produsen, Atomic Energy of Canada Limited, apakah mesin tersebut mungkin mengalami malfungsi. Ia diberi tahu bahwa hal itu tidak mungkin terjadi.

Selama dua puluh satu bulan berikutnya, mesin yang sama, atau lima saudara kembarnya yang dipasang di seluruh Amerika Utara, melakukan hal serupa lima kali lagi. Seorang pria di Hamilton, Ontario. Seorang pria di Yakima, Washington. Dua pasien di Tyler, Texas, dalam selang waktu tiga minggu. Seorang pasien di Yakima lagi. Tiga dari enam orang tersebut meninggal akibat cedera radiasi. Sisanya lumpuh atau cacat. Dalam setiap kasus, layar operator menampilkan kesalahan singkat—"Malfunction 54"—dan pembacaan dosis yang menunjukkan bahwa pasien tidak menerima radiasi apa pun atau hanya menerima fraksi normal. Log perawatan menyatakan semuanya baik-baik saja.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Dua mode, satu interlock

Therac-25 adalah sebuah linear accelerator yang dapat memancarkan radiasi dalam dua mode. Dalam mode elektron, mesin ini menghasilkan berkas arus rendah, sekitar 200 rad, yang digunakan untuk tumor dangkal. Dalam mode foton, mesin ini meningkatkan arus berkas sekitar seratus kali lipat dan menabrakkannya ke target tungsten, menghasilkan sinar-X yang bekerja untuk area yang dalam. Mode sinar-X hanya aman karena filter perata logam tebal dan magnet penyebar berkas berada di antara target dan pasien. Tanpa komponen-komponen tersebut, berkas elektron 25 MeV tanpa pelemahan akan langsung menghantam kulit.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Pendahulunya, Therac-6 dan Therac-20, menggunakan desain dua mode yang sama. Keduanya juga menggunakan interlock elektromekanis—mikrosakel fisik yang memastikan meja putar yang menahan target dan filter berada pada posisi yang tepat sebelum berkas dipancarkan. Therac-25 menghilangkan interlock tersebut. Pemeriksaan keamanan sepenuhnya dipindahkan ke perangkat lunak kendali, sebuah program bahasa rakitan PDP-11 yang ditulis, sebagian besar sendirian, oleh seorang pemrogram tunggal AECL yang juga menulis kode untuk model-model sebelumnya.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

Kode tersebut menggunakan kembali rutin-rutin dari Therac-20. Pada mesin lama, perangkat keras akan menangkap kesalahan perangkat lunak apa pun. Pada mesin baru, tidak ada yang melindunginya.

Jendela delapan detik

Nancy Leveson, ilmuwan komputer yang akhirnya menyusun laporan forensik definitif, melacak urutan mematikan tersebut ke sebuah *race condition* dalam rutin entri data. Ketika operator mengetik resep pada terminal VT100, perangkat lunak mengatur posisi magnet dan parameter berkas dalam urutan tertentu. Jika operator memilih mode sinar-X, lalu menyadari kesalahan, menggerakkan kursor kembali ke atas, mengubahnya ke mode elektron, dan menekan *return*, semuanya dalam waktu kurang lebih delapan detik, subrutin pengaturan magnet sudah berkomitmen pada satu konfigurasi sementara sebuah penanda (flag) terpisah beralih ke konfigurasi lainnya. Meja putar berotasi ke posisi mode elektron—tanpa target, tanpa filter—sementara parameter berkas tetap pada kekuatan foton.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

Mesin tersebut kemudian menembakkan seberkas elektron 25 MeV murni ke pasien dengan kekuatan sekitar 25.000 rad per pulsa. Sistem dosimetri, yang dikalibrasi untuk berkas foton yang menyebar, hampir tidak mendeteksi apa pun yang melewati ruang ionnya dan melaporkan dosis yang kurang (*underdose*). Operator, yang dilatih untuk mencoba lagi saat terjadi kesalahan *underdose*, menekan P untuk melanjutkan. Mesin menembak lagi.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

Bug tersebut hanya muncul setelah operator menjadi cukup mahir di layar entri data hingga mampu melampaui jendela delapan detik tersebut. Teknisi di Tyler memiliki kecepatan rata-rata. Rentetan kecelakaan tersebut berkumpul pada akhir 1985 dan 1986 karena itulah saat ketika kecepatan mengetik para operator mulai meningkat.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

Apa yang masih belum kita ketahui

Kita tidak tahu berapa banyak kasus kelebihan dosis yang tidak dilaporkan. Enam adalah hitungan resmi dari investigasi FDA, tetapi mode kegagalan tersebut menghasilkan cedera yang menyerupai luka bakar radiasi dari perawatan biasa dan kematian yang menyerupai perkembangan tumor. Kecelakaan di Tyler hanya dapat didiagnosis karena seorang fisikawan bernama Fritz Hager menghabiskan waktu berhari-hari mengetik ulang resep dengan kecepatan yang sama dengan operator, mencoba mereproduksi kesalahan tersebut, dan akhirnya berhasil.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

Kita tidak tahu seberapa banyak kode sumber aslinya yang masih tersisa. Dokumen yang diserahkan AECL kepada FDA hanya sebagian. Leveson dan Clark Turner merekonstruksi bug tersebut dari log operator, jejak perangkat keras, dan tambalan (*patch*) milik AECL sendiri, bukan dari pembacaan langsung program tersebut.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

Dan kita tidak tahu siapa sebenarnya pemrogram itu. AECL menolak menyebutkan namanya dalam dokumen publik mana pun. Ia disebut dalam literatur hanya sebagai "si pemrogram." Ia tidak memiliki pelatihan formal dalam rekayasa perangkat lunak, yang pada tahun 1982 bukanlah hal yang aneh.

Therac-25 kini menjadi studi kasus yang membuka setiap kursus rekayasa kritis-keselamatan—sebuah mesin yang satu-satunya sistem keamanannya adalah sepotong kode yang tidak dibaca dengan cukup teliti oleh siapa pun, ditulis oleh seorang pria yang namanya tidak boleh kita ketahui, membunuh pasien yang datang dengan harapan untuk disembuhkan.

१९८५ और १९८७ के बीच, कनाडा में निर्मित एक रेडिएशन थेरेपी मशीन ने कम से कम छह कैंसर रोगियों को निर्धारित स्तर से सौ गुना अधिक मात्रा दे दी। हार्डवेयर बिल्कुल दुरुस्त था। असल दोष एक ऐसी 'रेस कंडीशन' थी, जिसका परीक्षण करने के बारे में किसी ने सोचा तक न था।

3 जून 1985 को, जॉर्जिया के मैरिएटा स्थित केनेस्टोन रीजनल ऑन्कोलॉजी सेंटर में साठ के दशक की एक महिला लम्पेक्टोमी के बाद नियमित फॉलो-अप डोज़ के लिए लेटीं। तकनीशियन ने उनकी हंसली पर 10 MeV के इलेक्ट्रॉन बीम के लिए Therac-25 सेट किया। मरीज़ को गर्मी का एक ऐसा तेज़ झटका महसूस हुआ जैसे उनके कंधे पर "कॉफी का कोई गर्म प्याला" उड़ेल दिया गया हो। वह कंधे पर एक हल्के लाल निशान के साथ बाहर निकलीं। कुछ ही हफ्तों में उनकी त्वचा गलने लगी, उनका हाथ सुन्न पड़ गया और उनके स्तन को काटकर अलग करना पड़ा। अस्पताल के भौतिक विज्ञानी ने निर्माता कंपनी Atomic Energy of Canada Limited से पूछा कि क्या मशीन में कोई खराबी हो सकती है। उन्हें बताया गया कि ऐसा संभव नहीं है।

अगले इक्कीस महीनों में उसी मशीन ने, या उत्तरी अमेरिका में स्थापित उसकी पाँच अन्य मशीनों ने, पाँच बार फिर यही दोहराया। हैमिल्टन, ओंटारियो में एक व्यक्ति। याकिमा, वाशिंगटन में एक व्यक्ति। टेक्सास के टायलर में तीन सप्ताह के अंतराल पर दो मरीज़। याकिमा में फिर से एक मरीज़। छह में से तीन की मौत विकिरण की चोटों से हुई। अन्य लकवाग्रस्त हो गए या अपंग रह गए। हर मामले में ऑपरेटर की स्क्रीन पर एक संक्षिप्त त्रुटि संदेश — "मालफंक्शन 54" — दिखाई दिया था और डोज़ की रीडिंग यह बता रही थी कि मरीज़ को या तो कुछ नहीं मिला या फिर सामान्य मात्रा मिली। ट्रीटमेंट लॉग के अनुसार सब कुछ ठीक था।

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

दो मोड, एक इंटरलॉक

थेरैक-25 एक linear accelerator था जो दो मोड में विकिरण पहुँचा सकता था। इलेक्ट्रॉन मोड में यह कम करंट वाला बीम (लगभग 200 रैड्स) पैदा करता था, जिसका उपयोग उथले ट्यूमर के लिए किया जाता था। फोटॉन मोड में यह बीम करंट को लगभग सौ गुना बढ़ा देता था और उसे टंगस्टन के एक लक्ष्य से टकराता था, जिससे एक्स-रे पैदा होते थे जो शरीर की गहराई में काम करते थे। एक्स-रे मोड केवल इसलिए सुरक्षित था क्योंकि लक्ष्य और मरीज़ के बीच एक मोटी धातु का फ़्लैटनिंग फ़िल्टर और बीम फैलाने वाला चुंबक लगा होता था। इनके बिना, 25 MeV का बिना रुकावट वाला इलेक्ट्रॉन बीम सीधे त्वचा से टकराता था।

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

इसकी पूर्ववर्ती मशीनों, थेरैक-6 और थेरैक-20 में भी यही डुअल-मोड डिज़ाइन इस्तेमाल किया गया था। उन्होंने इलेक्ट्रोमैकेनिकल इंटरलॉक का भी उपयोग किया था — वे भौतिक माइक्रोस्विच जो पुष्टि करते थे कि बीम चलने से पहले लक्ष्य और फ़िल्टर को थामने वाला टर्नटेबल सही स्थिति में है। थेरैक-25 ने उन इंटरलॉक को हटा दिया। सुरक्षा जांच को पूरी तरह से कंट्रोल सॉफ्टवेयर में स्थानांतरित कर दिया गया था, जो एक PDP-11 असेंबली प्रोग्राम था। इसे काफी हद तक अकेले एईसीएल के एक प्रोग्रामर ने लिखा था, जिसने पिछले मॉडलों के लिए भी कोड लिखा था।

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

कोड में थेरैक-20 के रूटीन का ही पुन: उपयोग किया गया था। पुरानी मशीन पर, हार्डवेयर सॉफ्टवेयर की किसी भी चूक को पकड़ लेता। नई मशीन पर, उसे रोकने के लिए कुछ नहीं था।

आठ सेकंड की वह खिड़की

कंप्यूटर वैज्ञानिक Nancy Leveson, जिन्होंने अंततः इसका निर्णायक फॉरेंसिक विवरण लिखा, ने इस घातक क्रम का पता डेटा-एंट्री रूटीन की एक 'रेस कंडीशन' में लगाया। जब ऑपरेटर VT100 टर्मिनल पर निर्देश टाइप करता था, तो सॉफ्टवेयर एक विशेष क्रम में चुंबक की स्थिति और बीम के मापदंडों को सेट करता था। यदि ऑपरेटर ने एक्स-रे मोड चुना, फिर अपनी गलती महसूस की, कर्सर को वापस ऊपर ले गया, उसे इलेक्ट्रॉन मोड में बदला और एंटर दबाया — और यह सब लगभग आठ सेकंड के भीतर किया — तो चुंबक सेट करने वाला सबरूटीन पहले से ही एक कॉन्फ़िगरेशन के लिए प्रतिबद्ध हो चुका होता था, जबकि एक अलग फ्लैग दूसरे मोड की ओर मुड़ जाता था। टर्नटेबल इलेक्ट्रॉन-मोड की स्थिति (बिना लक्ष्य, बिना फ़िल्टर के) में घूम जाता था — जबकि बीम के मापदंड फोटॉन मोड की शक्ति पर ही रहते थे।

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

इसके बाद मशीन ने मरीज़ के शरीर में लगभग 25,000 रैड्स प्रति पल्स की तीव्रता से 25 MeV के इलेक्ट्रॉन की एक सीधी धार छोड़ दी। डोसिमेट्री सिस्टम, जिसे बिखरे हुए फोटॉन बीम के लिए कैलिब्रेट किया गया था, ने अपने आयन चैंबर से लगभग कुछ भी गुजरते हुए नहीं देखा और कम डोज़ की रिपोर्ट दी। ऑपरेटर ने, जिसे कम डोज़ वाली त्रुटियों पर दोबारा प्रयास करने के लिए प्रशिक्षित किया गया था, आगे बढ़ने के लिए P दबाया। मशीन ने फिर से वही किया।

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

यह बग केवल तब सामने आया जब ऑपरेटर डेटा-एंट्री स्क्रीन पर इतने तेज़ हो गए कि वे आठ सेकंड की उस खिड़की को मात देने लगे। टायलर का तकनीशियन औसत रूप से तेज़ था। ये दुर्घटनाएँ 1985 के अंत और 1986 में अधिक हुईं क्योंकि तब तक टाइपिंग की गति बढ़ चुकी थी।

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

वह जो हम अब भी नहीं जानते

हमें नहीं पता कि कितनी ओवरडोज़ की रिपोर्ट ही नहीं की गई। FDA की जाँच के अनुसार आधिकारिक संख्या छह है, लेकिन इस खराबी के कारण होने वाली चोटें सामान्य उपचार से होने वाले रेडिएशन बर्न जैसी लगती थीं और मौतें ऐसी लगती थीं जैसे ट्यूमर बढ़ गया हो। टायलर की दुर्घटनाओं का निदान केवल इसलिए हो पाया क्योंकि फ्रिट्ज़ हैगर नामक एक भौतिक विज्ञानी ने ऑपरेटर के समान गति से नुस्खे को बार-बार टाइप करने में कई दिन बिताए, ताकि वह उस त्रुटि को दोहरा सकें, और अंततः उन्होंने ऐसा कर दिखाया।

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

हम नहीं जानते कि मूल सोर्स कोड का कितना हिस्सा सुरक्षित बचा है। एईसीएल द्वारा एफडीए को सौंपे गए दस्तावेज़ अधूरे थे। लेवेसन और क्लार्क टर्नर ने ऑपरेटर लॉग, हार्डवेयर के निशान और एईसीएल के अपने पैच से इस बग को फिर से तैयार किया, न कि प्रोग्राम के किसी स्पष्ट अध्ययन से।

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

और हम ठीक-ठीक नहीं जानते कि वह प्रोग्रामर कौन था। एईसीएल ने किसी भी सार्वजनिक दस्तावेज़ में उसका नाम बताने से इनकार कर दिया। साहित्य में उसका उल्लेख केवल "प्रोग्रामर" के रूप में किया गया है। सॉफ्टवेयर इंजीनियरिंग में उनके पास कोई औपचारिक प्रशिक्षण नहीं था, जो 1982 में कोई असामान्य बात नहीं थी।

थेरैक-25 अब हर उस इंजीनियरिंग कोर्स का केस स्टडी है जो सुरक्षा-महत्वपूर्ण प्रणालियों से शुरू होता है — एक ऐसी मशीन जिसकी एकमात्र सुरक्षा प्रणाली कोड का एक ऐसा टुकड़ा था जिसे किसी ने भी पर्याप्त ध्यान से नहीं पढ़ा था, जिसे एक ऐसे व्यक्ति ने लिखा था जिसका नाम हमें जानने की अनुमति नहीं है, और जो उन मरीज़ों की जान ले रही थी जो ठीक होने के लिए आए थे।

Entre 1985 et 1987, un appareil de radiothérapie de conception canadienne a administré à au moins six patients cancéreux des surdoses cent fois supérieures à la dose prescrite. Le matériel était hors de cause. La faute incombait à une condition de concurrence que nul n'avait songé à tester.

Le 3 juin 1985, au Kennestone Regional Oncology Center de Marietta, en Géorgie, une femme d’une soixantaine d’années s’allongea pour recevoir une dose de suivi de routine après une lumpectomie. Le technicien régla le Therac-25 sur un faisceau d’électrons de 10 MeV dirigé vers sa clavicule. La patiente ressentit une décharge de chaleur, « comme si on lui versait une tasse de café brûlant » sur l’épaule. Elle quitta l’hôpital avec une légère marque rouge. En quelques semaines, sa peau se détacha par lambeaux, son bras devint inerte et elle dut subir une amputation du sein. Le physicien de l’hôpital demanda au fabricant, Atomic Energy of Canada Limited, si la machine avait pu dysfonctionner. On lui répondit que c’était impossible.

Au cours des vingt et un mois suivants, la même machine, ou ses cinq semblables installées à travers l’Amérique du Nord, répétèrent le même scénario à cinq reprises. Un homme à Hamilton, en Ontario. Un homme à Yakima, dans l’État de Washington. Deux patients à Tyler, au Texas, à trois semaines d’intervalle. Puis à nouveau un patient à Yakima. Trois des six victimes succombèrent à leurs lésions radiologiques. Les autres restèrent paralysées ou mutilées. Dans chaque cas, l’écran de l’opérateur avait affiché une erreur laconique — « Malfunction 54 » — et une lecture de dose suggérant que le patient n’avait rien reçu ou une fraction normale. Le registre de traitement indiquait que tout s'était bien passé.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Deux modes, un seul verrouillage

Le Therac-25 était un linear accelerator capable de délivrer des radiations selon deux modes. En mode électrons, il produisait un faisceau de faible intensité, d’environ 200 rads, utilisé pour les tumeurs superficielles. En mode photons, il augmentait l'intensité du faisceau d’un facteur cent environ et le projetait contre une cible en tungstène, produisant les rayons X nécessaires au traitement en profondeur. Le mode rayons X n’était sûr que parce qu’un épais filtre d’égalisation métallique et un aimant de balayage du faisceau se trouvaient entre la cible et le patient. Sans eux, un faisceau d’électrons de 25 MeV non atténué frappait directement la peau.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Ses prédécesseurs, le Therac-6 et le Therac-20, utilisaient la même conception bi-mode. Ils employaient également des verrouillages électromécaniques — des microrupteurs physiques qui confirmaient que le plateau tournant supportant la cible et le filtre était dans la bonne position avant que le faisceau ne soit activé. Le Therac-25 supprima ces sécurités physiques. Le contrôle de sécurité fut entièrement confié au logiciel de commande, un programme en assembleur PDP-11 écrit, pour l'essentiel en solitaire, par un unique programmeur de l'AECL qui avait également conçu le code des modèles précédents.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

Le code réutilisait des routines du Therac-20. Sur l’ancienne machine, le matériel aurait intercepté toute erreur logicielle. Sur la nouvelle, rien n'était prévu pour cela.

La fenêtre des huit secondes

Nancy Leveson, l’informaticienne qui rédigea par la suite le compte rendu d’expertise définitif, fit remonter la séquence mortelle à une condition de concurrence dans la routine de saisie des données. Lorsque l’opérateur tapait l’ordonnance sur le terminal VT100, le logiciel régla la position des aimants et les paramètres du faisceau dans un ordre précis. Si l’opérateur sélectionnait le mode rayons X, remarquait une erreur, remontait le curseur, changeait pour le mode électrons et appuyait sur Entrée, le tout en l’espace d’environ huit secondes, le sous-programme de réglage des aimants s’était déjà engagé dans une configuration tandis qu’un indicateur distinct basculait sur l’autre. Le plateau pivotait vers la position du mode électrons — sans cible ni filtre — alors que les paramètres du faisceau restaient à la puissance des photons.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

La machine projetait alors un mince faisceau d’électrons brut de 25 MeV sur le patient, à raison d’environ 25 000 rads par impulsion. Le système de dosimétrie, calibré pour le faisceau de photons diffus, ne détectait presque rien passer à travers sa chambre d’ionisation et signalait un sous-dosage. L’opérateur, habitué à réessayer en cas d’erreurs de sous-dosage, appuyait sur la touche P pour continuer. La machine tirait à nouveau.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

Le bug ne fit surface qu’une fois que les opérateurs devinrent assez rapides sur l’écran de saisie pour battre la fenêtre des huit secondes. Le technicien de Tyler était d'une rapidité moyenne. Les accidents se sont multipliés fin 1985 et en 1986, car c'est à cette période que la frappe est devenue véloce.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

Ce que nous ignorons encore

Nous ignorons combien de surdosages n’ont jamais été signalés. Six est le décompte officiel de l’enquête de la FDA, mais le mode de défaillance produisait des lésions qui imitaient les brûlures radiologiques d’un traitement ordinaire, et des décès qui ressemblaient à une progression tumorale. Les accidents de Tyler ne furent diagnostiqués que parce qu’un physicien nommé Fritz Hager passa des jours à retaper l’ordonnance à la même vitesse que l’opérateur, tentant de reproduire la faille, jusqu’à y parvenir enfin.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

Nous ne savons pas quelle proportion du code source original a survécu. Les documents fournis par l'AECL à la FDA étaient partiels. Leveson et Clark Turner ont reconstitué le bug à partir des journaux de bord des opérateurs, des traces matérielles et des propres correctifs de l’AECL, et non par une lecture directe du programme.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

Et nous ne savons pas qui était exactement le programmeur. L'AECL a refusé de citer son nom dans tout document public. Il n’est mentionné dans la littérature que sous le nom de « le programmeur ». Il n’avait aucune formation formelle en génie logiciel, ce qui n’était pas inhabituel en 1982.

Le Therac-25 est aujourd’hui l’étude de cas par laquelle débute tout cours d’ingénierie des systèmes critiques — une machine dont l’unique système de sécurité était un morceau de code que personne n’avait lu assez attentivement, écrit par un homme dont nous ne sommes pas autorisés à connaître le nom, tuant des patients venus pour être guéris.

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

3 июня 1985 года женщина в возрасте за шестьдесят легла на кушетку в Региональном онкологическом центре Кеннестоун в Мариетте, штат Джорджия, для получения плановой дозы облучения после лампэктомии. Техник настроил Therac-25 на пучок электронов мощностью 10 МэВ, направленный на ключицу. Пациентка почувствовала резкий всплеск жара, «будто на плечо вылили чашку горячего кофе». Она покинула кабинет с едва заметным красным пятном на коже. Через несколько недель кожа начала отслаиваться, рука отказала, а грудь пришлось ампутировать. Больничный физик обратился к производителю, компании Atomic Energy of Canada Limited, с вопросом, мог ли аппарат дать сбой. Ему ответили, что это исключено.

В течение следующих двадцати одного месяца тот же аппарат — или пять других машин этой модели, установленных по всей Северной Америке — срабатывал так же еще пять раз. Мужчина в Гамильтоне, Онтарио. Мужчина в Якиме, штат Вашингтон. Два пациента в Тайлере, Техас, с интервалом в три недели. Снова пациент в Якиме. Трое из шести скончались от лучевых поражений. Остальные остались парализованными или покалеченными. В каждом случае на экране оператора появлялось лаконичное сообщение об ошибке — «Malfunction 54» — а показания дозиметра свидетельствовали о том, что пациент либо не получил ничего, либо получил лишь обычную малую дозу. Журнал лечения утверждал, что всё в порядке.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Два режима, одна блокировка

Аппарат Therac-25 представлял собой linear accelerator, способный подавать радиацию в двух режимах. В электронном режиме он генерировал слаботочный пучок мощностью около 200 рад, предназначенный для лечения поверхностных опухолей. В рентгеновском (фотонном) режиме сила тока пучка увеличивалась примерно в сто раз; поток электронов врезался в вольфрамовую мишень, порождая рентгеновское излучение для глубокого воздействия. Этот режим был безопасен только потому, что между мишенью и пациентом находились массивный металлический выравнивающий фильтр и магнит для рассеивания пучка. Без них неослабленный электронный поток мощностью 25 МэВ бил прямо по коже.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Предшественники аппарата, Therac-6 и Therac-20, использовали ту же двухрежимную конструкцию. Но в них применялись электромеханические блокировки — физические микровыключатели, которые подтверждали, что поворотный стол с мишенью и фильтром находится в нужном положении, прежде чем пучок будет выпущен. В Therac-25 эти блокировки убрали. Проверка безопасности была полностью переложена на управляющее программное обеспечение — программу на языке ассемблера для PDP-11, написанную практически в одиночку тем же программистом AECL, который создавал код для предыдущих моделей.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

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

Восьмисекундное окно

Nancy Leveson, специалист по компьютерным наукам, написавшая в итоге окончательный отчет о техническом расследовании, проследила летальную последовательность до «состояния гонки» в процедуре ввода данных. Когда оператор вводил параметры назначения на терминале VT100, программа настраивала положение магнитов и параметры пучка в определенном порядке. Если оператор выбирал рентгеновский режим, затем замечал ошибку, поднимался курсором вверх, менял режим на электронный и нажимал ввод — и всё это в течение примерно восьми секунд, — подпрограмма настройки магнитов уже фиксировала одну конфигурацию, в то время как отдельный программный флаг переключался на другую. Поворотный стол вставал в положение для электронного режима (без мишени и фильтра), в то время как параметры пучка оставались на мощности, предназначенной для рентгеновских лучей.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

Затем машина выпускала прямой «карандашный» пучок электронов мощностью 25 МэВ, выдавая около 25 000 рад за импульс. Система дозиметрии, откалиброванная под рассеянный фотонный поток, почти не фиксировала прохождение частиц через ионизационную камеру и сообщала о недополучении дозы. Оператор, обученный повторять процедуру при ошибках недодозировки, нажимал клавишу «P» (proceed), чтобы продолжить. Машина стреляла снова.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

Баг проявлялся только тогда, когда операторы привыкали к экрану ввода данных настолько, что начинали работать быстрее восьмисекундного окна. Техник в Тайлере обладал средней скоростью печати. Несчастные случаи участились в конце 1985 и 1986 годах именно потому, что к тому времени персонал набил руку.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

Чего мы до сих пор не знаем

Мы не знаем, сколько случаев передозировки остались незарегистрированными. Шесть — это официальное число из расследования FDA, однако характер сбоев вызывал травмы, имитирующие обычные лучевые ожоги, и смерти, похожие на прогрессирование опухоли. Трагедии в Тайлере были диагностированы только потому, что физик по имени Фриц Хагер провел дни, заново вводя данные с той же скоростью, что и оператор, пытаясь воспроизвести неисправность, и в конце концов добился своего.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

Мы не знаем, какая часть оригинального исходного кода сохранилась. AECL предоставляла FDA лишь фрагменты. Левесон и Кларк Тернер восстановили суть бага по журналам операторов, отпечаткам аппаратных сигналов и патчам самой AECL, а не путем прямого анализа чистой программы.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

И мы не знаем, кем именно был тот программист. AECL отказалась называть его имя в любых публичных документах. В литературе он упоминается просто как «программист». У него не было профильного образования в области программной инженерии, что в 1982 году не было редкостью.

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

1985年から1987年にかけて、カナダ製の放射線治療装置が少なくとも6名のがん患者に対し、規定の100倍もの放射線を誤照射した。ハードウェアに不備はなかった。その原因は、誰もがテストを想定していなかった「レース条件」だった。

1985年6月3日、ジョージア州マリエッタにあるケネストーン地域腫瘍センター。60代の女性が、乳房腫瘤摘出術後の定期的な追加照射を受けるために横たわっていた。技師はTherac-25を、彼女の鎖骨へ向けて10 MeVの電子線が照射されるよう設定した。患者は、肩に「熱いコーヒー」を注がれたような衝撃的な熱さを感じた。彼女はかすかな赤みを帯びて部屋を出たが、数週間のうちに皮膚は剥がれ落ち、腕の感覚はなくなり、乳房は切断せざるを得なくなった。病院の医学物理士は製造元であるAtomic Energy of Canada Limitedに対し、機械が故障した可能性はないかと問い合わせた。返ってきた答えは、「ありえない」というものだった。

続く21ヶ月の間に、同じ機械、あるいは北米各地に設置された5台の兄弟機が、同様の事故をさらに5回引き起こした。オンタリオ州ハミルトンの男性。ワシントン州ヤキマの男性。テキサス州タイラーでは、わずか3週間の間に2人の患者が被害に遭った。そして再びヤキマの患者である。6人のうち3人が放射線障害で死亡し、他の患者も麻痺や重傷を負うことになった。いずれのケースでも、オペレーターの画面には「Malfunction 54」という素っ気ないエラーが表示され、線量の表示値は、患者に何も照射されていないか、あるいは通常のわずかな量しか照射されていないことを示していた。治療ログには、すべて正常であると記録されていた。

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

二つのモード、一つのインターロック

Therac-25は、二つのモードで放射線を照射できるlinear accelerator(線形加速器)だった。電子モードでは、浅い部位の腫瘍に使用される約200ラドの低電流ビームを生成する。一方、光子モードではビーム電流を約100倍にまで上げ、それをタングステン標的に衝突させることで、深部治療に必要なX線を発生させる。X線モードが安全に機能するのは、標的と患者の間に厚い金属製のフラットニング・フィルタ(平坦化フィルタ)とビーム拡散用磁石が介在しているからである。これらがなければ、減衰していない25 MeVの電子ビームが皮膚を直撃することになる。

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

前身モデルであるTherac-6とTherac-20も、同じデュアルモード設計を採用していた。しかし、これらは電気機械式のインターロック、すなわち標的とフィルタを保持するターンテーブルが正しい位置にあることを確認してからでなければビームが発射されないようにする物理的なマイクロスイッチを備えていた。Therac-25では、これらのインターロックが取り除かれていた。安全チェックの役割はすべて制御ソフトウェアに委ねられたのである。それはPDP-11のアセンブリ言語で書かれたプログラムであり、以前のモデルのコードも担当していたAECLのたった一人のプログラマーの手によって、ほぼ独力で書き上げられたものだった。

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

コードはTherac-20のルーチンを再利用していた。旧型の機械であれば、ハードウェアがソフトウェアのミスを捕捉していただろう。だが新型機には、それを防ぐ術は何もなかった。

8秒間の窓

後に決定的な調査報告書をまとめることになるコンピュータ科学者のNancy Levesonは、この致命的な一連の動作の原因がデータ入力ルーチンにおける競合状態(レースコンディション)にあることを突き止めた。オペレーターがVT100端末で処方内容を入力すると、ソフトウェアは特定の順序で磁石の位置とビームのパラメータを設定していく。もしオペレーターが一度X線モードを選択し、間違いに気づいてカーソルを戻し、電子モードに変更してEnterキーを押す——これらの一連の操作を約8秒以内に行うと、磁石設定サブルーチンが一方の設定を確定させている間に、別のフラグがもう一方の設定へと切り替わってしまうのだ。その結果、ターンテーブルは標的もフィルタもない電子モードの位置まで回転する一方で、ビームパラメータは光子モードの強度のまま維持される。

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

そして機械は、1パルスあたり約25,000ラドという生の25 MeV電子ペンシルビームを患者に向けて発射した。拡散された光子ビームに合わせて調整されていた線量測定システムは、電離箱を通過するエネルギーをほとんど検知できず、線量不足と報告した。線量不足エラーが出た際の再試行を訓練されていたオペレーターは、「P」キーを押して照射を続行させた。機械は再びビームを放った。

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

このバグが表面化したのは、オペレーターがデータ入力画面の操作に習熟し、8秒の壁を突破する速さで入力できるようになったためだった。タイラーの技師の速度は平均的なものだった。事故が1985年後半から1986年にかけて集中したのは、タイピングの速度がそれほどの速さに達した時期だったからである。

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

いまだ解明されていないこと

どれほどの過剰照射が報告されずに終わったのか、我々にはわからない。FDAの調査による公式な犠牲者数は6人だが、この故障モードによる損傷は通常の治療による放射線火傷と見分けがつかず、その死も腫瘍の進行によるものと区別しにくいものだった。タイラーでの事故が特定されたのは、フリッツ・ヘイガーという物理士が、故障を再現しようとオペレーターと同じ速度で何日も処方内容を打ち込み続け、ついにそれを再現させたからに他ならない。

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

オリジナルのソースコードがどれだけ現存しているかも不明である。AECLがFDAに提出した資料は断片的なものだった。レベソンとクラーク・ターナーがバグを再構成できたのは、プログラムを整然と解読したからではなく、オペレーターのログやハードウェアの追跡記録、そしてAECL自身が適用したパッチから導き出したものだった。

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

そして、そのプログラマーが具体的に誰であったのかも分かっていない。AECLは公的な文書で彼の名前を明かすことを拒んだ。文献ではただ「そのプログラマー」とのみ言及されている。彼はソフトウェア工学の正式な教育を受けていなかったが、1982年当時、それは珍しいことではなかった。

Therac-25は今や、安全性において極めて重要なエンジニアリングの講義が必ず最初に取り上げるケーススタディとなっている。それは、誰一人として十分に注意深く読み込まなかったコードが唯一の安全システムであり、我々が名前を知ることさえ許されない男によって書かれた機械が、治癒を求めてやってきた患者たちを死に至らしめた事件である。

Zwischen 1985 und 1987 verabreichte ein in Kanada gebautes Strahlentherapiegerät mindestens sechs Krebspatienten Überdosierungen, die das Hundertfache der verordneten Dosis betrugen. Die Hardware war tadellos. Die Ursache war eine Race Condition, an deren Prüfung niemand gedacht hatte.

Am 3. Juni 1985 legte sich eine Frau in den Sechzigern im Kennestone Regional Oncology Center in Marietta, Georgia, für eine routinemäßige Folgedosis nach einer Lumpektomie hin. Der Techniker stellte den Therac-25 auf einen 10-MeV-Elektronenstrahl an ihrem Schlüsselbein ein. Die Patientin spürte einen plötzlichen Hitzestoß, „als ob eine heiße Tasse Kaffee“ über ihre Schulter gegossen würde. Sie verließ das Krankenhaus mit einer schwachen roten Markierung. Innerhalb weniger Wochen löste sich die Haut ab, ihr Arm war wie tot und ihre Brust musste amputiert werden. Der Krankenhausphysiker fragte beim Hersteller, Atomic Energy of Canada Limited, an, ob die Maschine eine Fehlfunktion gehabt haben könnte. Ihm wurde gesagt, das sei ausgeschlossen.

In den folgenden einundzwanzig Monaten tat dieselbe Maschine, oder ihre fünf in ganz Nordamerika installierten Geschwistermodelle, dasselbe noch fünf weitere Male. Ein Mann in Hamilton, Ontario. Ein Mann in Yakima, Washington. Zwei Patienten in Tyler, Texas, im Abstand von drei Wochen. Erneut ein Patient in Yakima. Drei der sechs Opfer starben an den Strahlenschäden. Die anderen blieben gelähmt oder verstümmelt zurück. In jedem Fall hatte der Bildschirm des Bedieners eine knappe Fehlermeldung angezeigt – „Malfunction 54“ – sowie eine Dosisanzeige, die suggerierte, der Patient habe entweder gar nichts oder einen normalen Bruchteil erhalten. Das Behandlungsprotokoll besagte, alles sei in Ordnung.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

Zwei Modi, eine Verriegelung

Der Therac-25 war ein linear accelerator, der Strahlung in zwei Modi abgeben konnte. Im Elektronenmodus erzeugte er einen Strahl mit geringer Stromstärke von etwa 200 Rad, der für oberflächliche Tumore eingesetzt wurde. Im Photonenmodus wurde die Strahlstromstärke um etwa das Hundertfache hochgefahren und auf ein Wolfram-Target geschleudert, wodurch die Röntgenstrahlen erzeugt wurden, die für die Tiefenwirkung sorgten. Der Röntgenmodus war nur deshalb sicher, weil ein dicker Ausgleichsfilter aus Metall und ein Strahlaufweitungsmagnet zwischen dem Target und dem Patienten saßen. Ohne diese traf ein ungeschwächter 25-MeV-Elektronenstrahl direkt auf die Haut.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

Seine Vorgänger, der Therac-6 und der Therac-20, hatten dasselbe Dual-Modus-Design verwendet. Sie nutzten zudem elektromechanische Verriegelungen – physische Mikroschalter, die bestätigten, dass sich der Drehtisch mit dem Target und dem Filter in der korrekten Position befand, bevor der Strahl ausgelöst werden konnte. Beim Therac-25 wurden diese Verriegelungen entfernt. Die Sicherheitsprüfung wurde vollständig in die Steuerungssoftware verlagert, ein PDP-11-Assemblerprogramm, das weitgehend allein von einem einzelnen AECL-Programmierer geschrieben worden war, der auch den Code für die früheren Modelle verfasst hatte.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

Der Code verwendete Routinen des Therac-20 wieder. Bei der älteren Maschine hätte die Hardware jeden Softwarefehler abgefangen. Bei der neuen tat sie das nicht.

Das Acht-Sekunden-Fenster

Nancy Leveson, die Informatikerin, die schließlich den maßgeblichen forensischen Bericht verfasste, führte die tödliche Sequenz auf eine Race Condition in der Dateneingaberoutine zurück. Wenn der Bediener die Verordnung am VT100-Terminal eintippte, legte die Software die Magnetpositionen und Strahlparameter in einer bestimmten Reihenfolge fest. Wählte der Bediener den Röntgenmodus, bemerkte dann einen Fehler, sprang mit dem Cursor zurück, änderte ihn in den Elektronenmodus und drückte die Eingabetaste – alles innerhalb von etwa acht Sekunden –, so hatte sich die Unterroutine für die Magneteinstellung bereits auf eine Konfiguration festgelegt, während ein separater Flag auf die andere umsprang. Der Drehtisch rotierte in die Position für den Elektronenmodus – kein Target, kein Filter –, während die Strahlparameter auf der Photonenstärke blieben.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

Die Maschine schoss daraufhin einen ungefilterten 25-MeV-Elektronenstrahl mit etwa 25.000 Rad pro Puls in den Patienten. Das Dosimetriesystem, das auf den diffusen Photonenstrahl kalibriert war, registrierte kaum einen Durchgang durch seine Ionisationskammer und meldete eine Unterdosierung. Der Bediener, darauf geschult, bei Unterdosierungsfehlern einen neuen Versuch zu starten, drückte „P“ für „Proceed“. Die Maschine feuerte erneut.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

Der Fehler trat erst auf, als die Bediener an der Eingabemaske schnell genug wurden, um das Acht-Sekunden-Fenster zu unterschreiten. Der Techniker in Tyler war durchschnittlich schnell. Die Unfälle häuften sich Ende 1985 und 1986, weil das Tippen zu diesem Zeitpunkt schneller geworden war.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

Was wir noch immer nicht wissen

Wir wissen nicht, wie viele Überdosierungen ungemeldet blieben. Sechs ist die offizielle Zahl aus der Untersuchung der FDA, doch die Art des Versagens verursachte Verletzungen, die Strahlenverbrennungen einer gewöhnlichen Behandlung ähnelten, und Todesfälle, die wie ein Fortschreiten des Tumors wirkten. Die Unfälle in Tyler wurden nur deshalb diagnostiziert, weil ein Physiker namens Fritz Hager tagelang die Verordnung in derselben Geschwindigkeit wie der Bediener neu eintippte, um den Fehler zu reproduzieren – was ihm schließlich gelang.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

Wir wissen nicht, wie viel vom ursprünglichen Quellcode überlebt hat. Die Einreichungen von AECL bei der FDA waren unvollständig. Leveson und Clark Turner rekonstruierten den Fehler aus Bedienerprotokollen, Hardware-Spuren und den eigenen Patches von AECL, nicht durch eine saubere Lektüre des Programms.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

Und wir wissen nicht, wer genau der Programmierer war. AECL weigerte sich, seinen Namen in öffentlichen Dokumenten zu nennen. In der Literatur wird er lediglich als „der Programmierer“ bezeichnet. Er besaß keine formale Ausbildung in Software-Engineering, was 1982 nicht ungewöhnlich war.

Der Therac-25 ist heute die Fallstudie, mit der jeder Kurs für sicherheitskritische Technik beginnt – eine Maschine, deren einziges Sicherheitssystem aus einem Stück Code bestand, das niemand sorgfältig genug gelesen hatte, geschrieben von einem Mann, dessen Namen wir nicht kennen dürfen, und die Patienten tötete, die gekommen waren, um geheilt zu werden.

1985년에서 1987년 사이, 캐나다에서 제작된 방사선 치료기가 최소 여섯 명의 암 환자에게 처방치의 백 배에 달하는 방사선을 과다 조사했다. 하드웨어는 멀쩡했다. 원인은 그 누구도 테스트할 생각을 하지 못했던 '레이스 컨디션'이었다.

1985년 6월 3일, 조지아주 마리에타에 위치한 케네스톤 지역 종양 센터에서 유방종양절제술을 받은 60대 여성이 정기적인 후속 치료를 받기 위해 자리에 누웠다. 방사선 기술자는 그녀의 쇄골에 10 MeV 전자 빔을 조사하기 위해 Therac-25를 설정했다. 환자는 어깨에 "뜨거운 커피 한 잔"을 쏟아붓는 것 같은 갑작스러운 열기를 느꼈다. 그녀는 희미한 붉은 자국만을 남긴 채 병원을 나섰다. 하지만 몇 주 지나지 않아 피부가 허물처럼 벗겨졌고, 팔은 마비되었으며, 결국 유방을 절제해야 했다. 병원의 물리학자는 제조사인 Atomic Energy of Canada Limited에 기계가 오작동했을 가능성을 문의했으나, 그럴 리 없다는 답변만이 돌아왔다.

그 후 21개월 동안 북미 전역에 설치된 동일한 기계 혹은 다섯 대의 형제 기계들이 다섯 차례나 더 같은 사고를 일으켰다. 온타리오주 해밀턴의 한 남성, 워싱턴주 야키마의 한 남성, 그리고 3주 간격으로 텍사스주 타일러에서 두 명의 환자, 마지막으로 야키마에서 또 한 명의 환자가 피해를 입었다. 사고를 당한 여섯 명 중 세 명은 방사선 피폭으로 사망했고, 나머지는 마비되거나 신체 일부를 잃었다. 모든 사례에서 운영자의 화면에는 "오작동(Malfunction) 54"라는 짤막한 오류 메시지가 떴으며, 선량 수치상으로는 환자가 아무런 방사선도 받지 않았거나 아주 정상적인 극소량만을 받은 것으로 나타났다. 치료 기록에는 모든 것이 정상이라고 기록되어 있었다.

Therac 25 Rotation Ajzh2074 · CC BY-SA 4.0

두 가지 모드, 하나의 인터록

linear accelerator인 Therac-25는 두 가지 모드로 방사선을 방출할 수 있었다. 전자 모드에서는 얕은 종양 치료를 위해 약 200라드(rads)의 저전류 빔을 생성했다. 광자 모드에서는 빔 전류를 약 100배가량 높여 이를 텅스텐 표적에 충돌시켰고, 이를 통해 신체 깊숙한 곳까지 침투하는 엑스선을 만들어냈다. 엑스선 모드가 안전할 수 있었던 이유는 표적과 환자 사이에 두꺼운 금속 평탄화 필터와 빔 분산 마그넷이 자리 잡고 있었기 때문이었다. 이것들이 없다면 감쇄되지 않은 25 MeV 전자 빔이 피부에 직접 닿게 된다.

Therac 25 54
Therac 25 54 Ajzh2074 · BY-SA 4.0

이전 모델인 Therac-6와 Therac-20도 동일한 이중 모드 설계를 사용했다. 또한 이 모델들은 전기 기계적 인터록, 즉 빔이 발사되기 전 표적과 필터를 고정하는 회전판이 정확한 위치에 있는지 확인하는 물리적 마이크로스위치를 사용했다. 하지만 Therac-25는 이러한 인터록을 제거했다. 안전 점검 기능은 전적으로 제어 소프트웨어로 옮겨졌는데, 이는 이전 모델의 코드를 작성했던 AECL의 프로그래머 단 한 명이 거의 독자적으로 작성한 PDP-11 어셈블리 프로그램이었다.

A 1980s hospital radiation therapy room prepared for a routine treatment
A 1980s hospital radiation therapy room prepared for a routine treatment Illustration · AI-generated (FLUX.1-dev)

이 코드는 Therac-20의 루틴을 재사용했다. 이전 모델에서는 소프트웨어의 실수를 하드웨어가 잡아낼 수 있었지만, 새로운 모델에서는 그 무엇도 실수를 막아내지 못했다.

8초의 창

결국 이 사건에 대해 결정적인 포렌식 보고서를 작성한 컴퓨터 과학자 Nancy Leveson은 이 치명적인 사고의 원인이 데이터 입력 루틴의 경쟁 상태(race condition)에 있음을 밝혀냈다. 운영자가 VT100 터미널에 처방 내용을 입력하면, 소프트웨어는 특정 순서에 따라 마그넷 위치와 빔 파라미터를 설정했다. 만약 운영자가 엑스선 모드를 선택했다가 실수를 깨닫고 커서를 위로 올려 전자 모드로 변경한 뒤 엔터를 누르는 과정이 약 8초 이내에 이루어지면, 마그넷 설정 서브루틴은 이미 이전 설정으로 확정된 상태에서 별도의 플래그만 다른 모드로 전환되는 현상이 발생했다. 그 결과 회전판은 표적도 필터도 없는 전자 모드 위치로 회전했지만, 빔 파라미터는 여전히 광자 모드의 강도를 유지하게 된 것이다.

Therac 25 Rotation
Therac 25 Rotation Ajzh2074 · BY-SA 4.0

기계는 환자에게 한 펄스당 약 25,000라드에 달하는 가공할 만한 25 MeV 전자 빔을 바늘처럼 가느다랗게 쏘아 보냈다. 확산된 광자 빔에 맞춰 보정되어 있던 선량 측정 시스템은 이온 챔버를 통과하는 에너지를 거의 감지하지 못했고, 선량 부족 오류를 보고했다. 선량 부족 오류가 뜨면 다시 시도하도록 교육받은 운영자는 치료를 계속하기 위해 'P'를 눌렀다. 기계는 다시 한번 빔을 발사했다.

Close on the physical controls of the treatment room: a technician's hands move quickly ov
Close on the physical controls of the treatment room: a technician's hands move quickly ov Illustration · AI-generated (FLUX.1-dev)

이 버그는 운영자들이 화면 데이터 입력에 능숙해져 8초라는 시간의 창을 뛰어넘을 만큼 빨라졌을 때만 수면 위로 드러났다. 타일러의 기술자는 평균적인 속도를 가졌을 뿐이었다. 1985년 말과 1986년에 사고가 집중된 이유는 바로 그때부터 운영자들의 타이핑 속도가 그만큼 빨라졌기 때문이었다.

Therac 25 Input Screen
Therac 25 Input Screen Ajzh2074 · BY-SA 4.0

우리가 여전히 알지 못하는 것들

얼마나 많은 과다 복용 사례가 보고되지 않았는지는 알 수 없다. FDA 조사의 공식 집계는 6건이지만, 이 오작동으로 인한 부상은 일반적인 치료로 인한 방사선 화상과 흡사했고, 사망 원인 또한 종양의 진행과 구별하기 어려웠다. 타일러의 사고가 진단될 수 있었던 것은 프리츠 헤이거라는 물리학자가 오작동을 재현하기 위해 운영자와 똑같은 속도로 처방을 다시 입력하며 며칠을 보낸 끝에 마침내 성공했기 때문이었다.

Inside the open service bay of a medical linear accelerator
Inside the open service bay of a medical linear accelerator Illustration · AI-generated (FLUX.1-dev)

원본 소스 코드가 얼마나 남아 있는지도 알 수 없다. AECL이 FDA에 제출한 자료는 일부에 불과했다. 레브슨과 클라크 터너는 깨끗한 프로그램 소스를 읽은 것이 아니라 운영자 로그, 하드웨어 추적 기록, 그리고 AECL이 내놓은 패치들을 통해 버그를 재구성해냈다.

Therac-25
Therac-25 Unknown authorUnknown author · Public domain

또한 그 프로그래머가 정확히 누구인지도 알 수 없다. AECL은 공개 문서에서 그의 이름을 밝히기를 거부했다. 관련 문헌에서 그는 단지 "그 프로그래머"라고만 언급될 뿐이다. 그는 소프트웨어 공학에 대한 정식 교육을 받은 적이 없었으나, 1982년 당시에는 드문 일이 아니었다.

이제 Therac-25는 안전이 중요한 모든 공학 과정이 첫 번째로 다루는 사례 연구가 되었다. 아무도 충분히 꼼꼼하게 읽지 않은 코드 한 줄이 유일한 안전장치였고, 이름을 알 수 없는 한 남자가 쓴 그 코드는 병을 고치러 온 환자들을 죽음으로 몰아넣었다.

Image sources & licenses (8)
  1. Therac 25 Rotation (animation) — Ajzh2074, CC BY-SA 4.0. Source (commons)
  2. Therac 25 54 — Ajzh2074, BY-SA 4.0. Source (openverse)
  3. Therac 25 Rotation — Ajzh2074, BY-SA 4.0. Source (openverse)
  4. Therac 25 Input Screen — Ajzh2074, BY-SA 4.0. Source (openverse)
  5. Therac-25 — Unknown authorUnknown author, Public domain. Source (wikipedia)
  6. Đĩa xoay của Therac-25 phụ trách thay đổi chế độ — Ajzh2074, CC BY-SA 4.0. Source (commons)
  7. Cơ chế hoạt động của máy xạ trị (Therac-25) với hai chế độ khác nhau. Hình đang mô tả chế độ X quang. — Ajzh2074, CC BY-SA 4.0. Source (commons)
  8. Tareas del programa del Therac-25 y su interacción con las variables compartidas. — Ajzh2074, CC BY-SA 4.0. Source (commons)

Mentioned in this article

Sources

  1. Leveson, N. & Turner, C. S. (1993). "An Investigation of the Therac-25 Accidents." IEEE Computer 26 (7), 18–41.
  2. Leveson, N. (1995). Safeware: System Safety and Computers. Addison-Wesley.
  3. Jacky, J. (1989). "Programmed for Disaster: Software Errors that Imperil Lives." The Sciences 29 (5), 22–27.
  4. U.S. Food and Drug Administration (1987). Therac-25 Accident Reports, CDRH Public Docket 85N-0590.
  5. Baase, S. (2012). A Gift of Fire: Social, Legal, and Ethical Issues for Computing Technology, 4th ed. Pearson.
Production storyboard

The 90-second video script behind this article.

EN script

A healing machine. A software bug. Six patients dead. The code was never tested. Between 1985 and 1987, the Therac-25 radiation therapy machine—designed to treat cancer—killed six patients and seriously injured others. Not from mechanical failure. From software that was never properly tested. Here's what happened: the Therac-25 had two modes. A low-power electron mode for surface treatment. And a high-power X-ray mode that was 100 times stronger—meant to pass through metal shielding first. A software race condition meant that if an operator typed commands too quickly, the machine could fire in X-ray mode without the shielding in place. Patients received 100 times the intended dose in a concentrated beam. They felt intense burning. Some died within weeks. When patients complained, operators saw no error messages. The software reported everything was normal. Hospital staff blamed the patients' disease. The manufacturer blamed operator error. It took multiple deaths across different hospitals before anyone suspected the software. The disaster revealed a horrifying truth: the Therac-25 had removed hardware safety interlocks present in earlier models. The software was the only safety system. And no one had ever tested what happened when operators typed fast. Today, medical device software must undergo rigorous testing. The Therac-25 is taught in every software engineering course as the ultimate warning: in safety-critical systems, untested code kills.

HI script

Ek healing machine. Ek software bug. Chhe patients ki maut. Code kabhi test nahi hua tha.

Ek healing machine. Ek software bug. Chhe patients ki maut. Code kabhi test nahi hua tha. 1985 aur 1987 ke beech, Therac-25 radiation therapy machine—jo cancer treat karne ke liye bani thi—ne chhe patients ko maara aur doosron ko seriously injure kiya. Mechanical failure se nahi. Software se jo kabhi properly test nahi hua tha. Yeh hua kya: Therac-25 ke do modes the. Low-power electron mode surface treatment ke liye. Aur high-power X-ray mode jo 100 guna zyada powerful tha—pehle metal shielding se guzarne ke liye. Ek software race condition ka matlab tha ki agar operator commands bahut jaldi type kare, machine X-ray mode mein fire kar sakti thi bina shielding ke. Patients ko intended dose se 100 guna zyada concentrated beam mein mila. Unhe intense burning mehsoos hui. Kuch hafton mein mar gaye. Jab patients ne complain kiya, operators ko koi error messages nahi dikhe. Software report kar raha tha sab normal hai. Hospital staff ne patients ki disease ko blame kiya. Manufacturer ne operator error blame kiya. Multiple deaths alag alag hospitals mein hone ke baad hi kisi ne software par shak kiya. Disaster ne ek horrifying sach reveal kiya: Therac-25 ne hardware safety interlocks hata diye the jo pehle ke models mein the. Software hi akela safety system tha. Aur kisine kabhi test nahi kiya tha ki kya hota hai jab operators fast type karein. Aaj, medical device software ko rigorous testing se guzarna padta hai. Therac-25 har software engineering course mein sikhaya jaata hai ultimate warning ke taur par: safety-critical systems mein, untested code maarta hai.

  1. 01

    1980s hospital radiation therapy room with a large linear accelerator and a patient on the table

  2. 02

    Close-up of a technician's hands typing rapidly on a vintage keyboard near a dark terminal

  3. 03

    Internal view of the linear accelerator's rotating mechanism with tungsten target and filters

  4. 04

    Disassembled safety hardware components like microswitches laid out on a workbench

  5. 05

    A physicist investigating the machine in an empty treatment room with a stopwatch and logs

  6. 06

    Modern engineers inspecting vintage circuit boards and a PDP-era processor in a testing lab