圖片來源@視覺中國
文 | 郭華
1973年,蘇聯(lián)開始在基輔修建切爾諾貝利核電站,除了滿足烏克蘭的用電需求外,還希望借此向世界展示蘇聯(lián)“和平利用核能”的形象。
差不多同時,加拿大一家造核電站的公司AECL,成立了醫(yī)療部門,開始開發(fā)放射治療儀。
核能有三個主要的應用領域,分別是核武器、核動力、核醫(yī)學。一般來說,后兩者被認為是和平的,且越靠后就越和平。
AECL全稱Atomic Energy of Canada Limited,成立于1952年,由加拿大國家控股,其使命就是和平利用核能,所以AECL開發(fā)放射治療儀似乎天經地義。不過AECL的醫(yī)療部門并不是從頭開始的,他選擇了和法國的CGR公司合作,然后把CGR的兩款老產品進行升級,變成了自己的新產品,分別起名為Therac-6和Therac-20。
這算借腹生子?還是借子生子?都不重要,重要的是孩子已經有了。
可能是這兩款產品讓AECL站穩(wěn)了腳跟,也可能是雙方在市場上產生了分歧,總之因為一些未公開的原因,AECL和CGR的合作在1981年終止。
這年,切爾諾貝利的第三個反應堆建成開始發(fā)電,按照預期,六個反應堆都建成后切爾諾貝利將成為蘇聯(lián)最大的核電站。
AECL的腳步也沒有暫停,他在結束合作的一年后推出了Therac-25。
Therac-25有很多特別之處。
在AECL的產品體系中,后綴表示輻射能量,Therac-6的能量是6MeV,Therac-20是20MeV,Therac-25就是25MeV。所以他的能量是最大的,更大的能量意味著能夠觸達更深的病灶。而且他更先進,因為他能夠完全由軟件進行控制——就像2007年的iPhone、2010年的特斯拉一樣,更發(fā)達的軟件就是先進的表現(xiàn),至少是現(xiàn)今的表象。借助于發(fā)達的軟件,他省去了很多硬件,甚至包括安全鎖,所以他的成本也更低。
更重要的,他是AECL的親兒子。
1983年,加拿大總領事館在美通社新聞中對其進行了隆重發(fā)布,并在隨后交付出了11臺,其中5臺在美國,6臺在加拿大。巧合的是,后來發(fā)生爆炸的切爾諾貝利四號反應堆也是在這年上線的。
輻射的衡量單位是倫琴。
在切爾諾貝利爆炸的反應堆旁站十分鐘,受到輻射量大概是5000倫琴。
Therac-25在事故中給患者施加的劑量是切爾諾貝利的4倍,能夠達到20000倫琴以上,是常規(guī)治療的100倍。
而短期內全身接受1000倫琴的劑量便會致人死亡。
所以說如果切爾諾貝利像一個核彈,那么Therac-25就像一個殺手,披著治病救人的外衣反復作案——在1985-1987年間,他總共制造了6起事故,其中4人死亡,2人重傷。
Therac-25系列事故的本質就是AECL的失控——他的軟件無法控制他的硬件,他也控制不了他的軟件,而他的軟件和硬件一起,又正在控制著核輻射。
1985年6月,美國佐治亞州的肯尼斯通腫瘤中心,第一起。
這是一次胸部腫瘤的常規(guī)放射治療,射線強度預期200倫琴,照射位置為前胸,患者是一名61歲女性。但治療開始后不久,患者便感覺到了劇烈的灼燒感,隨后前胸的照射點、后背的貫穿性對應位置都出現(xiàn)了紅腫,這很像輻射傷。醫(yī)生立即停機并聯(lián)系了AECL。
三天后,AECL回了電話,表示過量輻射是不可能的。
患者不認可這個結論,醫(yī)院又給不出其他合理解釋,于是患者便把醫(yī)院和AECL一塊告上了法庭。但AECL始終拒絕承認Therac-25有問題,再加上治療當天Therac-25的打印功能被禁止了,當時的機器參數(shù)并沒有備份,所以該起訴訟最終庭外和解。
患者的胸部被切除,后來經過測算,當時的輻射強度大概在15000倫琴到20000倫琴之間。
這起事故發(fā)生在美國,美國有個FDA(食品藥品監(jiān)督管理局),但Therac-25上市并沒有經過FDA的測試。
FDA的上市認可有兩種,一種是PMA(Pre-market Approval)),一種是510K。PMA需要廠家充分證明該設備的安全性,并通過FDA組織的臨床試驗與實驗室測試。而510K則輕松的多,只要證明該設備與市場上已存在的設備具備等同性即可。
Therac-25上市用的是510K,大概是因為他與Therac-20具有某種意義上的等同性。
實際上不僅FDA沒有對Therac-25進行過獨立測試,AECL也沒有,他在1986年提交給FDA的事故報告里承認了這一點。
AECL表示一直以來所有設備(Therac-6、Therac-20、Therac-25)上的軟件都是一塊進行測試的,沒有單獨對Therac-25進行過完整測試。Therac-25的很多代碼是從Therac-6中移植過來的,大概AECL認為測過Therac-6就相當于測過Therac-25了吧。
另外還需要一提的是,Therac-6的代碼都是法國伙伴CGR編寫的。
后來的事實證明,AECL對這些代碼知之甚少。
1985年7月,加拿大安大略省癌癥基金會,第二起。
和第一起類似,患者在治療過程中感覺到了劇痛和灼燒感,但詭異的是,明明是輻射過量,Therac-25顯示器卻多次報出了“No DOSE delivered (沒有劑量傳輸)”信息。
隨后AECL派了工程師去調查,無法復現(xiàn)錯誤。
但他還是表現(xiàn)出了一副控制了局面的樣子。
他“猜測”問題是由電路故障導致的,然后基于這個猜測,AECL召回Therac-25進行了改造。根據(jù)說明,這次改造可以將安全性提升5個數(shù)量級,也就是原來的10萬倍。
不知道這個數(shù)字是怎么來的,更不知道為什么如此安全,AECL還是在改造說明中建議用戶使用Therac-25時最好進行“目視檢查”。
這起事故的患者三個月后死亡,后來經過測算,當時的輻射強度大概在13000倫琴至17000倫琴之間。
1985年12月,美國雅基瑪谷紀念醫(yī)院,第三起。
這次事故中的Therac-25剛剛經過了AECL的所謂5個數(shù)量級安全性的改造。
和之情的情況類似,先是病人在放療后身體出現(xiàn)了疑似過量輻射的紅斑,于是醫(yī)生聯(lián)系AECL,之后便是AECL的否認三連:先回復不可能,然后表示從沒有出現(xiàn)過類似的情況,最終猜測可能是其它原因。而且這次AECL還附了一個兩頁紙的說明,詳細列舉了Therac-25不可能過量輻射的理由。
醫(yī)生沒有辦法,最終只能在院方的報告中將事故原因歸為未知。
病人沒有死亡,但留下了殘疾和伴隨終生的疼痛。
debug是查找軟件bug的過程,其中的關鍵是復現(xiàn)。
所謂復現(xiàn),是指找到bug發(fā)生的條件,然后模擬這些條件,讓bug重復發(fā)生。前面事故一件件發(fā)生,而AECL始終沒有成功復現(xiàn)過問題。
直到第四起和第五起。
這兩起都發(fā)生在一個地方,前后間隔不過三周,本質就是一次天然復現(xiàn)。
1986年3月,美國東德克斯說腫瘤中心,第四起。
事故的跡象都是一樣的,患者的癥狀也是一樣的,AECL的回復同樣是一樣的:不可能、沒聽說、應該是其它原因。
這次AECL給出的其它原因是漏電,大概因為患者在描述當時的感覺時說像遭受了電擊,并聽到了滋滋聲吧。
和之前一樣,AECL靠著否認三連又一次控制了局面。
但很快,第五起就發(fā)生了。
1986年4月,美國東德克斯說腫瘤中心,第五起。
第五起和第四起發(fā)生在同一個地方,對醫(yī)院和患者來說,這顯然是一種巨大的不幸。但對整個事件來說,這卻像一種幸運,因為正是如此才讓Therac-25的bug現(xiàn)了原形。
不過復現(xiàn)bug的不是AECL,而是這個醫(yī)院的醫(yī)生。
第五起事故發(fā)生后,他不再相信AECL三周前給出的解釋,開始自己調查事故原因。
他發(fā)現(xiàn)兩次事故中,一個共同點是操作員都修改過處方。
圖1是Therac-25的電腦輸入界面。Therac-25支持兩種射線模式,一種是X射線,一種是電子束,在正常的流程中,操作員依次從左上角輸入到右下角,輸入患者姓名、射線類型、射線能量等參數(shù),最終光標會停到右下角,也就是綠色高亮的位置。
在這兩次事故中,操作員均是在一切都輸入完成后發(fā)現(xiàn)了錯誤:射線類型(BEAM TYPE)一欄應該是E(電子束),但錯誤輸入成了X(X射線)。于是他移動光標對其進行了修改,然后又將光標移回了綠色高亮位置,隨后點擊確認,啟動治療。
![]()
圖1 Therac-25的操作界面
但這個操作還不能保證復現(xiàn)問題,經過反復試驗,醫(yī)生找到了其中的關鍵,那就是時間,時間要快。
確切的說,修改要在八秒以內,這樣bug就能穩(wěn)定復現(xiàn)。
然后在醫(yī)生的幫助下,AECL終于找到了Therac-25的bug。
![]()
圖2 Therac-25 偽代碼片段
實際上這個bug相當簡單,僅僅是一句放錯了位置的代碼(見圖2),但其隱蔽性要結合Therac-25的操作流程(圖3)來解讀才能顯現(xiàn)出來。
![]()
圖3 Therac-25執(zhí)行流程圖
把大象裝冰箱要分三步,用Therac-25進行治療也要分三步:第一步,操作員輸入處方;第二步,Therac-25根據(jù)處方進行機器設置;第三步,開始治療。正常情況下,三步順序執(zhí)行沒有任何問題。
但這兩次事故中操作員修改處方數(shù)據(jù),實際上形成了一種并行。
并行是計算機領域的一個術語,指多件事同時執(zhí)行,很多簡單問題一并行就變的難以理解。
Therac-25的原始射線非常集中,而這對人體危害是很大的,所以Therac-25會在射線路徑上放置一系列磁鐵,來對射線進行分散。
設置磁鐵的偽代碼見圖2。
如果懂一些編程的話,應該可以發(fā)現(xiàn)其標黃的用以清除標記位的指令(注釋3)放錯了位置,應該放在Magnet函數(shù)的循環(huán)外(注釋4)。
不懂編程也沒關系,只需要知道這段代碼有bug,而這個bug會讓Therac-25在調節(jié)磁鐵的時候,忽略操作員對處方進行的修改。
調整磁鐵需要8秒鐘左右,這8秒,便是Therac-25的死亡窗口。
在這兩起事故中,操作員的修改均發(fā)生在這個窗口內,所以修改都沒有生效,也就是說,Therac-25實際執(zhí)行的是X射線模式。
在Therac-25的設計中,X射線模式的能量只有一種,就是系統(tǒng)最大的25MeV,然后用一個射線過濾器來調節(jié)高強度的原始射線,將其減弱到治療所需強度。
只不過這個過濾裝置需要手工放置到照射路徑上,而在這兩次事故中顯然都沒有,因為操作員都以為正在執(zhí)行的是電子束模式!
所以悲劇就這樣發(fā)生了。
患者受到了原始的高強度射線的照射,事故中他們聽到的滋滋聲不是電流聲,而是射線測量器被射線穿透后發(fā)出的聲音,就像把42度量程的體溫計扔到開水里一樣,它已經飽和失效了。
后來經過測算,當時的輻射強度為25000倫琴,是站在爆炸的切爾諾貝利反應堆旁邊十分鐘接受的量的5倍。
兩名患者均在不久后死亡。
第五次事故發(fā)生后,醫(yī)生把事故和復現(xiàn)事故的詳細步驟告知了AECL。
AECL立即給所有用戶發(fā)了一份聲明,告知Therac-25存在問題,并給出了修改方案:
禁止向上移動光標。
就這么簡單。
然后他又給FDA做了匯報。
這是AECL第一次正式給FDA匯報問題,前面四起事故中,只有第二起(發(fā)生在加拿大)AECL告知了美國的FDA,但只含糊的說Therac-25存在一個需要“目視檢查”的問題,而且他還進行了召回。
不過AECL到底還是晚了一步,在此之前,F(xiàn)DA已經獲得了來自德克薩斯州健康部門的“非法”匯報,并且已經開始調查AECL的問題了。
說“非法”,是因為當時的美國法律只要求醫(yī)療設備的制造商匯報問題,并沒要求醫(yī)院等使用者,所以FDA一直不知道發(fā)生了這么多起事故。實際上當時FDA對醫(yī)院發(fā)生的、因醫(yī)療設備問題而引起的傷亡事故所知不足1%。Therac-25事件后,美國對這條規(guī)則進行了修改,同樣要求使用者向FDA匯報問題。當然這都是后話。
當時FDA很快否定了AECL那個禁止向上移動光標的用戶聲明,并要求他按照《健康與安全輻射控制法》的規(guī)定進行整改,具體包括:通知所有購買者、調查問題、確定解決方案、提交對應的改進計劃。
這時時間是1986年4月,驚世駭俗的切爾諾貝利大爆炸也發(fā)生在這一個月。
1986年5月,F(xiàn)DA再次要求AECL重新通知用戶,詳細說明問題,并提交改進計劃。
這時Therac-25的用戶也坐不住了,他們聯(lián)合起來,舉辦了第一屆Therac-25用戶大會。
從某種意義上來說,這很像一種自救:事故在不斷發(fā)生,而廠家給出的信息總是令人失望,對問題避重就輕,對改進夸大其詞。作為用戶,他們至少享有知情權。用戶聚在一起,討論了事故的詳細經過,然后開始共同尋找解決方案。AECL也派人參加了會議,他們表示之前沒透露太多信息完全是不想引發(fā)謠言,AECL絕對沒有keep things quite的公司政治。
用戶討論后要求增加硬件鎖。
AECL拒絕了他們,理由是多余。
但他表示自己正在開發(fā)一個能夠把Therac-25的安全性再提升幾個量級的補丁。這個補丁于1986年6月13發(fā)布,叫補丁V1。
不過FDA馬上否定了補丁V1,并要求AECL給出詳細測試計劃。
AECL表示測試計劃很難,但可以再加一個補丁,于是在1986年12月22日發(fā)布了補丁V2。
V2上線后的第25天,第六起事故發(fā)生了。
1987年1月,美國雅基瑪谷紀念醫(yī)院,第六起。
第六起和第三起發(fā)生在同一個地方。
在用戶和FDA的壓力下,AECL很快查明了問題。
簡單來說,這起事故是由另一個bug引起的。和之前的一樣,單從本身看,這個bug本身也不是什么大問題,僅僅是一個字節(jié)使用不當而已,但它們的影響都是致命的。
至此,AECL的信任被消耗的差不多了,哪怕他宣布立即上線之前被否定的硬件鎖,也沒有再讓大家相信Therac-25的安全性。
FDA很快下線了所有的Therac-25。
AECL繼續(xù)孜孜不倦的開發(fā)補丁。1987年7月21日,他發(fā)布了最后一版補丁,第5版,所以叫補丁V5。
但這個補丁并沒有V5起來,后面的日子里,Therac-25江河日下。
1988年,AECL重組了開發(fā)Therac-25的醫(yī)療部門,將其更名為Theratronics,并試圖打包賣給別人,未遂。
1991年,因為Therac-25的問題,F(xiàn)DA禁止了該公司的全部產品線。
2005年,Theratronics公司解散。
Therac-25事件后,F(xiàn)DA開始仔細研究醫(yī)療軟件設備的審查標準,并逐漸發(fā)展成了現(xiàn)行的IEC62304(2006版,國內對應為YY/T0664)。這也是現(xiàn)在醫(yī)療軟件開發(fā)過程管理的基本標準。
Therac-25其實就是一種機器人。
自機器人被發(fā)明,甚至被幻想出來開始,關于它不聽話了要怎么辦的擔憂就沒有停過。
而且這并不像科幻小說那么遙遠,你肯定聽過自動駕駛的故障,也用過只知道繞圈子息事寧人的智能客服,從廣義上來說,這都是機器對你的碾壓。
給牛頓寫了墓志銘的英國人蒲柏有這么一句詩:
To err is human; to forgive, divine。
犯錯是人性,寬恕是神性。
或許比起等待機器產生自我意識,然后要求它們憑借善良本性,遵循阿西莫夫的機器人三定律來,這會是一個更理性的選擇。
畢竟我們都知道人不能因噎廢食。
參考資料:
1.[Threac-25], https://en.wikipedia.org/wiki/Therac-25
2.[Medical Devices : The Therac-25], Nancy Leveson
3.[ An Investigation of the Therac-25 Accidents],Leveson, Nancy G.; Turner, Clark S
4.[Fatal Dose - Radiation Deaths linked to AECL Computer Errors],http://www.ccnr.org/fatal_dose.html
快報
根據(jù)《網(wǎng)絡安全法》實名制要求,請綁定手機號后發(fā)表評論