次: Race Conditions with -print and -print0, 前: Changing the Current Working Directory, 上: Security Considerations for find
`-exec'アクションでは別のプログラムを実行します.その時にファイル 名を渡します.そしてプログラムを呼び出します -通常- ファイルになんらか のアクションを実施します.ここでも,利用可能な競合状態があります.我々 は,コマンド例を以下のように指定します.
find /tmp -path /tmp/umsp/passwd -exec /bin/rm
この見本例では,我々は削除する一つのファイルを識別し,削除するために
/bin/rm
を呼び出しています.find
が`-exec'アクションを
処理する必要があることを決定する時点と,/bin/rm
コマンドが実際に
unlink()
システムコールを実施する時点に時間差があるので,問題が存
在します.このとき,攻撃者は/tmp/umspディレクトリの名前を変更し,
/etcへのシンボリックリンクに置換することが可能です.find
が想定しているのと同じファイルで,/bin/rm
を実施していることを調
査する方法はありません.一度シンボリックリンクが配置されると,実際に呼
び出したコマンドが意図している効果ではなく,攻撃者はfind
に
/etc/passwdファイルを削除させるようだますこともあります.
この形態の攻撃から守る一つの可能性として,`-exec'の動作を
/bin/rm
コマンドを./passwd引数で,適切なワーキングディレク
トリで実行するようにする方法です.これは,この形式の攻撃から守るために
find
が実行する,通常の健全性の調査でも可能です.残念ながら,この
戦略はPOSIX標準で指定されている物では利用不可能で,そこでは
`-exec'でコマンドが呼び出されたカレントワーキングディレクトリと,
find
が呼び出されたカレントワーキングディレクトリは同じにする必要
があります.つまり,`-exec'アクションは本質的にセキュリティが低く,
修正不可能だということを意味します.
GNU find
では,`-exec'アクション等よりセキュリティが高い
`-execdir'を実装しています.`-execdir'アクションは,ターゲッ
トファイルを処理するため,サブディレクトリを参照しないようにする必要が
なくなるようにします.プログラムの呼び出しで使用されるカレントディレク
トリが,処理するファイルが存在するディレクトリと同じ(例では
/tmp/umsp)になっていて,処理するファイルのベース名が呼び出しコマ
ンドに渡され,それには`./'が(例では./passwd)前置されます.
`-execdir'アクションは,カレントディレクトリが$PATH環境変数 に含まれている場合,すべての動作を拒否します.これは,`-execdir'が ファイルが見つかったディレクトリと同じディレクトリのプログラムを実行す るので必要になります – 一般的に,そのようなディレクトリは信用できない ユーザは書き込みません.同じような理由で,`-execdir'は実行するコマ ンド名の`{}'を許可しません.