1.4K Views
July 24, 25
スライド概要
GMO IERAE HackNight #2 「IERAE CTFで学ぶセキュリティ技術&インフラ開発」
https://ierae.connpass.com/event/359736/
GMOサイバーセキュリティ byイエラエ株式会社
QEMUによるハードウェア問題のホスト 竹腰 開
問題「Skip Skip Skip 1/2」 概要 • サーバー上でプログラムが動作する • QEMU内で動作(後述) • メモリー内のフラグを読み出せば勝ち • タイミングを指定し1命令だけスキップできる
問題「Skip Skip Skip 1」 ソースコード
volatile int reveal_flag = 0;
......
if (reveal_flag) {
uart_puts(flag);
uart_puts("¥n");
← 実行されない
}
else {
uart_puts("Sorry, it's a secret!¥n");
}
......
問題「Skip Skip Skip 1/2」 解法 • 通常動作ではフラグを読み出せない • 命令スキップで異常動作を引き起こしフラグを読み出す • Fault Injection Attackを模したもの • 詳細は公式Writeupを参照
Fault Injection Attack(FIA)とは? • コンピューターを一瞬だけバグらせる攻撃 • 数百万分の一秒程度 • セキュリティ上の問題を引き起こす
どうするとコンピューターはバグる? 電圧変動 電磁波 クロック変動
コンピューターがバグるとどうなる? AAAA ↓ AAAC CMP BEQ MOV 処理中のデータが化ける ⇓ データの改ざん 命令がスキップされる ⇓ チェックの回避
オンラインCTFでFIA問を出したい • 実物の機材を使うのは無理 • 数十台必要 • オンサイトCTFのFIA問ではチーム数だけ機材を用意 • SECCON CTF 13 Finals • QEMUを使って機材を疑似的に再現 • ハードウェア(機材)をエミュレート(再現)するソフト • 問題がある
問題: FIAはタイミング調整が難しい • QEMUは動かす度に動作タイミングが変わる • タイミングが変わると問題として成立しない • 3つの仕組みを組み合わせて解決 • icountモード • 内蔵タイマー • デバッガー
仕組み1: QEMUのicountモード • QEMUが 常に同じタイミングで動作する • “Deterministic” (決定的) QEMUマニュアルより引用
仕組み2: QEMUの内蔵タイマー • 精密に時刻を計測できる • QEMU内で動作 • QEMUがicountモードなので 常に計測結果が同じ • タイマー割込で命令スキップ ARM社技術文書より引用
仕組み3: デバッガー • QEMUを外部から観察・操作 • Pythonで自動制御 • 内蔵タイマーのセットアップ等 GDBターミナル
アーキテクチャ図 CTFプレーヤー 制御プログラム QEMU icountモード 内蔵タイマーで時刻計測 デバッガー Pythonで自動制御
作問中にハマった事 • 内蔵タイマーが動作しない • プログラムの動作タイミングが変わる
内蔵タイマーが動作しない • デバッガーから内蔵タイマーを設定しても動かない • Memory-Mapped Input/Output (MMIO) • QEMU内のプログラムから設定する必要があった • デバッガーからコンテキストを退避し QEMU内でメモリ書込命令を実行させて解決
内蔵タイマーが動作しない 解決策 def store_in_machine(address, value): # Evacuate all registers and current instruction ...... # Execute "STR R1, [R0]" gdb.execute(f"set $r0 = {address:#010x}") gdb.execute(f"set $r1 = {value:#010x}") gdb.inferiors()[0].write_memory(gdb.selected_frame().pc(), b"¥x00¥x10¥x80¥xe5") gdb.execute("stepi") ...... # Restore registers and instruction
プログラムの動作タイミングが変わる • icountモードなのに 動作タイミングが変わる • QEMUのバグだった • 3か月前にIssue作成 • パッチ作って修正 QEMU Issue #2830より引用
まとめ • ハードウェア問をQEMUでホストした • 疑似的なFault Injection Attackを再現できた • QEMUのicountモード等を利用して問題として成立させた