新・OS X ハッキング! (152) El Capitanの「SIP」をもっと知る
この変化に気付いていない読者のために、SIPがもたらす影響を具体的に説明しよう。まず、手作業でドライバなど拡張書類(KEXT)を追加/削除できなくなった。たとえば、あるICカードリーダを利用するには、ドライバを手動で/usr/libexec以下に手動コピーしなければならないが、そのような処理はSIPにより却下される。SIPはデフォルトで有効なため、これを無効化しないかぎりユーザによるシステム領域の変更は認められない。
SIPの無効化は第142回で書いたとおり、リカバリーモードでTerminalを起動し「csrutil」コマンドを実行(csrutil disable)を実行すれば可能だが、そうすると今度はOS Xのセキュリティが低下する。
root権限がありさえすればファイルシステムを書き換えできることは長らく見過ごされてきたリスクであり、Appleの意図どおりここを制限すれば確実な効果が期待できる。確かに自由度は低下するものの、メリットとデメリットを比較すると受け入れる理由もうなずける新機構といえるだろう。
ところで、ディレクトリがSIPによる制限対象かどうかは、lsコマンドの「O」オプションで確認できる。グループ名の右横に「restricted」とあるディレクトリはSIPの対象であり、rootであっても書き込みできない。おかしいな、という場合にはこの方法で調べてみよう。
○設定情報は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」の値との関係がわかるはずだ。
○アップデート前のファイルの行方
El Capitanにアップグレードしたあと、SIPにより書き込み制限を受けた領域にあったはずのファイルがなくなった、という経験はないだろうか? それもそのはず、それらファイルはアップグレード時に/Library/SystemMigration/History以下へと強制移動されるからだ。
移動先のディレクトリ名には「Migration-」に続き一意のIDが使用され、lsコマンドなどで内容を見ると「QuarantineRoot」以下に「/System」や「/private」、「/usr」などといった領域がディレクトリ構造を保ったまま移動されていることがわかる。
$ ls -lR /Library/SystemMigration/History/Migration-[一意のID]/QuarantineRoot/
この領域を探せば、El Capitanにアップグレードしたときに行方不明となった書類を発見できるかもしれない。
前述したICカードリーダのドライバも、ここにしっかり移動されていたことを報告しておこう。