たった10行でOS XとiOSをカーネルパニックに出来る脆弱性(バグ)が見つかる。

OS X
記事内に広告が含まれています。
スポンサーリンク

 たった10行のコードでOS XとiOSをカーネルパニックに落とすことが出来る脆弱性(バグ)が発見されたそうです。詳細は以下から。

10LOC-Kernel-Panic-Hero


 この脆弱性は音楽のマーケティングサービスSoundropの共同創設者で、Fridaの開発者のOle André Vadla Ravnåsさんが自身のブログに投稿したもので「たった10行(LOC:line of code)でOS XとiOSをカーネルパニックにすることが出来る」というもので、Fridaユーザーからの報告で発見されたそうです。

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でカーネルパニックを起こすようです)

KernelPanic-10LOC-Xcode-Git

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をカーネルパニックに落とすことが出来るようです。

コメント

  1. Apple7743 より:

    dtruss使ってコードレビューするとlibcache.dylib(_dyld_get_image_header(2))
    のアドレス2ページ目から++でcopy on writeしていって、それを–で戻してmach_vm_read_overwriteするとパニックになるみたいだね。
    こういうのよく見つけてられたなってぐらい稀な例だけどFridaにはクリティカルな例だったのかな?

タイトルとURLをコピーしました