Linuxカーネルの多数のバージョンに、管理者権限の奪取につながる危険な脆弱性が存在することが分かった。「Dirty COW」と名付けられたこの脆弱性は、2016年10月中旬までの全バージョンのAndroidとChrome OSのカーネルにも存在する。同脆弱性の概要や危険性、AndroidとChrome OSでの対策などについて紹介する。

 AndroidやChrome OSなどが採用するLinuxカーネルの多数のバージョンに、管理者権限の奪取につながる危険な脆弱性が存在することが2016年10月に公開された。少なくとも2007年7月リリースのバージョン2.6.22以降から、2016年10月リリースのバージョン4.8.2までのカーネルに脆弱性が存在すると判明している。そのため、これらのカーネルを採用する2016年10月中旬までの全バージョンのAndroidとChrome OSも影響を受ける。

 「Copy-on-Write」(COW)という処理に存在する脆弱性であることから「Dirty COW」と名付けられた同脆弱性は、悪用が非常に容易なため注意が必要である。インターネットでは既に様々な実証コードが公開されている。また、同脆弱性を報告したセキュリティ研究者は、パケットキャプチャによる観察で、Dirty COWを悪用した攻撃があったことを確認したという。

 米国の非営利団体であるMITREが提供する脆弱性情報データベース「CVE」(Common Vulnerabilities and Exposures」には、2016年5月31日にDirty COWの情報が登録され、「CVE-2016-5195」というCVE-IDが割り当てられている。

想定外の領域が書き換えられる

 Linuxカーネルは、Copy-on-Write(書き換え時コピー)と呼ぶデータの書き換え方法に対応している。Copy-on-Write処理の流れを、図1左の(1)~(3)に挙げた。

図1●Linuxカーネルに見つかったDirty COW脆弱性の概要
図1●Linuxカーネルに見つかったDirty COW脆弱性の概要
Copy-on-Write(COW)という処理がアトミック(不可分)なものでなかったため、MADV_DONTNEEDフラグを使ったメモリー領域の破棄処理を挟み込むことで、本来書き換えるべきではないメモリー領域を書き換えられてしまう。これを悪用すれば、読み出し専用ファイルを書き換えるなどして、一般ユーザーが管理者権限を不正に取得できる。
[画像のクリックで拡大表示]

 madviseというシステムコールを使うと、ユーザープログラムからLinuxカーネルにメモリー領域の取り扱いを指示できる。例えば同システムコールで「MADV_DONTNEED」というフラグ付きでメモリー領域を指定すると、カーネルは同領域を破棄する。Copy-on-Write処理を実施した領域に対してMADV_DONTNEEDを指定すると、確保した物理メモリー領域を破棄し、元のデータを保持するメモリー領域にマッピング先を付け替える (図1左の4)。

 Copy-on-Write処理を安全に実施するには、図1左の(1)〜(3)の処理をアトミック(不可分)なものにしなければならない。しかしDirty COW脆弱性があるカーネルでは、そうなっておらず、実行タイミングによってMADV_DONTNEED処理を(2)と(3)の間に割り込ませられる。その場合、マッピング先を元のデータ領域に付け替えてからデータを書き換えることになる(図1右の2〜4)。これを悪用すれば、アクセス制限を回避して、読み出し専用ファイルを書き換えることが可能になる。

 また、書き換えるファイル次第で、一般ユーザーが管理者権限を不正に取得できる。