TOCTOU(Time-of-Check to Time-of-Use)攻撃は、プログラムがファイルやリソースの状態を確認する「チェック時」と、実際にそのファイルやリソースを使用する「利用時」の間に生じる時間差を悪用した攻撃です。攻撃者は、この時間差の間にリソースの状態を変更することで、システムに不正な動作を引き起こします。
TOCTOU攻撃は、競合状態(レースコンディション)を利用する攻撃の一種で、特にマルチスレッド環境や並列処理を伴うシステムにおいて発生しやすく、ファイルアクセスやリソース管理に関わる処理で大きなリスクとなります。
TOCTOU攻撃の仕組み
TOCTOU攻撃は、以下の手順で行われます:
- チェック(Time-of-Check)
プログラムは、対象ファイルやリソースが安全であるか、正しい状態かを確認します。例えば、特定のファイルのパーミッション(アクセス権限)が適切であるかなどをチェックします。 - 時間差の利用
チェック後、実際の利用までの間に、攻撃者が対象ファイルやリソースの状態を変更します。例えば、シンボリックリンクを悪意あるファイルに変更する、パーミッション設定を変えるといった方法が用いられます。 - 利用(Time-of-Use)
プログラムは、チェック時に確認した状態と異なる状態のリソースに対して、処理を続行します。これにより、プログラムが攻撃者の意図した不正なファイルやリソースにアクセスしてしまいます。
TOCTOU攻撃の例
TOCTOU攻撃はさまざまな形で行われますが、以下は代表的な例です。
- ファイルアクセス権限の変更
システムが「特定のファイルへのアクセス許可」を確認してからファイルにアクセスするまでの間に、攻撃者がそのファイルのリンク先を悪意あるファイルに変更します。この結果、システムが攻撃者の指定したファイルを意図せずに処理することになります。 - シンボリックリンクの悪用
プログラムが一時ファイルをチェックした後、利用するまでの間に、攻撃者がシンボリックリンクを操作し、機密データが格納されているファイルへリンクを変更します。プログラムは、攻撃者が操作した機密ファイルに意図せずアクセスしてしまいます。 - 一時ファイルの競合
一部のプログラムが一時ファイルをチェックし、安全であることを確認した後、そのファイルを利用するまでの間に、攻撃者が同じ一時ファイル名を使用することで内容を書き換えることが可能になる場合があります。
TOCTOU攻撃のリスク
TOCTOU攻撃には、以下のようなリスクが伴います:
- 機密データの漏洩
攻撃者が操作したファイルやリソースを通じて、プログラムが意図せず機密情報にアクセス・漏洩する可能性があります。 - 権限の誤使用
不正なファイルやリソースにアクセスさせることで、通常アクセスできないファイルやシステムリソースへの不正アクセスが発生する可能性があります。 - システムの信頼性低下
TOCTOU攻撃によって予期しない動作が発生し、システムの信頼性が低下する場合があります。
TOCTOU攻撃への対策
TOCTOU攻撃を防ぐためには、以下のような対策が効果的です:
- アトミック操作の利用
チェックと利用を同時に行うアトミック操作を使用することで、チェック後の状態変化を防ぎます。たとえば、ファイルアクセスにはファイルディスクリプタを直接使用し、状態が変更される隙を作らないようにします。 - シンボリックリンクの無効化
一時ファイルや重要なリソースへのアクセスにおいて、シンボリックリンクの利用を禁止する、またはシンボリックリンクでないことを確認する対策を講じます。 - ロック機構の導入
リソースに対してロックをかけることで、他のプロセスがリソースの状態を変更できないようにし、競合状態を防ぎます。 - 信頼できる一時ファイルの使用
一時ファイルを使用する場合、安全な生成方法を用いるか、特定のディレクトリのみを使用することで、攻撃者が競合状態を悪用するリスクを減らします。 - プログラムの権限を最小化
プログラムが必要以上のファイルやリソースにアクセスできる権限を与えないことで、TOCTOU攻撃のリスクを抑制します。
まとめ
TOCTOU攻撃は、プログラムがリソースを「チェック」した時点と「利用」する時点の間にある時間差を悪用し、競合状態(レースコンディション)を引き起こす攻撃です。この時間差を狙って攻撃者がリソースの状態を変更することで、プログラムに意図しない動作をさせることが可能になります。TOCTOU攻撃は、機密データの漏洩や不正アクセスの原因となるため、アトミック操作の利用、シンボリックリンクの制御、ファイルロックの導入などの対策が重要です。