Snyk Code による Java でのパストラバーサルの脆弱性軽減
2023年3月6日
0 分で読めますパストラバーサルはセキュリティ脆弱性の一種で、Web アプリケーションまたはサービスから、攻撃者が本来アクセスできるディレクトリ構造外にあるサーバーファイルやディレクトリにアクセスできる場合に発生する可能性があります。これにより、機密データが不正に読み取られたり、変更されたりする可能性があります。ファイルアップロードのコンテキストでは、ユーザーが指定したファイルパスをアプリケーションで適切に検証できない場合に、パストラバーサルの脆弱性が発生する可能性があります。この場合、攻撃者は、サーバー上のアクセスが制限されたファイルへのアクセスを可能にするファイル名が付けられた、悪意のあるファイルをアップロードできます。
ファイルアップロードでのパストラバーサルを防止することは、Java アプリケーションのセキュリティにとって非常に重要です。これによって機密データを保護し、アクセスが制限されたファイルやディレクトリへの不正アクセスを防止できるためです。このブログ記事では、ファイルアップロードでのパストラバーサルについて詳しく説明し、Java アプリケーションで Snyk Code によってこの脆弱性を防ぐ方法をご紹介します。
この記事は、開発者だけでなく、Java のセキュリティについて詳しく知りたい人々にも、Java アプリケーションの安全性維持に役立つ情報とインサイトを提供します。
ファイルアップロードでのパストラバーサルについて理解する
ユーザーがプロフィール画像をアップロードできるアプリケーションがあるとします。このアプリケーションでは、プロフィール画像がサーバー上のディレクトリ (/images/profiles/
など) に保存されます。このアプリケーションで、ユーザーが指定したファイル名を適切に検証できない場合、攻撃者は ../../etc/passwd
のようなファイル名が付けられた悪意のあるファイルをアップロードできる可能性があります。これにより、攻撃者は本来アクセスできるディレクトリ構造外にある機密性の高いシステムファイルにアクセスできるようになります。
Thymeleaf を使用する Spring Boot アプリケーションからの例をご覧ください。
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5 Files.write(fileNameAndPath, file.getBytes());
6 model.addAttribute("msg", "Uploaded images: " + name);
7 return "person/upload";
8}
画像のアップロードには、Web フォームが使用されることが非常に多いです。アップロード時には、受信する MultipartFile
の originalFilename
を使用します。HTTP POST 呼び出しをインターセプトして検査すると、filename
は 24 行目に表示されているこの HTTP リクエストのメタデータにすぎないことがわかります。
適切なツールを使用すれば、 filename を任意の名前に簡単に変更できます。filename を ../../../../../../../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
できることがすでに示されています。
前の例を変更して、正規化されたパスが少なくとも意図するアップロードフォルダーで始まるかどうかを確認してみましょう。これによって、パストラバーサルの問題を防ぎます。
編集者注:2023 年 3 月 31 日
このコードブロックは更新されました。
1@PostMapping("/uploadimage")
2public String uploadImage (Model model, @RequestParam("image") MultipartFile file) throws IOException {
3 var name = file.getOriginalFilename().replace(" ", "_");
4 var fileNameAndPath = Paths.get(UPLOAD_DIRECTORY, name);
5
6 if (!fileNameAndPath.normalize().startsWith(UPLOAD_DIRECTORY)) {
7 throw new IOException("Could not upload file: " + name);
8 }
9
10 Files.write(fileNameAndPath, file.getBytes());
11 model.addAttribute("msg", "Uploaded images: " + name);
12 return "person/upload";
13}
14
パストラバーサルの脆弱性を防ぐことは不可欠
パストラバーサルの脆弱性は、Java Web アプリケーションのセキュリティに対する重大な脅威であり、現在 Snyk が Java コードで検出するセキュリティ上の問題の上位に挙げられています。
開発者は、この脆弱性を認識し、それを防ぐ方法を理解する必要があります。適切な検証を実装し、Snyk Code などのツールを使用して潜在的な脆弱性を特定することで、開発者はアプリケーションのセキュリティを確保し、パストラバーサル攻撃のリスクからアプリケーションを保護できます。セキュリティの確保は継続的なプロセスであり、監視の目を緩めず、脆弱性をプロアクティブに特定、軽減することが Java アプリケーションのセキュリティを維持する鍵であることを覚えておくことが重要です。
パストラバーサルの脆弱性を修正して賞品を獲得
Snyk の脆弱性修正イベントである The Big Fix が、2 月 14 日から 3 月 14 日まで開催中です。このイベントに参加して、個人プロジェクトや、頻繁に使用するオープンソースプロジェクトの脆弱性を修正しましょう。アプリケーションでパストラバーサルの脆弱性を発見したら、The Big Fix にプロジェクトを追加してください。脆弱性を 1 つ修正すると、限定版の Big Fix 2023 T シャツがもらえます。今年の特に優れた修正に選ばれると、さらに豪華な賞品を獲得できます。
待つ理由は何もありません。今すぐ The Big Fix に参加して、アプリケーションを保護しましょう。