.. | ||
browext-clickjacking.md | ||
browext-permissions-and-host_permissions.md | ||
browext-xss-example.md | ||
README.md |
ブラウザ拡張機能の侵入テスト方法論
htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい場合やHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksのグッズを入手する
- The PEASS Familyを発見し、独占的なNFTsのコレクションを見つける
- **💬 Discordグループ**に参加するか、telegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローする
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
基本情報
ブラウザ拡張機能はJavaScriptで書かれ、ブラウザによってバックグラウンドで読み込まれます。それは自身のDOMを持っていますが、他のサイトのDOMとやり取りすることができます。これは他のサイトの機密性、整合性、可用性(CIA)を危険にさらす可能性があります。
主要コンポーネント
拡張機能のレイアウトは視覚化された際に最も見栄えが良く、3つのコンポーネントで構成されています。それぞれのコンポーネントを詳しく見てみましょう。
コンテンツスクリプト
各コンテンツスクリプトは単一のWebページのDOMに直接アクセスでき、したがって潜在的に悪意のある入力にさらされます。ただし、コンテンツスクリプトには、拡張機能コアにメッセージを送信する権限以外はありません。
拡張機能コア
拡張機能コアには、拡張機能のほとんどの権限/アクセスが含まれていますが、拡張機能コアはXMLHttpRequestおよびコンテンツスクリプトを介してWebコンテンツとのやり取りしかできません。また、拡張機能コアはホストマシンに直接アクセスする権限はありません。
ネイティブバイナリ
拡張機能には、ユーザーの完全な権限でホストマシンにアクセスできるネイティブバイナリが含まれています。ネイティブバイナリは、Flashや他のブラウザプラグインで使用される標準のNetscapeプラグインアプリケーションプログラミングインターフェース(NPAPI)を介して拡張機能コアとやり取りします。
境界
{% hint style="danger" %} ユーザーの完全な権限を取得するには、攻撃者はコンテンツスクリプトから拡張機能コアへの悪意のある入力と、拡張機能コアからネイティブバイナリへの悪意のある入力を拡張機能に説得する必要があります。 {% endhint %}
拡張機能の各コンポーネントは、強力な保護境界によって互いに分離されています。各コンポーネントは別々のオペレーティングシステムプロセスで実行されます。コンテンツスクリプトと拡張機能コアは、ほとんどのオペレーティングシステムサービスには利用できないサンドボックスプロセスで実行されます。
さらに、コンテンツスクリプトは別々のJavaScriptヒープで実行され、関連するWebページから分離されます。コンテンツスクリプトとWebページは同じ基礎となるDOMにアクセスできますが、2つはJavaScriptポインタを交換することはなく、JavaScript機能の漏洩を防ぎます。
manifest.json
Chrome拡張機能は、.crxファイル拡張子を持つZIPフォルダーです。拡張機能のコアは、フォルダーのルートにある**manifest.json
**ファイルで、レイアウト、権限、その他の構成オプションを指定します。
例:
{
"manifest_version": 2,
"name": "My extension",
"version": "1.0",
"permissions": [
"storage"
],
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
"background": {
"scripts": [
"background.js"
]
},
"options_ui": {
"page": "options.html"
}
}
content_scripts
コンテンツスクリプトは、ユーザーが一致するページに移動するたびにロードされます。この場合、https://example.com/*
式に一致するページと*://*/*/business*
正規表現に一致しないページです。これらはページ自体のスクリプトのように実行され、ページのDocument Object Model (DOM)に任意のアクセス権を持ちます。
"content_scripts": [
{
"js": [
"script.js"
],
"matches": [
"https://example.com/*",
"https://www.example.com/*"
],
"exclude_matches": ["*://*/*business*"],
}
],
**include_globs
とexclude_globs
**を使用して、さらにURLを含めたり除外したりすることも可能です。
これは、ページに説明ボタンを追加するコンテンツスクリプトの例です。これは、ストレージAPIを使用して、拡張機能のストレージからmessage
値を取得するために使用されます。
chrome.storage.local.get("message", result =>
{
let div = document.createElement("div");
div.innerHTML = result.message + " <button>Explain</button>";
div.querySelector("button").addEventListener("click", () =>
{
chrome.runtime.sendMessage("explain");
});
document.body.appendChild(div);
});
このボタンがクリックされると、コンテンツスクリプトによって拡張機能ページにメッセージが送信されます。これは、storage
が例外の中にあるAPIに直接アクセスできないというコンテンツスクリプトの制限によるものです。これらの例外を超える機能が必要な場合、メッセージが拡張機能ページに送信され、コンテンツスクリプトが通信できます。
{% hint style="warning" %}
ブラウザによっては、コンテンツスクリプトの機能がわずかに異なる場合があります。Chromiumベースのブラウザでは、機能のリストはChrome Developers documentationで利用可能であり、FirefoxではMDNが主要な情報源となります。
また、コンテンツスクリプトはバックグラウンドスクリプトと通信する能力を持ち、アクションを実行し、応答を返すことができます。
{% endhint %}
Chromeでコンテンツスクリプトを表示およびデバッグするには、Chromeの開発者ツールメニューにアクセスし、Options > More tools > Developer toolsを選択するか、Ctrl + Shift + Iを押します。
開発者ツールが表示されたら、Sourceタブをクリックし、次にContent Scriptsタブをクリックします。これにより、さまざまな拡張機能から実行中のコンテンツスクリプトを観察し、実行フローを追跡するためのブレークポイントを設定できます。
注入されたコンテンツスクリプト
{% hint style="success" %}
コンテンツスクリプトは必須ではないことに注意してください。動的にスクリプトを注入したり、tabs.executeScript
を使用してウェブページにプログラム的に注入することも可能です。これにより、より細かい制御が可能になります。
{% endhint %}
コンテンツスクリプトをプログラム的に注入するには、スクリプトを注入するページに対してホスト権限が必要です。これらの権限は、拡張機能のマニフェスト内でそれらを要求するか、activeTabを介して一時的にセキュリティを確保することができます。
activeTabベースの拡張機能の例
{% code title="manifest.json" %}
{
"name": "My extension",
...
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"action": {
"default_title": "Action Button"
}
}
{% endcode %}
- クリック時にJSファイルをインジェクトする:
// content-script.js
document.body.style.backgroundColor = "orange";
//service-worker.js - Inject the JS file
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
files: ["content-script.js"]
});
});
- クリック時に関数を注入する:
//service-worker.js - Inject a function
function injectedFunction() {
document.body.style.backgroundColor = "orange";
}
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target : {tabId : tab.id},
func : injectedFunction,
});
});
スクリプト権限の例
// service-workser.js
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
excludeMatches : [ "*://*/*business*" ],
js : [ "contentScript.js" ],
}]);
// Another example
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
Content Scripts run_at
run_at
フィールドは、JavaScriptファイルがWebページに注入されるタイミングを制御します。推奨されるデフォルト値は"document_idle"
です。
可能な値は次のとおりです:
document_idle
:可能な限りdocument_start
:css
からのファイルの後、ただし他のDOMが構築される前や他のスクリプトが実行される前にdocument_end
:DOMが完全になった直後、ただし画像やフレームなどのサブリソースが読み込まれる前
manifest.json
を介して
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["https://*.example.com/*"],
"run_at": "document_idle",
"js": ["contentScript.js"]
}
],
...
}
**service-worker.js
**を介して
chrome.scripting.registerContentScripts([{
id : "test",
matches : [ "https://*.example.com/*" ],
runAt : "document_idle",
js : [ "contentScript.js" ],
}]);
バックグラウンド
コンテンツスクリプトによって送信されるメッセージは、バックグラウンドページによって受信され、拡張機能のコンポーネントを調整する中心的な役割を果たします。特筆すべきは、バックグラウンドページが拡張機能の寿命を通じて持続し、直接的なユーザーとのやり取りなしに静かに動作します。独自のDocument Object Model(DOM)を持ち、複雑な相互作用や状態管理を可能にします。
主なポイント:
- バックグラウンドページの役割: 拡張機能の中で通信と調整を確実にする神経中枢として機能します。
- 持続性: ユーザーには見えないが、拡張機能の機能性には不可欠な、常に存在するエンティティです。
- 自動生成: 明示的に定義されていない場合、ブラウザは自動的にバックグラウンドページを作成します。この自動生成されたページには、拡張機能のマニフェストで指定されたすべてのバックグラウンドスクリプトが含まれ、拡張機能のバックグラウンドタスクのシームレスな動作を保証します。
{% hint style="success" %} ブラウザがバックグラウンドページを自動的に生成することで(明示的に宣言されていない場合)、必要なすべてのバックグラウンドスクリプトが統合され、操作されることで、拡張機能のセットアッププロセスが合理化されます。 {% endhint %}
例:バックグラウンドスクリプト:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
ランタイム.onMessage APIを使用してメッセージを受信します。 "explain"
メッセージを受信すると、tabs APIを使用して新しいタブでページを開きます。
バックグラウンドスクリプトのデバッグには、拡張機能の詳細を表示してサービスワーカーを検査することができます。これにより、バックグラウンドスクリプトが表示された開発者ツールが開きます:
オプションページおよびその他
ブラウザ拡張機能にはさまざまな種類のページが含まれます:
- アクションページは、拡張機能アイコンをクリックするとドロップダウンで表示されます。
- 拡張機能が新しいタブで読み込むページ。
- オプションページ:このページは、クリックすると拡張機能の上に表示されます。前のマニフェストでは、
chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca
でこのページにアクセスできました。または、以下をクリックしてください:
これらのページは、バックグラウンドページのように永続的ではなく、必要に応じて動的にコンテンツを読み込みます。しかし、これらのページはバックグラウンドページと同様の機能を共有しています:
- コンテンツスクリプトとの通信: バックグラウンドページと同様に、これらのページはコンテンツスクリプトからメッセージを受信し、拡張機能内での相互作用を容易にします。
- 拡張機能固有のAPIへのアクセス: これらのページは、拡張機能固有のAPIに包括的にアクセスでき、拡張機能に定義された権限に従います。
permissions
およびhost_permissions
permissions
およびhost_permissions
は、ブラウザ拡張機能が持つどの権限(ストレージ、位置情報など)とどのWebページに対して権限を持つかを示すmanifest.json
からのエントリです。
ブラウザ拡張機能は非常に特権的であるため、悪意のある拡張機能や侵害された拡張機能は、攻撃者に機密情報を盗み出したりユーザーを監視するための異なる手段を提供する可能性があります。
これらの設定がどのように機能し、どのように悪用される可能性があるかを確認してください:
{% content-ref url="browext-permissions-and-host_permissions.md" %} browext-permissions-and-host_permissions.md {% endcontent-ref %}
content_security_policy
コンテンツセキュリティポリシーはmanifest.json
内にも宣言できます。定義されている場合、脆弱になる可能性があります。
ブラウザ拡張機能ページのデフォルト設定はかなり制限的です:
script-src 'self'; object-src 'self';
CSPとバイパスの可能性についての詳細は、以下を参照してください:
{% content-ref url="../content-security-policy-csp-bypass/" %} content-security-policy-csp-bypass {% endcontent-ref %}
web_accessible_resources
ウェブページがブラウザ拡張機能のページ(たとえば.html
ページ)にアクセスするためには、このページをmanifest.json
の**web_accessible_resources
**フィールドに記載する必要があります。
例:
{
...
"web_accessible_resources": [
{
"resources": [ "images/*.png" ],
"matches": [ "https://example.com/*" ]
},
{
"resources": [ "fonts/*.woff" ],
"matches": [ "https://example.com/*" ]
}
],
...
}
これらのページは次のようなURLでアクセスできます:
chrome-extension://<extension-id>/message.html
公開拡張機能では、extension-id がアクセス可能です:
ただし、manifest.json
パラメータ use_dynamic_url
が使用されている場合、この id は動的になる可能性があります。
これらのページにアクセスできることで、これらのページは 潜在的に ClickJacking の脆弱性を持つ可能性があります:
{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}
{% hint style="success" %} これらのページがランダムな URL ではなく拡張機能のみによって読み込まれるようにすると、ClickJacking 攻撃を防ぐことができます。 {% endhint %}
externally_connectable
ドキュメントによると、"externally_connectable"
マニフェスト プロパティは、runtime.connect および runtime.sendMessage を介して拡張機能に接続できる どの拡張機能と Web ページが接続できるか を宣言します。
- 拡張機能のマニフェストに
externally_connectable
キーが宣言されていないか、"ids": ["*"]
として宣言されている場合、すべての拡張機能が接続できますが、Web ページは接続できません。 "ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]
のように 特定の ID が指定されている場合、それらのアプリケーションのみが接続できます。- 一致が指定されている場合、これらの Web アプリケーションが接続できます:
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
- もし**
"externally_connectable": {}
**として指定されている場合、どのアプリやウェブサイトも接続できません。
ここで指定されている拡張機能やURLが少ないほど、攻撃面が小さくなります。
{% hint style="danger" %}
もし**externally_connectable
でXSSや接収に脆弱なウェブページが指定されている場合、攻撃者はバックグラウンドスクリプトに直接メッセージを送信**することができ、Content ScriptとそのCSPを完全にバイパスできます。
したがって、これは非常に強力なバイパスです。 {% endhint %}
ウェブ ↔︎ Content Scriptの通信
コンテンツスクリプトが動作する環境とホストページが存在する環境はお互いに分離されており、隔離が保たれています。 この隔離にもかかわらず、両者はページのDocument Object Model (DOM)、共有リソースに対して相互作用する能力を持っています。 ホストページがコンテンツスクリプトと通信したり、コンテンツスクリプトを介して拡張機能と間接的に通信するためには、両者がアクセス可能なDOMを通信チャネルとして利用する必要があります。
ポストメッセージ
{% code title="content-script.js" %}
var port = chrome.runtime.connect();
window.addEventListener("message", (event) => {
// We only accept messages from ourselves
if (event.source !== window) {
return;
}
if (event.data.type && (event.data.type === "FROM_PAGE")) {
console.log("Content script received: " + event.data.text);
port.postMessage(event.data.text);
}
}, false);
{% endcode %}
{% code title="example.js" %}
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
{type : "FROM_PAGE", text : "Hello from the webpage!"}, "*");
}, false);
{% endcode %}
セキュアなPost Message通信は、受信したメッセージの信頼性を確認する必要があります。これは以下の方法で行うことができます:
event.isTrusted
: この値は、イベントがユーザーのアクションによってトリガーされた場合にのみTrueです。- コンテンツスクリプトは、ユーザーが特定のアクションを実行した場合にのみメッセージを期待するかもしれません。
- オリジンドメイン: メッセージを期待するのは特定のドメインのみかもしれません。
- 正規表現を使用する場合は非常に注意してください。
- ソース:
received_message.source !== window
は、Content Scriptがリスニングしている同じウィンドウからのメッセージかどうかをチェックするために使用できます。
前述のチェックは、実行されていても脆弱性がある可能性があるため、次のページで潜在的なPost Messageバイパスをチェックしてください:
{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}
Iframe
もう1つの通信方法はIframe URLを介したものです。例は以下で見つけることができます:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
DOM
これは厳密には通信方法ではありませんが、webとコンテンツスクリプトはweb DOMにアクセスできます。したがって、コンテンツスクリプトがそれから情報を読み取っている場合、web DOMを信頼している場合、webはそのデータを変更できる可能性があります(webは信頼できないため、またはXSSの脆弱性があるため)そしてContent Scriptを危険にさらす可能性があります。
ブラウザ拡張機能を危険にさらすDOMベースのXSSの例も以下で見つけることができます:
{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}
メモリ/コード内の機密情報
ブラウザ拡張機能がメモリ内に機密情報を保存している場合、これは(特にWindowsマシンで)ダンプされ、この情報を検索する可能性があります。
したがって、ブラウザ拡張機能のメモリは安全ではないと見なすべきであり、資格情報やニーモニックフレーズなどの機密情報は保存されてはいけません。
もちろん、コード内に機密情報を入れないでください。それは公開されることになります。
Content Script ↔︎ Background Script Communication
Content Scriptは、runtime.sendMessage() または tabs.sendMessage() 関数を使用してワンタイムのJSONシリアライズ可能なメッセージを送信できます。
応答を処理するには、返されたPromiseを使用します。ただし、後方互換性のために、最後の引数としてコールバックを渡すこともできます。
コンテンツスクリプトからリクエストを送信する方法は次のようになります:
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
拡張機能(通常はバックグラウンドスクリプト)からリクエストを送信します。コンテンツスクリプトは、指定したタブに送信する必要があります。選択したタブのコンテンツスクリプトにメッセージを送信する方法の例:
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
// do something with response here, not outside the function
console.log(response);
})();
受信側では、メッセージを処理するためにruntime.onMessage イベントリスナーを設定する必要があります。これはコンテンツスクリプトや拡張機能ページから見ても同じように見えます。
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.greeting === "hello")
sendResponse({farewell: "goodbye"});
}
);
例で強調されているように、sendResponse()
は同期的に実行されました。sendResponse()
を非同期に実行するために onMessage
イベントハンドラを変更するには、return true;
を組み込むことが重要です。
重要な考慮事項として、複数のページが onMessage
イベントを受信するシナリオでは、特定のイベントに対して最初に sendResponse()
を実行するページだけが効果的に応答を配信できます。同じイベントへの後続の応答は考慮されません。
新しい拡張機能を作成する際は、コールバックではなくプロミスを使用することが好ましいです。コールバックの使用に関しては、sendResponse()
関数は、同期的なコンテキスト内で直接実行される場合、またはイベントハンドラが非同期操作を示すために true
を返す場合にのみ有効と見なされます。ハンドラがどれも true
を返さない場合や、sendResponse()
関数がメモリから削除される(ガベージコレクトされる)と、sendMessage()
関数に関連付けられたコールバックがデフォルトでトリガーされます。
ブラウザでの拡張機能の読み込み
- ブラウザ拡張機能をダウンロードして解凍します
chrome://extensions/
に移動し、開発者モード
を有効にしますアンパックされた拡張機能を読み込む
ボタンをクリックします
Firefox の場合は、about:debugging#/runtime/this-firefox
に移動し、一時的なアドオンを読み込む
ボタンをクリックします。
ストアからソースコードを取得
Chrome 拡張機能のソースコードはさまざまな方法で取得できます。以下に各オプションの詳細な説明と手順を示します。
コマンドラインを使用して ZIP 形式で拡張機能をダウンロード
Chrome 拡張機能のソースコードは、コマンドラインを使用して ZIP ファイルとしてダウンロードできます。これには、curl
を使用して特定の URL から ZIP ファイルを取得し、その後 ZIP ファイルの内容をディレクトリに展開する必要があります。以下に手順を示します:
"extension_id"
を実際の拡張機能の ID に置き換えます。- 次のコマンドを実行します:
extension_id=your_extension_id # Replace with the actual extension ID
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
unzip -d "$extension_id-source" "$extension_id.zip"
CRX Viewerウェブサイトを使用する
CRX Viewer拡張機能を使用する
もう1つの便利な方法は、オープンソースプロジェクトであるChrome Extension Source Viewerを使用することです。Chrome Web Storeからインストールできます。ビューアのソースコードは、GitHubリポジトリで入手できます。
ローカルにインストールされた拡張機能のソースを表示する
ローカルにインストールされたChrome拡張機能も検査できます。以下の方法で行います:
chrome://version/
にアクセスし、"Profile Path"フィールドを見つけてChromeのローカルプロファイルディレクトリにアクセスします。- プロファイルディレクトリ内の
Extensions/
サブフォルダに移動します。 - このフォルダには、通常、読みやすい形式でソースコードが含まれているすべてのインストールされた拡張機能が含まれています。
拡張機能を識別するために、それらのIDを名前にマッピングできます:
about:extensions
ページで開発者モードを有効にして、各拡張機能のIDを表示します。- 各拡張機能のフォルダ内にある
manifest.json
ファイルには、拡張機能を識別するのに役立つ読みやすいname
フィールドが含まれています。
ファイルアーカイバまたはアンパッカーを使用する
Chrome Web Storeに移動して、拡張機能をダウンロードします。ファイルの拡張子は.crx
になります。
ファイルの拡張子を.zip
に変更します。
WinRAR、7-Zipなどのファイルアーカイバを使用して、ZIPファイルの内容を抽出します。
Chromeの開発者モードを使用する
Chromeを開いてchrome://extensions/
に移動します。
右上の「開発者モード」を有効にします。
「パッケージ化されていない拡張機能を読み込む」をクリックします。
拡張機能のディレクトリに移動します。
これによりソースコードはダウンロードされませんが、すでにダウンロードされたり開発された拡張機能のコードを表示および変更するのに便利です。
セキュリティ監査チェックリスト
ブラウザ拡張機能は攻撃面が限られていますが、一部には脆弱性や強化の余地がある場合があります。以下は最も一般的なものです:
- 要求される**
permissions
を可能な限り制限**する - 可能な限り**
host_permissions
を制限**する - 強力な **
content_security_policy
**を使用する - 必要がない場合は**
externally_connectable
を可能な限り制限し、デフォルトで残さずに{}
**を指定する - ここでXSSや乗っ取りに脆弱なURLが言及されている場合、攻撃者はバックグラウンドスクリプトに直接メッセージを送信できます。非常に強力なバイパスです。
- 可能な限り**
web_accessible_resources
**を制限し、可能であれば空にしてください。 - もし**
web_accessible_resources
**がない場合は、ClickJackingをチェックしてください - 拡張機能からウェブページへの通信が発生する場合、通信によって引き起こされるXSS脆弱性をチェックしてください。
- Post Messagesが使用されている場合は、Post Messageの脆弱性をチェックしてください。
- Content ScriptがDOMの詳細にアクセスする場合は、それらがWebによって変更された場合にXSSを導入していないかを確認してください
- この通信がContent Script -> Background script通信にも関与している場合は特に注意してください
- ブラウザ拡張機能の中に機密情報を保存すべきではありません
- ブラウザ拡張機能の中に機密情報を保存すべきではありません
ツール
Tarnish
- 提供されたChrome Webstoreリンクから任意のChrome拡張機能を取得します。
- manifest.json ビューア:拡張機能のマニフェストのJSON整形バージョンを簡単に表示します。
- フィンガープリント解析:web_accessible_resourcesの検出およびChrome拡張機能のフィンガープリントJavaScriptの自動生成。
- 潜在的なClickjacking解析:web_accessible_resourcesディレクティブが設定された拡張機能HTMLページの検出。これらはページの目的に応じてClickjackingの脆弱性があります。
- 許可警告ビューア:ユーザーが拡張機能をインストールしようとすると表示されるすべてのChrome許可プロンプト警告のリストを表示します。
- 危険な機能:攻撃者によって悪用される可能性のある危険な機能の場所を表示します(例:innerHTML、chrome.tabs.executeScriptなどの機能)。
- エントリーポイント:拡張機能がユーザー/外部入力を受け入れる場所を表示します。これは拡張機能の表面積を理解し、悪意のあるデータを拡張機能に送信する潜在的なポイントを探すのに役立ちます。
- 危険な機能とエントリーポイントのスキャナーは、生成されたアラートに次のものを持っています:
- アラートを引き起こした関連するコードスニペットと行。
- 問題の説明。
- アラートを引き起こしたファイル全体を表示するための「ファイルを表示」ボタン。
- アラートされたファイルのパス。
- アラートされたファイルの完全なChrome拡張機能URI。
- JavaScriptファイル内の脆弱な行が含まれている場合、それが含まれているすべてのページのパスと、これらのページのタイプ、web_accessible_resourceのステータス。
- コンテンツセキュリティポリシー(CSP)アナライザーおよびバイパスチェッカー:拡張機能のCSPの弱点を指摘し、ホワイトリストによるCSPのバイパス方法を明らかにします。
- 既知の脆弱なライブラリ:Retire.jsを使用して既知の脆弱なJavaScriptライブラリの使用をチェックします。
- 拡張機能とフォーマットされたバージョンをダウンロードします。
- オリジナルの拡張機能をダウンロードします。
- 拡張機能の美しく整形されたバージョンをダウンロードします(自動整形されたHTMLおよびJavaScript)。
- スキャン結果の自動キャッシュ化。拡張機能のスキャンを実行すると、最初の実行ではかなりの時間がかかりますが、2回目以降は、拡張機能が更新されていない限り、結果がキャッシュされているためほぼ即座になります。
- リンク可能なレポートURL、Tarnishによって生成された拡張機能レポートへのリンクを簡単に他の人にリンクできます。
Neto
Project Netoは、FirefoxやChromeなどのよく知られたブラウザ用のプラグインや拡張機能の隠れた機能を分析し解明するために設計されたPython 3パッケージです。このパッケージは、パッケージ化されたファイルを解凍して、manifest.json
、ローカライゼーションフォルダ、JavaScriptおよびHTMLソースファイルからこれらの機能を抽出するプロセスを自動化します。
参考文献
- この方法論の支援に感謝します@naivenom
- https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing
- https://palant.info/2022/08/10/anatomy-of-a-basic-extension/
- https://palant.info/2022/08/24/attack-surface-of-extension-pages/
- https://palant.info/2022/08/31/when-extension-pages-are-web-accessible/
- https://help.passbolt.com/assets/files/PBL-02-report.pdf
- https://developer.chrome.com/docs/extensions/develop/concepts/content-scripts
- https://developer.chrome.com/docs/extensions/mv2/background-pages
- https://thehackerblog.com/kicking-the-rims-a-guide-for-securely-writing-and-auditing-chrome-extensions/
- https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0