config.phpの改竄

config.phpの改竄のチェック

- Tatsuya Shirai の投稿
返信数: 0

 少し考え方を変えました.

 インストール時に「キケン,キケン」と表示されても不安感が増しますし,「まぁイイや」と軽く流してそのまま忘れて放置されるのも良くないですよね.

 fs_moodleでは[サイト管理]-[サーバ]に自前で一つ項目を追加(”fs_moodleの設定表示")してあります.色々なチェックを行なうためのページです.ここでのチェックにセキュリティの項目を追加しようと思います.

 とりあえずconfig.phpの安全性だけを考えるとします.

 is_writable()で調べてもあまり意味は無いですよね.今は書き込み不可でもchmod()で書き込み可に変更されたら同じですので.(ちなみに,Windows版PHP5.2.0では,rename()はパーミッションでNGなのに,is_writable()はtrueとなる.ちょっと実装が怪しい?)

 では,fileperms()で調べるのが良いのかな?と思ったのですが,PHPの参考書やWebのマニュアルの説明は使い方を簡単に書いてあるだけであまり詳しく分かりません.(ちなみに,Windows版PHPではパーミッション関係の関数は未実装...)

 戦略は以下の通り:

  1. まず現在はApache(PHP)によってconfig.phpがis_writable()ではないとする.
  2. fileperms()で現在のパーミッションを保存する.
  3. chmod()でパーミッションを書き込み可に変更する.
  4. chmod()でパーミッションを元に戻す.

 3でパーミッションの変更に失敗すればOK.もし変更できてしまったらNG.

 4で元に戻す(書き込み可の設定かも知れない)のは,あくまでセキュリティのチェックが目的であって,余計なお節介は迷惑だから,です.


 分からないのはfileperms()の戻り値とchmod()の引数の関係です.
 fileperms()で取得するパーミッションはintであり,8進表現ではないこと.サンプルでは int(33188)が得られたとして,printf("%o", fileperms())で"100644"(下三桁がrw-r--r--).では100644の頭の100は?
 このint(33188)をchmod()の引数に与えて4の”パーミッションを元に戻す”になるのかどうか? chmod('config.php', '0644'); としないとダメ?(頭の0で8進表現を指示).あるいはchmod('config.php', 33188);で元に戻るのか?

 LinuxのPCを久しぶりに起動して確認して見ようとは思いますが,上記考えに何か間違いが無いか教えていただけると助かります.