产品: InputLeap v3.0.3
厂商: input-leap
漏洞: 路径遍历
CWE: CWE-22 对路径名的限制不当导致目录遍历(“路径遍历”)
InputLeap 的拖放处理程序试图通过查找最后一个路径分隔符并仅保留其后的部分来清理文件名。当未找到分隔符时,C++ 字符串搜索会返回一个称为 npos 的特殊哨兵值以表示失败。然而,代码在将结果用于算术计算之前从未检查该哨兵值。由于 npos 被定义为可能的最大无符号整数,减去它会发生静默回绕,并产生一个看似有效但完全错误的答案:它返回的不是仅文件名,而是整个未清理的原始字符串。攻击者可以利用这一点,构造一条消息,其中某个条目缺少分隔符,而另一个条目包含不匹配的分隔符——代码的全局分隔符检测启发式规则发生翻转,搜索静默失败,于是 ..\..\AppData\...\Startup\evil.exe 原样通过。该字符串随后被拼接到拖放目录并交给操作系统,操作系统会解释 .. 序列并将文件写入预期文件夹之外。该漏洞存在的原因是缺少对“未找到”情况的防御性检查。
--enable-drag-drop(需主动开启,默认关闭)。/ 字符(以强制 slash="/"),而实际文件名段使用 \\ 分隔符,例如在数据块较早位置嵌入一个多余的 /,并使用文件名 ..\\..\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\evil.exe。DragInformation::parseDragInfo 的 find_last_of(slash, ...) 对以 \\ 分隔的文件名部分返回 npos,导致无符号算术回绕并返回完整的未截断路径。DropHelper::writeToDir 将该路径拼接到用户的拖放目标目录(默认为桌面)上,并在未进行规范化的情况下写入文件,使其落入 Startup 文件夹。/src/lib/inputleap/DragInformation.cpp
/src/lib/inputleap/DropHelper.cpp
已提供一个 POC,支持 TLS 以及到服务器的非加密连接。
input-leap-directory-traversal-poc.py
攻击者可以利用此漏洞将文件上传到默认或指定文件夹之外的任意路径。这可能导致代码执行
DragInformation::parseDragInfo 中,将斜杠检测启发式规则替换为 std::filesystem::path(filename).filename(),以保证仅提取基名。DropHelper::writeToDir 中,使用 std::filesystem::canonical 对最终路径进行规范化,如果它不以 destination 开头则拒绝。..、NUL 字节、驱动器盘符(X:)或前导分隔符的文件名。