ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【シェル】「zsh compinit: insecure directories」について

zsh(Zシェル)を起動した際に「zsh compinit: insecure directories」という警告メッセージが出るようになりました。
その解決方法についてここにメモを残します。

現象

zsh(Zシェル)のコンソールを立ち上げると「zsh compinit: insecure directories」という警告メッセージが出るようになりました。

警告メッセージ

You have mail.
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]? ncompinit: initialization aborted

警告メッセージ(日本語訳)

zsh compinit: 安全でないディレクトリがあります。一覧については compaudit を実行してください。安全でないディレクトリを無視して続行しますか [y]、それとも compinit を中止しますか [n]?

警告メッセージの内容

この警告は、zshの補完システム(compinit)がロードしようとしているディレクトリの中に、セキュリティ上安全でない(insecure)と見なされるディレクトリが含まれていることを示しています。

compinit コマンドとは?

compaudit コマンドは、シェル(特に Zsh)の補完システムで 不正な権限を持つファイルやディレクトリをリストアップ するために使用されます。これは、Zsh の初期化エラーメッセージ zsh: secure a shell completion's directory for insecure files と関連しており、このコマンドを実行してセキュリティ上の問題を特定し、修正するためのヒントを提供します。

原因の特定

指示通りに compaudit コマンドを実行すると、以下のように安全でないと判断されたディレクトリのリストが表示されます。

There are insecure directories:
/usr/local/share/zsh/site-functions

解決方法について

今回は、compaudit が指摘したディレクトリのパーミッションと所有者を修正し、セキュリティ要件を満たすような対応をとりました。
zshは、これらのディレクトリにグループや他のユーザーからの書き込み権限(group/other write permissions)があると、悪意のあるユーザーが補完ファイルを改ざんし、その結果、コマンド実行時にセキュリティ上のリスクが生じる可能性があると判断し、警告を出します。
オーソドックスな解決策は、compaudit が指摘したディレクトリのパーミッション(権限)と所有者(オーナー)を修正し、セキュリティ要件を満たすようにすることです。

ディレクトリのパーミッションを変更する

対象ディレクトリに対して、グループやその他のユーザーからの書き込み権限を削除し、適切なパーミッションを設定します。

sudo chmod -R 755 /usr/local/share/zsh/site-functions

ディレクトリの所有者を変更する(macOSなど)

特に macOS で Homebrew などを使って Zsh をインストールした場合、ディレクトリの所有者が不適切になっていることがあります。所有者を root:staff、または現在のユーザーと staff グループに変更します。

一般的な解決策:
sudo chown -R root:staff /usr/local/share/zsh
現在のユーザーを所有者にする解決策:
sudo chown -R ${USER}:staff /usr/local/share/zsh
compaudit の結果を使ってまとめて修正

compaudit の結果を chmod や chown にパイプ(渡す)して、影響のあるすべてのファイルを自動的に修正する方法もあります。

compaudit | xargs chmod go-w

警告を無効にする(推奨されないが簡単な方法)

根本的な解決ではありませんが、compinit のセキュリティチェックを無効にして、警告をスキップすることもできます。

.zshrc ファイルに以下を追加:
ZSH_DISABLE_COMPFIX=true
# または compinit の呼び出し時に -u オプションを使用する
# compinit -u