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. 魔鬼肌肉人
    Google Chrome 75Google Chrome 75Android 5.1Android 5.1

    现在已养成用时开,不用时全部保持关闭,希望有点用

    回复
  2. 神秘人
    Google Chrome 85Google Chrome 85Windows 10/11Windows 10/11

    这个很不好,不过国内没法打开chrome的应用商店,很多都是跑去edge的
    edge有一个好 就是拓展页面可以自由打开(笑)

    回复
    1. saber 文章作者
      Google Chrome 85Google Chrome 85Windows 10/11Windows 10/11

      chrome 的审核我觉得不松的,但是恶心。
      我的pixiv下载器经常被权限相关的理由不过审,恶心死了
      相比之下 edge 的审核通过的更顺利

      回复
      1. locationiskey
        Google Chrome 86Google Chrome 86Windows 10/11Windows 10/11

        chrome商店有问题的又不是一次两次……
        edge?审核?不存在的。之前有个搬运加料版扩展的好几个月才封掉

        回复
        1. saber 文章作者
          Google Chrome 85Google Chrome 85Windows 10/11Windows 10/11

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

          回复
  3. dkjf
    Firefox 81Firefox 81Ubuntu x64Ubuntu x64

    国内有许多人无法访问 Chrome 应用商店,所以,大多数情况下,人们“都会”离线安装别人提供的扩展程序

    回复
    1. saber 文章作者
      Google Chrome 85Google Chrome 85Windows 10/11Windows 10/11

      对,这种情况不少的,我就离线安装了一个扩展。

      回复