見出し画像

🚫tempファイル作成時の危険性 CWE377の図解 セキュアコーディング

この一見すると何の変哲もないコードは、一時ファイルを作成するための安全でない方法に依存しているため、さまざまな攻撃に対して脆弱性があります。 CWE377

ほとんど世にも奇妙な物語、何が安全でないというのか?


中間ファイルには大きく二種類あってそれぞれで驚異が異なる。一つはわかりやすい中間ファイル名から内容を読み込まれてしまうパターン、ランダムにはしてるけど名前の特定や先回りをされてしまうようなファイル名。

一時ファイルを作成するための関数は、単にファイル名を指定するものと、実際にファイルを開くものの2つに分類されます

グループ1:「一意な」ファイル名。一時ファイルの作成プロセスを支援するために設計されたCライブラリおよびWinAPI関数の最初のグループは、新しい一時ファイル用に一意のファイル名を生成し、プログラムがそれを開くことになっています。このグループには、tmpnam()、tempnam()、mktemp()などのCライブラリ関数と、_(アンダースコア)を先頭に持つ同等のC++関数、およびWindows APIのGetTempFileName()関数が含まれています。
この関数群には、選択されるファイル名に関する根本的な競合状態が存在します。これらの関数は、ファイル名が選択された時点で一意であることを保証しますが、選択された後、アプリケーションがファイルを開こうとする前に、他のプロセスや攻撃者が同じ名前のファイルを作成することを防ぐメカニズムはありません。

アプリケーションによって一時ファイルに保存されたデータは、攻撃者によってアクセス、変更、または破損される可能性があります。Unix ベースのシステムでは、攻撃者がファイルを別の重要なファイルへのリンクとして事前に作成した場合、さらに陰湿 な攻撃が可能です。

グループ2:「ユニーク」なファイル。Cライブラリ関数の第2グループは、一意のファイル名を生成するだけでなく、ファイルを開くことによって、一時ファイルに関連するセキュリティ問題のいくつかを解決しようとしています。このグループには、tmpfile() などの C ライブラリ関数と、_ (アンダースコア) を先頭に持つ同等の C++ 関数、および少し行儀の良い C ライブラリ関数 mkstemp() が含まれます。

https://amzn.to/3xuJAWP

アプリケーションは一時ファイルを頻繁に必要とするため、CライブラリやWindows(R)APIには一時ファイルを作成するためのさまざまなメカニズムが存在する。これらの関数のほとんどは、様々な攻撃に対して脆弱である。

最後に、mkstemp() は、一時ファイルを作成するための、それなりに安全な方法である。

mkstemp() は、ユーザーによって提供されたファイル名テンプレートと、ランダムに生成された一連の文字を組み合わせて、一意のファイルを作成し、開こうとする。そのようなファイルを作成できない場合は、失敗して-1を返す。これは、ユーザーが明示的にアクセス権を変更しない限り、ファイルが改ざんから保護されることを意味する。しかし、mkstemp() は予測可能なファイル名を使用しているため、攻撃者が使用されるファイル名を予測して事前に作成することで mkstemp() を失敗させると、アプリケーションはサービス拒否攻撃に対して脆弱になる可能性がある。

お願い致します