将路径遍历串联为 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)
- 攻击向量选择: 研究者选择了通过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字符 +Viber5字符 +\1字符 +qwave.dll9字符 + 终止符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)。
- 当受害者下一次启动Viber应用程序时,Viber会按照DLL搜索顺序,在自己的目录下找到恶意
五、 漏洞链总结与利用流程
第一步:利用路径遍历漏洞
- 动作: 攻击者通过E2EE聊天向受害者发送一个特殊命名的文件。
- 漏洞: Messenger客户端文件名消毒不严。
- 效果: 将恶意DLL写入Viber应用目录。
第二步:触发DLL劫持
- 动作: 受害者(在某个时间点)启动Viber应用。
- 机制: Windows DLL搜索机制。
- 效果: 恶意DLL被加载,攻击者代码执行,完全控制受害者机器。
六、 关键要点与教学意义(Key Takeaways)
- 客户端验证是最后防线: 在E2EE或任何客户端高度自治的系统中,绝不能信任任何来自外部的输入,包括元数据(如文件名)。必须在客户端进行严格的输入消毒、规范化和验证。
- 漏洞串联的威力: 不要孤立地看待漏洞。一个看似受限的中低危漏洞(如受限文件写入),在与系统环境或其他应用弱点(如DLL劫持)结合后,可能产生毁灭性的链式反应。安全评估应具备系统性思维。
- 深入了解攻击环境: 成功的漏洞利用往往依赖于对目标环境(操作系统、常见软件行为)的深刻理解。熟悉像DLL劫持、Dylib劫持(macOS)、PATH劫持等技术,是漏洞武器化的关键。
- 坚持与深度挖掘的价值: 初始的路径遍历漏洞已有一定价值,但研究者没有止步。通过深入挖掘,将“文件写入”推进到“稳定的RCE”,使得漏洞的严重性和最终赏金得到了数量级的提升。在漏洞赏金计划中,证明完整的业务影响至关重要。
- 对开发者的启示:
- 使用安全的API来管理文件路径(如
Path.Combine并验证最终路径是否在允许范围内)。 - 为应用程序设置清单文件,指定DLL搜索顺序,避免从当前目录加载高危DLL。
- 对用户输入进行严格的“白名单”过滤,而非“黑名单”。
- 使用安全的API来管理文件路径(如
七、 时间线
- 2024-06-03: 提交初始路径遍历漏洞报告。
- 2024-06-05: 提交完整的RCE利用链(DLL劫持Viber)。
- 2024-08-08: 获得初始赏金 $34,500。
- 2024-08-23: 经过讨论,赏金提升至 \(75,000,加上额外奖励,总额达到 **\)111,750**。