たった10行のコードでOS XとiOSをカーネルパニックに落とすことが出来る脆弱性(バグ)が発見されたそうです。詳細は以下から。
この脆弱性は音楽のマーケティングサービスSoundropの共同創設者で、Fridaの開発者のOle André Vadla Ravnåsさんが自身のブログに投稿したもので「たった10行(LOC:line of code)でOS XとiOSをカーネルパニックにすることが出来る」というもので、Fridaユーザーからの報告で発見されたそうです。
DIY: kernel panic OS X and iOS in 10 LOC https://t.co/RMn8NZkucx
After receiving quite a few reports from users of www.frida.re of kernel panic upon attaching the second time to a process, I finally got around to debugging the kernel to figure out what was going on.
[DIY: kernel panic OS X and iOS in 10 LOC – Ole André Vadla Ravnås]
10 LOCは既に複数のGitHubで公開されており、RedditやHacker Newsなどでも再現出来ているようですが、Andréさんによると「この不具合はmach_vm_read_overwrite処理のアサーションにあり、COW(copy-on-write)とPRV(private)にまたがって読み取りを行う際に起こる」としています。(あまりよく分かっていませんがCOW -> PRV transition後のmach_vm_read_overwriteでカーネルパニックを起こすようです)
A quick look at the call-stack revealed that it was hitting a failing assertion while handling mach_vm_read_overwrite. By looking at the arguments it was clear where it was requested to read from, and how many bytes.
[…]
This made perfect sense, because I knew Frida hooked one function in this particular library. “Could it be a bug when handling a read spanning COW and PRV pages?” I quickly wrote a tiny C program to test out this theory, and yep, that was the issue.
[DIY: kernel panic OS X and iOS in 10 LOC – Ole André Vadla Ravnås]
この脆弱性を修正したFridaはまもなくリリース予定で、Andréさんは「過去の印象からAppleがすぐにこの不具合を修正するとは思わないけど…」としながらも、Appleにも2015年2月20日付けで報告しているそうです。
Latest Frida from git now has a workaround where we limit our reads to one page at a time. This will be part of the upcoming 1.6.9 release, to be released soon.
Note: I reported this to Apple on the 20th of February 2015, though my impression from past events is that they’re not likely to fix this anytime soon.
[DIY: kernel panic OS X and iOS in 10 LOC – Ole André Vadla Ravnås]
ちなみに、AndréさんはOleavrというアカウントでHacker Newsでコメントしているので、興味のある方は関連リンクからどうぞ。
追記
実際に試してみましたが、このコードは非rootユーザーでもMacをカーネルパニックに落とすことが出来るようです。
たった10行のコードでOS X YosemiteやiOS 8をカーネルパニック出来る「KernelPanic-10LOC」を試してみた。 http://t.co/n3A4By1iEc http://t.co/33JRPC7YO9
- DIY: kernel panic OS X and iOS in 10 LOC – Ole André Vadla Ravnås
- Kernel panic in latest OS X in 10 lines of C : programming – Reddit
- DIY: kernel panic OS X and iOS in 10 LOC – Hacker News
- jdmoreira/KernelPanic-10LOC – GitHub
コメント
dtruss使ってコードレビューするとlibcache.dylib(_dyld_get_image_header(2))
のアドレス2ページ目から++でcopy on writeしていって、それを–で戻してmach_vm_read_overwriteするとパニックになるみたいだね。
こういうのよく見つけてられたなってぐらい稀な例だけどFridaにはクリティカルな例だったのかな?