当所有扩展都被禁用时,这个问题是否会发生?:是/否
- VS Code 版本:1.82.0-insider
- OS 版本:Linux x64 6.4.6-1-MANJARO
重现步骤:
- 创建一个不支持 shell 集成的 shell(例如 Julia)终端。
- 检查
VSCODE_NONCE
环境变量的值
通过扩展打开 Julia REPL 时,显示预期的警告:
2023-08-10 17:18:24.085 [warning] Shell integration cannot be enabled for executable "/home/pfitzseb/Documents/julia-1.8.5/bin/julia" and args ["-i","--banner=no","--project=/home/pfitzseb/.julia/environments/v1.9","--sysimage=/home/pfitzseb/Documents/Git/sysimgtest/sysimg.so","--project=/home/pfitzseb/Documents/Git/sysimgtest","--threads=auto","/home/pfitzseb/.vscode-insiders/extensions/julialang.language-julia-1.48.1/scripts/terminalserver/terminalserver.jl","/tmp/vsc-jl-repl-901c22ba-51e1-41a7-a1b6-4aacdc696676","/tmp/vsc-jl-cr-54bf6211-7f7f-4cdc-825c-e19c2557ca71","USE_REVISE=false","USE_PLOTPANE=true","USE_PROGRESS=true","ENABLE_SHELL_INTEGRATION=true","DEBUG_MODE=false"]
这是因为只有在 VS Code 检测到支持的 shell 时,才会注入环境变量(这意味着处理 shell 集成的脚本已经被打包):
vscode/src/vs/platform/terminal/node/terminalEnvironment.ts
6e2cace 中的第248行到第250行:
| | logService.warn(Shell integration cannot be enabled for executable "${shellLaunchConfig.executable}" and args
,shellLaunchConfig.args); |
| | returnundefined; |
| | } |
一个简单的解决方案是允许扩展在 vscode.window.createTerminal
中设置 nonce(然后由扩展负责仅启动能够正确处理并取消设置 VSCODE_NONCE
环境变量的 shell)。不确定这是否符合期望的安全标准 :)
5条答案
按热度按时间tyu7yeag1#
与其让
createTerminal
被设置,这对于未来的扩展作者来说可能会有点难以理解,不如我们直接在启用shell集成时总是设置VSCODE_NONCE
?这样我们就有这样的东西:
在这个if语句中:
vscode/src/vs/platform/terminal/node/terminalProcess.ts
99dad5d中的第203行到第204行
| | if(this._options.shellIntegration.enabled){ |
| | injection=getShellIntegrationInjection(this.shellLaunchConfig,this._options,this._ptyOptions.env,this._logService,this._productService); |
brgchamk2#
但是,随机数可用于在任何启动的shell中运行的任意程序,然后可以欺骗命令?
此外,
this._options.shellIntegration.enabled
是否直接从terminal.integrated.shellIntegration.enabled
设置派生,还是它还检查正在启动的shell?kdfy810k3#
好的点👍
我会看看是否很难允许扩展设置VSCODE_NONCE
snvhrwxg4#
现在我再次考虑这个问题:扩展提供的随机数可能没有太大的价值——重要的部分是扩展应该明确选择设置环境变量。
798qvoo85#
nonce目前没有做太多事情,但随着时间的推移,我希望它会被更多地使用。当我们在不先向用户展示的情况下重新运行命令时,我们需要nonce或用户确认。不过如果不是这样,也没关系,我会检查一下,因为这可能很容易。