App Sandboxとは
App Sandboxは、macOSに実装されているセキュリティ機能で、
潜在的に悪意のあるソフトウェアが
- ユーザーのキー入力をこっそり記録したり
- カメラをこっそり起動したり
- ドキュメントフォルダからデータを盗んだり
- ユーザーのMacに損害を与えたり
するのを防ぐのに役立つ。iOSでも利用可能で、「Sandbox」と呼ばれている。
App Sandboxの主なコンセプトは、アプリを実行するための限定的で隔離された空間(「Sandbox」)を提供することである。
アプリのシステムリソースや個人データへのアクセスを制限し、
悪意のあるコードによってアプリが侵害された場合の潜在的な損害を最小限に抑えられる。
イメージ図:
その仕組みについて:
Sandbox化された各アプリをイメージ図のように木で例えれば、
木の胴体は、アプリ
果物は、アプリがアクセスできるファイルやユーザーデータ
木が植えられた土台は、アプリがアクセスできるシステムリソース
とも言える。
一本の木が他の木にある果物や土台にアクセスできないように、
Sandbox化された各アプリは他のアプリのデータとシステムリソースから隔離されている。
一方、アプリからアクセスできるシステム操作は以下のように限られている。
- ハードウェア(カメラ、マイク、USB、プリンター)
- ネットワーク接続(受・送信)
- アプリデータ(カレンダー、位置情報、連絡先)
- ユーザーファイル(ダウンロード、ユーザー選択済ファイル、写真、音楽、映画)
ボイスレコーダーのアプリにカメラが使われる必要がないように、
アプリの開発者は「プロジェクト定義」にてアプリがシステムのどの機能をどの理由で使うかを
明示的にリクエストしなければならない。
Xcodeで指定する「プロジェクト定義」画面
最終的にユーザーがそのリクエストに対して権限を付与するか否かを決める。
App Storeにアプリを提出する場合、
開発者はApp Sandbox機能を使用することが義務付けられている。
App Sandboxが適用される方式
iOSは各アプリごとに全てSandbox化されている。
App Sandboxは各アプリに関するファイル、環境設定、ネットワークリソース、ハードウェアなどに対するアプリのアクセスを制限する細分化された制御の集合体と言える。
このようにアプリごとに区分けされているため、このアプリを使うユーザーはこのアプリのデータのみアクセスできる。外部データにアクセスしたければ、Sandboxに準じてアクセス権限が必要になる。逆に言えば、このアプリのデータも他のところからアクセスすることはできない。
アプリのSandboxフォルダはこのようにできている。
アプリをインストールした時点でSandbox DirectoryらをChild directoryとして持つ。
各Containerにはそれぞれ役割がある:
-
Bundle Container
:AppのBundleを保有する -
Data Container
:アプリ及びユーザーデータを保有、アプリがデータを整列、グルーピングするのに使える色んなChild directoryに分けられる -
iCloud Container
:ランタイムにアクセスをリクエストできる追加Container directory
iOSアプリのApp SandboxをFinderで確認してみよう
-
ターミナルを開いて
-
以下のコマンドを打つ(
$
は除く):
$ xcrun simctl get_app_container booted <アプリのBundle Identifier> data
Xcode - Project Navigator - (App Name) Project - Targets - Identity -
表示された経路をコピーして、Finderで開くコマンドを打つ:
$ open -a Finder <コピーした経路>
Finderで該当のApp Sandboxが表示された
xcrun: error: unable to find utility "simctl", not a developer tool or in PATH
上記、手順2でこのようなエラーが出た場合は、
「Developer directory」が正しく設定されてない可能性がある。
管理者権限で正しい経路を指定する:(PasswordはMacのログインパスワード)
$ sudo xcode-select -s /Applications/Xcode.app
これで正しく設定が出来たら自分のXcode情報が出てくるか確認してみよう:
$ xcodebuild -version
参考
Discussion