工作区信任下插件不应该做什么?
结论
工作区不受信任时,里面的代码、任务、配置都可能是别人仓库里的攻击载荷。插件不应该自动执行仓库里的任务、脚本、格式化钩子,也不应该加载仓库指定的可执行文件。
展开
用户打开陌生文件夹时,编辑器可以处于受限模式。vscode.workspace.isTrusted 为 false。授予信任后会触发 onDidGrantWorkspaceTrust。
不受信任时不要做:
- 自动运行
tasks.json、预提交钩子、Makefile、npm 脚本 - 按仓库配置去
child_process启动其中的二进制 - 读取并执行仓库里让插件「安装推荐扩展」之外的任意命令
- 把工作区内容送到网页视图里当 HTML 渲染而不做转义
- 因为检测到某种配置文件就在
activate里连上里面写的远程地址并带上密钥
可以做的:
- 展示静态的只读界面
- 提示用户信任之后才能启用检查
- 解析不会执行代码的安全子集,并仍然把内容当不可信文本
清单里可以声明插件对不受信任工作区的支持方式。如果你的功能必须执行代码,就在未信任时保持不激活或功能关闭,而不是先执行再希望用户以后点信任。
信任是窗口级决策。多根时要理解编辑器对信任的定义是整个工作区,不要自己按文件夹悄悄放开。
容易讲错的点
- 受限模式不是只读文件系统。有的文件仍能读。能读不等于能跑。
- 用户信任了工作区,也不表示网页内容可以
innerHTML。XSS 和信任是两层。 - 不要用「开发者一般会信任」跳过判断。克隆下来的恶意仓库就是这个机制要防的东西。