VSCode终端中运行的Node.js脚本未进入沙箱,仅Extension Host、Language Server和Webview受沙箱保护;真正限制系统调用需依赖Node.js v20+的--experimental-permission等实验性参数。

VSCode里Node脚本根本没进沙箱,别被名字骗了
VSCode自身没有为终端中运行的 node 命令提供任何沙箱保护——你在集成终端里敲 node app.js,它就是个普通系统进程,和你在 CMD 或 PowerShell 里直接运行完全一样。所谓“VSCode沙箱”只覆盖 Extension Host、Language Server 和 Webview 这三类组件,不碰你手写的脚本。想靠 VSCode 自动隔离用户代码?不存在的。
真正能限制 Node 系统调用的只有 --experimental-permission
Node.js v20+ 提供的 --experimental-permission 是目前唯一能在启动时硬性拦截 fs.readFile、fetch、child_process.spawn 等行为的机制。但它默认关闭,且不设白名单等于没开。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
-
--deny-net比留空--allow-net更可靠,显式拒绝比默认放行更安全 -
--allow-fs-read=/home/user/project必须用绝对路径,/tmp不等于/tmp/../etc/passwd,Node 会做规范化校验 -
--allow-env=NODE_ENV,LANG而不是--allow-env,空参数会继承全部环境变量 -
--allow-child-process风险极高,除非明确需要spawn('git'),否则一律禁用
launch.json 调试时权限链容易断在 PowerShell 策略上
按 F5 启动调试却卡住、断点灰掉、控制台没输出,大概率不是代码问题,而是 PowerShell 执行策略拦住了 npm 封装脚本或 shell 启动器。
- 先在终端运行
get-ExecutionPolicy -Scope CurrentUser,确认返回RemoteSigned -
program字段必须指向.js或.ts文件,比如"${workspaceFolder}/src/server.js" - 别写成
"${workspaceFolder}/start.sh"—— PowerShell 默认禁止执行未签名脚本,连./start.sh都会被拒 - 改完策略后必须关掉再开终端,
reload window不生效
vm2 是唯一能落地的第三方沙箱方案,但得绕过 require 缓存
vm2 是目前最实用的运行时沙箱,但它无法阻止 require('fs') 从宿主进程缓存中取模块——如果宿主已加载过 fs,沙箱里仍能拿到原生 fs 实例,权限配置形同虚设。
- 必须配合
require.context = 'sandbox'强制重置模块上下文 -
builtin: ['fs', 'path']只允许加载,不等于允许任意读写;fs.writeFile仍需额外校验路径是否在root内 -
external: ['lodash']要求node_modules/lodash在root下存在,否则报Cannot find module - 永远不要给
child_process、process、globalThis白名单,它们是逃逸主通道
--allow-fs-write 已废弃,现在必须用 --allow-fs-write-dir 指定可写目录——这种细节稍不注意,就等于没设防。

















