サーバーからさらにファイルをダウンロードする必要なく、Web ブラウザーでローカルに実行する必要がある "安全な" オフライン HTML5 アプリを構築しているとしましょう。最初に HTTPS (TLS) 経由で Web ブラウザーを使用してサーバーに接続し、ローカルで実行するために必要な HTML、JavaScript、および CSS をダウンロードするとします。ファイルを初めてダウンロードするときは、まだ誰も知らない新しいサーバーであるため、安全にダウンロードされていると合理的に推測できます。すべてのファイルはHTML5 Offline Application Cacheに保存されます。これで、アプリケーションをローカルで実行するために必要なものがすべて揃ったので、サーバーに依存する必要はなくなりました。
これで、アプリを実行するたびに、アプリケーションは HTML5 Offline Web Application Manifest を使用して、アプリをダウンロードするためのサーバーからの更新があるかどうかを確認します。これが問題になる可能性があります。攻撃者が私のサーバーを標的にし、接続に対して MITM 攻撃を行った場合、アプリケーション マニフェストが変更され、更新がトリガーされ、クライアントに新しい JavaScript と HTML がダウンロードされる可能性があります。アプリケーションはこれらのファイルの整合性に依存しているため、これによりアプリケーションのセキュリティが簡単に損なわれます。
これを防ぐために考えられるオプションは何ですか? これらのいずれかを実行できますか:
1)すべてのファイルがダウンロードされた後、サーバーからの更新を完全に無効にするかブロックします。次に、サーバー上でマニフェストが変更された場合、または攻撃者が新しいマニフェストを提供した場合、クライアントは新しいマニフェストを無視し、ファイルのローカル コピーを使用し続けます。
2)マニフェストが変更されたかどうか、更新イベントがトリガーされたかどうか、またはブラウザーが新しいファイルをダウンロードしているかどうかを検出します。したがって、これが発生したことをユーザーに通知してください。そして、それがユーザーから予期されていない場合、それは攻撃を示しています。仕様に記載されている「ダウンロード中」または「更新準備完了」または「確認中」イベントがあることを理解しています。これらのイベントが発生したことを JavaScript が検出する方法はありますか?
3)ファイルのバージョン値または暗号化ハッシュをブラウザのローカル ストレージに保存します。次に、ページの起動時に、ファイルが予期せず変更された場合、ユーザーに予期せず変更されたことを通知するアラートを Web ブラウザーにスローできます。
4)おそらく、ブラウザにファイルを無期限にキャッシュさせる何らかのキャッシュ ヘッダーを使用します。言い換えれば、サーバーから送信された新しいマニフェスト ファイルを無視するようにする一種のハックです。マニフェスト ファイルが変更されてもアプリケーションが更新されない原因となる問題が多数あるため、これはおそらく機能するように思えます。
前もって感謝します。