脆弱性の解説
プロセスの権限を落として処理すべきなのに、一か所だけそれをやっていないところはどこだか分かりましたか?
答えは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攻撃につながる危険がある)
この記事は参考になりましたか?
- 実例で学ぶ脆弱性対策コーディング連載記事一覧
-
- WindowsのDLLだけが危ないのか? DLL hijacking vulnerabil...
- WindowsのDLLだけが危ないのか? DLL hijacking vulnerabil...
- Linuxのcrontabコマンドの脆弱性をつぶす
- この記事の著者
-
戸田 洋三(JPCERT コーディネーションセンター)(トダ ヨウゾウ(JPCERT コーディネーションセンター))
リードアナリストJPCERTコーディネーションセンター東京工業大学情報理工学研究科修士課程修了。学生時代は、型理論および証明からのプログラム抽出を研究。その後、千葉大学総合情報処理センターのスタッフとして、学内ネットワークの運営、地域ネットワーク、IPマルチキャストの実験ネットワークであるJP-MB...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
