Grammarly For Chrome扩展任意用户劫持漏洞分析

01

综述

2018年02月02日,Grammarly官方更新了Grammarly for Chrome 14.826.1446版本,其中修复了一个严重漏洞,在此之前的版本中此扩展能够向所有网站曝光用户的令牌信息,导致任意网站都可以访问并修改用户在Grammarly上的文档,词典,访问历史,日志信息,用户信息等敏感数据。Grammarly官方当日立即修复此漏洞,与2月5日关闭此Bug。

攻击难度:低。

危害程度:高。

影响版本:≤ 14.826.1446。

官方修复情况如下:目前官方已经发布最新版本14.826.1446

02

什么是Grammarly

Grammarly 是一款拥有1000w+用户的国外厂商开发的语法检查应用,提供了浏览器扩展、网页版、 Mac 版和 Windows 版。如果你使用 Windows,Grammarly 还提供了 Word 插件,下载后可以在 Word 内部调用插件直接检查语法错误,我也是Grammarly的忠实用户之一。

Grammarly 可以实现实时语法检查,你边写它就边改,语法问题和修改意见会以标注的形式显示在文档的右侧,方便你去一一查看,而且在每条批注下面都会配有详细的解释,告诉你哪里错了,为什么要这样修改。当你出现错误的内容可以存入用户字典或者文档中。关于Grammarly的厉害之处请看参考链接中的视频。

03

漏洞分析

从网络上下载老版本的扩展插件,这里我们使用最新版之前的一个版本14.825.1439(参考链接中可下载历史版本),然后解压插件包,主要代码都在\extension_14_825_1439_0\src\js\Grammarly.js文件中,代码很多,但是主要核心漏洞代码如下图所示:

这里在返回的Message对象中,当返回的数据data.action=user,并且data.Grammarly=true时,调用sendUser()函数,在sendUser()函数中直接将user对象返回了,此user对象中包括了用户的所有信息,包括email,firstName,grauth等敏感信息,所以导致任意网站都可以通过触发message事件,通过postMessage操作获取Grammarly用户的敏感信息。

因为Grammarly的很多接口登录认证只需要grauth这个token值就可以直接访问,所以通过恶意获取用户grauth值之后就可以随意操作用户的数据信息了。

04

漏洞验证及利用

在官方的漏洞详情中,漏洞作者给出了在浏览器console中执行几行代码即可触发漏洞,如下图所示:

下面来解释一下这四行代码的意思:

1、将当前DOM中的节点元素置为可编辑状态(默认不可编辑); 2、返回文档中匹配指定的选择器组的第一个元素,这里返回[data-action=”editor”]的节点元素并执行点击操作; 3、返回class=gr_-ifr的iframe节点元素对象,再通过contentWindow得到iframe包含页面的window对象,最后将此对象注册到一个指定的监听器上,当该对象触发指定的事件message时,回调并执行匿名函数; 4、通过postMessage触发时间,并发送用户数据。

最后控制台上将返回用户信息中的email和grauth信息,如下图效果:

通过获取到grauth内容后,发送附带grauth cookie内容(grauth未失效)的请求到Grammarly接口即可获取对应用户数据,如下图访问用户的文档:

其他可利用接口如下:

虽然这里可以证明漏洞,但是并没有充分利用此漏洞将其危害体现出来。漏洞报告中提到任意网站都可以获取用户敏感信息,那就是说我们创建一个恶意网站,只要安装Grammarly for Chrome插件的用户访问到我们的网站就会被劫持,下面我们来实现此利用场景。

首先我们的站点页面必须存在可编辑文本的功能,比如<textarea>,这样才能自动调出Grammarly功能,所以我们构建如下页面即可:

这里已经成功指出我们的语法错误,这时点击右下角的图标即可进行相关操作了。然后我们在此页面中加入构造好的js代码,在编辑区触发此js代码即可:

最后将我们构造好的站点发送给受害者,当受害者访问此网站时,鼠标移动到编辑区即可触发漏洞,发送用户email和grauth内容到攻击者服务器,如下图我们的服务器上收到的用户信息:

备注:这里只进行局部测试,攻击方法可行,未进行任何非法操作及数据收集。

05

漏洞修复

在2018年02月02日更新的14.826.1446最新版本中,已经修复此漏洞,在代码中直接将用户的敏感信息删除掉,如下图修复代码对比:

在Chrome中安装最新版本后,通过console调试也可以看出返回的data.user信息中已经没有email和grauth等敏感信息了,如下图所示:

使用Grammarlyfor Chrome的用户请及时更新避免被恶意攻击者劫持导致信息泄露被滥用。

06

参考链接

https://youtu.be/wOxVMRwLfjU

https://www.crx4chrome.com/history/2722/

https://bugs.chromium.org/p/project-zero/issues/detail?id=1527

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-02-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LinXunFeng的专栏

hexo+github 搭建个人技术博客

19830
来自专栏编程

爬虫基本原理完全梳理及常用解析方式

什么是爬虫:即网络爬虫,可以理解为在网络上爬行的一只蜘蛛,互联网可以比喻为一张大网,一只蜘蛛在爬行时遇到了所需的资源就可以把它爬取下来。简单来说,爬虫就是请求网...

22970
来自专栏Java开发

Shiro缓存整合EhCache

但是shiro的授权将会是大量的数据,shiro的授权缓存是默认开启的,接下来我们将对shiro的缓冲使用EhCache来管理,之后授权时只有用户第一次访问系统...

57420
来自专栏cnblogs

前端打包成桌面应用、以及chrome扩展

     前段时间在利用工作之余开发了tomato timer这个蕃茄钟,然后部署到github.io上,由于greatway太厉害,偶尔会有打不开的情况。上周...

262100
来自专栏Web项目聚集地

Git简洁教程-本地项目推送到GitHub

Git是当今最流行的版本控制软件,它包含了许多高级工具,这里小编就讲一下Git的安装和使用,怎样推送到自己的远程仓库。

12720
来自专栏python学习路

一、Django的基本用法

学习Django有一段时间了,整理一下,充当笔记。盗张图: ? MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性...

33450
来自专栏BeJavaGod

权限框架 - shiro 简单入门实例

前面的帖子简单的介绍了基本的权限控制,可以说任何一个后台管理系统都是需要权限的 今天开始咱们来讲讲Shiro 首先引入基本的jar包 ? 项目工程结构: ? 创...

40590
来自专栏小程序的道路

小程序的数据请求

然后我们随便在input框输入一个值,点击查询,我们会发现通过接口交互,可以拿到请求api的对应返回操作结果

22960
来自专栏Hongten

Struts2 Path (getContextPath,basePath)

struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

23230
来自专栏木制robot技术杂谈

懒人神器 autoenv

前言 每次去不同的项目下运行程序都要更改相对应的 Python 环境,那么有什么办法可以省去这繁琐的一步吗?答案肯定是有的,Kenneth Reitz 已经为我...

45060

扫码关注云+社区

领取腾讯云代金券