漏洞概述 函数用于获取当前进程的命令行字符串。该函数返回的命令行字符串是 Unicode 命令行到 8 位进程代码页的转换。由于这种转换可能是有损的,转换后的命令行可能与 Unicode 命令行不同,从而产生潜在的安全问题。 影响范围 代码页转换问题:对于大多数代码页,这种转换是有损的,转换后的命令行可能与 Unicode 命令行不同,导致安全问题的可能性。 文件名处理问题:转换可能会改变用于文件名的字符串。例如,如果 ANSI 代码页是 Windows-1252,Unicode 字符 U+0100(拉丁大写字母 A 带 macron)会转换为 0x41(拉丁大写字母 A)。如果用户传递一个包含字符 A 的文件名,使用 的程序会接收到字符 A 并在错误的文件上操作。 命令行解析问题:转换可能会改变命令行解析方式。例如,如果 ANSI 代码页是 Windows-1252,Unicode 字符 U+FF02(全角引号)会转换为 0x22(ASCII 引号),Unicode 字符 U+2010(连字符)会转换为 0x2D(ASCII 减号)。这些都可能导致命令行文件参数被误解释为命令行选项。 修复方案 使用 函数:为了避免上述问题,建议使用 函数来获取 Unicode 命令行。 使用应用程序清单:在 Windows Server 2003 或更高版本的 Windows 上,可以使用应用程序清单将 UTF-8 设置为进程代码页。 POC 代码 安全备注 文件名处理:转换可能会改变用于文件名的字符串,导致程序在错误的文件上操作。 命令行解析:转换可能会改变命令行解析方式,导致命令行文件参数被误解释为命令行选项。 要求 最低支持客户端:Windows XP(桌面应用 最低支持服务器:Windows Server 2003(桌面应用 目标平台:Windows 头文件: (包括 在 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008、Windows Server 2008 R2) 库: DLL: 参见 函数 进程和线程函数 最后更新时间 2024年10月24日