SV.TOCTOU.FILE_ACCESS
ファイルアクセス時の作成日時/使用日時の競合
access、chown、chgrp、chmod など、ファイル名を操作する関数は、time-of-check time-of-use (TOCTOU) エラーに対して脆弱です。TOCTOU エラーとは、リソースのステータスがソフトウェアがチェックしたときから使用されるまでの間に変化する可能性がある状況のことです。中断時間があると、このチェックが無効になり、リソースが想定外のステートになると無効なアクションが引き起こされる可能性があります。
攻撃者がチェックと使用時の間にオブジェクトのステートを変更できる場合、TOCTOU エラーが発生する可能性があります。これは通常、マルチスレッドプログラムのファイル、メモリ、変数などの共有リソースで発生します。
この種の攻撃にさらされるのは、次の関数です。
- acct
- access
- chmod
- lchown
- chown
- fopen
- fdopen
- freopen
- fchmod
- fchown
- chdir
- chgrp
- creat
- open
- pathconf
- opendir
- lstat
- stat
- rename
- link
- lchown
SV.TOCTOU.FILE_ACCESS チェッカーは、TOCTOU エラーが発生する可能性のある関数呼び出しにフラグを立てます。
脆弱性とリスク
この脆弱性の典型的な例は、システム呼び出しで現在のプロセスにファイルに対する権利があるかどうかがチェックされてからファイルが開かれる場合です。この手法を使用するプロセスは、チェックが実行されてからファイルが実際に開かれるまでの間、一時停止される可能性があります。そのプロセスが一時停止されている間、どのファイルがその名前に関連付けられるのかを別のプロセスが変更することができます。
この状況には通常、ファイルへのシンボリックリンクをサポートするオペレーティングシステムが関係しています。たとえば、攻撃者はシンボリックリンクを使用して、あるパスワードファイルに与えられた文字列の意味を操作することにより、任意の場所に偽のエントリを挿入することができます。ある事例では、標的のユーザーディレクトリに .rhosts ファイルが作成され、これにより攻撃者がそのユーザーに成り済ましてリモートにログインすることができました。
この脆弱性では、悪意のあるユーザーが無許可のリソースにアクセスし、改変、ファイルの削除、および昇格された権限の取得を行うことができます。
軽減と防止
引数としてファイル名を受け取る関数とシステム呼び出しを使用しないでください。代わりに、ファイルハンドルまたはファイル記述子を受け取る呼び出しを使用してください。オペレーティングシステムがファイルハンドルまたはファイル記述子を割り当てると、シンボリックリンクによるファイル名の操作ほど簡単にはファイルハンドルまたはファイル記述子を変更できなくなります。
関数でファイル名を指定する必要がある場合
- ステートメント実行に有効な gid とuid を現在のユーザーとグループの gid とuid に設定します。
- リソースをチェックしてから使用するまでの時間を短縮します。
- 呼び出しを使用した後リソースをチェックして、適切なアクションが取られたことを確認します。
- 環境ロッキングメカニズムを使用して、リソースを保護します。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。