ENABLE_USER_SCRIPT_SANDBOXINGとは何なのか?
前提となる環境
- Xcode15.0.1 (15A507)
- SwiftLint v0.54.0
はじめに
Xcode14から、Build Settings
の中にENABLE_USER_SCRIPT_SANDBOXING
という項目ができました。
(Xcode上ではUser Script Sandboxing
が該当します)
この項目のデフォルト値が、Xcode15になった際、NO
からYES
へ変更されました。その影響で、ビルド時にSwiftLintなどのスクリプトを実行する際、以下のようなエラーが発生した方も多いのではないでしょうか。
Sandbox: swiftlint(99054) deny(1) file-read-data
現時点(2023/11/22)でSwiftLintが推奨する対応は、ENABLE_USER_SCRIPT_SANDBOXING = No
にすることです。この値を変更することによって具体的に何が起きるのでしょうか。
ENABLE_USER_SCRIPT_SANDBOXINGとは何なのか
1つずつ単語の意味を追ってみると、以下のようになります。
- ユーザースクリプト
- (Build Settingsの文脈においては)ビルド時の動作をカスタマイズするスクリプトのこと
- SandBoxing(サンドボックス化)
- システムの他の部分から隔離された仮想領域内で、制限されたリソースへのアクセスのみ許可して動作させる状態のこと
よって以下のように述べることができるのではないでしょうか。
ビルド時の動作をカスタマイズするスクリプトを実行する際に、許可されたリソースに対してのみアクセスできるようにするオプション
と言えるでしょう。
ちなみに、どのリソースにアクセスするかはBuild PhasesのInput files, Output filesで指定できます。
ENABLE_USER_SCRIPT_SANDBOXINGを有効にするメリット
ユーザースクリプトがシステム全体に影響を及ぼすのを防ぐことができるというメリットが考えられます。
例えば、もし悪さをするスクリプトが混ざっていたとしても、アクセス範囲を絞ることによって被害を抑えることができます。
今後のプロジェクト開発でどのように設定するべきか
現時点(2023/11/22)では、Swiftによる開発で必須のSwiftLintによってENABLE_USER_SCRIPT_SANDBOXING = YES
にできないです。そのため、しばらくはNO
にせざるを得ないです。
今後のSwiftLintを含む他のライブラリの対応やXcodeの変更によって、設定方法も変わってくるので、引き続き動向をウォッチしていきます。
Discussion
とありますが、Input files / Output files を設定して動かすことはできないのでしょうか?🤔
Input files
をプロジェクト直下の全てのファイルを指定すればできそうですが、以下の理由からやめた方が良さそうです。ENABLE_USER_SCRIPT_SANDBOXING = YES
にすることでアクセスする範囲を絞れる」というメリットが得られないENABLE_USER_SCRIPT_SANDBOXING = NO
とする対応を推奨しているちなみに
ENABLE_USER_SCRIPT_SANDBOXING = YES
として、Input files
を設定せずにSwiftLintを動作させると以下のエラーが発生します。コードをパッとみた程度なのですが、このメソッドでLintするファイルを指定しているようです。引数のpathで親パスを指定してFileManagerでアクセスするのですが、この際プロジェクト直下の全てのリソースに対してアクセスしてしまうのではないかと思います。