📃

ENABLE_USER_SCRIPT_SANDBOXINGとは何なのか?

2023/11/22に公開3

前提となる環境

  • 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の変更によって、設定方法も変わってくるので、引き続き動向をウォッチしていきます。

GitHubで編集を提案

Discussion

UhucreamUhucream

現時点(2023/11/22)では、Swiftによる開発で必須のSwiftLintによってENABLE_USER_SCRIPT_SANDBOXING = YESにできないです。そのため、しばらくはNOにせざるを得ないです。

とありますが、Input files / Output files を設定して動かすことはできないのでしょうか?🤔

MasaMasa

Input files / Output files を設定して動かすことはできないのでしょうか?🤔

Input filesをプロジェクト直下の全てのファイルを指定すればできそうですが、以下の理由からやめた方が良さそうです。

  1. ファイルを追加/削除をする度にInput filesに変更を加えないといけないので管理コストが高い
  2. ENABLE_USER_SCRIPT_SANDBOXING = YESにすることでアクセスする範囲を絞れる」というメリットが得られない
  3. SwiftLint公式がENABLE_USER_SCRIPT_SANDBOXING = NOとする対応を推奨している

ちなみにENABLE_USER_SCRIPT_SANDBOXING = YESとして、Input filesを設定せずにSwiftLintを動作させると以下のエラーが発生します。

Showing All Issues
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/.swiftlint.yml
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/HogeProjectUITests
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/HogeProject.xcodeproj
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/HogeProjectTests
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/.git
Sandbox: swiftlint(57562) deny(1) file-read-data /HogeProject/HogeProject/

↑ プロジェクト直下全てのリソースに対してreadできないというエラーです。
MasaMasa

コードをパッとみた程度なのですが、このメソッドでLintするファイルを指定しているようです。引数のpathで親パスを指定してFileManagerでアクセスするのですが、この際プロジェクト直下の全てのリソースに対してアクセスしてしまうのではないかと思います。