パス トラバーサル

OWASP カテゴリ: MASVS-STORAGE: ストレージ

概要

パス トラバーサルの脆弱性は、検証なしでファイルシステム API に渡されるパスの一部を攻撃者が制御できる場合に発生します。これにより、不正なファイル システム操作が行われる可能性があります。たとえば、攻撃者が「../」などの特殊文字を使用してターゲット ディレクトリの外に移動し、突然リソース ターゲットを変更してしまう場合があります。

影響

影響は、操作とファイルの内容によって異なりますが、一般にファイルの上書き(ファイルの書き込み時)、データ漏洩(ファイルの読み取り時)、権限の変更(ファイルやディレクトリの権限の変更時)が発生します。

リスクの軽減

File.getCanonicalPath() を使用してパスを正規化し、プレフィックスを所定のディレクトリと比較します。

Kotlin

@Throws(IllegalArgumentException::class)
fun saferOpenFile(path: String, expectedDir: String?): File {
    val f = File(path)
    val canonicalPath = f.canonicalPath
    require(canonicalPath.startsWith(expectedDir!!))
    return f
}

Java

public File saferOpenFile (String path, String expectedDir) throws IllegalArgumentException {
  File f = new File(path);
  String canonicalPath = f.getCanonicalPath();
  if (!canonicalPath.startsWith(expectedDir)) {
    throw new IllegalArgumentException();
  }
  return f;
}

その他にも、検証を使用して、所定の結果のみが発生していることを確認することもおすすめします。以下に例を示します。

  • 誤って上書きされないように、ファイルがすでに存在するかどうかを確認する。
  • データの漏洩や権限が不正に変更されるのを防ぐために、ターゲット ファイルが所定のターゲットであるかどうかを確認する。
  • 操作のカレント ディレクトリが、正規パスからの戻り値で正確に想定どおりかどうかを確認する。
  • 権限システムのスコープを操作に明示的に設定する(サービスを root として実行していないことを確認する、ディレクトリ権限のスコープを指定されたサービスまたはコマンドに設定するなど)。