SlideShare a Scribd company logo
1 of 29
Download to read offline
iOS/macOSとAndroid/Linuxの
サンドボックス機構について調べた
2017/02/03 Kラボ部会発表資料
@hnw
1
前々回のあらすじ
iOSアプリでfork(2)したい!
なぜか無理
fork(2)の代替を探した
2
そもそもの疑問
● 誰がfork(2)を無効化しているのか?
● どんな仕組みなのか?
3
「App Sandbox」が特定システムコールを無効化
本日の内容
● iOS/macOSの「App Sandbox」
○ アプリケーション用サンドボックス機構
● Android/Linuxの「seccomp」
○ システムコールを制限する仕組み
● どちらも情報が少ないので調査した
○ 注:chrootとかcgroupsとかの話はしません
4
話題1:App Sandbox (a.k.a. Seatbelt)
● iOSアプリの機能を制限する仕組み
● macOS上にも存在
○ Mac OS X Lion(10.8)から導入
○ iOS版のサブセットらしい
5
手元のmacOSで観察
6
手元のmacOSで実験
7
(「no-internet」の指定により、ネットワーク通信に関連するシステムコールが全て失敗する)
App Sandbox 概要
● iOS/macOS上のsandbox環境
○ storeアプリは全てsandbox配下
● システムコールをフック
○ DSLでフィルタを記述
● 構成
○ カーネル拡張
○ デーモン
○ ライブラリ
8
(iOS Hacker’s Handbook より引用)
sandboxに対するAppleのスタンス
● macOSアプリ
○ store審査でsandbox化必須
○ GUIから設定する前提
● iOSアプリ
○ 勝手にsandbox下で起動される
○ 開発者は対応作業なし
● 技術の詳細は非公開
○ Cインターフェースが最近
deprecatedになった
9
(XcodeのmacOSアプリの設定)
sandbox_init(3) (deprecated)
● 権限を自ら捨てる
● 権限の詳細は「プロファイル」で指定
● プロファイルの種類
○ カスタムプロファイル
○ ビルトインプロファイル
● 実験コード:https://github.com/hnw/apple-sandbox-test
10
カスタムプロファイル
● SBPL (Sandbox Profile Language)で記述
○ 許可・拒否のルールを記述するDSL
○ 内部的にはカスタムのScheme処理系で処理
● 手元のmacOSにもある
○ /usr/share/sandbox/*.sb
○ /System/Library/Sandbox/Profiles/*.sb
11
カスタムプロファイルの文法
12
● システムコールを複数束ね
て許可・拒否を記述
○ 例:「process-fork」
● 引数でフィルタ指定可能
○ 例:「file-read-data」
○ 正規表現マッチも可能
ビルトインプロファイル
● 定義はsandboxd内に存在
○ バイナリ化されており読み出しは困難
○ 古いバージョンの定義は解析されている
● iOSアプリはビルトインプロファイル
「container」下で動作
○ プロセス起動の禁止を実現している
13
App Sandboxまとめ
● システムコールをフィルタする仕組み
○ フィルタはDSLで定義、記述力は高い
● ファイルのアクセス制限も担当
○ Linuxなら別の仕組み(SELinux)で実現するところ
● 開発環境やStore審査など仕組みで強制
○ 開発者が自由に使うことは想定外?
14
話題2:seccomp
● システムコールのフィルタリング機構
○ Linux 3.5から導入、多くの環境でデフォルト有効
○ Android 7.0以降、全端末で有効
○ バックエンドにBPFを利用
15
BPF (Barkley Packet Filter)
● パケットフィルタに特化したVM(?)
○ レジスタマシン(レジスタ数2)
○ フィルタとしてVM命令列を与える
○ JITコンパイルされるので高速、らしい
→高速かつ記述力が高いのでseccompでも採用
16
BPFの例
17
● フィルタ条件を記述
● 大半の人類には難易度が高い
(「LinuxのBPF : (1) パケットフィルタ - 睡分不足」より引用)
libseccomp
● seccompを扱いやすくするライブラリ
○ https://github.com/seccomp/libseccomp
○ 素のseccomp/BPFは使いたくないでござる
● 各言語のバインディングも存在
○ Go / Perl / mruby
○ Python版はlibseccomp同梱
18
libseccompを試す(1)
● 実験コード
○ https://github.com/hnw/seccomp-test
● 利用の流れ
○ seccomp_init() :初期化
○ seccomp_rule_add():ルール追加
○ seccomp_release():ルールに従って権限を捨てる
19
libseccompを試す(2)
● 実際にコードを書いてみると結構面倒
○ デフォルトdeny・必要分だけallowしていく
○ Cライブラリ関数の内部でどのシステムコールが呼ばれ
るか自明でない
→何度も実行して試行錯誤するしかない
○ プリセットの定義があれば楽なのになぁ…
20
seccompの能力(1)
● 任意のシステムコールをフック
● マッチした場合に次の処理ができる
○ 問答無用でプロセスごとKILL
○ シグナルを投げる
■ シグナルハンドラで任意の処理を行う
○ 任意のerrnoを返す
21
seccompの能力(2)
● syscall引数(64bit int)の値による分岐
○ EQ / NE / LE / GE / MASKED_EQ など
■ 例:open()でO_WRONLYが指定されたらKILL
○ 文字列比較はできない
22
seccompの適用例
● 権限を捨ててから危険な処理を行う
○ 例:Chrome 20からFlash pluginがseccomp下で動作
○ 脆弱性があった場合の被害を最小化する目的
○ 3rd partyモジュールを実行するような場合に最適
23
Android 7.0とseccomp
● 現状、大多数のアプリとseccompは無関係
○ AOSPを見てもほとんど使われていない
○ App Sandboxのような利用は現時点では見られない
● 使いたい人が使えるようにしたという理解
○ 今のところChromeくらい
24
まとめ(1)
● 「sandbox的な機構が両OSにあるぞ!」と思っ
て調べてみたら運用方針が全く違った
○ iOS/macOS:3rd partyアプリの不正を防ぐ、強制
○ Android/Linux:安全性向上の仕組みを提供、任意
● 優劣の話ではなく、役割が違う
○ Androidだとファイルアクセス制御はSELinuxが担当
25
まとめ(2)
● SELinuxは今後も現役、seccompと補完関係
○ 調べる前はSELinuxを殺しに来たかと思った
○ SELinux:管理者が頑張る・ファイルアクセス特化
○ seccomp:開発者が頑張る・細かい制御は不向き
26
資料1
27
セキュリティ系の書籍
2012年発行
かなり攻撃者目線で、
日本では発売できない印象
資料2
28
Ruxcon 2014での発表資料
iOS8のApp Sandbox詳細
29
完

More Related Content

What's hot

CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
whywaita
 

What's hot (20)

containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)
IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)
IDaaS を利用すべき理由とエンジニアがおさえておくべきポイント (2021年1月14日)
 
#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門#logstudy 01 rsyslog入門
#logstudy 01 rsyslog入門
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミング
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxNVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
30分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.230分で分かる!OSの作り方 ver.2
30分で分かる!OSの作り方 ver.2
 
Raft
RaftRaft
Raft
 
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
CyberAgentのプライベートクラウド Cycloudの運用及びモニタリングについて #CODT2020 / Administration and M...
 
ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門ゼロからはじめるKVM超入門
ゼロからはじめるKVM超入門
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
はりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみたはりぼて OS で ELF なアプリを起動してみた
はりぼて OS で ELF なアプリを起動してみた
 

Viewers also liked (6)

家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう家庭用ブロードバンドルータ上でWordPressを動かそう
家庭用ブロードバンドルータ上でWordPressを動かそう
 
realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係realpathキャッシュと OPcacheの面倒すぎる関係
realpathキャッシュと OPcacheの面倒すぎる関係
 
KLab×サイバーエージェント 合同勉強会 発表資料
KLab×サイバーエージェント 合同勉強会 発表資料KLab×サイバーエージェント 合同勉強会 発表資料
KLab×サイバーエージェント 合同勉強会 発表資料
 
PHPの正規表現と最長一致
PHPの正規表現と最長一致PHPの正規表現と最長一致
PHPの正規表現と最長一致
 
PHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作るPHPの拡張モジュールをGoで作る
PHPの拡張モジュールをGoで作る
 
Tokyowebmining ctr-predict
Tokyowebmining ctr-predictTokyowebmining ctr-predict
Tokyowebmining ctr-predict
 

Similar to iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた

2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)
Naoki Okino
 
Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)
Hidenori Goto
 
How security broken? - Androidの内部構造とマルウェア感染の可能性
How security broken? - Androidの内部構造とマルウェア感染の可能性How security broken? - Androidの内部構造とマルウェア感染の可能性
How security broken? - Androidの内部構造とマルウェア感染の可能性
FFRI, Inc.
 

Similar to iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた (20)

最小セット
最小セット最小セット
最小セット
 
ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414ネットワークOS野郎 ~ インフラ野郎Night 20160414
ネットワークOS野郎 ~ インフラ野郎Night 20160414
 
コロナ禍の所蔵品検索システム
コロナ禍の所蔵品検索システムコロナ禍の所蔵品検索システム
コロナ禍の所蔵品検索システム
 
2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)2012 0623-x-road-tokyo-xoops-x(ten)
2012 0623-x-road-tokyo-xoops-x(ten)
 
Openstack abstract2
Openstack abstract2Openstack abstract2
Openstack abstract2
 
2008 08 09_osc2008nagoya_fight_cms_x_cube
2008 08 09_osc2008nagoya_fight_cms_x_cube2008 08 09_osc2008nagoya_fight_cms_x_cube
2008 08 09_osc2008nagoya_fight_cms_x_cube
 
20190828 sd by kitazaki_t0
20190828 sd by kitazaki_t020190828 sd by kitazaki_t0
20190828 sd by kitazaki_t0
 
LibreOfficeをビルドしてみよう(Windows)
LibreOfficeをビルドしてみよう(Windows)LibreOfficeをビルドしてみよう(Windows)
LibreOfficeをビルドしてみよう(Windows)
 
MUGT02 - vamp demo
MUGT02 - vamp demoMUGT02 - vamp demo
MUGT02 - vamp demo
 
A story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88kA story of porting OpenBSD/luna88k
A story of porting OpenBSD/luna88k
 
Osc2012 TokyoSpring OpenStack Abstract
Osc2012 TokyoSpring OpenStack AbstractOsc2012 TokyoSpring OpenStack Abstract
Osc2012 TokyoSpring OpenStack Abstract
 
What's Operating System?
What's Operating System?What's Operating System?
What's Operating System?
 
Miracle Linux seminer Hatohol and ConoHa
Miracle Linux seminer Hatohol and ConoHaMiracle Linux seminer Hatohol and ConoHa
Miracle Linux seminer Hatohol and ConoHa
 
Cocos2d-x公開講座 in 鹿児島
Cocos2d-x公開講座 in 鹿児島Cocos2d-x公開講座 in 鹿児島
Cocos2d-x公開講座 in 鹿児島
 
Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)
 
How security broken? - Androidの内部構造とマルウェア感染の可能性
How security broken? - Androidの内部構造とマルウェア感染の可能性How security broken? - Androidの内部構造とマルウェア感染の可能性
How security broken? - Androidの内部構造とマルウェア感染の可能性
 
How to use SOAP interface of debbugs #tokyodebian
How to use SOAP interface of debbugs #tokyodebianHow to use SOAP interface of debbugs #tokyodebian
How to use SOAP interface of debbugs #tokyodebian
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
Dockerクイックツアー
DockerクイックツアーDockerクイックツアー
Dockerクイックツアー
 
ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例
 

More from Yoshio Hanawa

zval をダイエットしてみた
zval をダイエットしてみたzval をダイエットしてみた
zval をダイエットしてみた
Yoshio Hanawa
 
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探るZend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
Yoshio Hanawa
 

More from Yoshio Hanawa (20)

自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた自宅の消費電力をリアルタイムに グラフ化してみた
自宅の消費電力をリアルタイムに グラフ化してみた
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
Zend VMにおける例外の実装
Zend VMにおける例外の実装Zend VMにおける例外の実装
Zend VMにおける例外の実装
 
ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込ぼくのかんがえる
さいきょうの銀行振込
ぼくのかんがえる
さいきょうの銀行振込
 
「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」「OKグーグル! 銀行振込1000円」
「OKグーグル! 銀行振込1000円」
 
浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話浮動小数点数とOSSのバグの話
浮動小数点数とOSSのバグの話
 
PHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったことPHP拡張をPECLに登録してわかったこと
PHP拡張をPECLに登録してわかったこと
 
GitHubからお金をもらった話
GitHubからお金をもらった話GitHubからお金をもらった話
GitHubからお金をもらった話
 
Laungage Update PHP編
Laungage Update PHP編Laungage Update PHP編
Laungage Update PHP編
 
GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話GitHubにバグ報告して賞金$500を頂いた話
GitHubにバグ報告して賞金$500を頂いた話
 
php-buildがいかに便利かを力説する
php-buildがいかに便利かを力説するphp-buildがいかに便利かを力説する
php-buildがいかに便利かを力説する
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
PHP7の拡張モジュール事情
PHP7の拡張モジュール事情PHP7の拡張モジュール事情
PHP7の拡張モジュール事情
 
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニックPHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
 
PHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイントPHP7で変わること ——言語仕様とエンジンの改善ポイント
PHP7で変わること ——言語仕様とエンジンの改善ポイント
 
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは偶然にも500万個のSSH公開鍵を手に入れた俺たちは
偶然にも500万個のSSH公開鍵を手に入れた俺たちは
 
PHP7はなぜ速いのか
PHP7はなぜ速いのかPHP7はなぜ速いのか
PHP7はなぜ速いのか
 
PHPNGの動向
PHPNGの動向PHPNGの動向
PHPNGの動向
 
zval をダイエットしてみた
zval をダイエットしてみたzval をダイエットしてみた
zval をダイエットしてみた
 
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探るZend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
 

iOS/macOSとAndroid/Linuxのサンドボックス機構について調べた