Blazor WASMの重大なセキュリティ脆弱性:あなたのアプリは安全ですか?

Blazor WASMの重大なセキュリティ脆弱性:あなたのアプリは安全ですか?

Blazor WASMの重大なセキュリティ脆弱性:あなたのアプリは安全ですか?

はじめに

この記事では、Blazor WebAssembly (WASM) アプリケーションにおける重大なセキュリティ脆弱性について解説します。この脆弱性により、悪意のあるユーザーが、アプリケーションの機密情報(データベース接続文字列など)にアクセスできる可能性があります。具体的には、DLLファイルの露出が問題となります。

この問題は、Ricardo Josue氏によって最初に指摘され、彼の動画を参考に本記事を作成しました。彼の動画はスペイン語ですが、この脆弱性の深刻さを理解する上で大変参考になります。

注意:この記事の内容を実運用システムに対して実行しないでください。この記事は教育目的でのみ提供されています。

脆弱性の概要

Blazor WASM アプリケーションは、クライアントサイドで実行されるため、セキュリティ対策が不十分だと、重要な情報が漏洩するリスクがあります。特に、この脆弱性は、アプリケーションコードがコンパイルされた後のDLLファイルが、適切に保護されていない場合に発生します。

ブラウザの開発者ツール(ネットワークタブ)から、これらのDLLファイルに直接アクセスし、ダウンロードすることができます。ダウンロードしたDLLファイルは、.NETの逆コンパイラを使用してデコンパイルでき、ソースコードの一部を復元可能です。これにより、データベース接続文字列などの機密情報が漏洩する危険性があります。

脆弱性の再現手順

この脆弱性を確認するために、簡単なBlazor WASM アプリケーションを作成し、実験してみましょう。

1. Blazor WASM アプリケーションの作成

Visual Studio を使用して、ASP.NET Core Hosted のBlazor WASM アプリケーションを作成します。この時、ASP.NET Core Hosted を選択することが重要です。バックエンドのAPIと連携する必要があるためです。

2. 機密情報の追加

Shared プロジェクトに、新しいクラス Connection を追加します。このクラスには、データベース接続文字列などの機密情報(今回はダミーの文字列を使用)を格納します。

// Connection.cs
namespace BlazorApp.Shared
{
    public class Connection
    {
        public string ConnectionString { get; set; } = "JustBlazorConnection";
    }
}

このConnectionStringプロパティに、本番環境では実際の接続文字列を記述します。しかし、この例では、脆弱性を示すためにダミーの文字列を使用しています。

重要なのは、このConnectionクラスを直接コンポーネントから使用しないことです。これにより、JavaScript側から直接この情報はアクセスできません。

3. アプリケーションの実行とデバッグ

アプリケーションを実行し、ブラウザの開発者ツールを開きます。

ネットワークタブを選択し、「Preserve log」を有効にします。アプリケーションをリフレッシュすると、ダウンロードされたファイルが表示されます。

ここで注目すべきは、_framework/blazor.shared.dllのようなDLLファイルです。このファイルの中には、コンパイルされたアプリケーションコードが含まれており、機密情報が隠れている可能性があります。

4. DLLファイルのダウンロードとデコンパイル

開発者ツールのネットワークタブで、blazor.shared.dllなどのDLLファイルを探し、ダウンロードします。

Postmanなどのツールを使用すれば、簡単にダウンロードできます。ダウンロードしたDLLファイルは、.NETの逆コンパイラツールを使用してデコンパイルできます。

この手順でダウンロードしたDLLファイルの中には、機密情報が埋め込まれています。

5. 脆弱性の確認

ILDasm (IL Disassembler) を使用してダウンロードしたDLLファイルをデコンパイルします。

ILDasmは、.NET Framework SDKに含まれているツールです。Visual Studio 2022の開発者コマンドプロンプトからildasmコマンドを実行します。

デコンパイルされたコードを確認し、JustBlazorConnectionなどの機密情報を探します。

このコマンドを実行することで、DLLファイルの中身を確認することができ、JustBlazorConnectionというダミーの接続文字列を確認できます。

脆弱性の対策

この脆弱性を回避するためには、以下の対策が有効です。

  • 機密情報をアプリケーションコードに直接埋め込まない: データベース接続文字列などの機密情報は、環境変数や設定ファイルなど、アプリケーションコードとは別に管理します。

  • Blazor WASM アプリケーションでの機密情報の扱い: 機密情報は、サーバーサイドで処理し、クライアントサイドには必要な情報のみを返すようにします。

  • HTTPS を使用する: HTTPS を使用することで、通信内容を暗号化し、盗聴を防ぎます。

  • 入力値の検証: クライアントサイドからの入力値は、必ずサーバーサイドで検証するようにします。

  • キャッシュクリアの対策: 開発者ツールでキャッシュをクリアする事でDLLファイルへのアクセスを阻止できます。Blazorアプリ自体でもキャッシュを定期的にクリアする処理を入れる事が考えられます。

キャッシュクリアについて更に深く

ブラウザのキャッシュに保存されたblazor.shared.dllなどのDLLファイルは、アプリケーションの更新や再構築を行っても残ってしまう可能性があります。このため、ユーザーが開発者ツールで手動でキャッシュをクリアしない限り、脆弱性は残存します。この問題を解決するために以下の3つの解決策が考えられます。

1. 開発者ツールによるキャッシュクリアの促進: アプリケーションに、開発者ツールによるキャッシュクリアを促すメッセージを表示する。ユーザーは、自身の責任において開発者ツールを使用する必要があることを明確に伝え、セキュリティリスクを軽減する必要があります。

2. 定期的なブラウザキャッシュクリアの推奨: アプリケーションは、機密情報が変更された場合に、ユーザーにブラウザのキャッシュをクリアすることを推奨します。この推奨は、アプリケーション内のメッセージとして、またはアプリ起動時のダイアログとして表示することが考えられます。

3. サーバーサイドでのキャッシュ制御: アプリケーションのキャッシュをサーバーサイドでより厳密に制御する。例えば、キャッシュの有効期限を短く設定したり、キャッシュキーを頻繁に変更したりする。これにより、古いDLLファイルへのアクセスを制限し、脆弱性の影響を最小限に抑えることができます。

これらの方法を組み合わせる事で、より強固なセキュリティ対策を行う事ができます。

まとめ

Blazor WASM アプリケーションのセキュリティは、開発者の責任において慎重に設計、実装する必要があります。この記事で紹介した脆弱性は、比較的簡単に悪用できるため、早急に対策することが重要です。

この脆弱性に関する詳細な情報は、Ricardo Josue氏の動画(スペイン語)を参考にしてください。彼のYouTubeチャンネルには、Blazor WASMに関する多くの有益な情報が掲載されています。

この脆弱性の存在を広く知らしめることで、より安全なBlazor WASMアプリケーションの開発に繋がることを願っています。 今後の記事では、Blazor WASMアプリケーションを安全に開発するためのより具体的な対策方法を紹介する予定です。ご期待ください。