Successfully reported this slideshow.
Your SlideShare is downloading. ×

OSS_SecuritySig_20170516_sesearch

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 24 Ad

More Related Content

Recently uploaded (20)

Advertisement

OSS_SecuritySig_20170516_sesearch

  1. 1. © Hitachi, Ltd. 2017. All rights reserved. OSSセキュリティ技術の会第一回勉強会 株式会社 日立製作所 OSSソリューションセンタ 2017/5/16 中村 雄一 SELinuxの正体を暴く!sesearch入門
  2. 2. © Hitachi, Ltd. 2017. All rights reserved. SELinuxのメイン機能 「TE(Type Enforcement)」の 復習 1 /var/wwwSELinux httpデーモン (/usr/sbin/httpd) ファイル ドメイン:httpd_t タイプ: http_content_t 誰が (ドメイン) 何に (タイプ) 許可 httpd_t http_content_t read … … … (3)ファイル読込要求 (4)許可されたアクセスかチェック (5)実際に読込 セキュリティポリシ ドメイン プロセス httpd_t /usr/sbin/httpd … … タイプ ファイル http_content_t /var/www/* … … (1) プロセス起動時に” ドメイン”付与 (2) ファイルやポートに に”タイプ”付与 Linuxカーネル 誰が(ドメイン)、何に(タイプ)、どんな(パーミッション) アクセスを許すか記載。 ここに書かれた以外は全て拒否 攻撃されたとしても、SELinuxはセキュリティポリシの範囲内に攻撃者の行動を 封じ込める とはいうものの、攻撃されるまで効果が分からないのではありがたみが…
  3. 3. © Hitachi, Ltd. 2017. All rights reserved. セキュリティポリシが分かればSELinuxの効果が分かる 2 httpデーモン (/usr/sbin/httpd) /var/www /etc/httpd タイプ:httpd_sys_content_t タイプ:httpd_conf_t ドメイン:httpd_t read可 read可 セキュリティポリシ設定状況の例 他ファイル 何も設定無いので 拒否 この場合のSELinuxの効果 httpデーモンの脆弱性を突かれて侵入されて(rootに昇格されたとしても) /var/www, /etc/httpdの読み込みしかさせない。 逆にセキュリティポリシで許可されすぎているケースもあり、 ポリシを知ればSELinuxが当てにならない箇所を知ることもできる
  4. 4. © Hitachi, Ltd. 2017. All rights reserved. 最低限押さえておくべきセキュリティポリシの設定要素 ~allow文とfile_contexts設定 3 allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ; ドメイン タイプ オブジェクトクラス (リソース種別) パーミッション (許可する操作) ■ allow文: アクセス許可する設定要素 ・ デフォルトでドメインはすべての操作が拒否。セキュリティポリシの中でallow文で一つ一つアクセスを許可する ・ オブジェクトクラスとパーミッションは大量にありますが、最初はfile関連が何となく分かるだけでもよいです。 一覧はこちらにあります⇒https://selinuxproject.org/page/ObjectClassesPerms ■ file_contexts設定: ファイルへのタイプ付与 タイプを見ただけではどのファイルなのか分からないためfile_contexts設定の確認が必要 /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ファイルのパス(正規表現) この場合だと/var/www以下全て ファイルのタイプファイル種別 (ディレクトリや 通常ファイル等)
  5. 5. © Hitachi, Ltd. 2017. All rights reserved. セキュリティポリシの実体 (CentOS 7での例) 4 ①バイナリポリシファイル (allow文やドメイン 遷移設定他) Linuxカーネル ②file_contexts ファイル (ファイルのタイプ 付与設定) SELinuxモジュール システム起動時 にロード セキュリティポリシの実体: /etc/selinux/targetedディレクトリ以下 xattrに タイプ書き込み 拡張属性 (xattr) ファイルシステム ・ コミュニティ開発者達が作ったポリシがバイナリ形式で /etc/selinux/targeted以下に入っています ・ バイナリ形式なので、そのままでは読めません… ポリシソースファイル (テキスト) RPMパッケージ インストール時に導入 CentOS 7システム バイナリ変換・パック コミュニティ開発者
  6. 6. © Hitachi, Ltd. 2017. All rights reserved. ポリシを解析するためのツール 5 コマンド 主な役割 sesearch ・ バイナリポリシーからallow文の抽出 seinfo ・ バイナリポリシーから 定義されているタイプやドメインの一覧を抽出 semanage ・ タイプ付与設定の表示や変更 ・ 新たなドメインの追加 利用するツール類 (コマンド) • ポリシはバイナリのため解析には専用のツールが必要 sesearchがメインですがいくつかあります インストール sesearch, seinfoは「setools」というツールに含まれていますが、デフォルトでは入ってない # yum install setools setools: SELinux古株のTresys Technology開発のツール
  7. 7. © Hitachi, Ltd. 2017. All rights reserved. 効果を実感するための模擬攻撃分析 6 攻撃者 (1)脆弱性悪用し 乗っ取り 機密情報 システム・ファイルなど デーモン・プロセス (例:httpd, httpd_tドメイン) Linuxシステム (3)root権限昇格 (4)破壊活動・ 情報奪取 (5)他システム へ被害拡大 これ自体は SELinuxで防げない 攻撃者のサイト SELinuxでは 無意味(2)ツール ダウンロード・実行 ・ 攻撃された場合に攻撃者が何をできるかを把握 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect 任意 file write, execute_no_trans, execute (A) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect (C) 必要なアクセス許可 (B) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション 任意 file write 任意 file read 許可されていなければ該当の被害を及ぼすことは難しい
  8. 8. © Hitachi, Ltd. 2017. All rights reserved. sesearchの使い方 7 sesearch -C -A -s <ドメイン> -t <タイプ> -c <オブジェクトクラス> -p <パーミッション> ■ 基本的な書式 -C : オン・オフ可能な設定も表示⇒とりあえずつけておく -A : allow文を表示 # sesearch -C -A -s httpd_t Found 1854 semantic av rules: allow httpd_t httpd_tmp_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; allow corenet_unlabeled_type unlabeled_t : association { sendto recvfrom } ; allow httpd_t pki_apache_var_lib : dir { ioctl read write getattr lock add_name remove_name search open } ; allow domain abrt_t : process { signull getattr } ; allow nsswitch_domain winbind_var_run_t : dir { getattr search open } ; allow nsswitch_domain krb5_conf_t : file { ioctl read getattr lock open } ; allow httpd_t proc_net_t : file { ioctl read getattr lock open } ; … …略 ・ 最も単純な実行例: httpd_tの許可されたアクセス全部表示
  9. 9. © Hitachi, Ltd. 2017. All rights reserved. 【例1】 攻撃ツールのダウンロード・実行(1/3) 8 攻撃者 (1)脆弱性悪用し 乗っ取り 機密情報 システム・ファイルなど デーモン・プロセス (例:httpd, httpd_tドメイン) Linuxシステム (3)root権限昇格 (4)破壊活動・ 情報奪取 (5)他システム へ被害拡大 これ自体は SELinuxで防げない 攻撃者のサイト SELinuxでは 無意味(2)ツール ダウンロード・実行 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect 任意 file write, execute_no_trans, execute (A) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect (C) 必要なアクセス許可 (B) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション 任意 file write 任意 file read 攻撃者サイトへの 接続 保存と実行
  10. 10. © Hitachi, Ltd. 2017. All rights reserved. 【例1】 攻撃ツールのダウンロード・実行 (2/3) 9 # sesearch -C -A -s httpd_t -t http_port_t -c tcp_socket -p name_connect 1: DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ] 2: DT allow httpd_t http_port_t : tcp_socket name_connect ; [ httpd_can_network_relay ] 3: ET allow httpd_t http_port_t : tcp_socket name_connect ; [ httpd_graceful_shutdown ] 4: DT allow nsswitch_domain reserved_port_type : tcp_socket name_connect ; [ nis_enabled ] httpdが攻撃者サイトに接続できるか?? httpdのドメインはps –eZで確認する(⇒ httpd_t ドメイン) DT, ETって何?? 行頭がDT or DF ⇒ 無効になっている設定で無視 行頭がET or EF ⇒ 有効になっている設定で見る なので allow httpd_t http_port_t : tcp_socket name_connect ; [ httpd_graceful_shutdown ] のみが有効な設定 つまり、「攻撃者サイトへの接続」自体は許可されていることが分かった。
  11. 11. © Hitachi, Ltd. 2017. All rights reserved. 【例1】 攻撃ツールのダウンロード・実行 (3/3) 10 httpdが攻撃ツールをダウンロードして実行できるか? ・ まずはファイル書き込みできるか検索 # sesearch -C -A -s httpd_t -c file -p write Found 79 semantic av rules: allow httpd_t httpd_cache_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; <以下78行allow文が表示> ⇒ ファイル書き込みはいくつか許されているようだ。。 (ダウンロードは可能) ・ かつ実行できるか ② # sesearch -C -A -s httpd_t -c file -p write|grep execute <何も表示されない> ⇒ 実行はできない!
  12. 12. © Hitachi, Ltd. 2017. All rights reserved. 【例2】 破壊活動の可能性分析 11 攻撃者 (1)脆弱性悪用し 乗っ取り 機密情報 システム・ファイルなど デーモン・プロセス (例:httpd, httpd_tドメイン) Linuxシステム (3)root権限昇格 (4)破壊活動・ 情報奪取 (5)他システム へ被害拡大 これ自体は SELinuxで防げない 攻撃者のサイト SELinuxでは 無意味(2)ツール ダウンロード・実行 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect 任意 file write, execute_no_trans, execute (A) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション http_port_t tcp_socket name_connect (C) 必要なアクセス許可 (B) 必要なアクセス許可 タイプ オブジェクト クラス パーミッション 任意 file write 任意 file read これ
  13. 13. © Hitachi, Ltd. 2017. All rights reserved. 12 【例2】 破壊活動の可能性分析: 分析対象 コンテナにします。 コンテナはsvirt_lxc_net_tで動作。 コンテナ test1 ホスト内の ファイル ホストOS コンテナの脆弱性を突かれてしまった場合 ホストのどんなファイルを壊されてしまうのかを分析 SELinuxがない場合は全て破壊されてしまう可能性 ホストOSから見るとプロセスとして見えています。 ps –eZでドメインをみると svirt_lxc_net_t
  14. 14. © Hitachi, Ltd. 2017. All rights reserved. 【例2】 破壊活動の可能性分析: アクセス可能なタイプ 13 # sesearch -A -C -c file -s svirt_lxc_net_t -p write Found 13 semantic av rules: allow svirt_sandbox_domain sysctl_net_unix_t : file { ioctl read write getattr lock append open } ; allow svirt_lxc_net_t cgroup_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow svirt_lxc_net_t svirt_lxc_net_t : file { ioctl read write getattr lock append open } ; allow domain puppet_tmp_t : file { ioctl read write getattr lock append } ; allow svirt_sandbox_domain tmpfs_t : file { read write } ; allow svirt_sandbox_domain hugetlbfs_t : file { ioctl read write getattr lock append open } ; allow svirt_sandbox_domain svirt_sandbox_file_t : file { ioctl read write create getattr setattr lock relabelfrom relabelto append unlink link rename execute execute_no_trans execmod open } ; allow domain afs_cache_t : file { read write } ; allow sandbox_net_domain svirt_home_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; allow svirt_lxc_net_t usermodehelper_t : file { ioctl read write getattr lock append open } ; DT allow svirt_sandbox_domain cifs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; [ virt_use_samba ] DT allow svirt_sandbox_domain fusefs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; [ virt_sandbox_use_fusefs ] DT allow svirt_sandbox_domain nfs_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ; [ virt_use_nfs ] 先頭行DTなので無視 コンテナは sysctl_net_unix_t, cgroup_t, svirt_lxc_net_t, puppet_tmp_t, tmpfs_t, hugetlbfs_t, svirt_sandbox_file_t, afs_cache_t, svirt_home_t, usermodehelper_t というタイプが付与されたホストのファイルにwriteアクセス可能!
  15. 15. © Hitachi, Ltd. 2017. All rights reserved. 【例2】 破壊活動の可能性分析: タイプからファイル名へ 14 ■ コンテナは sysctl_net_unix_t, cgroup_t, svirt_lxc_net_t, puppet_tmp_t, tmpfs_t, hugetlbfs_t, svirt_sandbox_file_t, afs_cache_t, svirt_home_t, usermodehelper_t というタイプが付与されたホストのファイルにwriteアクセス可能! ⇒ ファイル名は?? #semange fcontext –l SELinux fcontext タイプ コンテキスト /.* all files system_u:object_r:default_t:s0 /[^/]+ regular file system_u:object_r:etc_runtime_t:s0 …以下ひたすら関連付け6000行ほど… #semange fcontext –l | grep <対象とするタイプ> で絞り込む sysctl_net_unix_t, cgroup_t, svirt_lxc_net_t, puppet_tmp_t, tmpfs_t, hugetlbfs_t, svirt_sandbox_file_t, afs_cache_t, svirt_home_t, usermodehelper_t それぞれについて ■ semanageコマンドでfile_contexts設定を確認 ■ file_contextsファイルから必要な部分の抽出
  16. 16. © Hitachi, Ltd. 2017. All rights reserved. 【例2】 破壊活動の可能性分析: タイプからファイル名へ 15 # semanage fcontext –l |grep file| grep sysctl_net_unix_t ⇒ 何も出てこない。特殊ファイルか一時ファイル。今回の例のタイプはほとんどこれ。 ■ 関連するファイルが見つかった例 # semanage fcontext -l|grep file|grep svirt_sandbox_file_t /var/lib/kubelet(/.*)? all files system_u:object_r:svirt_sandbox_file_t:s0 /var/lib/docker/vfs(/.*)? all files system_u:object_r:svirt_sandbox_file_t:s0 # semanage fcontext -l|grep file|grep afs_cache_t /var/cache/(open)?afs(/.*)? all files system_u:object_r:afs_cache_t:s0 /usr/vice/cache(/.*)? all files system_u:object_r:afs_cache_t:s0 ⇒下線の/var/lib/kubelet以下などに書き込み可能。 だが、Cent OS 7のDockerのデフォルトでは、これらのファイルは存在しない。 分析結果 コンテナゲスト側で脆弱性を突かれてしまったとしても、ホストの通常ファイ ルは破壊できない
  17. 17. © Hitachi, Ltd. 2017. All rights reserved. アトリビュート 16 # sesearch -C -A -s httpd_t -t http_port_t -c tcp_socket -p name_connect 1: DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ] ⇒タイプに「port_type」 これは「_t」で終わらないが、何? ⇒アトリビュート タイプの名称は必ず「_t」で終わる規則だが、、、 前半出てきた結果 ■ アトリビュートとは タイプを複数束ねてグループ化したもの。 何を束ねているかはseinfoコマンドで確認可能 # seinfo --attribute=port_type –x port_type afs3_callback_port_t afs_bos_port_t <略> http_port_t <略:合計283タイプ> ⇒ port_typeは283タイプを束ねている。上記allow文では283タイプに対して アクセスを許可していることになる。
  18. 18. © Hitachi, Ltd. 2017. All rights reserved. 【例2】 破壊活動の可能性分析: 基本的な作業フロー(アトリビュート考慮) 17 ①分析対象とするドメインを 決定 ②sesearchコマンドで allowルール抽出、タイプ確認 ④アトリビュートから タイプ抽出 ③ ファイル名との 対応確認 タイプの末尾が_t タイプの末尾が_tでない 実ファイルへのアクセス 一時ファイルや 特殊ファイルシステム(/proc等) へのアクセス 対応するファイル名あり 対応するファイル名無し 無効なルール のため無視 行の先頭がDTかDF アトリビュートに 紐づいたタイプ の抽出必要
  19. 19. © Hitachi, Ltd. 2017. All rights reserved. 便利(かもしれない)ツール 18 手作業での分析はなかなか面倒。特にアトリビュートがたくさんあると大変。 GUIがある環境ならば「sepolicy gui」がある。 ■ インストール #yum install policycoreutils-gui ■ 起動 ウィンドウシステムを立ち上げて、 コマンドラインから sepolicy gui
  20. 20. © Hitachi, Ltd. 2017. All rights reserved. sepolicy gui実行例 19 やれることは限られるが、ドメインがwriteできるファイル一覧を 出してくれるのは便利かも(アトリビュートも考慮)
  21. 21. © Hitachi, Ltd. 2017. All rights reserved. 今回の分析についての注意 20 ・ 実際に攻撃された場合100%今回の分析のようにいくわけではない SELinuxは、SELinuxそのものを無効にできてしまう脆弱性について は対処できないため ・ 100%のセキュリティ技術は存在しないため、 複数の技術を組み合わせた「多層防御」が重要です。 ・ 多層防御の例: コンテナの場合 OSレベルのセキュリティ技術として「SELinux」だけではなく、 Seccompというシステムコールを使えなくする技術も併用するトレンド
  22. 22. © Hitachi, Ltd. 2017. All rights reserved. さいごに 21 ・ 分析してみて変なところを見つけたら… 技術の会のslackでつぶやいてください 適切なところに誘導されます http://bit.ly/jsoss-sig-chat
  23. 23. 22© Hitachi, Ltd. 2016. All rights reserved. 他社所有商標に関する表示 • SELinuxは米国及びその他の国におけるNational Security Agencyの登録商標です。 • Type Enforcementは米国及びその他の国におけるSecure Computing, LLCの登録商標です。 • CentOSは米国及びその他の国におけるCentOS ltdの登録商標です。 • その他記載の会社名、製品名は、それぞれの会社の商標もしくは登録商標です。

×