脆弱性の解説
プロセスの権限を落として処理すべきなのに、一か所だけそれをやっていないところはどこだか分かりましたか?
答えはutime()関数を使って一時ファイルのタイムスタンプを0にセットするところです。もう一度コードを追ってみましょう。
- swap_uids()で一般ユーザ権限に落とす
- mkstemp()で一時ファイルを生成
- swap_uids_back()でroot権限に戻る
- fdopen()で一時ファイルのFILEポインタを取得
- FILEポインタを通じて一時ファイルに既存ファイルの内容をコピー
- 元のcrontab(5)ファイルをfclose()
- 一時ファイルのタイムスタンプを0(epoch time)にセット(utime())
一時ファイルにcrontab(5)ファイルの内容をコピーしている間に、一時ファイルを削除し、同じ名前でどこか他のファイルへのシンボリックリンクを作ることができるとどうなるでしょうか。
ファイルシステムでそのような操作が行なわれたとしても、プログラム上はとくにチェックをしていないので、そのままutime()関数によるタイムスタンプの変更を行なってしまいます。しかも、このときのプロセスの権限はrootに戻っていますから、どんなファイルのタイムスタンプも操作できるのです。これにより、Cronで設定されているジョブを実行させないようにしたり、ログのローテーション処理に影響を与えたりできる可能性があります。
このように、シンボリックリンクを使うことで、意図していないファイルを操作させるような攻撃手法をsymlink攻撃と呼びます。今回のCronの場合は、タイムスタンプの操作を悪用されるので、ファイルのタイムスタンプに依存した処理をする部分への攻撃に悪用される危険があります。
今回の問題にはCVE-2010-0424という番号が振られており、以下のように説明されています。
The edit_cmd function in crontab.c in (1) cronie before 1.4.4 and (2) Vixie cron (vixie-cron) allows local users to change the modification times of arbitrary files, and consequently cause a denial of service, via a symlink attack on a temporary file in the /tmp directory.
(cronieの1.4.4より前のバージョンおよびVixie cron(vixie-cron)のcrontab.cで定義されているedit_cmd関数には、ローカルユーザが任意のファイルの変更時刻をいじることが可能になる問題がある。これは、/tmpディレクトリのファイルへのsymlink攻撃を通じてDoS攻撃につながる危険がある)
