Macがマルウェアに対して安全という説には大きな語弊があり、ユーザ数が多く標的になりやすいWindowsと比較し被害者が少ないからにすぎない。とはいえ長らく被害が少なかったことは事実で、そのためかMacユーザは総じてマルウェアへの危機意識に乏しく、システム常駐型のアンチウイルスソフトは普及せず、ダウンロードしたアプリは必ずウイルススキャンしてから実行すべしというカルチャーはついぞ根付かなかった。
しかしAppleはOS X 10.8 Mountain Lionのとき「GateKeeper」を投入、具体的根拠に乏しい"Mac安全神話"を自ら否定した。今後は自由配布のアプリの利用に制約を課すことで、根本的な安全性を確保しようというのだ。どのようなアプリを利用するのもユーザの勝手、という長年続いた暗黙の了解が否定されたことになる。
GatekeeperはOS X 10.5 Leopardのとき導入された検疫機能 -- ダウンロード時にファイルの拡張属性/Extended Attributeへ入手先URLなどの情報を記録し、後日の識別材料とする -- を拡張したもので、検疫情報付きのアプリを起動しようとするとシステムが手持ちのデータベースに照会、デジタル署名のないアプリの実行を拒否する機能を持つ。ダウンロード後/問題発生後に駆除するのではなく、インストール前/問題発生前に排除するという考えかただ。
導入当初は「開発元が未確認のため開けません」と表示する程度で、システム設定を変更すればかんたんに回避できたが、Mojaveのときにはカーネル拡張/KEXTにデジタル署名と「公証(Notarization)」が必須となり、Catalinaからは一般的なアプリにも求められるようになった(2020年2月3日以降)。インターネット上で公開/配布されているMac App Store管轄外のアプリは、もはや自由にインストールできない時代なのだ。
その「身元」を判定する材料は、Appleが一手に握っている。Appleはかねてからアプリ開発者に固有ID(デベロッパーID)の署名を求めており、それにはXcodeなどで生成したDeveloper ID証明書が必要だ。その処理によりオンラインのApple Notary Serviceで公証が得られれば、チケットがアプリに付与され、インストール/起動されたときGateKeeperにより存在がチェックされるというしくみだ。
公証のないアプリを実行すると、「"○○○"は、開発元を検証できないため開けません」と表示されたダイアログが現れ、ゴミ箱に入れるか実行をキャンセルするかの選択を迫られる。自己責任で実行するのであれば、Controlキーを押しながらアプリアイコンをクリックし、現れたコンテキストメニューで「開く」を選択する。Finderで過ごす時間が長いユーザは、この方法さえ覚えておけば困ることはないだろう。
公証の有無は「spctl」コマンドを利用しても確認できる。実行時に「--assess」オプション(assessmentの略、査定/評価の意)を付け、引数にアプリ(*.app)のパスを指定して実行すると、公証がないものについては「rejected」と表示される。なお、「--verbose」オプションを付ければ公証の種類を確認できるので、あわせて「-av」(--assess --verboseの省略形)としたほうがわかりやすい。
ところで、macOS Sierra以降、システム環境設定「セキュリティとプライバシー」パネルにあるダウンロードしたアプリの実行許可欄には、かつて存在した「すべてのアプリケーションの実行を許可」という選択肢が消えている。GUIの選択肢をなくすことでセキュリティ強化を図る狙いだが、前述したspctlコマンドを以下のとおり実行すれば、選択肢を復活させることができる。
検疫機能は引き続き動作するため、初めて起動したアプリでは「○○○はインターネットからダウンロードされたアプリケーションです。開いてもよろしいですか?」という確認のダイアログが現れるものの、Finderのコンテキストメニューを操作することに比べれば手間は格段に減る。
この設定は、GateKeeperのセキュリティレベルを下げ、システム全体の安全性を低下させてしまうため安易に適用すべきではないが、コンテキストメニューの「開く」を選択できないアプリ -- 一部アプリのアップデータなどに存在する -- ではやむを得ず使わざるをえないことがある。慎重に活用してほしい。
・ダウンロードしたすべてのアプリケーションを許可する
$ sudo spctl --master-disable
・「すべてのアプリケーションの実行を許可」を非表示にする(Catalinaの初期設定に戻す)
$ sudo spctl --master-enable