web-dev-qa-db-ja.com

ブラウザーの拡張機能を脆弱にする、不適切なコーディング方法は何ですか?

JSHintを使用してJavaScriptファイルの脆弱性をスキャンしようとしています。具体的には、ブラウザ拡張機能のJavaScriptファイルをスキャンしています。考えられる脆弱性を探すために、evalの使用など、JavaScriptの不適切なコーディング方法を探しています。 (JSHintには、evalの使用を検出するオプションがあります。)

現在、無害な拡張機能をスキャンしています。何らかの方法でユーザーのセキュリティを危険にさらす可能性のある脆弱性を調査しています(些細なことかもしれません)。しかし、(evalの使用、未使用の未定義変数の使用以外に)何を探す必要があるかわかりません。

誰かが私が探しているはずのものを提案できますか?

14

ブラウザ拡張機能では、脆弱性の影響はコンテキストと要求された権限に大きく依存します。コードをチェックする静的ツール(JSHint、AMOバリデーター)は存在しますが、特に難読化されたコードの場合、100%信頼できるツールはありません。

したがって、一部のコードに脆弱性があるかどうかを示す魔法の正規表現を表示するのではなく、拡張機能のしくみに関する簡単な概要と、潜在的な拡張機能固有の問題の小さなリストを示します。

既存のツール

Addons.mozilla.orgで使用されているMozillaの静的コード分析ツールは、 AMO Validator として公開されています。このツールは、すべての Jetpack -ベースのアドオンで機能します。最初に、ホワイトリストに登録されたすべてのJSライブラリを(ハッシュによって)識別して除外します。次に、XPIアーカイブの残りのコンテンツに対して これらのテストケース を実行します。

他のベンダーのいずれもそのようなツールを公開していません。幸い、Chrome/Safari/Opera)の拡張機能(プラグインではない)は、Firefoxアドオンほどの権限を取得できません。

抽出

Firefox(xpi)およびOpera(oex)アドオンは、拡張子が異なるZipファイルです。
Chrome(crx)拡張は CRXヘッダー が前に付いたZipファイルです。
Safari(safariextz)拡張機能は、署名されたxarアーカイブです。

7-Zip は、これらのアーカイブをすべて抽出できます。

許可

Chrome、Safari、およびOperaでは、拡張機能の開発者が特定のオリジンまたは機能にアクセスするための権限を宣言する必要があります。これらの宣言は次の場所にあります。

Originのアクセスは、Firefoxアドオンでは設定できません。

コンテンツスクリプト/挿入されたスクリプト

すべての拡張環境は、事前定義されたURLパターンに一致するページでのコードの実行をサポートしています。これらはChrome/Firefoxではコンテンツスクリプトと呼ばれ、Opera/Safariではインジェクトスクリプトと呼ばれます。これらのスクリプトはページのDOMに直接アクセスできますが、直接アクセスできません。実行コンテキストが異なるため、ページのJavaScript変数に。

背景ページ

これらのページは、拡張機能の最も特権的な部分です。

脆弱性

文字列でsetTimeoutを使用するなどの明らかな間違い(これらはボビンスの回答ですでに言及されています)、または偶然ではない可能性が高い遠くフェッチされたメソッド(資格情報を取得する拡張機能など)については触れません。ページを悪意のあるWebサービスに送信します。

  • .innerHTMLまたはjQueryを使用してexternalHTMLを解析する( Stack Overflowに関するこの質問 を参照):

    // Example 1:
    var heading = $(xhr.responseText).find('h1').text();
    // Example 2:
    document.body.innerHTML += '';
    // For: <img src="bogus" onerror="do_something_evil_with_privileges()">
    
  • データの検証やwindow.onmessageの確認なしでのevent.Originイベントの使用。次の例では、サードパーティがwindow.openpostMessageを使用してメッセージをGmailに送信し、意図せず漏えいした機能を悪用する可能性があります。

    // Content script running on https://mail.google.com/mail/
    addEventListener('message', function(event) {
        if (event.data.type === 'send-mail') doSomething();
        // or:
        notifyBackgroundPage(event.data);
    });
    
  • 外部(JS)コードの読み込み(悪い:http経由で外部コードを読み込む)。外部ソースが侵害された場合、すべてのユーザーが悪用されやすくなります。

  • Crossrider および Kango などのクロスブラウザ拡張フレームワークの使用。これらは開発者にとって便利ですが、生成された拡張機能は不必要な数の権限を要求します。

  • 拡張APIの影響を十分に制限していない。極端な例:関連するサイトだけでなく、すべてのサイトのhttpOnly cookieフラグを削除する。これには、多すぎるページでコンテンツスクリプトを実行することも含まれます。

  • プライバシーの問題:

    • Googleアナリティクスなどのサービスの使用(_gaq.Pushで検索)
    • ソーシャルメディアボタンなどの外部アセットの読み込み。

通常のベクトルのほとんどは、拡張にも関連しています。 https://www.owasp.org/ のチートシートを使用するか、 http://html5sec.org/ をご覧ください。

9
Rob W

JSからJSを注入する一般的な方法。

ほとんどすべての状況で間違ったこと:

  • eval
  • new Function()
  • setTimeoutおよびsetIntervalには、最初のパラメーターの文字列
  • setAttribute(または同等のフレームワーク、attr()など)、on...イベントハンドラー属性(または変数属性名)
  • javascript: URL

限られた状況で必要になる可能性がありますが、最小限に抑え、残りのインスタンスを注意深く監査する必要があります。

  • createElement('script')および本文の設定
  • <script>または<link>への可変外部URLの割り当て
  • hTMLインジェクション経由-innerHTMLを、エスケープされていない変数で作成された文字列に設定します(例:div.innerHTML= '<p>'+message+'</p>')。通常は、DOMスタイルのコンテンツ作成メソッド(特に、簡単にするためのフレームワークが与えられている)に置き換えた方がよいでしょう。巨大な長いテーブルのようないくつかのケースでは、マークアップの作成を含むソリューションが必要になる場合があります
  • フレームワーク関数の背後に隠されたHTMLインジェクション(例:文字列引数で呼び出されるjQuery操作関数(.html().append().before()など)(代わりに$('<div>', {dynamic attributes})ショートカットを使用)

場合によっては避けられないことがありますが、以下を確認する必要があります。

  • locationをナビゲートするとき、リンクを作成するとき、またはimage/object/iframe/etc src(またはnew Image()、またはCSS url()プロパティ)を設定するときに、変数URLを使用します。危険なURLスキーム(javascript:を含むがこれに限定されない)があるため、これらにはホワイトリストが必要です。これはブラウザ拡張で非常に一般的な問題であり、多くの場合、ユニバーサルXSSを実行します。
  • style要素/属性で設定されたコンテンツへのCSSインジェクション(バインディングや式などの危険なプロパティを使用してJSインジェクションに昇格)
6
bobince

ブラウザー拡張機能にどのように適用されるかはわかりませんが、Webアプリでは通常、変数と連結されたハードコードされた文字列を探します。それはしばしば問題ではありませんが、生のユーザー入力からHTMLが作成されている場所を見つけるのに役立ちます。たとえば、コードは次のようになります。

var myHtml = "<h1>" + userinput + "</h1>";

ユーザー入力にはHTML(スクリプトを含む)が含まれる可能性があり、この方法で使用する前にHTMLエスケープする必要があるため、これは安全ではありません。

これは、ハードコードされた文字列が変数と連結されるケースを見つける正規表現です。

["']\s*\+|\+\s*["']
1
davidwebster48