SpXn-Blog

Linuxカーネルにおける権限昇格(DirtyCOW:CVE-2016-5195)の脆弱性検証

August 24, 2019

 2016年にLinuxのカーネルにおいて発見された脆弱性であるDirtyCOW(CVE-2016-5195)はレースコンディションと呼ばれるプロセスやスレッドによって生じるバグを悪用した攻撃になります。
レースコンディション(特にファイルレースコンディション)は同一のリソースに複数のプロセスやスレッドがアクセスした際に意図しない動作を引き起こしてしまう現象です。

dirtycow

「レースコンディション」

例として同一の変数xを二つのプロセスが参照し、片方のプロセスAが変数の値を+3インクリメントし、もう片方のプロセスBが変数の値を+2インクリメントする場合を想定した場合、 正常に順番通り実行されれば結果として変数の値が+5インクリメントされますが、プロセスAとプロセスBが同時に読み込み時間差でプロセスBが書き込む、といった状況が生じた時に結果として変数の値が+2インクリメントされた 状態で結果が返ります。こういった具合で本来想定していた結果と異なる状態になってしまうことをレースコンディションといいます。

「COW機構とDirtyCOW」

DirtyCOWはLinuxカーネル上のCOW機構(Copy-on-Write)におけるセキュリティホールです。 COW機構はデータをプロセスごとにコピーしてメモリ上に展開する際に、変更要求が生じるまではコピーせずに同一のリソースを参照させるというコンピュータにおける最適化戦略です。
COWによりメモリの負荷を軽減, 無駄なリソースのコピーを防ぐことが可能です。
しかし、COW機構において同一のリソースを参照させるという点に脆弱性につながるバグがあったというわけです。以下に、ソースコードから読み取った権限昇格までの流れを示します。完全に意訳して書いているのでより完全に理解したければソースコードを読みましょう。そこまで、難しいことは書いてないです。

DirtyCOWによって権限昇格するまでの流れ(dirtyc0w.cより):

  1. 同一リソース(例では、ファイル)に対して二つのスレッドを同時に100,000,000回実行する
    一つ目は展開されたメモリ上のファイルに対して領域を解放するシグナル(MADV_DONTNEED)を送信するスレッド
    二つ目はメモリ上のファイルが存在する領域にプロセスの擬似ファイル*を直接指定することでアクセスし、書き込みを要求するスレッド
    *一つ目のスレッドが参照しているメモリの場所
  2. レースコンデイションが発生した場合にメモリ上のファイルへの書き込みが完了する
    管理者権限が必要なファイルに対しても権限をチェックする前に書き込みが行われるため、権限のバイパス、権限昇格が可能になる

本来であれば、ソースコードの61行目である
int f=open("/proc/self/mem",O_RDWR);
のところで、ファイルが読み取り専用なので読み書き(O_RDWRフラグ)じゃ開けないよとエラーが返るはずなのですが、レースコンディションのせいで開けてしまった…権限バイパスして書き込めちゃった…っていうのがDirtyCOWです。

試してみます。

DirtyCOWによる権限昇格の脆弱性検証:

  1. DirtyCOW(CVE-2016-5195)の脆弱性を持つLinuxカーネルを仮想環境に構築する
    *検証環境としてUbuntu 14.04で行う
  2. Ubuntu14.04を手順に沿ってセットアップする
    rootではない検証用のユーザを作成したりとか…
  3. GitHubよりdirtyc0w.cをダウンロードする
  4. 管理者読み取り専用ファイルを作成し、管理者権限でないことを確認(既に管理者権限であれば検証の意味…)
    $sudo echo "this is read only.you can't write anything" > foo
    $sudo chmod 0404 foo
    普通に読み取り専用ファイルをvimで編集しようとすると[readonly]と表示が出て書き込みができない
  5. ダウンロードしたdirtyc0w.cをコンパイル&実行
    $gcc -pthread dirtyc0w.c -o dirtyc0w
    $./dirtyc0w foo hogehoge
  6. 手順が正しければ書き込みが成功する。
    poc result

(なんか思ってたのと違うけど面白いのでこれを採用しました笑)

 この脆弱性を悪用してユーザ権限を管理しているファイル(/etc/passwd /etc/group /etc/shadowなど)を書き換えれば半永久的な権限を取得できたりする*2ので、脆弱性による被害は大きくなる。
リモートからのコード実行やソーシャルエンジニアリングによる侵入が無ければそもそも使えないものの、Linuxのカーネルレベルで存在するところはかなり厄介だ。
また、DirtyCOWのPoCが多く用意され、容易に攻撃が行えることも被害が大きくなる原因となっている。 かなり昔の脆弱性なので最新のLinuxディストリビューションを使用していれば被害にあうことはまずない。心がけたい。 今後の反省点としてはPoCを用いた検証画面にオシャレなオチを取り入れて記事に勢いをつけたいですね笑。かっこいい検証ようペイロードを考えないと。おわり。

*2 cowroot.cはDirtyCOWを利用したroot権限への昇格を可能にしている。


[object Object]

セキュリティ, エクスプロイト, Tor, 仮想化とか - written by "_spxn"
  '