suexec 関係

引数

常に 3 個取る。

動作

スクリプトファイルのディレクトリに chdir された状態で実行が開始される。

  1. 許可済みの環境変数のみが含まれた”クリーンな”環境を生成
  2. 自分の uid を取得し、/etc/passwd の中に存在するかチェック
  3. さらに、自分の uname が AP_HTTPD_USER かどうかチェック
  4. 第一引数が -V かどうかチェックし、もしそうならコンパイル情報を表示して終了
    • その際、uid が 0 (root) か apache の実行ユーザーかチェックし、そうでないなら表示しない
  5. 引数が 3 つ未満なら異常終了
  6. スクリプトファイル名をチェック。以下のようになっていたら異常終了
    • / で始まっている (絶対パスの指定はダメ)
    • ../ で始まっている (上位ディレクトリに行こうとしてるのはダメ)
    • /../ を含んでいる (ダメ)
  7. uid の先頭に ~ が付いているかチェックし、付いていたら内部の userdir 使用フラグを立てて ~ を削除
  8. SUEXEC_DOCROOT と SUEXEC_USERDIR_SUFFIX を取得してチェック
    • SUEXEC_USERDIR_SUFFIX は全てアルファベットか数字で構成されている必要あり、’.’ で始まらない必要あり
    • SUEXEC_DOCROOT は ‘/’ で始まっていないとダメ (絶対パスのみ許可)、一文字で終わっていたり ‘/’ や ‘.’ が二文字目にあったらダメ
  9. 指定された実行用 uid と gid が存在するかチェック
  10. ログに uid, gid, スクリプト名を記録
  11. 指定された uid/gid が最小値以上になっているかチェック
  12. gid -> uid の順にプロセスが持つ現在の id から指定された id へ変更
  13. カレントディレクトリのパスを取得し、正当性をチェック (SUEXEC_DOCROOT の中にあるか等)
    • 具体的な方法は後でもっとよく見る
  14. カレントディレクトリは本当にディレクトリか?(違ったら異常終了)
  15. カレントディレクトリは others または group から書き込み可能でないか?
    • group を許可するオプション付けてくれてもいいよね…
  16. 実行しようとしているスクリプト本体にアクセスできるか?
  17. スクリプト本体は others または group から書き込み可能でないか?
    • group をどうにかするオプションを…
  18. スクリプト本体は setuid または setgid されていないか?
  19. 指定された uid/gid が
    • スクリプト本体の uid/gid と同じか?
    • カレントディレクトリの uid/gid と同じか?
  20. スクリプト本体に所有者の実行権限が付いているか?
  21. AP_SUEXEC_UMASK で指定された umask をセット
    • others および group に対して書き込み権限がセットされないかチェック
  22. ログファイルをクローズ
    • exec() が成功した時にのみ閉じるようなフラグをセットすることで実現
  23. スクリプト本体を実行
    • execve() でプロセス自体をスクリプト本体に移行させるので、この時点で suexec のプロセスは終わる
  24. 実行に失敗したらエラーを吐いて終了

program/suexec (最終更新日時 2014-06-22 11:51:43 更新者 dossist)