■ バグ史上最強決定戦?
2005年 11月 16日 |
日頃気安くバグだ!バグ!!といって何でも片付けがちになるが
考えてみれば、そんな軽率なものじゃない。
そんなこと考えてたら、本日この記事の「下」がっ!

なんてタイムリー・・・・・・。

ということで、一挙に引用






「史上最悪のソフトウェアバグ」ワースト10を紹介(上)
Excite エキサイト : ニュース


 トヨタ自動車は先月、何もしないのに警告灯が点灯し、ガソリンエンジンが突然停止するとの報告を受け、ハイブリッド車『プリウス』約16万台を無償修理すると発表した。しかし、今回のプリウスの問題は、これまでの大規模な自動車のリコールと違い、ハードウェアが原因ではなかった――ハイテクを駆使したこのスマートカーに組み込まれたプログラムのバグが原因だった。

 今回の問題により、プリウスはバグを抱えるコンピューターの仲間入りをした。史上初のコンピューター・バグは1945年、『ハーバード・マーク2』のFパネルの70番リレーに虫が挟まった時にまでさかのぼる。乗算器と加算器のテスト中、異常に気づいた技術者が、この部分に蛾が挟まっているのを見つけたのだ。原因となった蛾は、「バグ(虫)が実際に見つかった最初のケース」との説明文とともに、業務日誌にテープで貼り付けられた。

 それから60年が経ったが、コンピューター・バグはいまだに存在しつづけ、絶滅する気配はない。ソフトウェアとハードウェアの境界があいまいになる中、プログラムのミスが日常生活に影響を与えることもますます増えている。もはやバグの生息地は、オペレーティング・システム(OS)やアプリケーションの中にとどまらない――今では携帯電話やペースメーカー、発電所や医療機器にもバグは潜んでいる。そして今回は車にも発見されたわけだ。

 しかし、最悪のバグといったら、どれになるだろうか?

 大混乱を引き起こしたバグをリストアップするのは簡単だ。だが、その重大性に順位を付けるとなると難しい。たとえば、ワームに悪用され、インターネットを数日間にわたってマヒ状態に追い込んだセキュリティーの脆弱性と、国中の電話システムが丸一日機能不能になるきっかけを作ったタイプミスと、どちらがより深刻だろうか? その答えは、あなたが電話をしたいのか電子メールをチェックしたいのかで変わってくる。

 多くの人は、人命にかかわる事態を起こすバグが最悪のものだと考えている。もちろんその数は少ないが、1980年代後半、放射線治療装置『セラック25』がプログラムミスによる誤動作を起こし、放射線障害で死者が出たケースなどは、安全が非常に重視される用途にやみくもにソフトウェア的手段を用いることへの警告として知られている。

 ただし、このようなシステムを研究する専門家は、あるソフトウェアによりごく少数の死者が出るとしても、こうした危険性にばかり焦点を当てていては、処理能力の向上が切に望まれている分野への新技術の導入が進まなくなる恐れがあると警告する。結局は、ソフトウェアが導入されなかったために命を落とす人のほうが、バグによる事故での死者よりも多くなりかねないというのだ。

 ともかく、バグが尽きないことだけは確かなようだ。以下に、ワイアード・ニュースが選ぶバグの歴代ワースト10を年代順に挙げていく……あくまで現時点までのことだが。

1962年7月22日――火星探査機『マリナー1号』:マリナー1号は打ち上げ時に予定のコースを外れたが、これは飛行ソフトウェアのバグが原因だった。地上の管制センターは大西洋上でロケットを破壊した。事後調査により、鉛筆で紙に書かれた数式をコンピューターのコードに置き換えるときにミスが起き、これが原因でコンピューターが飛行コースの計算を誤ったことが判明した。

1982年――旧ソ連のガス・パイプライン:シベリアを横断するガス・パイプラインの管理に旧ソ連が購入したカナダ製のコンピューターシステムに、米中央情報局(CIA)のスパイがバグを仕掛けたことがあるという(PDFファイル)。旧ソ連は当時、米国の機密技術を密かに購入しようと――または盗み出そうと――しており、このシステムを入手したのもその一環だった。だが、計画を察知したCIAはこれを逆手にとり、旧ソ連の検査は問題なく通過するが、いったん運転に入ると機能しなくなるように仕組んだとされる。この結果起きたパイプライン事故は、核爆発以外では地球の歴史でも最大規模の爆発だったという(日本語版記事)。

1985~1987年――セラック25:複数の医療施設で放射線治療装置が誤作動し、過大な放射線を浴びた患者に死傷者が出た。セラック25は2種類の放射線――低エネルギーの電子ビーム(ベータ粒子)とX線――を照射できるよう、既存の設計に「改良」を加えた治療装置だった。セラック25では電子銃と患者の間に置かれた金属製のターゲットに高エネルギーの電子を打ち込み、X線を発生させていた。セラック25のもう1つの「改良」点は、旧モデル『セラック20』の電気機械式の安全保護装置をソフトウェア制御に置き換えたことだった。ソフトウェアの方が信頼性が高いとの考えに基づく判断だった。

 しかし、技術者たちも知らなかった事実があった――セラック20およびセラック25に使われたOSは、正式な訓練も受けていないプログラマーが1人で作成したもので、バグが非常にわかりにくい構成になっていたのだ。「競合状態」と呼ばれる判明しにくいバグが原因で、操作コマンドを素早く打ち込んだ場合、セラック25ではX線用の金属製ターゲットをきちんと配置しないまま高エネルギーの放射線を照射する設定が可能になっていた。これにより少なくとも5人が死亡し、他にも重傷者が出た。


「史上最悪のソフトウェアバグ」ワースト10を紹介(下)
Excite エキサイト : ニュース


1988年――バークレー版UNIX(BSD)のフィンガーデーモンによるバッファー・オーバーフロー:最初のインターネットワームとなった通称『モーリス・ワーム』は、バッファー・オーバーフローを悪用し、1日足らずで2000台から6000台のコンピューターに感染した。原因となったのは、標準入出力ライブラリー・ルーチン内の「gets()」という関数のコードだ。「gets()」関数はネットワーク越しにテキストを1行取得するように設計された。しかし、残念ながら「gets()」関数は入力を制限するようには作られていない。そのため、あまりにも大きな入力があった場合には、接続可能なあらゆるマシンをワームが占拠する元凶になった。

 プログラマーは「gets()」関数を使用コードから排除することで問題に対処しているが、C言語の標準入出力ライブラリーからこれを削除することは拒否しており、この関数は現在も存在している。

1988~1996年――『ケルベロス』の乱数生成アルゴリズム:ケルベロスは暗号を使ったセキュリティーシステムだが、乱数発生器に与えるシード(種)が適切でなく、真にランダムな乱数が生成されていなかった。その結果、ケルベロスによる認証を用いているコンピューターについて、非常に簡単な方法で侵入可能な状態が8年間にわたって続いた。このバグが実際に悪用されたかどうかは、今も定かではない。

1990年1月15日―― 米AT&T社のネットワーク停止:米AT&T社の長距離電話用交換機『4ESS』を制御する最新版のソフトウェアにバグが入りこんだ。このため、4ESSは隣接するマシンの1つから、ある特定のメッセージを受け取るとクラッシュするようになってしまった――そしてそのメッセージとは、クラッシュした交換機が復帰した際に、隣接する交換機に送信するものだった。

 ある日、ニューヨークの交換機がクラッシュし再起動した。するとそれが原因で隣接する複数の交換機がクラッシュし、これらの交換機が再起動すると隣接する複数の交換機がさらにクラッシュし、この現象が延々と続いた。しばらくすると、114台の交換機が6秒ごとにクラッシュと再起動を繰り返すようになった。この影響でおよそ6万人の人々が9時間にわたって長距離通話サービスを利用できなくなった。修復のため、技術者たちは1つ前のソフトウェアをロードした。

1993年――インテル社製『Pentium』(ペンティアム)による浮動小数点数の除算ミス:米インテル社が大々的に売り出したPentiumチップが、特定の浮動小数点数の除算で誤りを引き起こした。たとえば、4195835.0/3145727.0を計算させると、正しい答えの1.33382ではなく1.33374となる。0.006%の違いだ。

 実際にこの問題の影響を受けるユーザーはごくわずかだったが、ユーザーへの対応から、同社にとって悪夢のような事態につながった。概算で300万~500万個の欠陥チップが流通していた状況で、インテル社は当初、高精度のチップが必要だと証明できる顧客のみをPentiumチップの交換対象とした。しかし、最終的にインテル社は態度を改め、不満を訴えるすべてのユーザーのチップ交換に応じた。この欠陥は結局、インテル社に約4億7500万ドルの損害を与えた。

1995年/1996年――『Ping of Death』:[ピング・オブ・デス、不正なピングパケットによる攻撃]分割送信されたIPパケットの再構成を行なうコードのチェックとエラー処理が不十分だったため、インターネット上の好きな場所から不正な形式のピングパケットを飛ばすことで、さまざまなオペレーティング・システム(OS)をクラッシュさせることができた。影響が最も顕著に現れたのはウィンドウズ搭載マシンで、この種のパケットを受け取ると、「死のブルー・スクリーン」と呼ばれる青い画面を表示して動作が停止してしまう。しかしこのバグを利用した攻撃は、ウィンドウズのみならず、マッキントッシュやUNIXを使ったシステムにも多くの被害をもたらした。

1996年6月4日――『アリアン5』フライト501:欧州宇宙機関の開発したロケット、アリアン5には、『アリアン4』で使われていたコードが再利用されていた。しかし、アリアン5ではより強力なロケットエンジンを採用したことが引き金となり、ロケットに搭載された飛行コンピューター内の計算ルーチンにあったバグが問題を起こした。エラーは64ビットの浮動小数点数を16ビットの符号付き整数に変換するコードの中で起こった。アリアン5では加速度が大きいため、64ビット浮動小数点で表現される数がアリアン4のときよりも大きくなってオーバーフローが起こり、最終的には飛行コンピューターがクラッシュしてしまった。

 フライト501では、最初にバックアップ・コンピューターがクラッシュし、それから0.05秒後にメイン・コンピューターがクラッシュした。その結果、エンジンの出力が過剰になり、ロケットは打ち上げ40秒後に空中分解してしまった。

2000年11月――パナマ国立ガン研究所:米マルチデータ・システムズ・インターナショナル社(本社ミズーリ州)が製作した治療計画作成用ソフトウェアを使っていたパナマの国立ガン研究所で、放射線治療で照射する放射線量の計算を誤る一連の事故が起きた。

 マルチデータ社のソフトウェアでは、健康な組織を放射線から守るための「ブロック」と呼ばれる金属製のシールドの配置を、コンピューターの画面上に描いて決めるようになっていた。しかし、同社のソフトウェアではシールドが4個しか使えなかったにもかかわらず、パナマ人の技師たちはこれを5個使いたいと考えた。

 技師たちは、真ん中に穴を持つ1個の大きなシールドとして、5個のシールドをまとめて表示させれば、ソフトウェアをだますことができることを発見した。だが、そうした配置にした場合、穴の描き方によってこのソフトウェアが返す計算結果が違ってくることにはまったく気づいていなかった。ある方向に向けて描くと正しい照射量が計算されるが、違う方向に描くと必要な照射量の最大2倍の量を推奨してきたのだ。

 少なくとも8人の患者が死亡し、さらに20人が過剰照射によって深刻な健康被害を受けたとみられている。技師たちは、コンピュータによる計算結果を手作業で再チェックする法的義務を負っていたため、殺人罪で起訴されることになった。



いかがでしたでしょうか?
ご存知のものありましたか?
[PR]