Command::arg 和 Command::args API 在其文档中声明,参数将原封不动地传递给生成的进程,无论参数内容如何,并且不会被 shell 求值。这意味着将不受信任的输入作为参数传递应该是安全的。
在 Windows 上,此功能的实现比其他平台更复杂,因为 Windows API 只提供一个包含所有参数的单一字符串给生成的进程,而由生成的进程自行分割它们。大多数程序使用标准的 C 运行时 argv,这实际上导致参数分割方式基本一致。
然而,有一个例外是 cmd.exe(用于执行批处理文件等),它有自己的参数分割逻辑。这迫使标准库为传递给批处理文件的参数实现自定义转义。不幸的是,有报告称我们的转义逻辑不够彻底,有可能传递恶意参数导致任意 shell 执行。

参考:https://blog.rust-lang.org/2024/04/09/cve-2024-24576.html