Visual Studio 项目新利用技术分析
2023-10-17 10:53:0 Author: paper.seebug.org(查看原文) 阅读量:13 收藏

原文链接:EvilSln: Don't open .sln files
译者:知道创宇404实验室翻译组

利用项目代码进行网络钓鱼攻击并不是一个新概念。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、COMFileReference: 项目打开TypeLib加载时触发

<COMFileReference Include="files\helpstringdll.tlb">
     <EmbedInteropTypes>True</EmbedInteropTypes>
</COMFileReference>

参考链接

我们希望找到一种无需编译即可执行代码的方式,只需打开*.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文件中加载所有数据。

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

通过检查VSPackage实现OnLoadOptions,我们可以找到VSCorePackage

// Microsoft.VisualStudio.dll
// Microsoft.VisualStudio.VSCorePackage
protected 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]
        }
    }
}

在[1]处,VSCorePackagestream传递给OptionService并调用vsToolboxService.OnLoadOptions(stream)

// Microsoft.VisualStudio.Toolbox.VsToolboxService
internal 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的执行。

Bypass信任区和 MOTW

Visual Studio 的情况有些不同。经过搜索,我们 在这里找到了一篇详细介绍的文章。

对于Visual Studio 2022 Preview 3,需要手动启用“受信任的位置”功能。一旦启用,Visual Studio将检测是否尝试打开不受信任的内容,并显示一个新的对话框,警告有关安全影响:

这个设置需要手动启用。然而,即使在该文章发表两年后,这个设置仍然默认禁用。可能有一些原因阻止Visual Studio启用它。

trust_setting

但是,我们仍然需要绕过MOTW的保护。

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

总之,我们可以轻松绕过Trust Zones和MOTW的双重保护,而这对于不了解风险的用户构成了重大威胁。

项目结构如下:

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

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

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

Lazarus 向我们展示了如何植入恶意代码:

然后,引导受害者打开项目。与2021年不同的是,当打开项目时,代码将被执行,无需额外的点击或缺少MOTW(未知来源文件的警告)/不受信任的警告对话框。

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

  1. 复制或下载该项目
git clone https://github.com/cjm00n/EvilSln
  • 双击该App1.sln文件使用 Visual Studio 打开它。(*.csproj也可以)
  • 计算器将会弹出。

测试版本:17.7.5(2023年10月的VS2022更新)。

没有Smartscreen警告,无需信任,无需进一步交互。但它将不会被修复,因为微软认为这不是一个漏洞。

  1. 按照Microsoft的文章中所概述的步骤,手动打开相关设置:使用Visual Studio 2022提高开发者安全性
  2. 避免在Visual Studio中打开任何未知的项目。正如微软所述,"打开Visual Studio项目是一项不安全的操作"。

在发现这一漏洞后,我们迅速与Microsoft取得联系,寻求澄清,并收到明确的回应,表明这不是一个安全问题。

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

这与outflank的博客中提供的回应一致。因此,这是一个无法修复的漏洞,或者更确切地说,是一系列不会被修复的漏洞。但是很明显存在漏洞。我们认为,在打开项目时会自动加载更多未公开的文件,仅仅这样最基础的操作就足以危用户的的计算机。

是否存在在野恶意项目?

我们很快使用SourceGraph进行了调查 ,发现GitHub 上至少有 10,570 个包含 .suo 文件的存储库。不幸的是,我们没有时间检查其中是否包含恶意内容。

无论如何,使用 IDE(尤其是 Visual Studio)时请小心。在其内部机制下,它会执行许多未经察觉的操作。


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/3052/



文章来源: https://paper.seebug.org/3052/
如有侵权请联系:admin#unsafe.sh