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

 前回で脆弱性の存在を確認したので,今回は,いよいよshellコードを流し込んでみます。目的は,イーサネット・コントローラの制御が可能かどうかを調べることです。

shellコードのアプローチ

 第6回で書いたように,ターゲットのCPUはSamsung社製のS3C4510Bです。S3C4510BのコアはARM7DTMIであり,16ビット・モードと32ビット・モードの2つのインストラクション・モードが用意されています。shellコードはどちらのモードで記述してもかまいませんが,32ビット・モードの場合はNULLが混入しやすいため,strcpy()などの文字列処理で発生するバッファ・オーバーフローの攻略には不向きです。そこで,16ビット・モードで記述します。

 ファームウエアが32ビット状態で動作している場合は,以下のように,オペランド・レジスタの状態ビット(ビット0)をセットしてBX命令を実行することで,16ビット状態に移行できます。

add  r12,pc,#0x1
bx   r12

 あとは,16ビット・モードでshellコードを記述します。16ビットモードの基本的な命令セットを以下に示します。


図11. 16ビット・モードの命令セット
[画像のクリックで拡大表示]

S3C4510Bとshellコード

 周辺装置をshellコードから直接制御するためには,制御したい周辺装置の利用方法と,ベースI/Oアドレスを知る必要があります。S3C4510Bには,イーサネット・コントローラ,2本のUART,18本のプログラマブルI/O,I2Cシリアル・インタフェース,タイマーといった,さまざまな周辺装置が組み込まれており,それらを簡単に制御できるようになっています。今回は,プログラマブルI/Oとイーサネット・コントローラの制御について解説します。

 S3C4510Bのリセット直後のメモリー・マップは,以下のようになっています。


図12. S3C4510Bのリセット直後のメモリマップ
[画像のクリックで拡大表示]

 Special Function Registersのオフセット0(アドレス0x03FF0000)は,System Configuration Registerとなっています。このレジスタの値を読み出すことにより,Special Register Bankのベース・アドレスを取得できます。S3C4510Bの周辺装置にアクセスする際は,マニュアルに記載されているI/Oアドレスに,このベース・アドレスを足したアドレスにアクセスします。

プログラマブルI/O

 プログラマブルI/Oとは,デジタル・データの入出力をおこなうためのモジュールであり,外部接点状態の読み取り(Input),および外部装置制御のための接点開閉(Output)の機能を提供します。S3C4510Bには18本のプログラマブルI/Oが用意されており,それぞれを,入力,出力および特殊モードに設定できます。プログラマブルI/Oの用途は,センサーやスイッチからの入力,LEDやリレーへの出力などがあります。

 プログラマブルI/Oを利用する場合は,IOPMOD RegisterおよびIOPDATA Registerの2つのレジスタを操作します。IOPMOD Registerにおいて各I/Oポートのモード(0=入力,1=出力)を設定し,IOPDATA Registerを読み書きすることで,各ポートの状態を取得したり(入力),各ポートの状態を設定したり(出力)することができます。

 S3C4510Bの各プログラマブルI/Oのピンは以下のようになっています。


ピン番号

プログラマブルI/OとLED
[画像のクリックで拡大表示]
図13. プログラマブルI/O

 今回のターゲットでは,17番のプログラマブルI/OがLink LEDに接続されていますので,IOPMOD Registerで17番ポートを出力に設定し,IOPDATA Registerで17番ポートをON/OFFすると,Link LEDの点滅を確認することができます。

 ルーターのLink LED点滅は無害ですが,もしターゲットが何らかの制御機器であり,プログラマブルI/Oがモーター等に接続されていると,場合によっては非常に危険です。CPUに用意されているプログラマブルI/Oは,セキュリティ脆弱性があると攻撃者に簡単に悪用されてしまいます。それを十分考慮した上で,システムを設計すべきです。

イーサネット・コントローラ

 イーサネット・コントローラを制御すると,パケットの入出力が可能となります。ルーターの場合には,メモリー内容を送信することで,パスワードや送受信バッファのような重要な情報を取得できます。また,別のターゲットを自動的に探して攻撃するようなインターネット・ワームを作成することも可能です。このように,イーサネット・コントローラは,攻撃者にとって非常に重要な機能です。

 イーサネット・コントローラは,主に,送受信バッファを制御するためのBuffered DMA(BDMA)レジスタ群と,媒体(Media)へのフレーム送出を制御するための媒体アクセス制御レジスタ群の2種類のレジスタ群で制御します。これらのレジスタは割り込みを使って制御するのが一般的ですが,shellコード内では簡単のためポーリングで制御します。

 実験では,特定のメモリー・エリアを,ICMPパケットに載せて送出するコードを作成しました。詳細は割合しますが,パケット送信までの手順を以下にまとめましたので,検証したい方は参考にしてください。


図14. イーサーネット・コントローラの制御

最後に

 今回は,ネットワーク対応の組み込み機器におけるマシンコード実行型のセキュリティ脆弱性について,特定の機器を例にその脅威を分析しました。いくつかの条件を満たせば,ブラック・ボックスのように見える組み込み機器でも,十分に攻撃者の標的になりうる可能性があることが明らかとなりました。

 現在は,組み込み機器をターゲットとした攻撃はあまり活発ではありません。しかし今後,情報家電やモバイルがさらに普及すれば,この種の攻撃が活発化する恐れがあります。組み込み機器を開発の際には,セキュリティに対する配慮を十分に行う必要があるものと思います。

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