Saber 酱的抱枕

Fly me to the moon

10/8
2020
软件

Chrome 扩展在开发者模式下可以读取任意本地文件

如果我们把一个本地文件夹拖到浏览器里打开,大部分浏览器应该都会显示里面的文件和文件夹。就像这样:

这样的地址是本地文件协议,url 如:
file:///C:/
如果可以通过在浏览器里运行 js 代码,请求本地文件的 url,并且可以任意遍历、读取文件(也就是全盘扫描了),那太可怕了。
我的常识告诉我,浏览器出于安全原因肯定会阻止这一行为,所以这应该是不可行的。在普通的网页里请求本地文件确实不可行,但是在浏览器扩展的后台脚本里呢?今天 Reinford 告诉我在后台脚本里可以任意请求本地文件,我试了下还真可以。

首先自己建立一个 Chrome 扩展项目,手动加载到 Chrome 中。在清单文件 manifest.json 的权限字段 permissions 里加入 "<all_urls>" 来获得请求任意 url 的权限。
之后指定一个 js 文件作为后台脚本,在里面用 xhr 来请求任意本地地址即可。

假设我的一个 ssh 秘钥文件路径是:

C:\Users\user\.ssh\ssh1

发起请求:

const h = new XMLHttpRequest()
h.addEventListener('loadend', async () => {
  console.log(h.response)
})
h.open('GET', 'file:///C:/Users/user/.ssh/ssh1', true)
h.send()

没有任何阻碍,直接读取到了这个文件:

假如我被这样攻击了,那我的秘钥就泄露了。事实上这种请求方式可以任意遍历硬盘上的文件,所以攻击者可以获取到任何(能被 Chrome 浏览器读取的)文件并发送到远程服务器(假设有网络)。


这太可怕了,但还好,Chrome 应用商店发布的扩展都会经过审核,脚本主动去读取本地文件这种危险操作应该不会被通过。

上面的操作示例是用开发者模式手动加载的扩展(即未发布到 Chrome 应用商店),所以可以为所欲为。

虽然大多数情况下,人们不会离线安装别人提供的扩展程序,但是难免会有人遇到。我们需要对 Chrome 扩展的特权和安全性提高警惕了。

Chrome 扩展在开发者模式下可以读取任意本地文件

        1. saber 文章作者
          Google Chrome 85Google Chrome 85WindowsWindows

          chrome还有个蛋疼的问题,如果我频繁提交更新,比如一个月提交三四次新版本,极其容易被拒。搞得我现在一个月只敢提交一个新版本,这样没被拒过

          回复