web-dev-qa-db-ja.com

クライアントは、サーバーから送信されたコードが改ざんされていないことをどのように確認できますか?

ProtonMailに関する最近の論争 を理解しようとしているときに、サーバーからクライアントに送信されているオープンソースのJavaScriptが改ざんされていないことを確認できるかどうか疑問に思い始めました。

私が正しく理解している場合、技術的にサーバーが侵害された場合、サーバーが悪意のあるJavaSciptをクライアントに送信し、クライアントの秘密の暗号化キー/パスワードで応答する可能性があるため、ブラウザでE2EEを使用できません。

私が開発者の場合、クライアントが私のパブリックGitHubリポジトリに保存されているものと同じJavaScriptを確実に受信できるようにするにはどうすればよいですか?これは可能ですか?

3
orangeMint

一般的に言って、あなたが求めていることは不可能だと思います。むしろ、それは実行不可能で、おそらく役に立たないと思います。それが実行不可能である理由は、コードが公式コードと同じであることを確認する必要があるためです(たとえば、GitHubで)。これを行う必要があります毎回ページをリロードします。おそらく役に立たない理由は、Webページが実際に正しく動作することを確認するには、毎回allのコードを監査する必要があるためです。ページが実際に特定のライブラリの公式コードをロードしたとしても、ページが実際にそのコードを期待どおりに使用しているかどうかをどのようにして知ることができますか?コードをロードして実行しない場合や、一部の関数を使用する前に再定義する場合などがあります。また、すべてのコードを監査してすべてが正常に機能していることを確認した場合でも、次にページを再読み込みするときに、すべての機能を使用できます。変更されました。

GitHubからソフトウェアをダウンロードすると、最終的にはそのコードのプロバイダー、つまりGitHubを信頼することになります。 Linuxリポジトリからソフトウェアをインストールする場合、リポジトリサーバーを信頼します。また、Webページ(JavaScript)でソフトウェアを実行する場合、基本的にドメイン所有者を信頼しています。

2
reed

サブリソースの整合性 (SRI)を使用できます。

サブリソース整合性(SRI)は、ブラウザーがフェッチするリソース(CDNなどから)が予期しない操作なしで配信されていることをブラウザーが確認できるようにするセキュリティ機能です。フェッチされたリソースが一致する必要がある暗号化ハッシュを提供できるようにすることで機能します。

あなたはこのようなものを使うことができます:

<script src="https://example.com/example-framework.js"
        integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
        crossorigin="anonymous"></script>

外部リソースを変更する攻撃者は、サイトも変更する必要があります。サーバーに静的HTMLがあり、別のサーバーにJavaScriptがあると、攻撃者がスクリプトを変更するための2つのポイントが作成されます。しかし、攻撃者がHTMLサーバーを危険にさらすと、あなたは負けます。

1
ThoriumBR