9

Visual Studio 项目新利用技术分析

 11 months ago
source link: https://paper.seebug.org/3052/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Visual Studio 项目新利用技术分析

16小时之前2023年10月17日经验心得

原文链接: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 文件的存储库。不幸的是,我们没有时间检查其中是否包含恶意内容。

a0e99120-02b5-48a7-837d-1bcd9ef8dc1d.png-w331s

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


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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK