犯罪者に付け入るスキを与えなければ,セキュリティの問題は起こらない。組み込み製品のセキュリティを考える上で,スキを作らないことが最大の対策になる。組み込み製品のスキとはすなわち,プログラムのバグや設定ミス,ユーザーの勘違いを誘うようなユーザー・インタフェースである。

 これらの問題の多くは製品開発の過程で気をつければ,取り除ける。しかし,現在の現場では開発の過程でセキュリティはほとんど考慮されていないし,開発者への教育も行き届いていない。

 そこで今,ソニーデジタルネットワークアプリケーションズや情報処理推進機構(IPA)は,開発プロセスの中に,セキュリティ評価を組み込む試みを始めている。このほか,東京大学は新しい言語を使い脆弱性のないOSを開発中である。組み込みを主な用途と考えている。

三つの攻撃パターン

 ネットワークにつながり,インターネットからサービスを受ける時代,組み込み機器はどのような攻撃を受けるだろうか。多くのセキュリティ技術者は「パソコンと変わらない」と考えている。

 現在,パソコンを狙う攻撃の手口は大きく三つある。(1)ネットワークに公開されているサービスを狙う攻撃,(2)ユーザーに不正なプログラムを実行するように仕向ける攻撃,(3)直接犯罪者がパソコンを触りながら実行する攻撃だ。

 (1)はネットワーク経由で利用できるサービスの脆弱性や設定の甘さを狙うもの。その代表例がバッファ・オーバーフローの脆弱性を狙った攻撃である(別掲記事「究極の攻撃 バッファ・オーバーフロー」を参照)。ネットワーク越しに不正なコードをいきなり送り込まれ,犯罪者の支配下に置かれてしまう。

 このほか,Webサーバーのプログラムに文字列チェックの甘さが残っていたり*1,ファイル共有サービスで単純なパスワードしか設定していないところから情報が漏えいする危険もある。

 (2)はユーザーが自ら悪意あるデータにアクセスすることで攻撃を受けるというもの。例えば,メールの誘い文句でウイルスが埋め込まれたWebページにアクセスさせるという手法である。Webブラウザにファイル実行の脆弱性がある場合などに攻撃を受ける。2001年に猛威を振るったNimdaがまさにこの攻撃手法を使った。

 (3)は,盗難や破棄などによって犯罪者がコンピュータに直接触れられる場合の問題だ。コンピュータに不正にログオンして操作したり,内蔵のハードディスクから直接データを抜き取ることが考えられる。

組み込みならではの機能が狙われる

図1●組み込み機器を狙う攻撃の例
パソコンとほぼ同様の攻撃が考えられる。

 対象になるサービスは異なるかもしれないが,組み込みでも同じ手法が攻撃に使われる危険性が高い(図1[拡大表示])。

 まず,(1)ネットワークに公開されているサービスへの攻撃は,設定/管理/運用のために用意されているWebサーバーや機器間連携のためのサービスを標的にする。後者としてはUniversal Plug and Play(UPnP)がある。UPnPはパソコンや周辺機器,AV機器,家電製品などがネットワークを介して機能を相互に提供し合うための技術仕様である。

 例えば,マルチメディア・サーバーやプリンタ,ルーター,AVコントローラ,ネットワーク・カメラなどの自動連携を定義しており,すでにこれらを組み込んだ機器も登場している。ここに脆弱性が残っていたり,甘い設定になっていると,ウイルスの埋め込みや情報漏えいが起こる危険性がある。2001年12月,Windows XP/MeのUPnP機能にバッファ・オーバーフローの脆弱性が見つかっている。組み込み機器でもこの種の脆弱性が残っている可能性は十分にある。

 (2)のユーザーを誘導する攻撃では,テレビや携帯電話などに搭載するWebブラウザのほか,マルチメディア再生機構が問題になりそうだ。今後のHDDレコーダやデジタルテレビの進化の方向を考えたとき,インターネットのサーバー上に置かれたコンテンツを保存/再生できるようになるだろう。例えば,不正なコードが埋め込まれたMPEG-2ファイルがサーバーに置かれていれば,これを実行してしまう危険性は十分にある。

 実際,Windows XP/Server 2003においてJPEGの解釈エンジンに不正なコードの実行を許す脆弱性が2004年9月に見つかっている。また,その後すぐにこれを狙ったウイルスが登場した。映像ファイルを再生しただけで感染する事態はそれほど荒唐無稽な話ではない。

 (3)のローカル攻撃が組み込み機器で可能なのは,説明するまでもないだろう。決済が可能な端末であれば,決済情報や購入履歴,個人情報が取り出されるかもしれない。


究極の攻撃バッファ・オーバーフロー

図●バッファ・オーバーフローの脆弱性を狙った攻撃
悪意あるプログラムと改変したリターン・アドレスを含んだデータによってバッファを溢れさせて,リターン・アドレスを書き換える。リターン・アドレスが読み出されると,悪意あるプログラムが動作する。

 不正なコードを含んだデータをマシンに送りつけて,リモートのマシンを支配下におく—。バッファ・オーバーフローは「魔法の弾丸」と呼ばれるほど,攻撃者にとって魅力的な脆弱性だ。

 一般に外部とデータをやり取りするプログラムは,受け取ったデータを一時的に蓄えておくバッファと呼ぶメモリー領域を持っている。バッファ・オーバーフローはこのバッファの領域を超えてデータが格納される場合に起こる([拡大表示])。

 例えばURLを受け取って,適切なディレクトリのファイルを返すWebサーバーを考える。このとき,バッファにURLを格納し,その構造を解析してどのディレクトリを表しているかを調べる。もし,20文字分しかバッファ領域を確保していないのに,40文字のURLが送られてきたときにどうなるか。もちろん,20文字以内かどうかをチェックするプログラムが構造解析の前にあれば問題は起こらない。

 しかし,チェックを怠ってそのままバッファに収めようとすると,20文字分のデータがバッファの隣のメモリー領域にあふれ出し,元のメモリーの内容を上書きしてしまう。この結果,メモリーの中身が書き換わりプログラマが意図しない動作が引き起こされる。

 バッファのそばには,その処理が終わった後の戻り番地(リターン・アドレス)が書き込まれていることが多い。ここを書き換えられてしまうと,処理が終わったときに,設計者が思ってもみなかったアドレスに飛んでしまう。先のWebサーバーの例で,悪意あるコードと,このコードが書かれた場所を指し示すリターン・アドレスがURLに書かれていたとする。処理が終わったとたん,悪意あるコードが走り出すことになる。

 バッファ・オーバーフローの脆弱性は,主にプログラムがC/C++で書かれている場合に発生する。C/C++の仕様では,メモリーの領域管理はプログラマに任されているからだ。防ぐためには,プログラマが明示的にデータ領域をチェックする必要がある。