ステップ1でおこなったSIPの無効化について
El CapitanからSystem Integrity Protection (SIP)という機能が追加されています(“rootless” modeとも呼ばれるようです ). システムファイルをを書き換えるマルウェアからの攻撃に対する頑健性を向上させるために, システムファイルの書き換えをできなくしてしまう機能です. なのでEl Capitanにおいてシステムファイルはsudoでも書き換えられません. 今回はシステムファイルを書き換える必要がありますのでステップ1でこれを無効にしています.
上記の通り、El Capitan以降はセキュリティ強化がされており、デフォルトの状態では
sudo コマンドを用いてもできないといった状態になっている。このままでは自家製ドライバを使ったり、既存のドライバを改変して別のデバイスに流用したりができない。 これを解決する方法をまとめる。
参考:
csrutil コマンドでSIPのレベルを下げるステップ1:SIPを無効にする
Command-Rを押しながらMacを再起動- Utilities から Terminal を起動し以下のコマンドを実行
csrutil disable- ”SIP”を無効にしましたみたいなメッセージが表示されます
- 再起動
ひとまずEl Captian以前のセキュリティ状態にするには
リカバリモードで立ち上げて、ターミナルからcsrutil disable でよいらしいが、
もう少し段階的に下げることができないものか、
というかcsrutilってどんなことをしているのかということを調べたら以下のページがヒットした。
きっかけ
先日El CapitanにアップデートしたところXtraFinderが動かなくなり、 最終的に、リカバリーモードで
csrutil enable --without debugとして一部のSIPの機能を解除することで解決しました。
盲目的にセキュリティを甘くしてしまいましたが、このままだと気持ち悪いのでいろいろと調べてみました。
このページにcsrutilがどんなことをしているのか詳細が書かれていたので引き続き引用する。
ここで、Appleが公開しているソースコードによると
/* Rootless configuration flags */ #define CSR_ALLOW_UNTRUSTED_KEXTS (1 << 0) #define CSR_ALLOW_UNRESTRICTED_FS (1 << 1) #define CSR_ALLOW_TASK_FOR_PID (1 << 2) #define CSR_ALLOW_KERNEL_DEBUGGER (1 << 3) #define CSR_ALLOW_APPLE_INTERNAL (1 << 4) #define CSR_ALLOW_UNRESTRICTED_DTRACE (1 << 5) #define CSR_ALLOW_UNRESTRICTED_NVRAM (1 << 6) #define CSR_ALLOW_DEVICE_CONFIGURATION (1 << 7)とそれっぽい定義があり、ここに先ほどの値が当てはめられるようです。
ちなみに、先ほどの0x14を2進数に直すと
000010100となりCSR_ALLOW_TASK_FOR_PIDとCSR_ALLOW_APPLE_INTERNALの部分が1になっていることがわかります。また、
csrutilで設定できる内容とビット列の関係は以下の表となります。
コマンド DEVICE NVRAM DTRACE INTERNAL KERNEL PID FS KEXT 16進数値 enable –no-internal 0 0 0 0 0 0 0 0 0x00 enable 0 0 0 1 0 0 0 0 0x10 enable –without kext 0 0 0 1 0 0 0 1 0x11 enable –without fs 0 0 0 1 0 0 1 0 0x12 enable –without debug 0 0 0 1 0 1 0 0 0x14 enable –without dtrace 0 0 1 1 0 0 0 0 0x30 enable –without nvram 0 1 0 1 0 0 0 0 0x50 disable 0 1 1 1 0 1 1 1 0x77 それぞれのフラグの意味
ここからは少し予測が入りますが、それぞれのフラグが意味する内容を整理してみます。
CSR_ALLOW_UNTRUSTED_KEXTS未署名のkextの読み込み制限を解除するフラグです。
kextはKernel Extentionの略でデフォルトのカーネルを拡張する為のモジュールです。 例えば、ドライバがこれに該当します。
10.10以降からkextには署名が必須となっているようです。
CSR_ALLOW_UNRESTRICTED_FSファイルシステムに対する制限を解除するためのフラグです。 これは有名ですね。
この制限により特定のフォルダではファイルの作成、更新はroot権限でも不可能になっています。
また、保護される場所、例外の場所はそれぞれ
/System/Library/Sandbox/rootless.conf
/System/Library/Sandbox/Compatibility.bundle/Contents/Resources/pathsで確認することができます。
CSR_ALLOW_TASK_FOR_PID
task_for_pid()が利用できるようになるフラグです。これは何のための関数かというと
an inspector process now depends on the security framework to authorize use of the task_for_pid system service which gives a process the capability to control another process.
とあるので、どうやら別のプロセスを操作するときに利用する関数みたいです。
CSR_ALLOW_KERNEL_DEBUGGERおそらく、カーネルコードの変更制限を解除するためのフラグです。 これは、
csrutilでは設定できない項目です。 カーネルをデバッグする機会はそうそうないと思うので問題ないでしょう。
CSR_ALLOW_APPLE_INTERNAL以下のコードを見る限り、SIPが有効なら基本的に1となるフラグらしいです。
* rootless=0 * no effect * rootless=1 * csr_allow_internal = 0ここが0の場合、他のフラグが0でも意味が無いのだと思われます。
CSR_ALLOW_UNRESTRICTED_DTRACEdtraceの実行制限を解除するためのフラグです。
dtraceはプロセスの動作を追跡、監視するためのコマンドです。 実際に実行してみたところ、一部の追跡コマンドは権限がないとしてはじかれました。
CSR_ALLOW_UNRESTRICTED_NVRAMnvramの実行制限を解除するためのフラグです。 nvramコマンドを通じて内容を変更できるようになります。
ここが変更できるということはcsr-active-configを変更できるということになるので、SIPの意味がほとんどなくなってしまいます。 基本的に無効にしない方がいいフラグでしょう。
CSR_ALLOW_DEVICE_CONFIGURATION調べてみましたが、何に使われているのかはよくわかりませんでした。 これは、
csrutilでは設定できない項目です。
ということなので、デバイスドライバ系の改造には以下のコマンドが適切なようだ。
csrutil enable --without kext --without fs
これをリカバリモードで実行するとこのようになる
# csrutil enable --without kext --without fs
csrutil: requesting an unsupported configuration. This is likely to break in the future and leave your machine in an unknown state.
csrutil: requesting an unsupported configuration. This is likely to break in the future and leave your machine in an unknown state.
Successfully enabled System Integrity Protection. Please restart the machine for the changes to take effect.
この状態で再起動をして、csrutil statusを用いてSIPの状態を確認する。
$ csrutil status
System Integrity Protection status: enabled (Custom Configuration).
Configuration:
Apple Internal: disabled
Kext Signing: disabled
Filesystem Protections: disabled
Debugging Restrictions: enabled
DTrace Restrictions: enabled
NVRAM Protections: enabled
BaseSystem Verification: enabled
This is an unsupported configuration, likely to break in the future and leave your machine in an unknown state.
Kext Signing 及び Filesystem Protections が disable になっている。ひとまずの目的は達成したみたいだ。