摘要

在攻击者与防御者的持续军备竞赛中,最新锐的攻击手法总是被紧盯,而最古老的合法功能却常常成为完美的隐匿空间。SYLK 文件格式正是这一规律的最新注脚。

SYLK 诞生于 1980 年代,设计目标是仅使用可显示的 ANSI 字符,让不同应用程序之间能可靠地交换表格数据。它的文件扩展名 .slk 至今仍被 Microsoft Office 默认映射到 Excel,涵盖 2010、2013、2016 乃至更新版本。此前,安全研究员 Matt Nelson 已演示过将 DDE(动态数据交换)攻击与 SYLK 结合的方法,且该方法已被多起真实恶意软件样本所采用。

本文则进一步揭示一个更严重的滥用维度:SYLK 可以直接承载 Excel 4.0/XLM 宏,且这一能力在当前安全生态中几乎未被充分认知和检测。在 VBA 宏已受到层层监视的今天,XLM 宏在 .slk 容器中的复活,为攻击者提供了一条低风险、高成功率的新通道。

SYLK特权

在对攻击面进行任何深入拆解之前,必须首先理解 SYLK 在网络防御体系中的特殊地位——它不是靠漏洞获得特权,而是靠“默认信任”。

受保护视图沙箱的豁免

当文件从互联网或不受信任来源下载时,Windows 会为其附加“网络标记”(Mark of the Web, MotW)。对于常规 Office 文件,这会触发受保护视图沙箱,阻止宏执行并显示醒目的安全警告。然而,SYLK 文件格式并不适用此沙箱。用户双击打开恶意 .slk 文件时,不会看到受保护视图的屏障。

邮件与浏览器网关的通行证

在典型的攻击链中,.slk 文件在传输阶段几乎不被拦截:

  • MS Outlook 阻止附件列表:不包含 .slk。

  • OWA(Outlook Web Access)默认阻止扩展名列表:同样不包含 .slk。

  • Chrome 安全浏览的文件类型黑名单:未将 .slk 标记为危险文件类型。

这意味着,一个武器化的 .slk 文件可以通过电子邮件附件或云存储链接,以极高的送达率出现在目标用户的收件箱中。

嵌入 XLM 宏

VBA 无法嵌入 SYLK,但 Excel 4.0/XLM 宏可以通过手工构造记录行的方式原生嵌入。 Excel 的“另存为”功能主动剥离了宏代码,但手工编写的 .slk 文件绕过了这个剥离过程,Excel 在解析时直接执行了嵌入的宏指令。

在记事本中输入以下内容,保存为 poc.slk,双击打开,启用内容后计算器弹出:

ID;P 
O;E 
NN;NAuto_open;ER101C1
C;X1;Y101;EEXEC("CALC.EXE") 
C;X1;Y102;EHALT() 
E 

逐行解析:

记录
含义
1
ID;P
声明文件类型为 SYLK。ID标识文件格式,P表示这是生产型 SYLK 文件。
2
O;E
O
记录设置全局选项。E子记录指明“此文档包含宏”,相当于 Excel 工作簿的“启用宏”标记。
3
NN;NAuto_open;ER101C1
NN
定义命名区域。将第 101 行第 1 列(R101C1)的单元格命名为Auto_ope——XLM 宏的自动执行事件触发器(等同于VBA的Auto_Open)。
4
C;X1;Y101;EEXEC(“CALC.EXE”)
C 定义单元格内容。X1;Y101定位到第 1 列第 101 行;E 记录定义该单元格的表达式值为 XLM 宏函数EXEC("CALC.EXE")
5
C;X1;Y102;EHALT()
同上,第 1 列第 102 行单元格执行HALT(),终止宏执行。
6
E
文件结束符。

 

关键约束

  • SYLK 文件每行不得超过 260 字符,否则 Excel 将拒绝解析该行。

  • Auto_open 是语言相关的触发器名称。在荷兰语版本中须写为Auto_openen,在德语中为Auto_öffnen。跨语言攻击需适配本地化名称。

当然,EXEC() 和 HALT() 仅是 XLM 宏的冰山一角。在课程中我们可以学习 利用 SYLK 注入 Shellcode

  • 动态下载与执行远程载荷(URLDownloadToFile + EXEC)

  • 向其他进程注入 shellcode(通过调用 Windows API)

  • 文件系统的完整操作(写入、删除、编码/解码)

  • 反分析与反沙箱检测(通过 GET.WORKSPACE 检测鼠标移动、最近文件列表等)

SYLK 作为 XLM 宏的传输容器,直接继承了上述全部攻击能力。可以说,武器化的.slk文件等价于一个携带完整后门逻辑的轻量级恶意文档,且其攻击链中几乎每一步都享有防御豁免。

攻击面扩展

伪装为 CSV

SYLK 文件的一个极其危险的特性是:Excel 会依据文件内容而非扩展名来识别 SYLK 格式。 具体规则为:如果一个文件以 ID;P 开头,即使扩展名是 .csv(逗号分隔值),Excel 也会识别它为 SYLK 文件,并向用户弹出对话框:“此文件是 SYLK 格式,但扩展名是 CSV。是否以 SYLK 格式打开?”

如果用户点击“是”,文件将以 SYLK 格式解析,嵌入的 XLM 宏随之激活。攻击者因此可以:

  1. 制作一个以 ID;P 开头的恶意文件。

  2. 将其扩展名设为 .csv,伪装成“客户名单”、“交易记录”等看似无害的表格。

  3. 利用用户对 CSV 文件的低警惕性(一般认为 CSV 是纯文本,不可能携带宏),配合对话框的误导性文本,达成宏执行。

跨平台覆盖

Microsoft Office for Mac 同样原生支持 SYLK 格式与 XLM 宏。.slk 扩展名默认映射到 Mac 版 Excel,且Auto_open触发器在 Mac 环境下完全有效。

更严重的是,Microsoft Office for Mac 2011 存在一个已被公开但永不修复的漏洞:打开包含宏的 SYLK 文件时,不显示任何安全警告,宏直接静默执行。由于该版本已终止生命周期支持,此漏洞成为永久性零日。尽管 Office 2011 的用户量在逐年下降,但研究人员仍不时发现部分 Mac 用户运行着这一过时版本,构成一条持续开放的未修复攻击路径。

规避

理论上,SYLK 文件是完全基于 ANSI 文本的,结构简单,安全产品理应对其进行高效扫描。然而实际测试表明,大多数主流杀毒软件对恶意 .slk 文件的检测签名和启发式规则都严重滞后。原因可能包括:

  • .slk 在野样本量相对较小,未引起足够关注。

  • XLM 宏的语法与 VBA 完全不同,基于 VBA 特征的检测引擎无效。

  • SYLK 文件可以高度混淆(通过冗余记录、注释、空白填充等),进一步降低了启发式引擎的有效性。

反恶意软件扫描接口(AMSI)是 Windows 内置的关键防御层,它为杀毒软件提供了对脚本、宏、PowerShell 等动态内容的可见性。但在 SYLK 的攻击场景中,AMSI 完全不起作用——原因是 AMSI 的宏扫描引擎仅与 VBA(Visual Basic for Applications)交互,无法理解 Excel 4.0/XLM 宏的语法与执行上下文。

当恶意宏通过 SYLK 文件的 XLM 指令执行时,AMSI 根本看不到任何可疑活动。这构成了一个完整的、从文件传输到代码执行的 AMSI 盲区攻击链。

结语

SYLK 文件格式的滥用并非零日漏洞,而是一种对“历史信任”的利用。它只需要一个古老的、未被充分审视的文件格式,加上一层被现有安全工具系统性忽略的宏执行引擎。

在我们的课程中还有100+文件格式可以利用。