El Capitanにおける最大の変更点は、間違いなく「System Integrity Protection(SIP)」だ。第142回で紹介したとおり、スーパユーザ(root)の権限狭めることでセキュリティ向上を図る機能だが、代わりに/usr以下など特定領域へのファイルの書き込みおよび削除がrootですら不可能になる、という事態を招いてしまった。rootならなんでもできる、という従来のUNIX系OSにおける常識は今後通用しなくなる。

この変化に気付いていない読者のために、SIPがもたらす影響を具体的に説明しよう。まず、手作業でドライバなど拡張書類(KEXT)を追加/削除できなくなった。たとえば、あるICカードリーダを利用するには、ドライバを手動で/usr/libexec以下に手動コピーしなければならないが、そのような処理はSIPにより却下される。SIPはデフォルトで有効なため、これを無効化しないかぎりユーザによるシステム領域の変更は認められない。

SIPの無効化は第142回で書いたとおり、リカバリーモードでTerminalを起動し「csrutil」コマンドを実行(csrutil disable)を実行すれば可能だが、そうすると今度はOS Xのセキュリティが低下する。root権限がありさえすればファイルシステムを書き換えできることは長らく見過ごされてきたリスクであり、Appleの意図どおりここを制限すれば確実な効果が期待できる。確かに自由度は低下するものの、メリットとデメリットを比較すると受け入れる理由もうなずける新機構といえるだろう。

ところで、ディレクトリがSIPによる制限対象かどうかは、lsコマンドの「O」オプションで確認できる。グループ名の右横に「restricted」とあるディレクトリはSIPの対象であり、rootであっても書き込みできない。おかしいな、という場合にはこの方法で調べてみよう。

lsコマンドに「-lO」オプションを付けて実行すると、どの領域がSIP対象かわかる

SIPで保護される領域は「/System/Library/Sandbox/rootless.conf」に記載されている

設定情報はNVRAMに

SIPはOSより低位のレイヤーで管理されるため、設定情報はファイルシステム上ではなくファームウェアレベルで管理される。実際、nvramコマンドを使い「csr」というキーワードでNVRAMの内容を探ってみると、「csr-active-config」というキーになにやら値が登録されていることがわかる。これが、SIPの挙動を決めているに違いない。

$ nvram -p | grep -i csr
csr-active-config   %10%00%00%00

Appleが公開しているソースコードのコメント部分を見ると、この値の先頭1バイトはフラグ情報であろうことが推測できる。初期値の「10」(16進数)を2進数で表現すると「00010000」、すなわち4ビット目の「CSR_ALLOW_APPLE_INTERNAL」のみフラグが立っているということだ。

話が込み入るので端折らせていただくが、この16進数で表現されるフラグはcsrutilコマンドのオプションと連動している。ファイルシステムの変更を制限するフラグ(CSR_ALLOW_UNRESTRICTED_FS)は1ビット目、前述した4ビット目とあわせると「00010010」、これを16進数で表せば「12」。NVRAMにある「csr-active-config」の値との関係がわかるはずだ。

csrutilコマンドのオプション(リカバリーモードでのみ実行可能)
オプション 16進数
enable --no-internal 0x00
enable 0x10
enable --without kext 0x11
enable --without fs 0x12
enable --without debug 0x14
enable --without dtrace 0x30
enable --without nvram 0x50
disable 0x77

アップデート前のファイルの行方

El Capitanにアップグレードしたあと、SIPにより書き込み制限を受けた領域にあったはずのファイルがなくなった、という経験はないだろうか? それもそのはず、それらファイルはアップグレード時に/Library/SystemMigration/History以下へと強制移動されるからだ。

移動先のディレクトリ名には「Migration-」に続き一意のIDが使用され、lsコマンドなどで内容を見ると「QuarantineRoot」以下に「/System」や「/private」、「/usr」などといった領域がディレクトリ構造を保ったまま移動されていることがわかる。

$ ls -lR /Library/SystemMigration/History/Migration-[一意のID]/QuarantineRoot/

この領域を探せば、El Capitanにアップグレードしたときに行方不明となった書類を発見できるかもしれない。前述したICカードリーダのドライバも、ここにしっかり移動されていたことを報告しておこう。

El Capitanアップグレードのとき行方不明になったドライバは、/Library/SystemMigration/History以下に移動されていた