不要克隆那个仓库:Visual Studio Code的二次方代码执行
2020年3月16日 - 作者:Filippo Cremonese
这是我偶然发现Visual Studio Code Python扩展中一个代码执行漏洞的故事。该扩展在市场上报告的安装量超过1650万次。
漏洞详情
前段时间,我在审查一个客户的Python Web应用时注意到一个警告
好吧,我想,我只需要安装pylint。
令我惊讶的是,在运行pip install --user pylint后警告仍然存在。
然后我注意到编辑器窗口左下角显示的venv-test。VSCode是否自动从项目文件夹中选择了Python环境?!为了证实我的假设,我在该虚拟环境中安装了pylint,警告消失了。
这看起来很可疑,于是我在pylint的某个源文件中添加了os.exec("/Applications/Calculator.app"),然后计算器就启动了。这是有史以来最简单的代码执行!
VSCode的行为很危险,因为在没有用户交互的情况下就激活了项目文件夹中找到的虚拟环境。只需将恶意文件夹添加到工作区并在项目中打开一个python文件就足以触发该漏洞。
一旦发现虚拟环境,VSCode会将其路径保存在.vscode/settings.json中。如果在克隆的仓库中找到此值,它会不加询问地加载并信任该值。实际上,可以将虚拟环境隐藏在任何仓库中。
概念验证
你可以自己尝试!这个无害的PoC仓库会在macOS上打开Calculator.app:
git clone git@github.com:doyensec/VSCode_PoC_Oct2019.git- 将克隆的仓库添加到VSCode工作区
- 在VSCode中打开
test.py
这个仓库包含一个"恶意"的settings.json,它选择了totally_innocuous_folder/no_seriously_nothing_to_see_here中的虚拟环境。
对于像这样的简单仓库,注意到虚拟环境可能很容易,但在真实的代码库中很容易被忽略。此外,VSCode仅仅通过在编辑器中打开Python文件就执行来自文件夹的代码,这显然是不可取的。
披露时间线
-
2019年10月2日:发现问题
-
2019年10月2日:向微软发送安全建议
-
2020年1月7日:向微软询问解决时间表
-
2020年1月8日:微软回复称问题应在2020年4月中旬修复
-
2020年3月16日:Doyensec发布安全建议和博客文章
编辑
- 2020年3月17日:博客文章声称该扩展默认与编辑器捆绑。事实并非如此,我们已删除该声明。感谢@justinsteven指出这一点!