#format text_markdown TOCTOU ====== Time Of Check to Time Of Use 問題。ファイルのレースコンディションを利用して不正なファイルを開かせる。 例として apache 2.4 におけるシンボリックリンク攻撃がある。 レースコンディション -------------------- ファイル操作等を行う時、以前に取得した状態が、実際に操作を行うまでの間に他のプロセスやスレッド等によって書き換えられていて、想定外の操作をしてしまう問題。 シンボリックリンク攻撃 ---------------------- シンボリックリンクを無条件に許可していると可能になる攻撃。 他ユーザーのファイル等自分がアクセス権限を持たないファイルへのシンボリックリンクを作成し、それを apache に読ませることで (apache が対象ファイルの読み出しを許可されていれば) apache を経由して目的のファイルの内容を読み出すことができてしまう。 また、apache がファイルの拡張子によって処理方法を決定している php スクリプトなどの場合、シンボリックリンク名を .html 等にしてソースを読むことができてしまう。 (ソースには設定情報や、時には平文パスワードやハッシュ化されたパスワードが記録されている) シンボリックリンクを拒否する設定にすることで防げるように見えるが、実は十分ではない。 TOCTOU 問題 ----------- apache 2.4 はレースコンディション対策を十分に行っていないため、ファイルのレースコンディションを利用すればシンボリックリンクを開かせることが依然として可能になる。 apache 2.4 は以下のような手順でシンボリックリンクを確認する。 1. ファイルがシンボリックリンクであるか確認する 1. ファイルの親ディレクトリがシンボリックリンクであるか確認する (ルートディレクトリまで繰り返し確認する) 1. シンボリックリンクでなければファイルを開く 確認作業とファイルのオープンまでに僅かな時間があり、マルチタスク OS ではこの間に他のプロセスがファイルの内容をシンボリックリンクに置き換えることができる。 解決策 ------ 気が向いたら書く。参考文献を参照のこと。 参考 ---- * [Apache HTTPD: \`Options -FollowSymLinks\` は不完全 - ダメ出し Blog](http://fumiyas.github.io/2013/09/03/no-followsymlinks-is-not-safe.html) * [IPA シンボリックリンク攻撃対策](http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c802.html) * [IPA ファイルレースコンディション対策](http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c803.html) * [JPCERT POS01-C. ファイルを操作するときにはリンクが存在するかどうかを検査する](https://www.jpcert.or.jp/sc-rules/c-pos01-c.html) * [JPCERT POS35-C. シンボリックリンクの有無のチェック時の競合状態を避ける](https://www.jpcert.or.jp/sc-rules/c-pos35-c.html)