Slide 1

Slide 1 text

SEGVなんてもういいですから OSC2016 Tokyo/Spring Linuxライトニングトーク @RKX1209

Slide 2

Slide 2 text

自己紹介 ● るくすと申します ● twitter:@RKX1209 ● 神戸大学 工学部 B3 ● 普段はセキュリティ - マルウェア解析,sandbox... ● OS, VMMなど低レイヤーなもの好き

Slide 3

Slide 3 text

突然ですがみなさんはこんなコードを書いた 事がありますか?

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

実行結果 Segmentation fault (コアダンプ) 当たり前だよなぁ

Slide 6

Slide 6 text

なんとか実行させたい... なんとか実行させたくない? → よし SEGVを殺そうぜ!

Slide 7

Slide 7 text

Linuxカーネル SEGVをなくすには? → Linuxカーネルを弄るしか無い → SEGVを許してくれる仕組みを作ろうぜ! → 優しいOSの完成 → 平和の訪れ

Slide 8

Slide 8 text

不正アドレスの処理 1. 不正なアドレスへのアクセスが発生するとCPUが トラップ実行 2. Linuxがトラップを受けdo_page_faultを実行する 3. SEGVが発生したアドレスから、正常なページフォ ルトなのか、不正なアクセスなのか判断 4. 正常ならhandle_mm_faultでページフォルトを処 理 5. 不正ならSEGV発生

Slide 9

Slide 9 text

SEGVを殺す方法 ✔ 不正なアドレスでも正常な処理に飛ぶようにする ✔ 正常だと思ったLinuxはそのままページフォルトと して処理 ✔ 不正なアドレスにmmapで物理アドレスを割り当て る ✔ ぶっちゃけ仮想アドレスがどんな値 でも物理アドレスを割り当れば 何とかなる → バディシステムに圧倒的感謝

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

SEGVを殺す時の注意 • mmapで物理アドレスを割り当てる時do_mmapを 使ってはいけない → do_page_fault実行時はプロセスのとあるスピ ンロックを既に使用している → do_mmapはこのスピンロックが解法されるまで 待つため、デッドロックが発生する • なのでスピンロックを使用しない do_mmap_pgoffを使いましょう

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

実行結果 a やったね (スクショ撮り忘れましたorz)

Slide 14

Slide 14 text

ご清聴有難うございました 実際のパッチや詳細な説明は http://rkx1209.hatenablog.com/entry/2015/12/06/ 213912