Баг-вбивця. Фигаг, фигак і Therac-25

Програмний код почав вбивати людей за допомогою машин ще в 1985 році.



Типова разова терапевтична доза радіації складає до 200 рад.
1000 рад — смертельна доза. Повстала машина фігачить в беззахисних землян 20 000 радий.

Розглянемо випадок, коли поетапне, але не узгоджене впровадження покращень софта призвело до системної помилку. До найгіршою в історії програмної помилку.

Therac-25 апаратна захист була прибрана і функції безпеки були покладені на програмне забезпечення.
Як проводилося розслідування, що мають намотати на вус проектувальники ІТ-систем, програмісти, тестувальники, щоб не допустити подібного.

Вбивця
Терак-25 (англ. Therac-25) — апарат променевої терапії, медичний прискорювач створений канадської державною організацією Atomic Energy of Canada Limited.





Релама апарату для домогосподарок.


Вбивство
З червня 1985 року по січень 1987 року цей апарат став причиною як мінімум шести передозувань радіації, деякі пацієнти отримали дози в десятки тисяч радий. Як мінімум двоє померли безпосередньо від передозувань.

Медсестра згадала, що в той день вона замінювала «x» на «e». З'ясувалося, що якщо зробити це досить швидко, переоблучение траплялося практично із 100-відсотковою ймовірністю.


Розслідування
Під час ведення судових справ проти AECL прокуратура штату Техас звернулася до Ненсі Ливесон як до експерта для розслідування. У той час вона була професором комп'ютерних наук Каліфорнійського Університету в Ірвайні і грала ключову роль в пионерном розвитку наук комп'ютерної безпеки. Ненсі об'єднала свої зусилля з Кларком Тернером і приблизно протягом трьох років вони займалися збором матеріалів і реконструкцією подій, пов'язаних з Therac-25[8]. Даний результат є особливо важливим, так як в більшості інцидентів з безпеки інформація є неповною, суперечливою і навіть невірної

Канадська державна організація «Atomic Energy of Canada Limited» (далі AECL) випустила три версії: Therac-6, Therac-20 і Therac-25. 6 і 20 були зроблені спільно з французькою компанією CGR. Партнерство припинилося перед проектуванням Therac-25, але в обох компаній залишився доступ до проектів і вихідними кодами ранніх моделей.

Програмний код в Therac-20 ґрунтувався на коді Therac-6. На всіх трьох апаратах був встановлений комп'ютер PDP-11. Попереднім моделям він не потрібен, так як вони були спроектовані як автономні пристрої. Технік з променевої терапії налаштовував різні параметри вручну, в тому числі і положення поворотного диска для налаштування режиму роботи апарату.


В електронному режимі відхиляючі магніти розподіляли промінь так, щоб електрони вкрили більшу площу. В рентгенівському режимі мішень розташовувалася на шляху випромінювання, електрони наносили по ній удар, щоб зробити фотони рентгенівського випромінювання, спрямовані на пацієнта. Нарешті, на шляху прискорювача можна було розташувати відбивач, з допомогою якого рентгенотехник міг навести випромінювання точно на хворе місце. Якщо відбивач був на шляху, електронний промінь не запускався.

На Therac-6 і 20 апаратні механізми блокування не дозволяли оператору зробити щось небезпечне, скажімо, вибрати електронний пучок високої потужності без рентгенівської мішені на місці.

Спроба активувати прискорювач в неправильному режимі призводила до спрацьовування запобіжників і зупинки роботи. PDP-11 і супутнє обладнання були вбудовані для зручності. Технік міг ввести рецепт в термінал VT-100, і комп'ютер, використовуючи сервоприводи, автоматично налаштовував поворотний диск і інші пристрої.


Працівникам лікарень подобалося, що комп'ютер налаштовує все швидше, ніж людина. Чим менше часу йшло на налаштування, тим більше пацієнтів можна було прийняти за день.

Коли прийшов час зробити Therac-25, AECL вирішили залишити тільки комп'ютерне управління. Вони відмовилися від пристроїв ручного управління і від апаратних механізмів блокування. Комп'ютер повинен був стежити за настройками пристрою і, в разі виявлення неполадок, повинен був відключати живлення всієї машини.

Ну ну.

У програмному забезпеченні Therac-25 були знайдені як мінімум чотири помилки, які могли призвести до переоблучению.

  • Одна і та ж змінна застосовувалася як для аналізу введених чисел, так і для визначення положення поворотного кола. Тому при швидкому введенні даних через термінал Therac-25 міг мати справу з неправильним положенням поворотного кола (так зване стан гонки).

  • Настройка положення відхиляючих магнітів займає близько 8 секунд. Якщо за цей час установки типу і потужності випромінювання були змінені, а курсор встановлений на фінальну позицію, то система не виявляла змін.

  • Ділення на величину випромінювання, що приводить у деяких випадках до помилки ділення на нуль і до відповідного збільшення величини опромінення до максимально можливої.

  • Установка булевской змінної (однобайтовим) в значення «істина» проводилося командою «x=x+1». Тому із ймовірністю 1/256 при натисканні кнопки «Set» програма могла пропустити інформацію про некоректну положенні диска.
Крім цих явних помилок, було помічено безліч потенційних — наприклад, в багатозадачного операційній системі не було ніякої синхронізації.

Виправлення
  • Помилки дозиметрії стали вважатися фатальними (після них система перезавантажується).
  • Додана миттєво перезапускающая систему програмна гілку і робить те ж саме незалежна апаратна ланцюг.
  • Виправлені всі знайдені помилки; додана перестраховка.
  • Незрозумілі повідомлення про помилки замінені осмисленими.
  • Положення диска додатково зчитується потенціометром і передається на пульт управління.
  • Зміна положення диска і інших частин апарата тепер можливо тільки тоді, коли оператор утримує спеціальну педаль.
  • В режимі рентгенівської терапії відхиляючі магніти для електронної терапії встановлюються в таку конфігурацію, що відхиляють пучок електронів на 270°.
Виробник повідомив, що програмне і апаратне забезпечення протестовано протягом багатьох років. Однак, при розгляді з'ясувалося, що програмне забезпечення було перевірено мінімальною кількістю тестів на симуляторі, а більшість часу тестувалася вся система в цілому. Таким чином, модульним тестуванням пренебрегалось, а проводилося тільки інтеграційне тестування.

Було висунуто наївне припущення, що повторне використання коду або коробкового продукту збільшить безпеку програмного забезпечення в силу тривалості їх успішного застосування. Повторне використання коду не гарантує безпеку модуля в новій системі, так як її проектування має свої особливості. Переписування з нуля дозволяє отримати більш просту і прозору систему, і як наслідок, більш безпечну.

В даному випадку мало місце повторне використання програмного коду з Therac-6 і Therac-20. У Therac-6 взагалі не було рентгенівської терапії, в Therac-20 застосовувався механічний блокіратор.

Після нещасних випадків Therac-25 FDA змінило своє ставлення до безлічі проблем систем, пов'язаних з безпекою, і особливо у відношенні до програмного забезпечення. Як результат, FDA запустило процес поліпшення своїх процедур, директив і системи звітності, і включило в них програмне забезпечення. Даний урок був важливим не тільки для FDA, але і для всіх промислових систем, критичних до безпеки.

Ще матеріали по темі Therac-25
Висновок
Software Engineering Institute говорить про середню числі в 1 баг на кожні 100 рядків коду і 98% випадків збоїв пристроїв, що трапляються з причин помилок у ПЗ, легко можна було б уникнути при належному рівні тестування коду. Знаючи про це, хочеться приєднатися до руху "дайте код подивитися". Начебто заходи після гучних випадків прийняті, але все одно не дуже хочеться зіткнутися з бормашиною, де змінної, що відповідає за кутову швидкість, «помилилися на нулик». Шановні тестувальники (програмісти, розробники), робіть свою роботу добре.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.