Skip to main content

Snyk CodeでJavaのパストラバーサル脆弱性を緩和

snyk code featured

2023年3月6日

0 分で読めます

パストラバーサルは、Webアプリケーションやサービスが攻撃者による想定されたディレクトリ構造外のサーバーファイルやディレクトリへのアクセスを許可してしまうことで発生するセキュリティ脆弱性です。機密データの不正な読み取りや改ざんにつながるおそれがあります。ファイルアップロードの場合、ユーザーが指定したファイルパスをアプリケーションが適切に検証しないと、攻撃者は制限されたサーバーファイルへのアクセスにつながるファイル名を付けた悪意あるファイルをアップロードできてしまいます。

ファイルアップロードにおけるパストラバーサルの防止は、機密データを保護し、制限されたファイルやディレクトリへの不正アクセスを防ぐために、Javaアプリケーションのセキュリティ上、極めて重要です。この記事では、ファイルアップロードにおけるパストラバーサルについて詳しく解説し、Snyk Codeを使ってJavaアプリケーションのこの脆弱性を防ぐ方法をご紹介します。

開発者の方も、Javaのセキュリティについて詳しく知りたい方も、この記事で紹介する情報や知見を活用して、Javaアプリケーションを安全に保ちましょう。

ファイルアップロードにおけるパストラバーサルを理解する

ユーザーがプロフィール写真をアップロードできるアプリケーションを想像してみてください。アプリケーションは、/images/profiles/のようなサーバー上のディレクトリにプロフィール写真を保存します。ユーザーが指定したファイル名をアプリケーションが適切に検証しない場合、攻撃者は../../etc/passwdのようなファイル名を付けた悪意あるファイルをアップロードできます。これにより、攻撃者は想定されたディレクトリ構造外にある機密性の高いシステムファイルにアクセスできてしまいます。

Thymeleafを使ったSpring Bootアプリケーションの例を見てみましょう。

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

Webフォームは、画像のアップロードによく使われます。アップロード時には、受信したMultipartFileからoriginalFilenameを取得します。HTTP POSTリクエストを傍受して調べると、24行目に示すように、filenameはこのHTTPリクエスト内のメタデータにすぎないことがわかります。

JSESSIONID Cookieと、JPEG画像をアップロードするmultipart/form-dataのコードスニペット。

適切なツールがあれば、ファイル名は簡単に好きなものへ変更できます。ファイル名を../../../../../../../etc/passwdに変更すると、コードはファイルをimages/profiles/../../../../../../../etc/passwdにアップロードします。パスはルートまで遡り、/etc/passwdが上書きされてしまいます。

Snyk Codeがパストラバーサルを検出する仕組み

Snyk Codeは、Java開発者がアプリケーション内の脆弱性を特定できるよう支援するリアルタイムSASTツールです。ファイルアップロードにおけるパストラバーサルも検出できます。高度な機械学習モデルを用いた静的解析でコードをスキャンし、潜在的なセキュリティリスクを特定します。

パストラバーサルについては、Snyk Codeを使うと、ユーザーが指定したファイルパスを使用している箇所や、適切な検証が行われていない箇所をコード内で特定できます。たとえば、GitHubリポジトリをSnykに接続したところ、Snyk CodeがWeb UIでパストラバーサルの問題を検出しました。

Javaのアップロードコードにおけるパストラバーサルの脆弱性を示すSnyk Codeのインターフェース。安全でないファイル書き込み行と修正方法の説明が表示されています。

次に、Snyk Codeを有効にしたIntelliJ IDEA用Snykプラグインを使ってみます。開発中にローカルマシンでスキャンしたところ、ファイルアップロードに潜むパストラバーサルの問題がすぐに見つかりました。さらに、考えられる緩和策もいくつか提案されました。

重大度の高いCWE-23(パストラバーサル)の脆弱性と、安全でないファイルパスを防ぐコード修正を強調表示したSnykのセキュリティダッシュボード。

Snyk Codeを使えば、悪用される前にパストラバーサル脆弱性を事前に特定して修正し、アプリケーションとその処理対象データの安全性を確保できます。

まとめると、Snyk Codeはコードをスキャンし、適切な検証が行われていない箇所を特定することで、Java開発者によるファイルアップロード時のパストラバーサル脆弱性の発見を支援します。これにより、アプリケーションの安全性を高め、潜在的な攻撃から保護できます。

ファイルアップロード時のパストラバーサルを緩和する

パストラバーサル脆弱性を修正する最も簡単な方法は、file.getOriginalFilename()を使用しないことです。ファイル名を自分で生成すれば、ユーザー入力に左右されず、ファイルの保存先を完全に制御できます。

ただし、元のファイル名を維持したい場合は、ファイルの保存先が意図した場所であることを確認する必要があります。Snyk Code(IDEプラグインの例を参照)は、パスをnormalizeできることをすでに示しています。

先ほどの例を変更し、正規化したパスが少なくとも意図したアップロードフォルダーから始まることを確認しましょう。こうすることで、パストラバーサルの問題を防げます。

編集者注:2023年3月31日

このコードブロックは更新されました。

@PostMapping("/uploadimage")
public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
   var name = file.getOriginalFilename().replace(" ", "_");
   var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);

   if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
        throw new IOException("Could not upload file: " + name);
   }

   Files.write(fileNameAndPath, file.getBytes());
   model.addAttribute("msg", "Uploaded images: " + name);
   return "person/upload";
}

パストラバーサル脆弱性の防止は不可欠です。

パストラバーサル脆弱性はJava Webアプリケーションのセキュリティに対する深刻な脅威であり、現在、SnykがJavaコードで検出する主要なセキュリティ問題の一つです。
開発者はその危険性を理解し、防止する方法を知る必要があります。適切な検証を実装し、Snyk Codeなどのツールで潜在的な脆弱性を特定することで、アプリケーションの安全性を高め、パストラバーサル攻撃のリスクから保護できます。セキュリティ対策は継続的な取り組みです。Javaアプリケーションの安全性を維持するには、脆弱性の特定と緩和に常に注意を払い、積極的に対応することが重要です。

パストラバーサル脆弱性を修正して、限定グッズを手に入れよう

Snykの脆弱性修正イベント「The Big Fix」は、2月14日から3月14日まで開催中です。コンテストに参加して、自分のプロジェクトや、よく利用するオープンソースプロジェクトの脆弱性を修正しましょう。アプリケーションにパストラバーサル脆弱性があるとわかった方は、プロジェクトをThe Big Fixに登録してください。脆弱性を1件修正するだけで、限定版のThe Big Fix 2023 Tシャツを獲得できます。今年の上位修正者には、さらに豪華な賞品が用意されています。

さあ、The Big Fixに参加して、今すぐアプリケーションのセキュリティ対策を始めましょう。

「脆弱性を修正して、イケてるグッズをゲットしよう」と書かれたThe Big Fixのプロモーションバナー。期間は2月14日〜3月14日。「参加する」ボタン付き。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。