Linux kernel の脆弱性 Dirty COW (CVE-2016-5195)

Dirty COW

Linux kernel の脆弱性 CVE-2016-5195 が報告されています。
別名 Dirty Cow
2016/10/24 Redhat (CentOS) のワークアラウンド手順追加
2016/10/27 gcc .. 部分の誤記修正(ご指摘ありがとうございました)

はじめに

Linux kernel の脆弱性が報告されています。
パッチも出てきているようですので、対策しましょう。

※写真 : 写真素材ぱくたそ

概要

以下ページで報告されています。

Dirty COW (CVE-2016-5195)

※ninja ドメインですね... って、そんな事はどうでもいいか.

Dirty COW

上記 Dirty COW によると

  • Linuxカーネルのメモリサブシステムがcopy-on-write(COW) 時に、プライベートなread-onlyメモリを破損する事が可能である問題らしい。
    これにより、権限のないユーザが権限昇格によって、読み取り専用のメモリへ書き込みを行えるようになる( 特権取得が可能 )
  • 実際にこの脆弱性を利用する exploit が Phil Oester によって見つかっている Linux users urged to protect against 'Dirty COW' security flaw (HTTPのパケットキャプチャにより発見)

  • Dirty COW の COW は copy-on-write (COW) から。

Dirty COW explained: Get a moooo-ve on and patch Linux root hole によると、

実は Linus Torvalds が11年前に発見していたんだけど、不幸にもFIX出来ずに放置されていたらしい。 ( ちょっと前にも似たようなの聞いた気がする )

こっち が元ネタ (Linusによる)

PoC

PoC (proof of concept) は ここ にある。( PoCリスト )

PoC再現手順

  1. 適当な特権ユーザ ( root ) 以外のユーザで Linux にログイン
  2. 適当なディレクトリに移動
    $ cd 適当なディレクトリ
    
  3. ReadOnlyのファイル生成
    $ sudo -s
    # echo this is not a test > foo
    # chmod 0404 foo
    # exit
    $ ls -lah foo
    -r-----r-- 1 root root 19 Oct 21 16:56 foo
    $ cat foo
    this is not a test
    
  4. PoC ソースファイル作成
    $ vi dirtyc0w.c
    

    上記 PoC (リンク先) のコードを貼り付けて保存

  5. コンパイル
    $ gcc -pthread dirtyc0w.c -o dirtyc0w
    
  6. 実行
    $ ./dirtyc0w foo m00000000000000000
    mmap 39ca6000
    
    madvise 0
    
    procselfmem 1800000000
    
  7. ファイル確認
    $ cat foo
    m00000000000000000
    

    脆弱性がある場合、上記のようにファイル内容が書き換わります。

上記 PoC の処理内容に関してより知りたい方は Dirty COW PoC 概説 をどうぞ。

※EC2でパッチ適用していない過去のAMIからインスタンス起動して実験したら、書き換わりました。パッチ適用後のインスタンスでは this is not a test のまま。

※上記PoC ( dirtyc0w.c ) は以下コメントがあるようにRedhat Enterprise Linux 5/6 では動作しないとの事。

The in the wild exploit we are aware of doesn't work on Red Hat Enterprise Linux 5 and 6 out of the box because on one side of the race it writes to /proc/self/mem, but /proc/self/mem is not writable on Red Hat Enterprise Linux 5 and 6.

上記PoCリストにある pokemon.c 辺りなら RHEL5/6 でも動くかと ( 弊社CentOS6.8で動作する事を確認 )。

※他 Android 用の PoC 等も置いてある

対策

各ディストリビューションから情報が提供されているので、これらに従いましょう。
kernel アップデート後は再起動も忘れずに。

AWS

ALAS-2016-757

aws からは既に パッチが提供されていました。いつもの手順 ( yum update 等 ) でアップデート可能です。

Redhat

CVE-2016-5195 - Red Hat

Redhat でもパッチが提供されました。こちらも yum update でアップデート可能です。

脆弱性の有無を確認

  1. Kernel Local Privilege Escalation - CVE-2016-5195 にアクセス
  2. Diagnose タブをクリックする。
    [ DOWNLOAD DETECTION SCRIPT ] リンク ( ボタン ) が表示されるので、ここからチェック用スクリプトを取得する。
    私の場合、URLをコピーして wget で取得した。
    $ wget https://access.redhat.com/sites/default/files/rh-cve-2016-5195_2.sh
    
  3. 取得したスクリプトを実行
    $  bash rh-cve-2016-5195_2.sh
    Your kernel is 2.6.32-642.6.1.el6.x86_64 which IS vulnerable.
    Red Hat recommends that you update your kernel. Alternatively, you can apply partial
    mitigation described at https://access.redhat.com/security/vulnerabilities/2706661 .
    

    "which IS vulnerable" が出力されている場合、脆弱性あり。

対策

※以下はパッチ提供までの代替策としてRedhatが提示していた方法です ( 現時点では非推奨 )

10/24 11AM(JST)時点ではパッチは提供されていない。

パッチの提供が行われるまでの代替策は こちら (Redhat)

  1. .stp ファイルの作成
    $ vi dcow.stp
    
    以下内容で作成
    probe kernel.function("mem_write").call ? {
            $count = 0
    }
    
    probe syscall.ptrace {  // includes compat ptrace as well
            $request = 0xfff
    }
    
    probe begin {
            printk(0, "CVE-2016-5195 mitigation loaded")
    }
    
    
    probe end {
            printk(0, "CVE-2016-5195 mitigation unloaded")
    }
    
  2. systemtap のインストール
    $ sudo yum install systemtap
    
  3. systemtap の実行
    $ sudo stap -g dcow.stp
    semantic error: while resolving probe point: identifier 'syscall' at dcow.stp:5:7
            source: probe syscall.ptrace {  // includes compat ptrace as well
                          ^
    
    semantic error: no match
    
    Pass 2: analysis failed.  [man error::pass2]
    

    だがエラーになってしまった。
    どうやら systemtap を実行する場合、kernel-debuginfo、及び、kernel-debuginfo-common パッケージも必要らしいが、これは yum ではインストールできない。
    Redhatの場合には ISOイメージから取得できるらしい。
    CentOSの場合には、http://debuginfo.centos.org/ からdebuginfo パッケージを取得できる。利用しているkernelバージョンに合致する debuginfo を取得してインストール。

    $ sudo rpm -ivh kernel-debuginfo-common-... kernel-debuginfo-...
    

  4. 再実行
    $ sudo stap -g dcow.stp
    
    Message from syslogd@xxxxxx at Oct 24 10:29:21 ...
     kernel:CVE-2016-5195 mitigation loaded
    

    うまくいった。が、Ctrl-Cで終了、アンロードされてしまうので、バックグラウンド実行するようにした方がよい。

    $ sudo stap -g dcow.stp &
    

※システム再起動で無効になるので、ブート時に再実行されるようにしないといけないとの事

※上記代替策で問題ないかは弊社では検証しきれていません

debian

CVE-2016-5195

Ubuntu

CVE-2016-5195 in Ubuntu

debian/Ubuntu に関しては apt-get で対応可能なようです。

Patch your Linux-powered systems, phones and gadgets as soon as possible

と警告してたりして、
Linux サーバだけではなく、Android や 各種 Linux ベースのガジェット、アプライアンス等、影響範囲が大きそうな感じがする Dirty COW。

暫くは自身の管理しているこれらデバイスへの対応、攻撃の増加など気にしておいた方がよいかもしれません。