鵜飼 裕司/米eEye Digital Security Senior Software Engineer

 今回は,マシンコード実行型の脆弱性を突いた攻撃が可能となる条件をまとめてみました。以下,順に解説します。

(1)攻撃可能な脆弱性が存在する

 当然,この条件が前提となります。この条件さえ満たさなければ攻撃は不可能なので,開発者としては,この条件をつぶすことが最も重要となります。

(2)CPUのアプリケーション・ノートを入手できる

 第2回で書いたように,マシンコード実行型の脆弱性を攻略するには,shellコードをターゲット上で実行させる必要があります。shellコードは,ネイティブ・マシンコードで記述します。このため,ターゲットのCPUに関する情報(CPUの基本的な使い方やインストラクション・セットなど)を入手することが,攻撃を可能とする条件になります

 しかし,それほど難しいことではありません。攻撃者は,ターゲットのケースを分解すれば,CPUを簡単に見つけることができます。通常,CPUは汎用的なものが利用されていますので,その表面に記載されている型番をサーチ・エンジンなどで検索すると,ほとんどの場合,ベンダーのWebサイトなどからCPUに関する詳細な情報(アプリケーション・ノート)を入手できます。

 CPUの表面に刻印されている型番情報を消去すれば,CPUの判別は難しくなるでしょうが,そうでもしない限り,ほとんどの組み込みシステムにおいて,攻撃者はこの条件をクリアできます。

(3)コンパイラやアセンブラを入手できる

 shellコードを記述する際,コンパイラやアセンブラがあると便利です。ARMの場合には,フリーで提供されているGNUのアセンブラを利用できます。ただ,shellコードはそれほど複雑ではなくサイズも小さいので,ハンド・アセンブルでも可能でしょう。

(4)メモリーやレジスタの内容を確認できる

 この条件は,第4回で述べたJTAGエミュレータの接続に成功すればクリアできます。また,システムによっては,UART(Universal Asynchronous Receiver Transmitter)などにデバッグ・コンソールが実装されていて,メモリーを閲覧できる場合があります。それをうまく利用できれば,JTAGエミュレータを利用しなくても,この条件をクリアできます(JTAGエミュレータの接続については,第6回で詳しく解説します)。

(5)周辺装置を利用できる

 以上の条件を満たせば,ターゲット・システム上でshellコードを実行させることができます。しかし,周辺装置が利用できない場合には,致命的なダメージを与える攻撃はほぼ不可能です。周辺装置が利用できれば,メモリー内容をネットワーク経由で転送したり,フラッシュに記述されている設定情報を上書きしたりすることができます。

 周辺装置の利用には,APIを利用する方法と,周辺装置を直接制御する方法があります。

 APIを利用する場合には,ファームウエアをリバース・エンジニアリングして,攻撃の目的(パケット送信やフラッシュ書き換えなど)を達成するためのAPIを探し出します。ファームウエアは,JTAGエミュレータ経由でホストに吸い出せます。最近ではIDAのような高機能ディスアセンブラも存在しますので,リバース・エンジニアリングは以前に比べると容易になっています。

 周辺装置を直接制御する場合は,周辺装置のユーザー・マニュアルを入手する必要があります。ただ,最近はイーサネット・コントローラーなどのネットワーク機能はあらかじめCPUに組み込まれている場合があります。そのような場合には,CPUのマニュアルに詳細な解説が書かれています。

 周辺装置を直接制御する場合の“メリット”は,リバース・エンジニアリングを必要としないことです。また,ファームウエアのバージョンに依存しないshellコードを記述できます。しかし,デバイス制御(ハードウエア・ドライバ)に関する知識が不可欠です。さらに,APIを利用する場合に比べて,一般的にshellコードのサイズが大きくなります。

 どちらの方法も,攻撃者にとってメリットとデメリットがあるといえます。本稿では,周辺装置を直接制御する方法について解説したいと思います。(第6回へ続く)

 「Security Tech」は,米eEye Digital SecurityのSenior Software Engineerである鵜飼裕司氏による技術コラムです。鵜飼氏はMicrosoft製品のセキュリティ脆弱性(セキュリティ・ホール)を多数発見していることでも知られるセキュリティの専門家です。
 本コラムでは,あるテーマについて数回にわたって技術解説記事を執筆していただきます。1回目のテーマは,「組み込みシステムのセキュリティ」。全8回にわたって,組み込みシステムにおけるセキュリティ脆弱性の脅威の実際と,開発サイドに求められる組み込み機器独特の防衛策について解説していただきます。
 なお,鵜飼氏には「ITpro Watcher」も執筆していただいております。こちらのほうも,併せてお読みいただければ幸いです。(編集部より)