( PoC ) linux kernel特権昇格脆弱性( CVE-2017-6074 ) の暫定回避策の確認
こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。
02/22/2017に公開されたkernelの脆弱性情報(CVE-2017-6074)に関して、環境限定のPoCが公開されています(悪用防止のため、URLは敢えて載せません)。今回はこのPoCから、暫定回避策(モジュールの除去や SELinux )が有効かどうかを確認してみます。
PoC準備
PoCの準備を行います。
- まず、環境としてUbuntu 16.04.1 LTSを用意し、適当なミラーサイトなどから4.4.0-62-generic x86_64 カーネルをダウンロードしてインストールし、再起動します(カーネルバージョンが違うとPoCのコードはうまく動きません)。
- 今回のPoCですが、Ubuntuの特定バージョンのKernel用のため、SELinuxが有効かどうかを確認するためにSELinuxをインストールします(Ubuntuでデフォルトの強制アクセス制御はAppArmorになります)。CentOS用のPoCは未だ確認されていません(このPoC用のソースを使っても、root権限取得の所で失敗します)。aptitudeを使ってインストールしています。SELinuxのインストール後に再起動が必要になります。SELinuxインストール直後は、設定がpermissiveモードになるため、再起動してもSELinuxによるアクセス制御が無い状態で起動します。念の為、再起動する前に/etc/selinux/configを確認して下さい。
(03/08/2017補足) 今回は、あくまでも「SELinuxが有効かどうか」の検証の為にUbuntuでSELinuxを有効にした形です(本当はCentOS/Fedoraを使いたかったのですが、出来ないので代替策としてUbuntuを使った形になります)。UbuntuでSELinuxを有効にすると、ポリシの修正などその他の作業が必要になるため、運用でのUbuntu+SELinuxを推奨しているわけではありません。あくまでもPoCを行うための作業の一環です。
root@ubuntu:~# aptitude -y install selinux root@ubuntu:~# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # default - equivalent to the old strict and targeted policies # mls - Multi-Level Security (for military and educational use) # src - Custom policy built from source SELINUXTYPE=ubuntu # SETLOCALDEFS= Check local definition changes SETLOCALDEFS=0 root@ubuntu:~# reboot
- 次に、PoCコードをダウンロードしてビルドします。
sios@ubuntu:~/CVE-2017-6074$ ls poc.c README.md trigger.c sios@ubuntu:~/CVE-2017-6074$ sios@ubuntu:~/CVE-2017-6074$ gcc -o pwn poc.c sios@ubuntu:~/CVE-2017-6074$ ls poc.c pwn README.md trigger.c sios@ubuntu:~/CVE-2017-6074$
PoC
通常の状態(脆弱性あり)
- CONFIG_IP_DCCPがモジュールになっていることを確認します。
root@ubuntu:~# cat /boot/config-4.4.0-62-generic |grep CONFIG_IP_DCCP CONFIG_IP_DCCP=m # CONFIG_IP_DCCP_CCID2_DEBUG is not set # CONFIG_IP_DCCP_CCID3 is not set # CONFIG_IP_DCCP_DEBUG is not set
- 一般ユーザでPoCのコンパイルしたコードを実行すると、root権限を取得できます。
sios@ubuntu:~/CVE-2017-6074$ ./pwn [.] namespace sandbox setup successfully [.] disabling SMEP & SMAP [.] scheduling 0xffffffff81064550(0x406e0) [.] waiting for the timer to execute [.] done [.] SMEP & SMAP should be off now [.] getting root [.] executing 0x402043 [.] done [.] should be root now [.] checking if we got root [+] got r00t ^_^ [!] don't kill the exploit binary, the kernel will crash root@ubuntu:/home/sios/CVE-2017-6074# ls /root/.bashrc /root/.bashrc root@ubuntu:/home/sios/CVE-2017-6074# id uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:kernel_t:s0 root@ubuntu:/home/sios/CVE-2017-6074# cat /etc/shadow root:ZZZZZZ:12282:0:99999:7::: daemon:*:15043:0:99999:7::: bin:*:15043:0:99999:7::: --snip--
SELinuxを有効にしている場合
SELinuxを有効にしている場合には、root権限取得が阻止されることがわかります。詳しくは、こちらのOSSセキュリティ技術の会(http://www.secureoss.jp)のブログを参照して下さい(英語ですが。。。)
暫定回避策で、モジュールを読み込ませないようにした場合
- rootで/etc/modprobe.d/以下に下記のblacklist-dccp.confを作成して再起動します。
# For CVE-2017-6074 alias net-pf-2-proto-0-type-6 off alias net-pf-2-proto-33-type-6 off alias net-pf-10-proto-0-type-6 off alias net-pf-10-proto-33-type-6 off
- 一般ユーザでPoCのコンパイルしたコードを実行します。SOCK_DCCPで”socket type not supported”と出力され、阻止されることがわかります。
sios@ubuntu:~/CVE-2017-6074$ ./pwn [.] namespace sandbox setup successfully [.] disabling SMEP & SMAP [.] scheduling 0xffffffff81064550(0x406e0) socket(SOCK_DCCP): Socket type not supported
結論
CVE-2017-6074はやはりローカルユーザがroot特権に昇格できる危険な脆弱性であることがわかりました。しかし、ディストリビューション元などで一般的に公開されている情報(モジュールを読み込ませないようにする、SELinuxを有効にする等)で、root権限取得が阻止されることがわかりました。勿論、これらの対応作はあくまでも暫定回避策なため、修正済みのカーネルに更新されることを強くお薦めします(モジュールを読み込ませないようにする場合でも、再起動が必要になるため)。
OSの再起動が発生する場合には、pacemakerなどOSSのクラスタ製品やLifeKeeperなどの商用のクラスタリング製品を使うとサービス断の時間を最小限にすることが出来ます。
[参考]
https://security.sios.com/vulnerability/kernel-security-vulnerability-20170223
OSSセキュリティ技術の会ブログ(http://www.secureoss.jp/post/omok-selinux-kernel-20170305/)
セキュリティ系書籍案内
技術評論社より、2/23に『【イラスト図解満載】情報セキュリティの基礎知識』が発刊されました。セキュリティの要素技術がイラスト図解でやさしく解説されており、初心者にもわかりやすくなっていますのでお薦めです。
セミナー情報
3/10(金)の12:00から、明星大学 日野キャンパス(多摩モノレール 「中央大学・明星大学駅」から大学まで直結。会場まで徒歩6分)にて開催されるオープンソースカンファレンス2017 Tokyo/Springで、本ブログ執筆者の面 和毅がOSSセキュリティ技術の会発足の紹介として、プラットフォームの全般的なセキュリティの紹介を行います。OSCに参加される方、またお近くの方で御時間が有りましたら、是非ご参加下さい。
—–