15

コンテキスト:

  • クライアントに特定の Chrome 拡張機能がインストールされている場合にのみ、排他的なコンテンツを提供する必要がある Web サーバーがあります。
  • Chrome 拡張機能パッケージを提供するには、次の 2 つの方法があります。
    1. Chrome ウェブストアから
    2. 独自のサーバーから

問題:

  • Chrome 拡張機能がインストールされていることを確認できるソリューションは多数あります。
    1. コンテンツ スクリプトを使用して、Web ページの読み込み時に要素を挿入します。
    2. Web Requestsを使用して特定のヘッダーをサーバーに送信します。
    3. 等。
  • しかし、Web ページと対話している Chrome 拡張機能が本物かどうかを確認する解決策はないようです。
  • 実際、Chrome 拡張機能のソース コードは誰でも閲覧およびコピーできるため、Web ページと対話している現在の Chrome 拡張機能が、公開したものなのか、複製されたバージョンなのかを知る方法はないようです(他の人によって多少変更されている可能性があります。
  • 一部の Chrome 拡張機能が「予期された方法」で Web ページと対話していることだけを知ることができるようですが、その信頼性を確認することはできません。

ソリューション?

  • 解決策の 1 つは、Chrome 拡張機能パッケージに含まれ、他のユーザーが変更またはコピーできない情報を使用することです。
    1. Chrome 拡張機能の ID をサーバーに送信していますか? しかし、どのように?
      • ID はあなたとあなたの JavaScript コードによって送信される必要があり、「内部」Chrome 関数でそれを行う方法はないようです。
      • したがって、他の誰かが同じ ID をサーバーに送信した場合 (ある種の Chrome 拡張機能の ID スプーフィング)、サーバーは彼の Chrome 拡張機能を本物と見なします!
    2. アプリケーションをパッケージ化したときに提供された秘密鍵を使用していますか? しかし、どのように?
      • プログラムでこのキーにアクセスしたり、何らかの方法で使用したりする方法はないようです!
  • もう 1 つの解決策は、NPAPI プラグインを使用し、GPG などの認証方法を埋め込むことです。しかし、この解決策は、API の docに大きな「警告」セクションがあるため、主に望ましくありません。
  • 他の解決策はありますか?

ノート

この質問は、Chrome 拡張機能の API で実際のセキュリティ問題を提起しようとしています: サービスとのやり取りに関して、Chrome 拡張機能の信頼性を確認する方法. 不足している可能性や誤解がある場合は、コメントでお気軽にお問い合わせください。

4

2 に答える 2

7

申し訳ありませんが、あなたが提起したこの問題は、単純な問題が 1 つあるため、本質的に解決できません。それは、クライアントを信頼できないということです。クライアントはコードを見ることができるので、問題を解決することはできません。

クライアント側からの情報は、他の方法で複製できます。これは、ユーザーが自分のアカウントにログインするときに、ユーザー名とパスワードを見つけた、または与えられたのは他の誰かではなく、実際にはそのユーザーであることを証明しようとするのと本質的に同じ問題です。

インターネット セキュリティ モデルは、第三者が 1 つを模倣したり、会話を変更したり、聞いたりすることなく通信しようとする 2 つの当事者を中心に構築されています。拡張機能のソース コードを非表示にしないと、クライアントはサード パーティと区別できなくなります (コピーの中のファイル - どれがどれであるかを判断する方法はありません)。

ソースコードが隠されている場合、それはまったく別の話になります。これで、ユーザーまたは悪意のある当事者は、実際のクライアントが知っている秘密にアクセスできなくなり、すべての通常のセキュリティ モデルが適用されます。ただし、Chrome が拡張機能に隠されたソース コードを許可するかどうかは疑わしいです。これは、他のセキュリティ上の問題を引き起こす可能性があるためです。

あなたが述べたように、NPAPIプラグインを使用して一部のソースコードを非表示にすることができますが、すでにご存知のように代償が伴います。


現在の状態に戻ります。

ここで、相互作用とは何を意味するのかという問題になります。

インタラクションを意味するのは、ユーザーがページにいる間に、それが拡張機能であるか他の拡張機能であるかを知りたい場合、ここに記載されているように、アプリセクションの下の拡張機能マニフェストにページをリストすることです。

これにより、アプリがインストールされているかどうかをページで尋ねることができます。

    chrome.app.isInstalled

これは、アプリがインストールされているかどうかを示すブール値を返します。コマンドはここに文書化されています

ただし、拡張機能がインストールされていても有効になっていない可能性があり、サイトとの通信を模倣する別の拡張機能があるため、これで問題が実際に解決されるわけではありません。

さらに、検証はクライアント側で行われるため、その検証を使用する関数を上書きして、この変数の結果を無視することができます。

ただし、相互作用が XMLHttpRequests を作成することを意味する場合は、運が悪いです。上記のようにソース コードが表示されるため、現在の方法を使用して実行することはできません。

ただし、サイトのユーザビリティを許可されたエンティティに制限している場合は、通常の認証手段を使用することをお勧めします。ユーザーがログインすると、セッションを作成できます。このセッションは、拡張機能によって行われたすべてのリクエストに伝播されるため、アカウント共有などの通常のクライアント ログインの信頼の問題が発生します。これらはもちろん、ほとんどが気が進まない Google アカウント経由でユーザー ログインを行うことで管理できます。共有し、悪用されていると思われるアカウントをブロックすることでさらに軽減されます。

于 2012-09-19T20:36:22.587 に答える
2

Git が使用するものと同様のことを行うことをお勧めします ( http://git-scm.com/book/en/Git-Internals-Git-Objectsを見て、 git の実装方法を理解してください)、つまり

chrome-extension 内のすべてのファイルのコンテンツの SHA1 値を作成し、以前に取得した連結された SHA1 値の別の SHA1 値を再作成します。

このようにして、誰かがファイルを変更した場合に備えて SHA1 値が変更されるため、SHA1 値をサーバーと共有し、拡張機能を認証できます。

擬似コードを使用して詳しく説明します。

function get_authentication_key(){

    var files = get_all_files_in_extension,
        concatenated_sha_values = '',
        authentication_key;

    for(file in files){
        concatenated_sha_values += Digest::SHA1.hexdigest(get_file_content(file));
    }

    $.ajax({
  url: 'http://example.com/getauthkey',
  type: 'post'
  async: false,
  success:function(data){
         authentication_key = data;
  }
    })

    //You may return either SHA value of concatenated values or return the concatenated SHA values
    return authentication_key;  
}

// Server side code
get('/getauthkey') do
    // One can apply several type of encryption algos on the string passed, to make it unbreakable
authentication_key = Digest::<encryption>.hexdigest($_GET['string']);
return authentication_key;
end

このメソッドを使用すると、画像ファイル、ビデオ ファイル、またはその他のファイルなど、何らかの種類のファイルが変更されたかどうかを確認できます。これも壊れるかどうか教えていただけると嬉しいです。

于 2012-09-21T12:50:26.593 に答える