SV.PATH.INJ
ファイル挿入
このエラーは、作成または作成が行われるファイルの名前の一部として未検証のユーザーデータが使用されている場合に発生します。
リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。
脆弱性とリスク
この状況は、データインジェクションとの併用により、任意のファイル (/etc/passwd など) へのデータの挿入を許す可能性があります。また、ファイルインジェクションを使用してファイルおよびディレクトリを作成し、攻撃者が選択した名前が将来的な攻撃で使用できるようにする可能性もあります。たとえば、機密情報を持つファイルを世界中から読み取り可能な場所に作成するように攻撃者がアプリケーションを操作する可能性があります。
Klocwork セキュリティ脆弱性 (SV) チェッカーは、潜在的に危険なデータを生成する呼び出しを特定します。このような呼び出しは安全でないソースと考えられます。ユーザーは攻撃者になる可能性があり、ヒューマンエラーを取り込む可能性があるため、安全でないソースはユーザーが指定した任意のデータである可能性があります。
軽減と防止
すべてのユーザーデータの許容可能な字句値とサイズを検証します。たとえば、ユーザー名がディレクトリ構造の一部である必要がある場合には、ユーザー名の英数字文字のサイズと内容についてチェックする必要があります。
脆弱コード例 1
import javax.servlet.http.*;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("userName");
File userDir = new File("userFiles", name);
File profile = new File(userDir, "profile");
FileOutputStream stream = new FileOutputStream(profile);
try {
createFileWithSensitiveInformation(stream);
} finally {
stream.close();
}
}
Klocwork は、6 行目で SV.PATH.INJ の欠陥を報告し、次を示します。'name' には HTTP 要求パラメーターからのデータが含まれているため、汚染される可能性があります (3 行目)。この値は、5 行目でファイル 'profile' の作成に使用され、6 行目で FileOutputStream の作成に使用されます。これを利用して、サーバーファイルシステム内の任意のファイルに情報が挿入される可能性があります。
脆弱コード例 2
import jakarta.servlet.http.*;
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("userName");
File userDir = new File("userFiles", name);
File profile = new File(userDir, "profile");
FileOutputStream stream = new FileOutputStream(profile);
try {
createFileWithSensitiveInformation(stream);
} finally {
stream.close();
}
}
Klocwork は、6 行目で SV.PATH.INJ の欠陥を報告し、次を示します。'name' には HTTP 要求パラメーターからのデータが含まれているため、汚染される可能性があります (3 行目)。この値は、5 行目でファイル 'profile' の作成に使用され、6 行目で FileOutputStream の作成に使用されます。これを利用して、サーバーファイルシステム内の任意のファイルに情報が挿入される可能性があります。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。