跳到主要内容

工作区信任下插件不应该做什么?

结论​

工作区不受信任时,里面的代码、任务、配置都可能是别人仓库里的攻击载荷。插件不应该自动执行仓库里的任务、脚本、格式化钩子,也不应该加载仓库指定的可执行文件。

展开​

用户打开陌生文件夹时,编辑器可以处于受限模式。vscode.workspace.isTrusted 为 false。授予信任后会触发 onDidGrantWorkspaceTrust。

不受信任时不要做:

  • 自动运行 tasks.json、预提交钩子、Makefile、npm 脚本
  • 按仓库配置去 child_process 启动其中的二进制
  • 读取并执行仓库里让插件「安装推荐扩展」之外的任意命令
  • 把工作区内容送到网页视图里当 HTML 渲染而不做转义
  • 因为检测到某种配置文件就在 activate 里连上里面写的远程地址并带上密钥

可以做的:

  • 展示静态的只读界面
  • 提示用户信任之后才能启用检查
  • 解析不会执行代码的安全子集,并仍然把内容当不可信文本

清单里可以声明插件对不受信任工作区的支持方式。如果你的功能必须执行代码,就在未信任时保持不激活或功能关闭,而不是先执行再希望用户以后点信任。

信任是窗口级决策。多根时要理解编辑器对信任的定义是整个工作区,不要自己按文件夹悄悄放开。

容易讲错的点​

  • 受限模式不是只读文件系统。有的文件仍能读。能读不等于能跑。
  • 用户信任了工作区,也不表示网页内容可以 innerHTML。XSS 和信任是两层。
  • 不要用「开发者一般会信任」跳过判断。克隆下来的恶意仓库就是这个机制要防的东西。