コンテンツにスキップ

root が読む書き込み可能パス

root 権限のサービス、sudo で実行するスクリプト、timer が、低権限ユーザーの書けるパスを読む場合、そのパスが権限境界になる。探索コマンドはファイルとディレクトリ権限にまとめた。timer から呼び出される場合は定期実行の設定と照合する。

ターミナルウィンドウ
find <APP_DIR> -maxdepth 5 -writable -ls 2>/dev/null
namei -l <APP_DIR>/<FILE>
stat <APP_DIR>/<FILE>
  • root 権限のサービス、sudo で実行するスクリプト、timer が、低権限ユーザーの書けるディレクトリ内のファイルを読む。
  • symlink、.pth、plugin、checkpoint、archive、log、一時ファイルが入力として使える。
ターミナルウィンドウ
grep -RniE 'open|read|glob|plugins|checkpoint|load|source|include|cat|cp|mv|chmod|chown' <APP_DIR>
findmnt -no TARGET,OPTIONS <MOUNTPOINT>
  • 目的: ファイルがいつ、誰の権限で、どの API に渡るかを確認する。
  • 前提条件: 書き込み検証は状態変更である。先に stat、namei、コードを読む。
  • 出力の解釈: glob("*.pt") と torch.load、site.addsitedir() と group-writable directory、symlink 検査のあとに行う cat は、それぞれ信頼境界になる。
  • 失敗した場合の切り分け: 実行前に別処理で止まる、mtime の順が違う、mount の nosuid や noexec、ACL、container と host の path 差。
  • 代替: inotifywait があれば観察する。なければ timestamp と log を見る。
  • 状態変更: ファイルへの書き込み、シンボリックリンクの作成、chmod は変更内容として記録し、後片付けする。

ファイルを置くだけでは境界にならない。高権限処理がそれを読むことと、読む API が何をするかまでをつなぐ。

  • group writable な plugin directory の .pth を、root の site.addsitedir() が起動時に処理する。
  • log 用ディレクトリの symlink は複数段になる。閲覧処理が検査するのは1段目だけのことがある。
  • 共有 mount 上の checkpoint を、root の学習ジョブが読む。container 内の chmod が、host 側の書き込み可否を変える。
  • root 権限の HTTP サーバがスクリプトを実行する公開ディレクトリに、変換結果がスクリプトとして保存される。

読む API までの線は独自コードの信頼境界に図がある。