QEMUによるハードウェア問題のホスト @ GMO IERAE HackNight #2 「IERAE CTFで学ぶセキュリティ技術&インフラ開発」

1.4K Views

July 24, 25

スライド概要

GMO IERAE HackNight #2 「IERAE CTFで学ぶセキュリティ技術&インフラ開発」
https://ierae.connpass.com/event/359736/

profile-image

GMOサイバーセキュリティ byイエラエ株式会社

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

QEMUによるハードウェア問題のホスト 竹腰 開

2.

問題「Skip Skip Skip 1/2」 概要 • サーバー上でプログラムが動作する • QEMU内で動作(後述) • メモリー内のフラグを読み出せば勝ち • タイミングを指定し1命令だけスキップできる

3.
[beta]
問題「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");
}
......

4.

問題「Skip Skip Skip 1/2」 解法 • 通常動作ではフラグを読み出せない • 命令スキップで異常動作を引き起こしフラグを読み出す • Fault Injection Attackを模したもの • 詳細は公式Writeupを参照

5.

Fault Injection Attack(FIA)とは? • コンピューターを一瞬だけバグらせる攻撃 • 数百万分の一秒程度 • セキュリティ上の問題を引き起こす

6.

どうするとコンピューターはバグる? 電圧変動 電磁波 クロック変動

7.

コンピューターがバグるとどうなる? AAAA ↓ AAAC CMP BEQ MOV 処理中のデータが化ける ⇓ データの改ざん 命令がスキップされる ⇓ チェックの回避

8.

オンラインCTFでFIA問を出したい • 実物の機材を使うのは無理 • 数十台必要 • オンサイトCTFのFIA問ではチーム数だけ機材を用意 • SECCON CTF 13 Finals • QEMUを使って機材を疑似的に再現 • ハードウェア(機材)をエミュレート(再現)するソフト • 問題がある

9.

問題: FIAはタイミング調整が難しい • QEMUは動かす度に動作タイミングが変わる • タイミングが変わると問題として成立しない • 3つの仕組みを組み合わせて解決 • icountモード • 内蔵タイマー • デバッガー

10.

仕組み1: QEMUのicountモード • QEMUが 常に同じタイミングで動作する • “Deterministic” (決定的) QEMUマニュアルより引用

11.

仕組み2: QEMUの内蔵タイマー • 精密に時刻を計測できる • QEMU内で動作 • QEMUがicountモードなので 常に計測結果が同じ • タイマー割込で命令スキップ ARM社技術文書より引用

12.

仕組み3: デバッガー • QEMUを外部から観察・操作 • Pythonで自動制御 • 内蔵タイマーのセットアップ等 GDBターミナル

13.

アーキテクチャ図 CTFプレーヤー 制御プログラム QEMU icountモード 内蔵タイマーで時刻計測 デバッガー Pythonで自動制御

14.

作問中にハマった事 • 内蔵タイマーが動作しない • プログラムの動作タイミングが変わる

15.

内蔵タイマーが動作しない • デバッガーから内蔵タイマーを設定しても動かない • Memory-Mapped Input/Output (MMIO) • QEMU内のプログラムから設定する必要があった • デバッガーからコンテキストを退避し QEMU内でメモリ書込命令を実行させて解決

16.

内蔵タイマーが動作しない 解決策 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

17.

プログラムの動作タイミングが変わる • icountモードなのに 動作タイミングが変わる • QEMUのバグだった • 3か月前にIssue作成 • パッチ作って修正 QEMU Issue #2830より引用

18.

まとめ • ハードウェア問をQEMUでホストした • 疑似的なFault Injection Attackを再現できた • QEMUのicountモード等を利用して問題として成立させた