パストラバーサルは、 Webアプリケーションや サービスが 攻撃者に よる 想定された ディレクトリ構造外の サーバーファイルや ディレクトリへの アクセスを 許可してしまう ことで 発生する セキュリティ脆弱性です。 機密データの 不正な 読み取りや 改ざんに つながる おそれが あります。 ファイルアップロードの 場合、 ユーザーが 指定した ファイルパスを アプリケーションが 適切に 検証しないと、 攻撃者は 制限された サーバーファイルへの アクセスに つながるファイル名を 付けた 悪意ある ファイルを アップロードできてしまいます。
ファイルアップロードに おける パストラバーサルの 防止は、 機密データを 保護し、 制限された ファイルや ディレクトリへの 不正アクセスを 防ぐ ために、 Javaアプリケーションの セキュリティ上、 極めて 重要です。 この 記事では、 ファイルアップロードに おける パストラバーサルに ついて 詳しく 解説し、 Snyk Codeを 使って Javaアプリケーションの この 脆弱性を 防ぐ 方法を ご紹介します。 開発者の 方も、 Javaの セキュリティに ついて 詳しく 知りたい 方も、 この 記事で 紹介する 情報や 知見を 活用して、 Javaアプリケーションを 安全に 保ちましょう。
ファイルアップロードにおけるパストラバーサルを理解する ユーザーが プロフィール写真を アップロードできる アプリケーションを 想像してみてください。 アプリケーションは、 /images/profiles/のような サーバー上の ディレクトリに プロフィール写真を 保存します。 ユーザーが 指定した ファイル名を アプリケーションが 適切に 検証しない 場合、 攻撃者は ../../etc/passwdのような ファイル名を 付けた 悪意ある ファイルを アップロードできます。 これに より、 攻撃者は 想定された ディレクトリ構造外に ある 機密性の 高い システムファイルに アクセスできてしまいます。
Thymeleafを 使った Spring Bootアプリケーションの 例を 見てみましょう。
Webフォームは、 画像の アップロードに よく 使われます。 アップロード時には、 受信した MultipartFileから originalFilenameを 取得します。 HTTP POSTリクエストを 傍受して 調べると、 24行目に 示すように、 filenameは この HTTPリクエスト内の メタデータに すぎないことが わかります。
適切な ツールが あれば、 ファイル名は 簡単に 好きな ものへ 変更できます。 ファイル名を ../../../../../../../etc/passwdに 変更すると、 コードは ファイルを images/profiles/../../../../../../../etc/passwdに アップロードします。 パスは ルートまで 遡り、 /etc/passwdが 上書きされてしまいます。
Snyk Codeがパストラバーサルを検出する仕組み Snyk Codeは、 Java開発者が アプリケーション内の 脆弱性を 特定できるよう 支援する リアルタイムSASTツールです。 ファイルアップロードに おける パストラバーサルも 検出できます。 高度な 機械学習モデルを 用いた 静的解析で コードを スキャンし、 潜在的な セキュリティリスクを 特定します。
パストラバーサルに ついては、 Snyk Code を 使うと、 ユーザーが 指定した ファイルパスを 使用している 箇所や、 適切な 検証が 行われていない 箇所を コード内で 特定できます。 たとえば、 GitHubリポジトリを Snykに 接続した ところ、 Snyk Codeが Web UI で パストラバーサルの 問題を 検出しました。
次に、 Snyk Codeを 有効に した IntelliJ IDEA用Snyk プラグイン を 使ってみます。 開発中に ローカルマシンで スキャンした ところ、 ファイルアップロードに 潜む パストラバーサルの 問題が すぐに 見つかりました。 さらに、 考えられる 緩和策も いくつか 提案されました。
Snyk Codeを 使えば、 悪用される 前に パストラバーサル脆弱性を 事前に 特定して 修正し、 アプリケーションと その 処理対象データの 安全性を 確保できます。
まとめると、 Snyk Codeは コードを スキャンし、 適切な 検証が 行われていない 箇所を 特定する ことで、 Java開発者に よる ファイルアップロード時の パストラバーサル脆弱性の 発見を 支援します。 これに より、 アプリケーションの 安全性を 高め、 潜在的な 攻撃から 保護できます。
ファイルアップロード時のパストラバーサルを緩和する パストラバーサル脆弱性を 修正する 最も 簡単な 方法は、 file.getOriginalFilename()を 使用しない ことです。 ファイル名を 自分で 生成すれば、 ユーザー入力に 左右されず、 ファイルの 保存先を 完全に 制御できます。
ただし、 元の ファイル名を 維持したい 場合は、 ファイルの 保存先が 意図した 場所である ことを 確認する 必要が あります。 Snyk Code (IDE プラグインの 例を 参照)は、 パスを normalizeできる ことを すでに 示しています。 先ほどの 例を 変更し、 正規化した パスが 少なくとも 意図した アップロードフォルダーから 始まる ことを 確認しましょう。 こうする ことで、 パストラバーサルの 問題を 防げます。
パストラバーサル脆弱性の防止は不可欠です。 パストラバーサル脆弱性は 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 に 参加して、 今すぐ アプリケーションの セキュリティ対策を 始めましょう。
Capture the Flagを 始めよう オンデマンドの バーチャル入門ワークショップを 見て、 Capture the Flagの 課題の 解き方を 学びましょう。