Slide 1

Slide 1 text

終末何してますか? 忙しいですか? 今度はKOZOSを デバッグしてもらって いいですか? 2017-09-23 KernelVM Hokuriku 3

Slide 2

Slide 2 text

$ who @tnishinaga

Slide 3

Slide 3 text

本日の内容 @ykyukinet さんの KOZOS/RasPi で Luaがちゃんと動くようになるまでの おっさん妖精の戦いの物語

Slide 4

Slide 4 text

2017-09-22 3:00ごろまでの話 ● セキュリティキャンプでykyukiさんがKOZOS/RasPiでLuaを動 かせるようにした ● しかしLua実行はできるが、実行後にOSが落ちる問題があっ た ○ https://github.com/ykyuki/kozos-rpi-lua/commit/49cb3475a8d542a6130a9648213a17ae46f568 e3

Slide 5

Slide 5 text

$ 犯人(たぶん)

Slide 6

Slide 6 text

$ 犯人(たぶん)

Slide 7

Slide 7 text

OSが落ちた結果何処に行ってるか ● 0x0004eae0という謎アドレスに飛んだ結果 Undefined fault

Slide 8

Slide 8 text

Undefined faultの詳細 ● KOZOSのdispatch関数が謎メモリアドレスをプログラムカウ ンタ(pc)に書き戻す ● 飛んだ先でデータを命令として実行しようとしてundefined exceptionが飛んでfault

Slide 9

Slide 9 text

KOZOSのスレッド生成とスレッドスタック ● KOZOSはkz_run関数でスレッドを起動する ● kz_run関数はスレッドが使うスタックサイズ上限を引数にとる ● KOZOSは引数からスタックサイズ上限を調べてスレッドに割 り当てる thread stack メモリ thread “cmd” kz_run(command_main, "cmd", 8, 0x200, 0, NULL); 0x200 byte

Slide 10

Slide 10 text

KOZOSのスレッドスタック配置 ● スレッド生成時にスタック領域を0xffffffff方向に伸ばして確保 ● 伸ばした先端をスレッドのスタックとして提供 thread stack メモリ thread1 thread2 thread3

Slide 11

Slide 11 text

KOZOSのスレッドスタックの中身 ● 以下が入ってる ○ プログラムの一時変数など ○ スレッド切替時は保存されたレジスタ情報等 thread stack register data char hoge; int i;

Slide 12

Slide 12 text

KOZOSでStack Overflowが起こるとどうなる ● 別のスレッドのスレッド状態等を破壊する ● 問題はdispatch時に発火 thread stack register data char hoge; int i; register data char hoge; int i[]; thread stack register data char hoge; int i; register data char hoge; int i[];

Slide 13

Slide 13 text

問題の原因 ● 一言で言えば Stack Buffer Overflow ● スレッドに割り当てるスタックが少なかった ● 割当スタックを8KBに増やしたら解決した

Slide 14

Slide 14 text

戦いの記録 https://github.com/ykyuki/kozos-rpi-lua/commits/master

Slide 15

Slide 15 text

おわりに 「Luaがエラーを起こすとOSが落ちる」

Slide 16

Slide 16 text

僕達の戦いはこれからだ!!