将路径遍历串联为 RCE —— Meta 的 $111,750 漏洞
字数 3468 2025-10-18 11:17:50

教学文档:从路径遍历到RCE的漏洞链利用艺术——Meta $111,750漏洞深度剖析

一、 漏洞背景与核心思想

  • 目标程序: Meta(Facebook) Messenger 的 Windows 桌面客户端。
  • 攻击场景: 端到端加密(E2EE)聊天。在此场景下,服务器无法解密聊天内容,因此所有来自“不可信”发送方的数据(如图片、文件)的验证责任完全落在了客户端身上。这创造了一个关键的攻击面:客户端对接收数据的处理逻辑。
  • 核心漏洞链: 并非一个单一的致命漏洞,而是将一个中低危漏洞(路径遍历)与目标系统环境(Windows特性、已安装的其他软件)相结合,串联升级为一个高危漏洞(远程代码执行)。
  • 赏金结果: 该漏洞链在2024年6月的Meta BountyCon活动中被发现,最终为研究者赢得了第一名和总计$111,750美元的奖金。

二、 漏洞发现与验证:路径遍历(Path Traversal)

  1. 攻击向量选择: 研究者选择了通过E2EE聊天发送的文件附件作为测试目标。文件名是客户端必须处理的外部输入。
  2. Payload构造: 在文件名中注入经典的路径遍历序列。为了绕过可能的简单过滤,采用了URL编码形式:
    • 原始序列: ..\
    • 编码后: %2e%2e%5c
  3. 漏洞验证: 将文件名设置为类似 %2e%2e%5ctest.bat 的格式,并通过Messenger发送。
  4. 结果: Messenger客户端未能对文件名进行正确的消毒和规范化处理,天真地接受了包含遍历序列的文件名,并将文件保存到了预期目录之外的位置。例如,文件被保存到了类似以下路径:
    C:\Users\[用户名]\AppData\Local\Messenger\...\very\long\path\...\%2e%2e%5ctest.bat
    文件最终被成功写入 C:\Users\[用户名]\AppData\Local\test.bat
    • 结论: 存在路径遍历漏洞,攻击者可以将任意文件写入受害者计算机的磁盘。

三、 利用障碍与挑战分析

尽管实现了任意文件写入,但直接实现RCE面临巨大挑战:

  1. 主要障碍:Windows MAX_PATH限制

    • 限制: Windows系统通常有260个字符的路径长度限制(MAX_PATH)。
    • 问题分析: Messenger存储附件的基础路径非常长,例如:
      C:\Users\vulna\AppData\Local\Messenger\TamStorage\media_bank\AdvancedCrypto\100027775233281\persistent\da7a85eb-aac7-46da-9cba-7a2f38f88e08\2024\06\03\20240603T091559605.att.04484a15-4cbf-4a1d-9e65-a48c59dcc7a2\
    • 字符计数: 仅基础路径就占用了约212个字符。这意味着留给攻击者构造的文件名(包括遍历序列和目标路径)仅剩 260 - 212 = 48个字符
  2. 利用计算

    • 每向上遍历一级目录(..\)需要3个字符。
    • 为了逃逸出冗长的Messenger目录,需要向上遍历约11级才能到达 C:\Users\[用户名]\AppData\Local\
    • 字符消耗: 11级遍历需要 11 * 3 = 33个字符
    • 剩余字符48 - 33 = 15个字符。这15个字符需要容纳目标文件夹名和文件名
  3. 额外限制: 该漏洞不允许覆盖已存在的文件。因此,攻击者必须选择一个尚不存在文件的位置进行写入。

挑战总结: 在仅有的15个字符限制下,找到一个能够被写入、并且能导致代码执行的位置,且该位置不能有同名文件存在。

四、 创造性绕过:DLL劫持(DLL Hijacking)

研究者通过利用经典的Windows攻击技术——DLL劫持,完美地解决了上述挑战。

  1. 技术原理

    • 许多Windows应用程序在启动时,会动态加载所需的DLL(动态链接库)。
    • 系统搜索DLL的顺序是固定的,通常会包括应用程序的当前工作目录
    • 如果攻击者能将一个恶意的DLL放置在搜索顺序中比合法系统目录更靠前的位置(如应用目录),应用程序就会加载这个恶意DLL而非合法的系统DLL,从而执行攻击者的代码。
  2. 寻找“猎物”

    • 研究者检查了受害者机器上可能安装的其他流行应用程序,如Viber、Slack等。
    • 关键发现: Viber客户端在启动时,会尝试从其安装目录 C:\Users\[用户名]\AppData\Local\Viber\ 加载一个名为 qwave.dll 的DLL。然而,该目录下默认并不存在这个DLL文件
  3. 完美匹配

    • 目标路径..\Viber\qwave.dll
    • 路径长度: 这个路径恰好是 19个字符..\ 3字符 + Viber 5字符 + \ 1字符 + qwave.dll 9字符 + 终止符1字符? 实际计算应为 ..\Viber\qwave.dll 共19字符,仍在15字符限制内?这里需要修正:研究者通过精确计算遍历级数,确保了最终完整路径不超过MAX_PATH,并且目标文件名部分 Viber\qwave.dll 是可行的)。
    • 实际利用: 通过精心计算遍历级数,构造最终的文件名Payload为:
      %2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5cViber%5cqwave.dll
    • 当受害者接收此文件后,恶意的 qwave.dll 就会被写入 C:\Users\[用户名]\AppData\Local\Viber\ 目录。
  4. 实现RCE

    • 当受害者下一次启动Viber应用程序时,Viber会按照DLL搜索顺序,在自己的目录下找到恶意 qwave.dll 并加载它。
    • 恶意DLL中的代码随之执行,成功实现无需用户交互的远程代码执行(RCE)

五、 漏洞链总结与利用流程

第一步:利用路径遍历漏洞

  • 动作: 攻击者通过E2EE聊天向受害者发送一个特殊命名的文件。
  • 漏洞: Messenger客户端文件名消毒不严。
  • 效果: 将恶意DLL写入Viber应用目录。

第二步:触发DLL劫持

  • 动作: 受害者(在某个时间点)启动Viber应用。
  • 机制: Windows DLL搜索机制。
  • 效果: 恶意DLL被加载,攻击者代码执行,完全控制受害者机器。

六、 关键要点与教学意义(Key Takeaways)

  1. 客户端验证是最后防线: 在E2EE或任何客户端高度自治的系统中,绝不能信任任何来自外部的输入,包括元数据(如文件名)。必须在客户端进行严格的输入消毒、规范化和验证。
  2. 漏洞串联的威力: 不要孤立地看待漏洞。一个看似受限的中低危漏洞(如受限文件写入),在与系统环境或其他应用弱点(如DLL劫持)结合后,可能产生毁灭性的链式反应。安全评估应具备系统性思维。
  3. 深入了解攻击环境: 成功的漏洞利用往往依赖于对目标环境(操作系统、常见软件行为)的深刻理解。熟悉像DLL劫持、Dylib劫持(macOS)、PATH劫持等技术,是漏洞武器化的关键。
  4. 坚持与深度挖掘的价值: 初始的路径遍历漏洞已有一定价值,但研究者没有止步。通过深入挖掘,将“文件写入”推进到“稳定的RCE”,使得漏洞的严重性和最终赏金得到了数量级的提升。在漏洞赏金计划中,证明完整的业务影响至关重要。
  5. 对开发者的启示
    • 使用安全的API来管理文件路径(如 Path.Combine 并验证最终路径是否在允许范围内)。
    • 为应用程序设置清单文件,指定DLL搜索顺序,避免从当前目录加载高危DLL。
    • 对用户输入进行严格的“白名单”过滤,而非“黑名单”。

七、 时间线

  • 2024-06-03: 提交初始路径遍历漏洞报告。
  • 2024-06-05: 提交完整的RCE利用链(DLL劫持Viber)。
  • 2024-08-08: 获得初始赏金 $34,500。
  • 2024-08-23: 经过讨论,赏金提升至 \(75,000,加上额外奖励,总额达到 **\)111,750**。

教学文档:从路径遍历到RCE的漏洞链利用艺术——Meta $111,750漏洞深度剖析 一、 漏洞背景与核心思想 目标程序 : Meta(Facebook) Messenger 的 Windows 桌面客户端。 攻击场景 : 端到端加密(E2EE)聊天。在此场景下,服务器无法解密聊天内容,因此所有来自“不可信”发送方的数据(如图片、文件)的验证责任完全落在了 客户端 身上。这创造了一个关键的攻击面:客户端对接收数据的处理逻辑。 核心漏洞链 : 并非一个单一的致命漏洞,而是将一个 中低危漏洞 (路径遍历)与目标系统环境(Windows特性、已安装的其他软件)相结合,串联升级为一个 高危漏洞 (远程代码执行)。 赏金结果 : 该漏洞链在2024年6月的Meta BountyCon活动中被发现,最终为研究者赢得了 第一名和总计$111,750美元 的奖金。 二、 漏洞发现与验证:路径遍历(Path Traversal) 攻击向量选择 : 研究者选择了通过E2EE聊天发送的 文件附件 作为测试目标。文件名是客户端必须处理的外部输入。 Payload构造 : 在文件名中注入经典的路径遍历序列。为了绕过可能的简单过滤,采用了URL编码形式: 原始序列: ..\ 编码后: %2e%2e%5c 漏洞验证 : 将文件名设置为类似 %2e%2e%5ctest.bat 的格式,并通过Messenger发送。 结果 : Messenger客户端未能对文件名进行正确的消毒和规范化处理,天真地接受了包含遍历序列的文件名,并将文件保存到了预期目录之外的位置。例如,文件被保存到了类似以下路径: C:\Users\[用户名]\AppData\Local\Messenger\...\very\long\path\...\%2e%2e%5ctest.bat 文件最终被成功写入 C:\Users\[用户名]\AppData\Local\test.bat 。 结论 : 存在 路径遍历漏洞 ,攻击者可以将任意文件写入受害者计算机的磁盘。 三、 利用障碍与挑战分析 尽管实现了任意文件写入,但直接实现RCE面临巨大挑战: 主要障碍:Windows MAX_ PATH限制 限制 : Windows系统通常有260个字符的路径长度限制(MAX_ PATH)。 问题分析 : Messenger存储附件的基础路径非常长,例如: C:\Users\vulna\AppData\Local\Messenger\TamStorage\media_bank\AdvancedCrypto\100027775233281\persistent\da7a85eb-aac7-46da-9cba-7a2f38f88e08\2024\06\03\20240603T091559605.att.04484a15-4cbf-4a1d-9e65-a48c59dcc7a2\ 字符计数 : 仅基础路径就占用了约 212个字符 。这意味着留给攻击者构造的文件名(包括遍历序列和目标路径)仅剩 260 - 212 = 48个字符 。 利用计算 : 每向上遍历一级目录( ..\ )需要3个字符。 为了逃逸出冗长的Messenger目录,需要向上遍历约11级才能到达 C:\Users\[用户名]\AppData\Local\ 。 字符消耗 : 11级遍历需要 11 * 3 = 33个字符 。 剩余字符 : 48 - 33 = 15个字符 。这15个字符需要容纳目标 文件夹名和文件名 。 额外限制 : 该漏洞不允许 覆盖已存在的文件 。因此,攻击者必须选择一个尚不存在文件的位置进行写入。 挑战总结 : 在仅有的15个字符限制下,找到一个能够被写入、并且能导致代码执行的位置,且该位置不能有同名文件存在。 四、 创造性绕过:DLL劫持(DLL Hijacking) 研究者通过利用经典的Windows攻击技术——DLL劫持,完美地解决了上述挑战。 技术原理 : 许多Windows应用程序在启动时,会动态加载所需的DLL(动态链接库)。 系统搜索DLL的顺序是固定的,通常会包括 应用程序的当前工作目录 。 如果攻击者能将一个恶意的DLL放置在搜索顺序中比合法系统目录更靠前的位置(如应用目录),应用程序就会加载这个恶意DLL而非合法的系统DLL,从而执行攻击者的代码。 寻找“猎物” : 研究者检查了受害者机器上可能安装的其他流行应用程序,如Viber、Slack等。 关键发现 : Viber客户端在启动时,会尝试从其安装目录 C:\Users\[用户名]\AppData\Local\Viber\ 加载一个名为 qwave.dll 的DLL。然而, 该目录下默认并不存在这个DLL文件 。 完美匹配 : 目标路径 : ..\Viber\qwave.dll 路径长度 : 这个路径恰好是 19个字符 ( ..\ 3字符 + Viber 5字符 + \ 1字符 + qwave.dll 9字符 + 终止符1字符? 实际计算应为 ..\Viber\qwave.dll 共19字符,仍在15字符限制内?这里需要修正:研究者通过精确计算遍历级数,确保了最终完整路径不超过MAX_ PATH,并且目标文件名部分 Viber\qwave.dll 是可行的)。 实际利用 : 通过精心计算遍历级数,构造最终的文件名Payload为: %2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5c%2e%2e%5cViber%5cqwave.dll 当受害者接收此文件后,恶意的 qwave.dll 就会被写入 C:\Users\[用户名]\AppData\Local\Viber\ 目录。 实现RCE : 当受害者下一次启动Viber应用程序时,Viber会按照DLL搜索顺序,在自己的目录下找到恶意 qwave.dll 并加载它。 恶意DLL中的代码随之执行,成功实现 无需用户交互的远程代码执行(RCE) 。 五、 漏洞链总结与利用流程 第一步:利用路径遍历漏洞 动作 : 攻击者通过E2EE聊天向受害者发送一个特殊命名的文件。 漏洞 : Messenger客户端文件名消毒不严。 效果 : 将恶意DLL写入Viber应用目录。 第二步:触发DLL劫持 动作 : 受害者(在某个时间点)启动Viber应用。 机制 : Windows DLL搜索机制。 效果 : 恶意DLL被加载,攻击者代码执行,完全控制受害者机器。 六、 关键要点与教学意义(Key Takeaways) 客户端验证是最后防线 : 在E2EE或任何客户端高度自治的系统中, 绝不能信任任何来自外部的输入 ,包括元数据(如文件名)。必须在客户端进行严格的输入消毒、规范化和验证。 漏洞串联的威力 : 不要孤立地看待漏洞。一个看似受限的 中低危漏洞 (如受限文件写入),在与系统环境或其他应用弱点(如DLL劫持)结合后,可能产生 毁灭性的链式反应 。安全评估应具备系统性思维。 深入了解攻击环境 : 成功的漏洞利用往往依赖于对目标环境(操作系统、常见软件行为)的深刻理解。熟悉像DLL劫持、Dylib劫持(macOS)、PATH劫持等技术,是漏洞武器化的关键。 坚持与深度挖掘的价值 : 初始的路径遍历漏洞已有一定价值,但研究者没有止步。通过深入挖掘,将“文件写入”推进到“稳定的RCE”,使得漏洞的严重性和最终赏金得到了 数量级的提升 。在漏洞赏金计划中,证明完整的业务影响至关重要。 对开发者的启示 : 使用安全的API来管理文件路径(如 Path.Combine 并验证最终路径是否在允许范围内)。 为应用程序设置清单文件,指定DLL搜索顺序,避免从当前目录加载高危DLL。 对用户输入进行严格的“白名单”过滤,而非“黑名单”。 七、 时间线 2024-06-03 : 提交初始路径遍历漏洞报告。 2024-06-05 : 提交完整的RCE利用链(DLL劫持Viber)。 2024-08-08 : 获得初始赏金 $34,500。 2024-08-23 : 经过讨论,赏金提升至 $75,000,加上额外奖励,总额达到 $111,750 。