漏洞详情
某次审计客户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)
可尝试以下无害PoC代码库(macOS系统将打开计算器):
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日:向微软提交安全建议
- 2019年10月8日:微软回应,在vscode-python问题跟踪器创建#7805
- 2020年1月7日:向微软询问解决时间表
- 2020年1月8日:微软回复称问题将在2020年4月中旬修复
- 2020年3月16日:Doyensec发布安全公告和博客文章
修正说明
2020年3月17日:原文声称该扩展默认与编辑器捆绑发布,经@justinsteven指正,该说法不准确,已移除该表述。