JSHintを使用してJavaScriptファイルの脆弱性をスキャンしようとしています。具体的には、ブラウザ拡張機能のJavaScriptファイルをスキャンしています。考えられる脆弱性を探すために、eval
の使用など、JavaScriptの不適切なコーディング方法を探しています。 (JSHintには、eval
の使用を検出するオプションがあります。)
現在、無害な拡張機能をスキャンしています。何らかの方法でユーザーのセキュリティを危険にさらす可能性のある脆弱性を調査しています(些細なことかもしれません)。しかし、(eval
の使用、未使用の未定義変数の使用以外に)何を探す必要があるかわかりません。
誰かが私が探しているはずのものを提案できますか?
ブラウザ拡張機能では、脆弱性の影響はコンテキストと要求された権限に大きく依存します。コードをチェックする静的ツール(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では、拡張機能の開発者が特定のオリジンまたは機能にアクセスするための権限を宣言する必要があります。これらの宣言は次の場所にあります。
/manifest.json
。 match pattern および permission warnings を参照してください/<extension-name>.safariextension/Info.plist
。 アクセスと権限 を参照してください。/config.xml
。 config.xml
を参照してください。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.open
とpostMessage
を使用してメッセージを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フラグを削除する。これには、多すぎるページでコンテンツスクリプトを実行することも含まれます。
プライバシーの問題:
_gaq.Push
で検索)通常のベクトルのほとんどは、拡張にも関連しています。 https://www.owasp.org/ のチートシートを使用するか、 http://html5sec.org/ をご覧ください。
JSからJSを注入する一般的な方法。
ほとんどすべての状況で間違ったこと:
eval
new Function()
setTimeout
およびsetInterval
には、最初のパラメーターの文字列setAttribute
(または同等のフレームワーク、attr()
など)、on...
イベントハンドラー属性(または変数属性名)javascript:
URL限られた状況で必要になる可能性がありますが、最小限に抑え、残りのインスタンスを注意深く監査する必要があります。
createElement('script')
および本文の設定<script>
または<link>
への可変外部URLの割り当てinnerHTML
を、エスケープされていない変数で作成された文字列に設定します(例:div.innerHTML= '<p>'+message+'</p>'
)。通常は、DOMスタイルのコンテンツ作成メソッド(特に、簡単にするためのフレームワークが与えられている)に置き換えた方がよいでしょう。巨大な長いテーブルのようないくつかのケースでは、マークアップの作成を含むソリューションが必要になる場合があります.html()
、.append()
、.before()
など)(代わりに$('<div>', {dynamic attributes})
ショートカットを使用)場合によっては避けられないことがありますが、以下を確認する必要があります。
location
をナビゲートするとき、リンクを作成するとき、またはimage/object/iframe/etc src
(またはnew Image()
、またはCSS url()
プロパティ)を設定するときに、変数URLを使用します。危険なURLスキーム(javascript:
を含むがこれに限定されない)があるため、これらにはホワイトリストが必要です。これはブラウザ拡張で非常に一般的な問題であり、多くの場合、ユニバーサルXSSを実行します。style
要素/属性で設定されたコンテンツへのCSSインジェクション(バインディングや式などの危険なプロパティを使用してJSインジェクションに昇格)ブラウザー拡張機能にどのように適用されるかはわかりませんが、Webアプリでは通常、変数と連結されたハードコードされた文字列を探します。それはしばしば問題ではありませんが、生のユーザー入力からHTMLが作成されている場所を見つけるのに役立ちます。たとえば、コードは次のようになります。
var myHtml = "<h1>" + userinput + "</h1>";
ユーザー入力にはHTML(スクリプトを含む)が含まれる可能性があり、この方法で使用する前にHTMLエスケープする必要があるため、これは安全ではありません。
これは、ハードコードされた文字列が変数と連結されるケースを見つける正規表現です。
["']\s*\+|\+\s*["']