Therac-25:一台拆掉硬件保险的放疗机,被操作员的几下按键变成了杀人机器
目录
配图:AI 生成的概念示意图,非真实现场、产品界面或实验数据。
TL;DR:1985 到 1987 年间,加拿大 AECL 公司的 Therac-25 放射治疗机至少造成六起严重过量照射事故,其中三名患者后来因此死亡。调查认为,直接原因是软件里的并发缺陷(竞态条件)等程序错误,而新机型把前代的硬件联锁交给了软件来兜底。需要说明的是,部分患者本身就患有重症癌症,具体死因的认定并不都一样干脆。
这是一桩三十多年前的旧事,发生在 1985 至 1987 年,不是最近的新闻。它至今仍是软件工程和安全工程课上的经典反面教材。
背景:把保险交给软件
Therac-25 是医用直线加速器,既能发射电子束,也能通过靶材产生 X 射线。前代机型 Therac-20 配有硬件联锁,万一软件出错,物理机制仍能拦住危险。Therac-25 的设计去掉了其中不少硬件保护,转而依赖软件检查,据称还沿用了旧机型的部分代码。全球共有约 11 台 Therac-25 装机,分布在美国和加拿大。
出了什么事
按调查者 Leveson 和 Turner 的整理,六起事故大致是:
- 1985 年 6 月,美国佐治亚州:一名患者被过量照射,乳房最终被切除。
- 1985 年 7 月,加拿大安大略:患者同年 11 月死亡。
- 1985 年 12 月,华盛顿州 Yakima:患者留下慢性溃疡等伤害,幸存。
- 1986 年 3 月和 4 月,得克萨斯州 Tyler:两名患者先后死亡,其中一人约五个月后,另一人在 5 月 1 日。
- 1987 年 1 月,Yakima:患者估计受到约 8000 至 10000 拉德的照射,而处方只有 86 拉德,同年 4 月去世。
这些数字比正常治疗剂量高出几十倍甚至上百倍。
两个软件缺陷
Tyler 的事故里,操作员输入治疗模式后,用光标键回头修改,整套操作在大约 8 秒内完成。而机器调磁铁需要约 8 秒,软件在这段时间之后就不再读取修改,于是屏幕显示和设备实际状态对不上,束流在不该出现的配置下打了出去。
Yakima 的事故则是另一个缺陷:一个只有一字节的标志位每次被加一,而不是被设成固定值,每运行 256 次就会溢出回零,恰好跳过了关键的准直器检查。操作员在这一刻按下确认,机器就以全功率出束。
为什么更糟
报告指出,AECL 起初难以相信机器会出错,对早期投诉的反应也偏慢。操作员看到的往往只是一条含糊的错误提示,而这类提示平时并不少见,于是容易习惯性地继续治疗。1986 年 4 月,AECL 甚至建议用户把某个光标键的键帽拆掉、用胶带封住触点。
后续
1986 年 5 月 2 日,美国 FDA 宣布 Therac-25 存在缺陷,要求 AECL 通知用户并提交纠正计划。经过多轮修改,最终方案在 1987 年夏天获得接受,包括修复软件并恢复部分硬件联锁。
教训很朴素:软件会出错,所以关键的安全保障不该只靠软件;复用旧代码不等于复用旧的安全保证;用户反馈里的“怪事”要当事故线索认真对待。
来源:Leveson & Turner, An Investigation of the Therac-25 Accidents(Stanford 课程资料 PDF)
- MIT 6.033 转载(Part III):https://web.mit.edu/6.033/2004/wwwdocs/papers/Therac_3.html
- 维基百科:https://en.wikipedia.org/wiki/Therac-25