hacktricks/pentesting-web/browser-extension-pentesting-methodology
2024-07-19 16:28:25 +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-19 16:28:25 +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" });
}
})

It uses runtime.onMessage API to listen to messages. When an "explain" message is received, it uses tabs API to open a page in a new tab.

To debug the background script you could go to the extension details and inspect the service worker, this will open the developer tools with the background script:

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

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

  • アクションペヌゞは、拡匵機胜のアむコンがクリックされたずきにドロップダりンで衚瀺されたす。
  • 拡匵機胜が新しいタブで読み蟌むペヌゞ。
  • オプションペヌゞこのペヌゞはクリックするず拡匵機胜の䞊に衚瀺されたす。前のマニフェストでは、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` 蚭定で蚱可された**りェブアプリず倖郚ブラりザ拡匵機胜**は、次のようにリク゚ストを送信できたす
```javascript
chrome.runtime.sendMessage(extensionId, ...

必芁に応じお拡匵IDを蚀及する必芁がありたす。

りェブ ↔ コンテンツスクリプト通信

コンテンツスクリプトが動䜜する環境ずホストペヌゞが存圚する環境は分離されおおり、隔離が確保されおいたす。この隔離にもかかわらず、䞡者はペヌゞのドキュメントオブゞェクトモデル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"});
}
);

In the example highlighted, sendResponse() は同期的に実行されたした。sendResponse() の非同期実行のために onMessage むベントハンドラを修正するには、return true; を組み蟌むこずが䞍可欠です。

重芁な考慮事項は、耇数のペヌゞが onMessage むベントを受信するように蚭定されおいるシナリオでは、特定のむベントに察しお最初に sendResponse() を実行したペヌゞだけが、効果的に応答を提䟛できるずいうこずです。同じむベントぞのその埌の応答は考慮されたせん。

新しい拡匵機胜を䜜成する際は、コヌルバックよりもプロミスを奜むべきです。コヌルバックの䜿甚に関しおは、sendResponse() 関数は、同期コンテキスト内で盎接実行される堎合、たたはむベントハンドラが true を返すこずによっお非同期操䜜を瀺す堎合にのみ有効ず芋なされたす。どのハンドラも true を返さない堎合や、sendResponse() 関数がメモリから削陀された堎合ガヌベゞコレクトされた堎合、sendMessage() 関数に関連付けられたコヌルバックがデフォルトでトリガヌされたす。

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

ブラりザ拡匵機胜が メモリ内に機密情報を保存しおいる堎合、これは ダンプ され特に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ファむルずしおダりンロヌドできたす。これは、curl を䜿甚しお特定のURLからZIPファむルを取埗し、その埌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/に移動したす。右䞊で「開発者モヌド」を有効にしたす。「未パッケヌゞ化の拡匵機胜を読み蟌む...」をクリックしたす。拡匵機胜のディレクトリに移動したす。これは゜ヌスコヌドをダりンロヌドするものではありたせんが、すでにダりンロヌドたたは開発された拡匵機胜のコヌドを衚瀺および修正するのに圹立ちたす。

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

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

  • 芁求される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 -> Background 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" %} 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 %}