ファイルとディレクトリ権限
対象ファイルに加え、親ディレクトリ、ACL、マウントオプション、ファイルの capability、SUID/SGID を確認する。root 権限の処理がそのパスを読む場合は、root が読む書き込み可能パスで詳しく調べる。
確認コマンド
Section titled “確認コマンド”追加確認例:
namei -l <path>stat <path>ls -la <path>findmntgetfacl <path>getcap <file>getcap -r / 2>/dev/nullfind / -perm -4000 -type f 2>/dev/nullfind / -perm -2000 -type f 2>/dev/null- 目的: owner、group、mode、ACL、symlink、mount option、capabilities、SUID/SGID を確認する。
- 前提条件: 全ファイルシステム探索は重い。まず
/opt,/srv,/var/www,/home/<user>,/etc/systemd/system,/usr/local/bin、アプリディレクトリに絞る。 - 何を確認しているか: 親ディレクトリの書き込み可否、
nosuid,noexec,nodev、bind mount、root プロセスが読む user-writable path。 - 期待される出力:
drwxrwxr-x root <group> ... <app>/plugins、/tmpにnosuidがない、共有パスが bind mount になっている。 - 出力の解釈: ファイル本体が root 所有でも、親ディレクトリを書けるなら置換、symlink、race の余地がある。
nosuidなら、そのマウント上の SUID shell は効かない。 - 失敗した場合の切り分け: ACL、supplementary group、container 側の UID/GID、mount namespace、symlink の解決先を確認する。
- 代替コマンド:
find <DIR> -maxdepth 4 -writable -ls,find <DIR> -xtype l -ls,readlink -f <path>。 - 状態変更: 読み取り専用。
find /は負荷と大量の Permission denied を生む。対象を絞る。
優先度の高い範囲:
find /opt /srv /var/www /usr/local -maxdepth 5 -type d -writable -ls 2>/dev/nullfind /opt /srv /var/www /usr/local -maxdepth 5 -type f -writable -ls 2>/dev/nullfind /home -maxdepth 4 -type f \( -name '*.conf' -o -name '*.env' \) 2>/dev/null共有マウントはコンテナの境界にも関わる。コンテナと名前空間の findmnt と合わせて確認する。
- root が読む path に symlink、writable な親、race、archive 展開が絡むと権限境界になる。
- SUID binary は
nosuidのマウントでは効かない。bashは-pがないと、実行時に権限を落とす。 getcapの結果は、コンテナと名前空間で確認するプロセスのCapEffと分けて記録する。ファイルの capability とプロセスの実効 capability は別物である。
権限の差が境界になる形は次のとおり。
- root で動くスクリプトが
site.addsitedir()する plugin directory が group writable だと、そのグループが import 経路を書ける。 - log ディレクトリへの symlink は1段で終わらない。高権限の閲覧処理が、2段目の先を root で読むことがある。
- container と host の共有 mount では、container 側の
chmodが host 側ユーザーの書き込み可否を変える。 - Web の実行ユーザーがテーマや公開ディレクトリを書ける場合、そこへの書き込みはそのユーザーでのコード実行になる。
- root の開発用 HTTP サーバの document root に、処理結果がスクリプトとして保存されると、そのプロセスの権限で実行される。
高権限プロセスがこれらのパスを読む流れは独自コードの信頼境界に図で残してある。

