システムがopen(2)
システムコールのO_NOFOLLOWフラグをサポートする
場合1,find
は安全にディレク
トリを変更するとき使用します.目的となるディレクトリは最初にオープンさ
れ,find
はfchdir()
システムコールで作業ディレクトリを変更
します.これで,シンボリックリンクは確実にたどられなくなり,シンボリッ
クリンクの作成を使用する競合状態の攻撃の類は避けられます.
なんらかの理由でこの手法が動作しない場合,find
はO_NOFOLLOWがサポー
トされていない状況で一般的に使用される手法に戻ります.
以下を実行することで,システムがO_NOFOLLOWをサポートしてかどうか分かり ます.
find --version
これで,バージョン番号と利用可能な機能が表示されます.例えば,私のシス テムでは以下のようになります.
GNU find version 4.2.18-CVS Features enabled: D_TYPE O_NOFOLLOW(enabled)
ここで,実行しているfindのバージョンがfindutils-4.2.18の前の リリースの開発(CVS)コードからビルドされたことと,D_TYPEとO_NOFOLLOWの機 能が存在することが分かります.O_NOFOLLOWは“enabled”であると分かります. これは,現在のシステムでO_NOFOLLOWをサポートしているらしいことを,簡単 に示しています.システムでビルドされたfindがO_NOFOLLOWを定義 していて,O_NOFOLLOWフラグを無視するシステムで実行されている可能性があ るので,この調査は必要です.我々は,開始時にオペレーティングシステムと バージョン番号を調査することで,そのような状況の検出を試みます.このよ うな状況では,“O_NOFOLLOW(disabled)”を代わりに見ることになります.