NTTデータCCS で部門横断での技術支援を担当している riue です。今回はたまたま遭遇したトラブルにまつわる小ネタになります。同じような事態に遭遇した人の助けになることを祈って。
そもそも何が起こったか
前回の記事で、Windows 上で CRG の動作検証をしていたときの話です。uv 経由で Python スクリプトを起動するようなフックを定義していたのですが、なぜかフックが毎回エラーを出していました。
おかしいなと思って Codex の $ で uv --help を直接実行してみると
2 | uv --help
| ~~~~~~~~~
| プログラム 'uv.exe' を実行できませんでした: An error occurred trying to start process 'C:\Users\riue\AppData\Local\Microsoft\WinGet\Packages\astral-sh.uv_Microsoft.Winget.Source_8wekyb3d8bbwe\uv.exe' with working directory 'C:\Users\riue\playfield. アクセスが拒否されました。位置 行:2 文字:1
というようなエラー。どうも Codex からの uv の実行が拒否されているようです。一方で、その uv でインストールして ~/.local/bin に入っている crg そのものはフックからも起動できます。
uv は WinGet でインストールしたもの。何か WinGet が悪さをしているのか? とりあえず ACL (アクセス制御リスト: Windows でオブジェクトのアクセス権限を管理する仕組み) でも見てみるか、と思い、cacls を実行してみました。
なぜ icacls じゃないのかと言われると、単純に大昔からの慣れです。
uv は
ドメイン名\riue:(ID)F
BUILTIN\Administrators:(ID)F
NT AUTHORITY\SYSTEM:(ID)F
に対して crg は
ホスト名\CodexSandboxUsers:(ID)R
NT AUTHORITY\SYSTEM:(ID)F
BUILTIN\Administrators:(ID)F
ドメイン名\riue:(ID)F
ん? 何だこの CodexSandboxUsers っていうグループは???
CodexSandboxUsers とは
CodexSandboxUsers は Windows の Codex がサンドボックス制御を行うために追加するローカルグループで、同じく Codex が作成する CodexSandboxOffline / CodexSandboxOnline というユーザが所属しています。Codex は必要なファイルに対して CodexSandboxUsers の ACE (アクセス制御エントリ: ACL 内の個別のアクセス権限定義) を追加することで、サンドボックス内からのファイルシステムに対するアクセスを制御しています。
そして少なくとも私の環境では、ホームディレクトリ直下の個々のフォルダに CodexSandboxUsers への読み取り / 実行の継承可能 ACE (エクスプローラのセキュリティ詳細設定で見ると「このフォルダー、サブフォルダーおよびファイル」として示されるもの) が個別に設定されていました。これにより、その配下のファイルやフォルダにも CodexSandboxUsers のアクセス権が継承され、サンドボックス内からアクセスできるようになります。
実際、WinGet で uv がインストールされるホームディレクトリ直下の AppData にも、CodexSandboxUsers への継承可能 ACE が付与されていました。ところが肝心の uv では何故か CodexSandboxUsers の ACE だけが存在しない状況になっており、Codex から uv の実行が拒否されていたというわけです。
解決方法
ということで、uv 直上のフォルダのプロパティ > [セキュリティ] タブ > [詳細設定] から辿れるセキュリティ詳細設定画面を開き、「子オブジェクトのアクセス許可エントリ全てを、このオブジェクトからの継承可能なアクセス許可エントリで置き換える」をチェックして [適用] したところ、uv にも CodexSandboxUsers への ACE が設定され、無事に Codex からも uv が実行できるようになりました。
今回は uv 関係の 3 つの実行可能形式しか存在しないフォルダに対する設定であること、本来であれば親から権限が継承されるべきファイル群であることからこの対応をしていますが、一般的に無条件にフォルダに対して継承することは意図的に ACL が設定されたファイルの権限定義を破壊してしまう行為であることに注意してください。
uv の ACL が上記のようにおかしくなってしまった原因は不明ですが、もし再現したらこの記事に追記しようと思います。