スライド 1 - Software Engineering Laboratory

組込みソフトウェアのテストを目的とした
CPUエミュレータ上での異常注入手法
東 誠† 山本 哲男‡ 早瀬 康裕†
石尾 隆† 井上 克郎†
†
‡
2009/11/6
大阪大学大学院情報科学研究科
立命館大学総合理工学院情報理工学部
SIGSE-166-19
1
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
発表内容
• 背景
– 組込みシステムの信頼性
– 組込みソフトウェアのテストの問題点
– 本研究の目的
• 提案手法
• ケーススタディ
• 考察
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
2
2009/11/6
組込みシステムの信頼性
• 組込みシステムは,専用の外部デバイスと組
込みソフトウェアから成り立つ
外部デバイス:機器の外部から受け取った入力を
変換してソフトウェアに出力する装置
携帯電話の場合,ボタンやタッチパネル,カメラなど
• 組込みシステムには高い信頼性が求められ
るものがある
– ペースメーカーが停止すると人命の危機に陥る
– 携帯電話内の個人情報が読み取られる
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
3
2009/11/6
組込みソフトウェアの故障
信頼性を向上させるには,組込みソフトウェア
の故障に対処する必要がある
– 特定の状況で外部デバイスから特定の入力列を
受け取った際に,故障が発生することがある
• 短期間で通信を繰り返すと,携帯電話端末の動作が
不安定になる[1]
• 携帯電話でメール作成中,「題名」を入力直後に「本
文」を入力すると,操作ができなくなる場合がある[2]
– 以降,組込みソフトウェアの故障を発生させる可
能性のある入力を,異常な入力と呼ぶ
[1] FOMA M1000 | お客様サポート | NTTドコモ, http://www.nttdocomo.co.jp/support/trouble/data/smart_phone/m1000/
[2]重要なお知らせ : 「FOMA D900i」をご愛用のお客様へ | お知らせ | NTTドコモ , http://www.nttdocomo.co.jp/info/notice/page/040817_00.html
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
4
2009/11/6
組込みソフトウェアのテストの問題点
• 異常な入力を用いたテストには手間がかかる
– テストの度に外部デバイスから受け取る入力値を
調整しなければならない
– ソースコードを書き換えて入力値を自動的に書き
換えるには,ビルドし直す必要がある
– デバッガで入力値を書き換えるには,細かい作
業を大量に行う必要がある
• テストには様々な入力が必要になるため,そ
れらの用意に必要な手間は無視できない
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
5
2009/11/6
入力を用いたテストを容易にする
ツール
ソフトウェアに異常な入力を注入する
FIG[3]は関数の呼び出しを横取りし,代わりの返
り値を返す
→ 外部デバイスから入力を受け取る関数の呼び
出しを横取りすれば,異常な入力の注入が可能
main関数
main(){
read();
・
・
・
・
・
・
呼び出す
FIG
代わりの返り値を返す
返り値を返す
read関数
read(){
アクセスする
外部デバイス
・
・
・
return input;
}
入力を渡す
[3] P. Broadwell, N. Sastry, and J. Traupman, FiG: A Prototype Tool for Online Verification of Recovery
Mechanisms Proc. ACM ICS SHAMAN Workshop, June 2002.
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
6
2009/11/6
組込みソフトウェアのテストに
FIGを利用する際の問題点
外部デバイスから入力を受け取る際に関数を
利用しない組込みソフトウェアがある
メモリからの読み込みと同じ方法を利用する
外部デバイス専用のアドレスを指定
組込みソフトウェア
LDR ADDR
ADD
MOV
・
・
・
・
・
・
メモリアドレスにアクセスする
外部デバイス
FIG 横取りできない
入力を渡す
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
7
2009/11/6
本研究の着眼点
組込みシステムには,外部デバイスがメモリ
アドレスに対応付けられているものがある
その組込みソフトウェアが外部デバイスから入力
を受け取るには,CPUのロード命令を使用する
→ ロード命令を横取りすれば,組込みソフトウェ
アに異常な入力を注入することができる
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
8
2009/11/6
本研究の目的
• 目的:外部デバイスから受け取る入力を用い
た組込みソフトウェアのテストを容易にする
• 手段:ロード命令を横取りしてソフトウェアに異
常な入力を注入する
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
9
2009/11/6
発表内容
• 背景
– 組込みシステムの信頼性
– 組込みソフトウェアのテストの問題点
– 本研究の目的
• 提案手法
• ケーススタディ
• 考察
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
10
2009/11/6
提案手法
異常な入力を注入する機構をCPUエミュレー
タに加え,ロード命令を横取りする
– 組込みソフトウェアのテストには,CPUや外部
デバイスのエミュレータを用いることが多い
外部デバイスと同時にソフトウェアを開発する際,外
部デバイスが未完成の時にもテストをするため
– CPUに比べ,機構を加えるのが容易
ハードウェアよりもソフトウェアの方が加工が容易
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
11
2009/11/6
異常な入力を注入する手順
ロード命令
CPUエミュレータ
プログラム メモリアドレスにアクセスする
メモリアドレスにアクセスする
アクセスする
LDR ADDR
ADD
MOV
・
・
・
・
・
・
異常な入力を
注入する
外部デバイス
または
そのエミュレータ
異常注入機構
ロード命令のロード元が
外部デバイスか調べる
ロード元が外部デバイスなら
受け取った入力値を破棄し,
新しい入力値を設定する
入力を渡す
入力を渡す
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
1 2
3
4 5
6
7 8
9
* 0
#
12
2009/11/6
注入内容の指定方法
プログラムの実行前に,ユーザは異常注入
設定ファイルに指定内容を記述
– 算出式:新しい入力値を計算するための数式
– 異常な入力を注入する条件
条件式:利用する算出式を選ぶための数式
異常注入設定ファイル
関数A
メモリアドレスa : 0x10000000
条件式A-a-1 : 現在の入力値が 5
算出式A-a-1 : 変数temp
条件式A-a-2 : 変数temp が0以下
算出式A-a-2 : 現在の入力値 + 1
異常注入機構
異常な入力の
注入を指定
指定内容に従って,
異常な入力を注入する
・
・
・
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
13
2009/11/6
注入の条件として指定可能な要素
1/2
• メモリアドレス
– ロード元が外部デバイスか判断するために必要
– この要素は条件に必須で,他の要素はオプション
• 関数名
指定された関数が実行されている間のみ,異常
な入力を注入することが可能
• 全ての状況で異常な入力を注入すると,ソフトウェア
の動作が遅くなるから
• 異常な入力によって故障が発生するのは,特定の機
能を実行している時に限定されるから
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
14
2009/11/6
注入の条件として指定可能な要素
2/2
• 条件式のオペランドに利用可能な値
– 定数
– プログラム中の変数
プログラムの状況を考慮
– 現在の入力値
特定の入力値を異常な入力値に変更
プログラム
異常注入設定ファイル
条件式A-a-1 : 変数temp が 20
算出式A-a-1 : 現在の入力値 + 1
条件式A-a-2 : 現在の入力値が1
算出式A-a-2 : -999
switch(temp){
case 10:
・
・
・
状況を考慮
case 20:
・
・
・
・
・
・
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
15
2009/11/6
算出式のオペランドに利用できる値
• 定数
• プログラム中の変数
• 現在の入力値
これを用いた演算結果を新しい入力値とすれば,
入力値が部分的に変更された状況を模倣できる
例:センサの検出結果がノイズの影響を受けた場合
異常注入設定ファイル
条件式A-a-1 : 現在の入力値が0x00000001
算出式A-a-1 : 入力値の3ビット目を1に
・
・
・
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
16
2009/11/6
発表内容
• 背景
– 組込みシステムの信頼性
– 組込みソフトウェアのテストの問題点
– 本研究の目的
• 提案手法
• ケーススタディ
• 考察
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
17
2009/11/6
ケーススタディ
提案手法をCPUエミュレータに実装し,ソフト
ウェアに異常な入力を注入
CPUエミュレータはskyeye
C言語で実装されているため,ロード用関数が異常注
入用関数を呼び出すように改変した
提案手法を用いれば,組込みソフトウェアの
テストが容易に行えるようになることを確認
実行が困難な処理を異常な入力の注入で実行
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
18
2009/11/6
実験対象
Rockboxというデジタルオーディオプレイヤー
のファームウェアに含まれるSERIAL0関数
シリアルポートから受信するデータの転送率を取
得し,それに応じた処理を行う
→ 殆ど取得される機会がない転送率への処理を
実行させるのは困難
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
19
2009/11/6
実験内容
現在の転送率を取得する際に,SERIAL0関
数の処理に必要な転送率を注入
– 1つの処理につき,1組の条件式と算出式を記述
– 通常の転送率と,殆ど取得される機会がない転
送率の両方を注入するように指定
異常注入設定ファイル
SERIAL0関数
通常の
転送率への処理
殆ど取得される
機会がない
転送率への処理
switch(temp){
case 0xFE:
・
・
・
default:
条件式A-a-1 : 現在の転送率が0x0D
算出式A-a-1 : 0xFE
条件式A-a-1 : 現在の転送率が0x4E
算出式A-a-1 : 0x00
・
・
・
・
・
・
・
・
・
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
20
2009/11/6
実験結果
SERIAL0関数内の全処理が実行できた
計31行の指定内容を記述し, 13の処理を実行
異常注入設定ファイルの内容を変更しつつ,計5回プ
ログラムを起動
提案手法でテストが容易に行えることを確認
– 異常注入設定ファイルを2行書き換えるだけで,
実行する処理を追加または変更できた
– 取得される頻度に関わらず様々な転送率を注入
し,それに応じた処理が実行できた
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
21
2009/11/6
発表内容
• 背景
– 組込みシステムの信頼性
– 組込みソフトウェアのテストの問題点
– 本研究の目的
• 提案手法
• ケーススタディ
• 考察
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
22
2009/11/6
注入内容を決める指針
異常な入力を注入する目的は組込みソフト
ウェアの故障を発見するため
→ 故障が発生する状況を漏れなくテストでき
るように注入内容を指定すべき
– できる限り多くの処理を実行するように注入
– 故障を発生させる可能性の高い入力を注入
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
23
2009/11/6
指定すべき注入内容の特定方法
• 他のテスト手法で作成した入力値に加減算
• プログラム中の条件分岐全てを網羅するよう
に,注入する入力値を指定
ソースコードの静的解析によって自動化可能
• 過去の故障から,異常な入力の傾向を調査
– 発生時に実行していた機能
– ソフトウェアが入力を受け取った外部デバイス
– 異常な入力の値
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
24
2009/11/6
故障発見に対する有用性
• 短期間で通信を繰り返す時に発生する故障
[1]は,連続で入力を注入すれば発見可能
割り込みを連続で発生させる機能によって実現
既に実装している
• 「題名」から「本文」の入力で発生する故障[2]
は,特定の順で入力を注入すれば発見可能
注入する値を格納するキューによって実現
まだ実装していない
[1] FOMA M1000 | お客様サポート | NTTドコモ, http://www.nttdocomo.co.jp/support/trouble/data/smart_phone/m1000/
[2]重要なお知らせ : 「FOMA D900i」をご愛用のお客様へ | お知らせ | NTTドコモ , http://www.nttdocomo.co.jp/info/notice/page/040817_00.html
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
25
2009/11/6
まとめ
• テストに手間がかかる組込みソフトウェアを容
易にテストする手法を提案
CPUエミュレータのロード命令を横取り
→ 異常な入力をソフトウェアに注入
• 今後の課題
– 提案手法によるソフトウェアの故障の発見
– 指定すべき注入内容を特定する方法の適用
– 注入する値を格納するキューの追加
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
26
2009/11/6
2009/11/6
SIGSE-166-19
27
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
以降,質疑応答用
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
28
2009/11/6
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
29
2009/11/6
割り込み機能の実装
• 割り込みを行う条件として指定可能な要素
– ソースコード中の行番号
– 前に実行した割り込みからの経過時間
• 時間の指定単位および測定方法を,より実際
の組込みシステムに近づける必要がある
– 実行した命令数で指定および測定
– 命令毎に実行に必要な時間を定めて測定
– 外部デバイスから入力を受け取るのに必要な
ウェイトを考慮
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
30
2009/11/6
FIGの関数呼び出し横取り方法
•
Linux の環境変数 LD_PRELOAD を利用
LD_PRELOAD に横取りしたい関数と,代わり
に実行する関数を指定すれば,横取りが可能
•
FIGが横取りを行う手順
1. ソフトウェアの実行前にユーザが異常な入力を
注入する内容をファイルに記述
2. ファイルから横取りしたい関数の代わりになる
関数を自動的に生成し,LD_PRELOADに指定
注入する値を代わりの関数の返り値に設定
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
31
2009/11/6
提案手法の実装
skyeye に,以下の機能を追加
– 関数名に対応するメモリアドレスの範囲を取得
求めた範囲をプログラムカウンタの値と比較すること
により,指定された関数が実行中か判断できる
– ロード命令を横取りして,新しいロード値を設定
– 異常注入設定ファイルの算出式,条件式を構文
解析して数式として利用
– グローバル変数に対応するメモリアドレスを取得
数式の利用時に,グローバル変数の値を取得できる
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
32
2009/11/6
提案手法とFIGの差別化 1/2
• Rockboxには外部デバイスから入力を受け
取る関数があるため,FIGも利用可能
様々な機種を想定しているため,様々な外部デ
バイスに対応する必要がある
• Rockbox以外の組込みソフトウェアでも,FIG
が利用できるものは考えられる
OSが提供する関数を用いて外部デバイスから入
力を受け取っているソフトウェア
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
33
2009/11/6
提案手法とFIGの差別化 2/2
しかし,FIGが利用できなくても,提案手法な
ら注入が可能なソフトウェアは存在する
例:ペースメーカーの組込みソフトウェア
• 専用の外部デバイスにのみ対応している
• 機能が限定されているため,OSを利用する可能性が
低い
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
34
2009/11/6
例外処理の検知機能をテストする必
要性
異常な入力が例外処理の検知機能で検知で
きないことがある
検知機能の条件で網羅していない異常な入力が
存在する
検知機能の条件が適切かをテストする必要
がある
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
35
2009/11/6
例外処理の対処機能をテストする必
要性
組込みシステムや外部デバイスの種類に
よって,適切な例外処理が必要になる
– 携帯電話のボタンなら,入力がない時と同じ処理
– 携帯電話のネットワークなら,通信履歴の整合性
チェック
– ペースメーカなら,機能を制限して動作を継続
各入力に対して実行される対処内容が適切
かをテストする必要がある
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
36
2009/11/6
SIGSE-166-19
Department of Computer Science, Graduate School of Information Science and Technology, Osaka University
37
2009/11/6