安全性を高めるサンドボックス
「バグのないプログラムは存在しない」、技術者の間ではこんな定説があります。昨今のソフトウェアはさまざまなサービスと連携するなどして便利になっていますが、当然その分高度になっており、思わぬところで問題が発覚することがあり得ます。問題を起こさないように注意するというのは重要ですが、そうした精神論だけでは安全性は守り切れないのが正直なところです。
となると、ソフトウェアに脆弱性があったとき、それによる被害を最低限に食い止める仕組みが重要になってくるというわけです。そこで用意されたのが、OS X に搭載されている 「アップサンドボックス(App Sandbox)」機能です。
サンドボックスって何?
サンドボックス(砂場、砂箱)とは、安全に区切られた場所を示す用語です。言い換えれば、その中でいくら遊んでも外に影響を与えないということを意味します。アップサンドボックスは、前号でも解説した「強制アクセス制御(MAC=Mandatory Access Control)」を使って、アクセスできるフォルダや機能に制限を加えています。
まずソフトウェアを起動すると、そのソフトウェアごとに「コンテナ」と呼ばれるフォルダが用意されます。そのとき、実行に必要なフレームワークへの読み取りアクセスはできますが、書き込みが可能なフォルダは「コンテナ」フォルダから下の階層だけに限られます。それ以上の機能を利用する場合は、あらかじめそれを使用するという旨をプロパティリストに記載しておく必要があります。
たとえば左頁の表にあるようなキーワードを記入しておかないと、その機能が使えないのです。また、第三者にこのキーワードやバイナリを書き換えられてしまうと困るので、アップサンドボックスを使うソフトウェアは電子署名が必須となります。なお、どのような機能の利用が入力されているのかは、ターミナルのcodesignコマンドで確認ができます。
Powerboxという仕組み
たとえば、ファインダの[書類]フォルダにファイルを保存したり、デスクトップにあるファイルを開くなどといったために、すべてのソフトウェアが書類フォルダやデスクトップへのアクセス権を書き込んでいては意味がありません。コンテナの外でも、ユーザが指定したファイルについてはアクセスを許す仕組みが必要です。
アップサンドボックスを有効にしてから「com.apple.security.files.user-selected.read-write」を書き込んだソフトウェアでは、[開く]パネルや[保存]パネルを実行すると、裏でヘルパープログラムが1つ起動します。このヘルパーは文書やデスクトップなどへのアクセスが許可されており、ファイルを読み書きし、ソフトウェアと通信してファイルの内容だけをやりとりします。この仕組みを「パワーボックス(Powerbox)」といいます。パワーボックスのように、特定の目的の機能を切り出してヘルパーとして分離することでソフトウェアの安全性は高まっていくのです。
XPCと権限分離
パワーボックスは、OS Xのソフトウェア開発環境のフレームワークである「ココア(Cocoa)」に組み込まれた権限分離の仕組みですが、ソフトウェアの開発者が独自にヘルパーを開発、権限を分けることもできます。
たとえば、「プレビュー」ではPDFを開いたときに独自のヘルパーが起動します。これはPDFの中のURLなどの外部を参照する部分を処理するヘルパーです。
悪意あるPDFの場合、外部を参照するところで悪いものを読み込ませ、ソフトウェアを攻撃する、という可能性が考えられるので、その部分の処理だけを外出しにしておくことで、「プレビュー」全体が乗っ取られるのを防いでいるわけですね。
このようなヘルパーの作成を簡単にするために、ココアには「XPC」と呼ばれる扱いやすいプロセス間通信の仕組みが付け加えられています。
App Sandboxは必須?
もちろん、アップサンドボックスを使わないソフトウェアを作ることもできます。自分だけが使うために作成したソフトや、企業内の限られた範囲で使うソフトなどはアップサンドボックスを使う必要はないかもしれません。
ただ、Macアップストアを使ってソフトウェアを配布する場合は話が変わります。アップルはMacアップストア内で販売するソフトのアップサンドボックス対応を必須としており、裏を返せば対応していないソフトは販売することができません。広く世に提供するソフトウェアは、それだけの配慮が必要ということなのでしょう。
なお、有効な電子署名がされていないソフトウェアはOS Xの「ゲートキーパー(GateKeeper)」で実行が拒否されます。ゲートキーパーの設定を変えれば電子署名がないソフトウェアでも実行できますし、右クリックして実行を指定することで特定のソフトだけ設定を変えることもできますが、安全とはいいがたいですよね。
今後のMacでは、電子署名で改ざんされていないのがわかる、アップサンドボックスで脆弱性があっても被害が最低限に抑えられる安全なソフトウェアが当たり前となっていくのでしょう。
AppSandboxでの制限解除キーワード(一部)
これらのキーワードをプロパティリスト(Plist)に記載、ソフトウェアに埋め込むことで、それぞれの機能の操作が許可されます。逆にいえば、記載しなければこうした機能は封じ込まれていて勝手に使われることはありません。ソフトウェアが積極的に使わない機能を使えないようにすることで、ソフトが乗っ取られてもそうした機能を使われずに済み、より安全になるわけです。
テキストエディットのキーワード
ターミナルのcodesignコマンドで、テキストエディットのプロパティリストのキーワードを読み出した画面です。アップサンドボックスの使用、パワーボックスでの読み書き、また一部ファイルのための書き込んだファイルへの実行権限の割り当て、印刷についてなどが書き込まれています。
Powerboxの仕組み
パワーボックスはココア標準のオープンパネルやセーブパネルに仕掛けられたバックグラウンドタスクです。これらのパネルを使うと、自動的にパワーボックスが起動し、制限の中で動けないソフトの代わりにファイルにアクセスしてくれます。なお、これらのパネルは「ユーザの指定したファイル」しかアクセスしません。なので、パワーボックスがあるからといって任意のファイルにアクセスできるわけではありません。
【 MAC 】
MAC(Mandatory Access Control)は、別名「強制アクセス制御」と呼ばれるもので、あらかじめ指定した機能しか使えないように権限を制約する枠組みです。実装ごとに名前があり、たとえばLinuxのMACは「SELinux」といい、OS XのMACの仕組みは「サンドボックス(Sandbox)」といいます。実はアップサンドボックスとは別のもので、その基盤となるものです。
【 App Sandbox 】
OS XのサンドボックスはOS X10.5レパードで導入されたもので、一部のサーバプロセスにのみ適用されていました。その設定は「スキーム(Scheme)」という言語で構成されており、柔軟な反面決して簡単ではなく、適切に設定するのが難しいものです。そこで、ソフトウェアの構成に合わせた決め打ちの設定を作り、プロパティリストに書き込みだけすれば機能を使えるように簡略化し、パワーボックスなど、より扱いやすい仕組みを整えたのがアップサンドボックスです。
【 電子署名 】
公開鍵暗号方式を利用した、ファイルが改ざんされていないことを示す方法です。通常の公開鍵暗号方式は誰もが使える公開鍵で、暗号化したものは秘密鍵でしか復号できず、秘密鍵の持ち主しか内容を知ることができないのですが、電子署名はこれを逆に使います。すなわち、秘密鍵で暗号化したものは誰もが持っている公開鍵で複合化できます。内容は誰もが読めますが、「その公開鍵で複合化できる暗号文は秘密鍵の持ち主だけしか作れない」ので、結果として改ざんされていないことがわかります。
【コンテナ】
「コンテナ」は[ホーム]フォルダの下の[ライブラリ]→[Containers]フォルダの中、「グループコンテナ」は同じ[ライブラリ]フォルダの[Group Containers]の中にあります。
【SELinux】
LinuxのMACであるSELinuxは強力な反面、これまた設定が難しく、誤設定で運用を阻害することも多々あるため、無効にされることが多くあります。アップサンドボックスはこれを反面教師にしたものと思われます。
文●千種菊理
本職はエンタープライズ系技術職だが、一応アップル系開発者でもあり、二足の草鞋。もっとも、近年は若手の育成や技術支援、調整ごとに追い回されコードを書く暇もなく、一体何が本業やら…。