Closed7

ターミナルで"zsh compinit: insecure directories, run compaudit for list."が表示された際の対応について

ふじしろふじしろ

SDKMANをインストールして再起動した際に、ターミナルに下記の内容が表示された。

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

ざっくり意訳すると

zsh compinitより
安全じゃないディレクトリがあるから、coupauditを実行するよ。
無視するなら"y"、中断するなら"n"を押してね。

という感じだろうか。

ふじしろふじしろ

compauditを実行してみると他の方と同じ回答。

% compaudit
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh
ふじしろふじしろ

zsh completion - zsh compinit: insecure directories - Stack Overflowより原因に関して言及した記述があったので抜粋して引用

Most answers come with a solution, but do not mention why this warning occurs. Here's an excerpt from ZSH's compinit:

For security reasons compinit also checks if the completion system would use files not owned by root or by the current user, or files in directories that are world- or group-writable or that are not owned by root or by the current user. If such files or directories are found, compinit will ask if the completion system should really be used. To avoid these tests and make all files found be used without asking, use the option -u, and to make compinit silently ignore all insecure files and directories use the option -i. This security check is skipped entirely when the -C option is given.

上記をDeepL翻訳

ほとんどの回答には解決策がありますが、この警告が発生する理由については触れていません。これがZSHのcompinitからの抜粋です:

セキュリティ上の理由から、compinitは、補完システムがrootまたは現在のユーザーによって所有されていないファイル、または誰でも書き込み可能またはグループ書き込み可能であるか、rootまたは現在のユーザーによって所有されていないディレクトリ内のファイルを使用するかどうかもチェックします。
そのようなファイルまたはディレクトリが見つかった場合、compinitは補完システムを実際に使用する必要があるかどうかを尋ねます。
これらのテストを回避し、確認されたすべてのファイルを確認せずに使用できるようにするには、オプション-uを使用し、compinitに安全でないすべてのファイルとディレクトリをサイレントに無視させるには、オプション-iを使用します。
-Cオプションを指定すると、このセキュリティチェックは完全にスキップされます。

ふじしろふじしろ

ざっくり現状整理。

  • zshのcompinitは、安全ではないディレクトリやファイルをチェックしてくれる。
  • 安全ではないディレクトリやファイルとは、以下のようなもの。
    • ルートユーザーにもログイン中のユーザーにも所有されていないファイル
    • 誰でも書き込み可能なディレクトリ内のファイル
    • グループ書き込み可能なディレクトリ内のファイル
    • ルートユーザーにもログイン中のユーザーにも所有されていないディレクトリ
  • そして今回は下記の2ディレクトリが該当した
    • /usr/local/share/zsh/site-functions
    • /usr/local/share/zsh

なので、これらのディレクトリに適切なアクセス権を付与すれば解決する。

ふじしろふじしろ

試しに/usr/local/share/zshのアクセス権を確認してみる。
確かに所有グループからの書き込みが可能になっている。
zshのcompinitはこの状況に反応していた模様。

% ls -la | grep zsh
drwxrwxr-x   3 user   admin    96 Jun  5  2021 zsh
ふじしろふじしろ

アクセス権を変更

% chmod 755 /usr/local/share/zsh
% chmod 755 /usr/local/share/zsh/site-functions

アクセス権の変更を確認(zshの例)

% ls -la | grep zsh
drwxr-xr-x   3 user   admin    96 Jun  5  2021 zsh

compauditの表示が消えることを確認

% compaudit
# 何も表示されない

ターミナル再起動後、当初のメッセージが表示されないことを確認。

このスクラップは2022/06/16にクローズされました