Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

admin 2023年10月18日00:56:56评论29 views字数 4263阅读14分12秒阅读模式



Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

背景

使用代码项目进行网络钓鱼攻击并不是一个新概念。2021 年初,Lazarus APT 组织在针对安全研究人员的活动中采用了一种特定的攻击技术。他们在 Visual Studio 项目文件中嵌入了恶意事件命令,从而允许在编译项目时执行有害代码,详情请参阅:针对安全研究人员的新活动


此次事件再次让Visual Studio的安全问题进入公众视野。但值得注意的是,Visual Studio 并不是唯一存在此类风险的产品。JetBrains 的 IDE、VSCode 和其他文本编辑器在打开不安全项目时也面临类似的漏洞。作为回应,这些产品引入了信任区域机制,在不受信任的环境中禁用某些有风险的功能,旨在保护用户。


在此存储库中,我们为 Visual Studio 项目提出了一种新的利用技术(Microsoft 认为这不是安全问题)并提供了概念证明。我们的目的是提高人们对所涉及潜在风险的认识,并帮助个人避免被黑客攻击。


详细分析

执行

以下是一些公开披露的利用 Visual Studio 的方法:


1.PreBuildEvent:在工程编译前执行任意命令。

<PreBuildEvent>    <Command>    cmd /c calc    </Command></PreBuildEvent>

2.GetFrameworkPaths Target:查看代码时触发。

<Target Name="GetFrameworkPaths">    <Exec Command="calc.exe"/></Target>

3.COMFileReferenceTypeLib:项目打开时加载时触发。

<COMFileReference Include="fileshelpstringdll.tlb">     <EmbedInteropTypes>True</EmbedInteropTypes></COMFileReference>

(参考文献 2 和 3 来自https://outflank.nl/blog/2023/03/28/attacking-visual-studio-for-initial-access/。我们在发布演示视频后在评论中发现了这篇优秀的文章.)


我们希望找到一种无需编译即可执行代码的方法,只需打开*.sln或*.csproj项目文件即可。我们发现,打开一个项目后,Visual Studio会自动.vs在项目根目录下生成一个文件夹,其中包含一个名为.suo.


根据 Visual Studio 文档:https://learn.microsoft.com/en-us/visualstudio/extensibility/internals/solution-user-options-dot-suo-file? view=vs-2022


当环境打开 .suo 文件时,它会枚举当前加载的所有 VSPackages。如果 VSPackage 实现该IVsPersistSolutionOpts接口,则环境会调用 LoadUserOptionsVSPackage 上的方法,要求它从.suo文件加载所有数据。


这意味着该函数将在文件加载IVsPersistSolutionOpts#LoadUserOptions时被调用。.suo


通过检查VSPackage实现OnLoadOptions,我们可以发现VSCorePackage。

// Microsoft.VisualStudio.dll// Microsoft.VisualStudio.VSCorePackageprotected override void OnLoadOptions(string name, Stream stream){  if (name.Equals(typeof(VsToolboxService).Name))  {    VsToolboxService vsToolboxService = this.GetService(typeof(IToolboxService)) as VsToolboxService;     if (vsToolboxService != null)    {      vsToolboxService.LoadOptions(stream); // [1]    }  }}

at [1],VSCorePackage将传递streamtoOptionService和 calllvsToolboxService.OnLoadOptions(stream)

// Microsoft.VisualStudio.Toolbox.VsToolboxServiceinternal void LoadOptions(Stream stream){  BinaryReader binaryReader = new BinaryReader(stream);  BinaryFormatter binaryFormatter = new BinaryFormatter();  int num = binaryReader.ReadInt32();  for (int i = 0; i < num; i++)  {    string text = binaryReader.ReadString();    int num2 = binaryReader.ReadInt32();    for (int j = 0; j < num2; j++)    {      string text2 = this.Links.Read(stream);      VsToolboxService.ToolboxItemContainer toolboxItemContainer = (VsToolboxService.ToolboxItemContainer)binaryFormatter.Deserialize(stream); // [2]      if (text2 != null && File.Exists(text2))      {        toolboxItemContainer.LinkFile = text2;        this.Links.TrackLink(text2);        this.Items.GetFilteredList(text).Add(toolboxItemContainer);      }    }  }}

并 [2] 会调用 BinaryFormatter.Deserialize 从流中获取对象。这是 BinaryFormatter 反序列化的常见用法。由于类型限制不够,我们可以直接使用 ysoserial.net 生成payload并尝试将其写入文件 .suo 。当在Visual Studio中打开项目时,恶意 .suo 文件将被自动加载并触发 calc.exe.


顺便说一句,还有另一个类具有几乎相同的漏洞,有兴趣的读者应该能够很快找到它。


“绕过”信任区和 MOTW?

Visual Studio 的情况有些不同。经过搜索,我们 在这里找到了一篇 提供见解的文章。


对于 Visual Studio 2022 Preview 3,您必须手动启用“受信任位置”功能。启用后,Visual Studio 将检测您是否尝试打开不受信任的内容,并显示一个新对话框,警告您安全隐患:


该设置需要手动启用。然而,即使在文章发表两年后,此设置仍然默认处于禁用状态。可能有某些因素阻止 Visual Studio 启用它。

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

但我们仍然需要绕过 MOTW 的保护,不是吗?


在我们的测试中,Visual Studio 似乎不遵守 MOTW。通过 HTTP 下载的包含 MOTW 标签的 sln 文件可以在没有任何警告的情况下打开。可能需要特定的方法或配置来触发 MOTW 警告。


总而言之,我们可以毫不费力地绕过Trust Zones和MOTW的双重保护,这给不知情的用户带来了巨大的风险。


开发

一个邪恶的项目结构看起来像这样:

$ tree -a.├── App1│   └── Form1.cs├── App1.sln└── .vs    └── App1        └── v17            └── .suo

理论上,该项目可能会更小,但就目前而言,这应该足够了。与纯文本 .sln 或 .csproj 文件相比, .suo 它是隐藏的(默认情况下, . 文件资源管理器中不显示以 开头的文件夹和文件),其内容更难以阅读。描述该文件结构的文档也很有限,因此即使仔细检查也很容易被忽视。


此外,由于 Visual Studio 在关闭时将新内容保存到 .suo 文件中的行为,有效负载内容被清除,从而为这种利用技术提供了自然的隐藏。此外,此特性可确保该漏洞不会被多次触发。


Lazarus 向我们展示了如何毒害项目:

  • 在 GitHub 上公开该项目,例如 针对安全研究人员的 Active North Korean 活动(只需将后门隐藏在代码中)

  • 通过社交平台发送项目,例如 针对安全研究人员的新活动(使用PreBuildEvent技术)

然后,引导受害者打开项目。与 2021 年不同的是,代码将在项目打开时执行,无需任何额外的点击或缺少 MOTW/不受信任的警告对话框。


借助反序列化的能力,攻击者可以在内存中执行任意代码。


概念验证

1.克隆或下载该项目

git clone https://github.com/cjm00n/EvilSln

2.双击该App1.sln文件以使用 Visual Studio 打开它。(*.csproj 也可以)

3.计算器将会弹出。

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

测试版本:17.7.5(VS2022于2023.10更新)。


无需智能屏幕警告,无需信任,无需进一步交互。但它不会被修复,因为微软认为这不是一个漏洞。


减轻

按照 Microsoft 文章中概述的步骤手动打开相关设置:使用 Visual Studio 2022 提高开发人员安全性

避免在 Visual Studio 中打开任何未知项目。正如 Microsoft 所说,“打开 Visual Studio 项目是一种不安全的操作。”


讨论

发现此漏洞后,我们立即联系微软进行澄清,并得到明确答复,表明这不是安全问题。


经过调查,我们的团队确定该问题不是漏洞。打开 Visual Studio 项目是一种不安全的操作,如下所述:  https: //devblogs.microsoft.com/visualstudio/improving-developer-security-with-visual-studio-2022/


这与outflank 博客中提供的响应一致 。因此,这是一个无法修复的漏洞,或者更确切地说,是一系列无法修复的漏洞。然而,很明显这里存在一个漏洞。我们相信,当您打开项目时,会自动加载更多未公开的文件。只需打开这样的项目就足以危害您的机器。





感谢您抽出

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

.

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

.

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

来阅读本文

Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

点它,分享点赞在看都在这里


原文始发于微信公众号(Ots安全):Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月18日00:56:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Visual Studio 项目的新开发技术(Microsoft Visual Studio 上的一键 RCE-概念验证)http://cn-sec.com/archives/2116173.html

发表评论

匿名网友 填写信息