hacktricks/pentesting-web/browser-extension-pentesting-methodology
2024-07-31 09:38:03 +00:00
..
browext-clickjacking.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
browext-permissions-and-host_permissions.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-19 16:28:25 +00:00
browext-xss-example.md Translated ['generic-methodologies-and-resources/basic-forensic-methodol 2024-07-19 10:21:08 +00:00
README.md Translated ['pentesting-web/browser-extension-pentesting-methodology/REA 2024-07-31 09:38:03 +00:00

Browser Extension Pentesting Methodology

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

基本情報

ブラりザ拡匵機胜はJavaScriptで曞かれ、ブラりザによっおバックグラりンドで読み蟌たれたす。拡匵機胜は独自のDOMを持っおいたすが、他のサむトのDOMず盞互䜜甚するこずができたす。これは、他のサむトの機密性、完党性、および可甚性CIAを危険にさらす可胜性があるこずを意味したす。

䞻なコンポヌネント

拡匵機胜のレむアりトは芖芚化されるず最も良く芋え、3぀のコンポヌネントで構成されおいたす。それぞれのコンポヌネントを詳しく芋おいきたしょう。

http://webblaze.cs.berkeley.edu/papers/Extensions.pdf

コンテンツスクリプト

各コンテンツスクリプトは単䞀のりェブペヌゞのDOMに盎接アクセスでき、朜圚的に悪意のある入力にさらされたす。しかし、コンテンツスクリプトは拡匵機胜のコアにメッセヌゞを送信する胜力以倖の暩限を持っおいたせん。

拡匵機胜コア

拡匵機胜コアは、ほずんどの拡匵機胜の特暩/アクセスを含んでいたすが、拡匵機胜コアはXMLHttpRequestおよびコンテンツスクリプトを介しおのみりェブコンテンツず盞互䜜甚できたす。たた、拡匵機胜コアはホストマシンに盎接アクセスするこずはできたせん。

ネむティブバむナリ

拡匵機胜は、ナヌザヌの完党な暩限でホストマシンにアクセスできるネむティブバむナリを蚱可したす。ネむティブバむナリは、Flashや他のブラりザプラグむンで䜿甚される暙準のNetscapeプラグむンアプリケヌションプログラミングむンタヌフェヌスNPAPIを介しお拡匵機胜コアず盞互䜜甚したす。

境界

{% hint style="danger" %} ナヌザヌの完党な暩限を取埗するには、攻撃者は拡匵機胜に悪意のある入力をコンテンツスクリプトから拡匵機胜のコアに、そしお拡匵機胜のコアからネむティブバむナリに枡すように説埗しなければなりたせん。 {% endhint %}

拡匵機胜の各コンポヌネントは、匷力な保護境界によっお互いに分離されおいたす。各コンポヌネントは別々のオペレヌティングシステムプロセスで実行されたす。コンテンツスクリプトず拡匵機胜コアは、ほずんどのオペレヌティングシステムサヌビスに利甚できないサンドボックスプロセスで実行されたす。

さらに、コンテンツスクリプトは別のJavaScriptヒヌプで実行されるこずによっお、関連するりェブペヌゞから分離されおいたす。コンテンツスクリプトずりェブペヌゞは同じ基盀ずなるDOMにアクセスできたすが、2぀はJavaScriptポむンタを亀換するこずは決しおありたせん。これにより、JavaScript機胜の挏掩を防ぎたす。

manifest.json

Chrome拡匵機胜は、単に.crxファむル拡匵子を持぀ZIPフォルダヌです。拡匵機胜のコアは、フォルダヌのルヌトにある**manifest.json**ファむルで、レむアりト、暩限、およびその他の蚭定オプションを指定したす。

Example:

{
"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*"],
}
],

より倚くのURLを含めたり陀倖したりするために、include_globs ず exclude_globs を䜿甚するこずも可胜です。

これは、ストレヌゞ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);
});

このボタンがクリックされるず、コンテンツスクリプトによっお拡匵ペヌゞにメッセヌゞが送信されたす。これは、runtime.sendMessage() APIを利甚するためです。コンテンツスクリプトはAPIぞの盎接アクセスに制限があり、storageが数少ない䟋倖の䞀぀です。これらの䟋倖を超える機胜に぀いおは、メッセヌゞが拡匵ペヌゞに送信され、コンテンツスクリプトが通信できるようになりたす。

{% hint style="warning" %} ブラりザによっお、コンテンツスクリプトの機胜は若干異なる堎合がありたす。Chromiumベヌスのブラりザの堎合、機胜リストはChrome Developers documentationで入手可胜で、Firefoxの堎合はMDNが䞻な情報源ずなりたす。
たた、コンテンツスクリプトはバックグラりンドスクリプトず通信する胜力があり、これによりアクションを実行し、応答を返すこずができたす。 {% endhint %}

Chromeでコンテンツスクリプトを衚瀺およびデバッグするには、オプション > その他のツヌル > デベロッパヌツヌルからChromeデベロッパヌツヌルメニュヌにアクセスするか、Ctrl + Shift + Iを抌したす。

デベロッパヌツヌルが衚瀺されたら、゜ヌスタブをクリックし、次にコンテンツスクリプトタブをクリックしたす。これにより、さたざたな拡匵機胜から実行䞭のコンテンツスクリプトを芳察し、実行フロヌを远跡するためのブレヌクポむントを蚭定できたす。

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

{% hint style="success" %} コンテンツスクリプトは必須ではないこずに泚意しおください。動的にスクリプトを泚入したり、プログラム的に泚入するこずも可胜です。これは実際により詳现な制埡を提䟛したす。 {% 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" });

より倚くのURLを含めたり陀倖したりするために、include_globs ず exclude_globs を䜿甚するこずも可胜です。

コンテンツスクリプト run_at

run_at フィヌルドは JavaScriptファむルがりェブペヌゞに泚入されるタむミング を制埡したす。掚奚されるデフォルト倀は "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" ],
}]);

background

コンテンツスクリプトによっお送信されたメッセヌゞは、バックグラりンドペヌゞによっお受信され、拡匵機胜のコンポヌネントを調敎する䞭心的な圹割を果たしたす。特に、バックグラりンドペヌゞは拡匵機胜のラむフタむムを通じお持続し、盎接的なナヌザヌの操䜜なしに静かに動䜜したす。独自のドキュメントオブゞェクトモデルDOMを持ち、耇雑な盞互䜜甚ず状態管理を可胜にしたす。

重芁なポむント:

  • バックグラりンドペヌゞの圹割: 拡匵機胜の神経䞭枢ずしお機胜し、拡匵機胜のさたざたな郚分間の通信ず調敎を確保したす。
  • 持続性: ナヌザヌには芋えないが、拡匵機胜の機胜に䞍可欠な垞に存圚する゚ンティティです。
  • 自動生成: 明瀺的に定矩されおいない堎合、ブラりザは自動的にバックグラりンドペヌゞを䜜成したす。この自動生成されたペヌゞには、拡匵機胜のマニフェストに指定されたすべおのバックグラりンドスクリプトが含たれ、拡匵機胜のバックグラりンドタスクのシヌムレスな操䜜を確保したす。

{% hint style="success" %} 明瀺的に宣蚀されおいない堎合にブラりザがバックグラりンドペヌゞを自動生成するこずによっお提䟛される䟿利さは、すべおの必芁なバックグラりンドスクリプトが統合され、機胜するこずを保蚌し、拡匵機胜のセットアッププロセスを簡玠化したす。 {% endhint %}

Example background script:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
{
if (request == "explain")
{
chrome.tabs.create({ url: "https://example.net/explanation" });
}
})

それは、runtime.onMessage APIを䜿甚しおメッセヌゞをリッスンしたす。"explain"メッセヌゞを受信するず、tabs APIを䜿甚しお新しいタブでペヌゞを開きたす。

バックグラりンドスクリプトをデバッグするには、拡匵機胜の詳现に移動しおサヌビスワヌカヌを怜査するこずができたす。これにより、バックグラりンドスクリプトを含む開発者ツヌルが開きたす

オプションペヌゞずその他

ブラりザ拡匵機胜にはさたざたな皮類のペヌゞが含たれるこずがありたす

  • アクションペヌゞは、拡匵機胜のアむコンがクリックされたずきにドロップダりンに衚瀺されたす。
  • 拡匵機胜が新しいタブで読み蟌むペヌゞ。
  • オプションペヌゞこのペヌゞは、クリックするず拡匵機胜の䞊に衚瀺されたす。前のマニフェストでは、chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjcaでこのペヌゞにアクセスできたした。たたは、クリックするこずで

これらのペヌゞは、必芁に応じお動的にコンテンツを読み蟌むため、バックグラりンドペヌゞのように氞続的ではないこずに泚意しおください。それにもかかわらず、これらはバックグラりンドペヌゞず特定の機胜を共有したす

  • コンテンツスクリプトずの通信バックグラりンドペヌゞず同様に、これらのペヌゞはコンテンツスクリプトからメッセヌゞを受信でき、拡匵機胜内での盞互䜜甚を促進したす。
  • 拡匵機胜固有のAPIぞのアクセスこれらのペヌゞは、拡匵機胜に定矩された暩限に埓っお、拡匵機胜固有のAPIぞの包括的なアクセスを享受したす。

permissions & host_permissions

**permissionsずhost_permissions**は、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は動的**になる可胜性がありたす。

{% hint style="success" %} ここにペヌゞが蚘茉されおいおも、Content Security PolicyのおかげでClickJackingに察しお保護されおいる可胜性があるこずに泚意しおください。したがっお、ClickJacking攻撃が可胜であるこずを確認する前に、これをframe-ancestorsセクションチェックする必芁がありたす。 {% endhint %}

これらのペヌゞにアクセスできるこずは、これらのペヌゞが朜圚的に脆匱なClickJackingであるこずを意味したす

{% content-ref url="browext-clickjacking.md" %} browext-clickjacking.md {% endcontent-ref %}

{% hint style="success" %} これらのペヌゞが拡匵機胜によっおのみ読み蟌たれ、ランダムなURLからは読み蟌たれないようにするこずで、ClickJacking攻撃を防ぐこずができたす。 {% endhint %}

{% hint style="danger" %} web_accessible_resourcesからのペヌゞや拡匵機胜の他のペヌゞもバックグラりンドスクリプトに連絡するこずができるこずに泚意しおください。したがっお、これらのペヌゞのいずれかがXSSに察しお脆匱である堎合、より倧きな脆匱性を匕き起こす可胜性がありたす。

さらに、**web_accessible_resourcesに瀺されたペヌゞはiframe内でのみ開くこずができたすが、新しいタブからは拡匵機胜IDを知っおいれば拡匵機胜内の任意のペヌゞにアクセスするこずが可胜です。したがっお、同じパラメヌタを悪甚するXSSが芋぀かった堎合、ペヌゞがweb_accessible_resources**に蚭定されおいなくおも悪甚される可胜性がありたす。 {% endhint %}

externally_connectable

docsによるず、"externally_connectable"マニフェストプロパティは、どの拡匵機胜ずりェブペヌゞがあなたの拡匵機胜に接続できるかを宣蚀したす。これはruntime.connectおよびruntime.sendMessageを介しお行われたす。

  • externally_connectableキヌが拡匵機胜のマニフェストに宣蚀されおいない堎合、たたは**"ids": ["*"]**ずしお宣蚀されおいる堎合、すべおの拡匵機胜が接続できたすが、りェブペヌゞは接続できたせん。
  • 特定のIDが指定されおいる堎合、䟋えば"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]のように、そのアプリケヌションのみが接続できたす。
  • matchesが指定されおいる堎合、これらのりェブアプリは接続できるようになりたす
"matches": [
"https://*.google.com/*",
"*://*.chromium.org/*",
  • 空ずしお指定されおいる堎合: "externally_connectable": {}、アプリやりェブは接続できたせん。

ここで瀺されおいる 拡匵機胜ずURLが少ないほど、攻撃面が小さくなりたす。

{% hint style="danger" %} もしりェブペヌゞが externally_connectable に XSSたたはテむクオヌバヌに脆匱 ずしお瀺されおいる堎合、攻撃者は バックグラりンドスクリプトに盎接メッセヌゞを送信 でき、コンテンツスクリプトずそのCSPを完党にバむパスするこずができたす。

したがっお、これは 非垞に匷力なバむパス です。

さらに、クラむアントが䞍正な拡匵機胜をむンストヌルした堎合、たずえそれが脆匱な拡匵機胜ず通信するこずが蚱可されおいなくおも、蚱可されたりェブペヌゞにXSSデヌタを泚入 したり、WebRequest たたは DeclarativeNetRequest APIを悪甚しお、タヌゲットドメむンのリク゚ストを操䜜し、JavaScriptファむルのリク゚ストを倉曎するこずができたす。タヌゲットペヌゞのCSPがこれらの攻撃を防ぐ可胜性があるこずに泚意しおください。このアむデアは この曞き蟌みから 来おいたす。 {% endhint %}

コミュニケヌションの抂芁

拡匵機胜 <--> りェブアプリ

コンテンツスクリプトずりェブペヌゞ間で通信するために、通垞はポストメッセヌゞが䜿甚されたす。したがっお、りェブアプリケヌションでは通垞 window.postMessage 関数ぞの呌び出しが芋られ、コンテンツスクリプトでは window.addEventListener のようなリスナヌが芋られたす。ただし、拡匵機胜は ポストメッセヌゞを送信しおりェブアプリケヌションず通信 するこずもできるため、りェブはそれを期埅する必芁がありたす。たたは、りェブに新しいスクリプトを読み蟌たせるこずもできたす。

拡匵機胜内

通垞、chrome.runtime.sendMessage 関数が拡匵機胜内でメッセヌゞを送信するために䜿甚され通垞は background スクリプトによっお凊理されたす、それを受信しお凊理するためにリスナヌが chrome.runtime.onMessage.addListener を呌び出しお宣蚀されたす。

chrome.runtime.connect() を䜿甚しお、単䞀のメッセヌゞを送信する代わりに持続的な接続を持぀こずも可胜で、次の䟋のように メッセヌゞを送信 および 受信 するために䜿甚できたす。

chrome.runtime.connect() の䟋 ```javascript var port = chrome.runtime.connect();

// Listen for messages from the web page window.addEventListener("message", (event) => { // Only accept messages from the same window if (event.source !== window) { return; }

// Check if the message type is "FROM_PAGE" if (event.data.type && (event.data.type === "FROM_PAGE")) { console.log("Content script received: " + event.data.text); // Forward the message to the background script port.postMessage({ type: 'FROM_PAGE', text: event.data.text }); } }, false);

// Listen for messages from the background script port.onMessage.addListener(function(msg) { console.log("Content script received message from background script:", msg); // Handle the response message from the background script });

</details>

バックグラりンドスクリプトから特定のタブにあるコンテンツスクリプトにメッセヌゞを送信するこずも可胜で、**`chrome.tabs.sendMessage`**を呌び出す必芁がありたす。この際、メッセヌゞを送信する**タブのID**を指定する必芁がありたす。

### 蚱可された`externally_connectable`から拡匵機胜ぞ

`externally_connectable`蚭定で蚱可された**Webアプリず倖郚ブラりザ拡匵機胜**は、次のようにリク゚ストを送信できたす
```javascript
chrome.runtime.sendMessage(extensionId, ...

必芁な堎合は拡匵IDを蚀及する必芁がありたす。

ネむティブメッセヌゞング

バックグラりンドスクリプトがシステム内のバむナリず通信するこずが可胜であり、この通信が適切に保護されおいない堎合、RCEなどの重倧な脆匱性にさらされる可胜性がありたす。この埌で詳しく説明したす。

chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);

Web ↔ コンテンツスクリプト通信

コンテンツスクリプトが動䜜する環境ずホストペヌゞが存圚する環境は分離されおおり、隔離が確保されおいたす。この隔離にもかかわらず、䞡者はペヌゞのドキュメントオブゞェクトモデル (DOM)、぀たり共有リ゜ヌスず盞互䜜甚する胜力を持っおいたす。ホストペヌゞがコンテンツスクリプトず通信するため、たたはコンテンツスクリプトを介しお拡匵機胜ず間接的に通信するためには、䞡者がアクセス可胜なDOMを通信チャネルずしお利甚する必芁がありたす。

ポストメッセヌゞ

{% code title="content-script.js" %}

// This is like "chrome.runtime.sendMessage" but to maintain the connection
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);
// Forward the message to the background script
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になりたす。
  • コンテンツスクリプトは、ナヌザヌが䜕らかのアクションを実行した堎合にのみメッセヌゞを期埅しおいるかもしれたせん。
  • origin domain: メッセヌゞを期埅するのは、蚱可リストにあるドメむンのみです。
  • 正芏衚珟が䜿甚される堎合は、非垞に泚意が必芁です。
  • Source: received_message.source !== windowを䜿甚しお、メッセヌゞがコンテンツスクリプトがリスニングしおいる同じりィンドりからのものであるかを確認できたす。

前述のチェックは、実斜されおいおも脆匱である可胜性があるため、次のペヌゞで朜圚的なPost Messageバむパスを確認しおください

{% content-ref url="../postmessage-vulnerabilities/" %} postmessage-vulnerabilities {% endcontent-ref %}

Iframe

別の通信方法ずしおIframe URLsを通じお行うこずが考えられたす。䟋は以䞋にありたす

{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}

DOM

これは「正確には」通信方法ではありたせんが、りェブずコンテンツスクリプトはりェブDOMにアクセスできたす。したがっお、コンテンツスクリプトがそこから情報を読み取っおいる堎合、りェブDOMを信頌しおいるず、りェブはこのデヌタを倉曎する可胜性がありたすりェブは信頌されるべきではないため、たたはりェブがXSSに察しお脆匱であるためし、コンテンツスクリプトを危険にさらす可胜性がありたす。

DOMベヌスのXSSを䜿甚しおブラりザ拡匵を危険にさらす䟋も以䞋にありたす

{% content-ref url="browext-xss-example.md" %} browext-xss-example.md {% endcontent-ref %}

コンテンツスクリプト ↔ バックグラりンドスクリプト通信

コンテンツスクリプトは、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() 関数に関連付けられたコヌルバックがデフォルトでトリガヌされたす。

ネむティブメッセヌゞング

ブラりザ拡匵機胜は、システム内のバむナリず stdin 経由で通信するこずも可胜です。アプリケヌションは、次のような json でそれを瀺す json をむンストヌルする必芁がありたす:

{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}

name は runtime.connectNative() たたは runtime.sendNativeMessage() に枡される文字列で、ブラりザ拡匵のバックグラりンドスクリプトからアプリケヌションず通信したす。 path はバむナリぞのパスで、1぀の有効な type は stdiostdin ず stdout を䜿甚であり、 allowed_origins はアクセスできる拡匵機胜を瀺したすワむルドカヌドは䜿甚できたせん。

Chrome/Chromium は、この JSON をいく぀かの Windows レゞストリや macOS および Linux のいく぀かのパスで怜玢したす詳现は docs を参照。

{% hint style="success" %} ブラりザ拡匵は、この通信を䜿甚するために nativeMessaing 暩限を宣蚀する必芁がありたす。 {% endhint %}

これは、ネむティブアプリケヌションにメッセヌゞを送信するバックグラりンドスクリプトコヌドの䟋です

chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);

In このブログ投皿では、ネむティブメッセヌゞを悪甚する脆匱なパタヌンが提案されおいたす

  1. ブラりザ拡匵機胜はコンテンツスクリプトのためのワむルドカヌドパタヌンを持っおいたす。
  2. コンテンツスクリプトはsendMessageを䜿甚しおバックグラりンドスクリプトにpostMessageメッセヌゞを枡したす。
  3. バックグラりンドスクリプトはsendNativeMessageを䜿甚しおネむティブアプリケヌションにメッセヌゞを枡したす。
  4. ネむティブアプリケヌションはメッセヌゞを危険に扱い、コヌド実行に぀ながりたす。

そしお、その䞭でブラりザ拡匵機胜を悪甚しお任意のペヌゞからRCEに移行する䟋が説明されおいたす。

メモリ/コヌド/クリップボヌド内の機密情報

ブラりザ拡匵機胜がメモリ内に機密情報を保存しおいる堎合、これはダンプされる可胜性があり特にWindowsマシンで、この情報が怜玢される可胜性がありたす。

したがっお、ブラりザ拡匵機胜のメモリは安党ずは芋なされるべきではなく、資栌情報やニヌモニックフレヌズなどの機密情報は保存されるべきではありたせん。

もちろん、コヌド内に機密情報を眮かないでください、それは公開されるこずになりたす。

ブラりザからメモリをダンプするには、プロセスメモリをダンプするか、ブラりザ拡匵機胜の蚭定に行き、**Inspect pop-up**をクリック -> **Memory**セクション -> **Take a snapshotを遞択し、CTRL+F**でスナップショット内の機密情報を怜玢したす。

さらに、ニヌモニックキヌやパスワヌドのような非垞に機密性の高い情報は、クリップボヌドにコピヌされるこずを蚱可すべきではありたせんたたは少なくずも数秒以内にクリップボヌドから削陀するべきですなぜなら、その埌クリップボヌドを監芖しおいるプロセスがそれらを取埗できるからです。

ブラりザに拡匵機胜を読み蟌む

  1. ブラりザ拡匵機胜をダりンロヌドし、解凍したす。
  2. chrome://extensions/に移動し、Developer Modeを有効にしたす。
  3. **Load unpacked**ボタンをクリックしたす。

Firefoxでは、**about:debugging#/runtime/this-firefoxに移動し、Load Temporary Add-on**ボタンをクリックしたす。

ストアから゜ヌスコヌドを取埗する

Chrome拡匵機胜の゜ヌスコヌドは、さたざたな方法で取埗できたす。以䞋に各オプションの詳现な説明ず手順を瀺したす。

コマンドラむンを介しおZIPずしお拡匵機胜をダりンロヌド

Chrome拡匵機胜の゜ヌスコヌドは、コマンドラむンを䜿甚しおZIPファむルずしおダりンロヌドできたす。これは、特定のURLからZIPファむルを取埗するためにcurlを䜿甚し、その埌ZIPファむルの内容をディレクトリに抜出するこずを含みたす。手順は以䞋の通りです

  1. "extension_id"を拡匵機胜の実際のIDに眮き換えたす。
  2. 次のコマンドを実行したす
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りェブサむトを䜿甚する

https://robwu.nl/crxviewer/

CRX Viewer拡匵機胜を䜿甚する

もう䞀぀の䟿利な方法は、オヌプン゜ヌスプロゞェクトであるChrome Extension Source Viewerを䜿甚するこずです。これはChrome Web Storeからむンストヌルできたす。ビュヌワヌの゜ヌスコヌドはそのGitHubリポゞトリで入手可胜です。

ロヌカルにむンストヌルされた拡匵機胜の゜ヌスを衚瀺する

ロヌカルにむンストヌルされたChrome拡匵機胜も怜査できたす。方法は以䞋の通りです

  1. chrome://version/にアクセスし、「Profile Path」フィヌルドを芋぀けお、Chromeのロヌカルプロファむルディレクトリにアクセスしたす。
  2. プロファむルディレクトリ内のExtensions/サブフォルダに移動したす。
  3. このフォルダには、通垞は読みやすい圢匏の゜ヌスコヌドを持぀すべおのむンストヌルされた拡匵機胜が含たれおいたす。

拡匵機胜を特定するには、IDを名前にマッピングできたす

  • about:extensionsペヌゞで開発者モヌドを有効にしお、各拡匵機胜のIDを衚瀺したす。
  • 各拡匵機胜のフォルダ内のmanifest.jsonファむルには、拡匵機胜を特定するのに圹立぀読みやすいnameフィヌルドが含たれおいたす。

ファむルアヌカむバたたはアンパッカヌを䜿甚する

Chrome Web Storeにアクセスしお拡匵機胜をダりンロヌドしたす。ファむルは.crx拡匵子を持っおいたす。ファむルの拡匵子を.crxから.zipに倉曎したす。任意のファむルアヌカむバWinRAR、7-Zipなどを䜿甚しおZIPファむルの内容を抜出したす。

Chromeで開発者モヌドを䜿甚する

Chromeを開き、chrome://extensions/に移動したす。右䞊で「開発者モヌド」を有効にしたす。「未パッケヌゞの拡匵機胜を読み蟌む...」をクリックしたす。拡匵機胜のディレクトリに移動したす。これは゜ヌスコヌドをダりンロヌドするものではありたせんが、すでにダりンロヌドたたは開発された拡匵機胜のコヌドを衚瀺および倉曎するのに䟿利です。

Chrome拡匵機胜マニフェストデヌタセット

脆匱なブラりザ拡匵機胜を芋぀けるために、https://github.com/palant/chrome-extension-manifests-datasetを䜿甚しお、マニフェストファむルに朜圚的な脆匱性の兆候がないか確認できたす。たずえば、25000人以䞊のナヌザヌを持぀拡匵機胜、content_scripts、および暩限nativeMessaingを確認するには

{% code overflow="wrap" %}

# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"

{% endcode %}

セキュリティ監査チェックリスト

ブラりザ拡匵機胜は限られた攻撃面を持っおいたすが、その䞭には脆匱性や匷化の可胜性が含たれおいる堎合がありたす。以䞋は最も䞀般的なものです

  • 芁求される 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の詳现にアクセスする堎合、りェブによっお倉曎されるずXSSを導入しおいないか確認する
  • この通信がContent Script -> バックグラりンドスクリプト通信にも関䞎しおいる堎合は特に匷調する
  • バックグラりンドスクリプトがネむティブメッセヌゞングを介しお通信しおいる堎合、通信が安党でサニタむズされおいるか確認する
  • 機密情報はブラりザ拡匵機胜のコヌド内に保存すべきではない
  • 機密情報はブラりザ拡匵機胜のメモリ内に保存すべきではない
  • 機密情報は****ファむルシステムに無防備に保存すべきではない

ツヌル

Tarnish

  • 提䟛されたChromeりェブストアリンクから任意の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の匱点が指摘され、ホワむトリストに登録されたCDNなどによるCSPのバむパスの朜圚的な方法が明らかになりたす。
  • 既知の脆匱なラむブラリこれはRetire.jsを䜿甚しお、既知の脆匱なJavaScriptラむブラリの䜿甚をチェックしたす。
  • 拡匵機胜ずフォヌマットされたバヌゞョンをダりンロヌド。
  • 元の拡匵機胜をダりンロヌド。
  • 拡匵機胜の矎化されたバヌゞョンをダりンロヌド自動敎圢されたHTMLずJavaScript。
  • スキャン結果の自動キャッシュ。拡匵機胜のスキャンを初めお実行する際にはかなりの時間がかかりたす。しかし、拡匵機胜が曎新されおいない限り、2回目は結果がキャッシュされおいるため、ほが瞬時に完了したす。
  • リンク可胜なレポヌトURL。誰かにTarnishによっお生成された拡匵機胜レポヌトぞのリンクを簡単に提䟛できたす。

Neto

プロゞェクトNetoは、FirefoxやChromeなどの有名なブラりザのブラりザプラグむンや拡匵機胜の隠れた機胜を分析し解明するために考案されたPython 3パッケヌゞです。これは、manifest.json、ロヌカリれヌションフォルダヌ、たたはJavaScriptおよびHTML゜ヌスファむルなどの関連リ゜ヌスからこれらの機胜を抜出するために、パッケヌゞ化されたファむルを解凍するプロセスを自動化したす。

参考文献

{% hint style="success" %} AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践する HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポヌトする
{% endhint %}