図2  セキュリティを考えるポイント<BR>なるべく早い段階でセキュリティ・ホールを潰せれば,完成度の高い製品を作りやすい。
図2 セキュリティを考えるポイント<BR>なるべく早い段階でセキュリティ・ホールを潰せれば,完成度の高い製品を作りやすい。
[画像のクリックで拡大表示]

パソコンの対策は施せない

 ところが困ったことに組み込み機器では,パソコンのようなセキュリティ対策は施しづらい。

 パソコンではセキュリティ対策として,修正プログラムの迅速な適用,ウイルス対策ソフトのインストールと定義ファイルの更新,パーソナル・ファイアウォールの搭載,推測されにくいパスワードの利用などが挙げられる。

 しかし組み込みの世界で,これらの対策を一般に普及させるには無理がある。まずコスト。アップデートの仕組みを整え,ウイルス対策ソフトを組み込むとコスト増大の要因になる。

 ユーザー層が子供からお年寄りまでと幅広いことも障害だ。パソコン・ユーザーでこれらの対策を徹底できていないことを考えれば,組み込みの世界では不可能に近い。セキュリティ・ホールが見つかったことや新型ウイルスが発生したことを告知し,全員に的確な対策をお願いするのは難しい。

 また,組み込み機器には使い勝手を損なうものは入れられない。例えばパスワードを入力しないと動かないテレビやハードディスク・レコーダーなどは考えづらい。

脆弱性のない製品を作り上げる

 脆弱性の多くはささいなミスから生じる。例えば,「データにアクセスする前の認証を付け忘れた」「バッファの領域あふれを考慮しなかった」といったものだ。こういったミスを最小限に抑えるには企画段階から取り組む必要がある(図2[拡大表示])。開発の上流工程である企画/設計の段階でしっかりとレビューしておけば,最終製品になった段階でのセキュリティ・ホールは確実に減る。

 企画段階では,その製品に入っている情報の価値,それを取り巻く利害関係者の振る舞い,事故が起こったときの損害などを分析する。そうすれば,最悪の場合に何を死守し,何を捨てられるかが見えてくる。

 例えば,携帯電話を考えてみる。もし,携帯電話の個体認証情報が簡単に書き換えることが可能だったら,クローン機が作られかねない。この結果,携帯電話会社は通信/通話量による課金ができなくなり,経営を揺るがす問題に発展する。また,端末から電子メールリストが簡単に漏れるなら犯罪に利用されるかもしれない。

 次の段階である要件定義では,企画時の検討に従い,セキュリティ上必要な要求を定義する。先の携帯電話の例では,個体認証情報は経営の根幹にかかわるため,3重のロックをかける,電子メールリストは簡単に漏れないようにアクセスするときは必ずパスワードを要求するといった具合だ。

 設計段階では要件に応じた仕組みを考える。特に,アプリケーション間やチップ間のインタフェース部分の設計は重要である。この連携部分でデータが漏えいしやすい。携帯電話の例であれば,個体認証情報が格納エリアからマイクロプロセッサに呼び出される場合は,相互に認証した後,暗号化して渡すようにする。犯罪者がチップ間のデータのやり取りを調べ,偽の認証情報を吐き出す回路を作る危険性があるからだ。

 重要情報のライフサイクルも考えておかなければならない。重要な情報がどのように生成/表示/保存/破棄されるのかを考慮しておく。例えばクレジットカード番号を一時的にストレージに書き込む場合,アプリケーションはこのデータを確実に消してから終了する必要がある。

 さらに,セキュリティ上重要なプログラムを分離し,小さく作る設計にしておく。小さいプログラムであるほど,バグが出にくい。

 実装では,プログラマが脆弱性の発生しやすい個所を意識してプログラミングする。具体的には,バッファ・オーバーフローの脆弱性を生みやすいメモリー操作やコマンドに注意を払う,想定外の文字列やデータが渡されたときに適切な例外処理を行うといった工夫をする。

 最後のテスト段階では,攻撃のシーンを洗い出し,過去に使われたパターンをすべて試す。このために,過去の攻撃パターンを研究して分類し,データベース化しておく必要がある。