如何安全地使用 Process.Start?

信息安全 视窗 。网
2021-08-19 11:21:38

我在创建的 Windows 服务中使用Process.Start来执行我在服务器上用于音频转换的 exe。我将一些用户输入作为参数传递给这个 exe。代码看起来像这样:

string filePath = "\ffmpeg.exe";
string parameters =  String.Format(@"-i ""{0}"" -f mp3 ""{1}""", 
                           LocalFileName,
                           tempDirectory + NewFileName);
ProcessStartInfo startInfo = new ProcessStartInfo(ffmpegPath, parameters);
Process proc = Process.Start(startInfo);

变量LocalFileNameNewFileName由用户输入设置。如果我想防止OS Injection,删除任何&字符就足够了,还是我应该做的更多?

2个回答

参数中的额外参数 从字符串中删除任何引号,以确保它们不能将自己的参数放入命令行。

吃掉你的磁盘空间 去掉 ./\ 字符。好像你不这样做,你会得到像“\Windows\Filename”这样的攻击,实际上会将文件写入“:\Windows\TempDirName\Filename”,当你以后需要清理临时文件时,攻击者文件将在不同的位置比您要清洁的要高。

例如,当攻击者文件位于:“C:\Windows\Temp\”时,您将查看“C:\AudioConversion\Temp\”

您使用的 ffmpeg.exe 版本是否存在漏洞? 查看渗透网站,了解针对此工具的任何漏洞。如果您熟悉此过程,当然可以自己先完成,以确保安全。如果您偏执,可以为此过程启用 DEP。

程序中的缓冲区溢出? 是的,除非您使用 unsafe 修饰符或进行本地调用等,否则极不可能,但请检查它。

您正在使用参数开始该过程,而不是提交命令行。使用 Process.Start 就像运行参数化 SQL。