我的应用程序正在使用Process.Start打开其他应用程序来运行。 VeraCode报告称OS命令注入易受攻击。我想得到一些评论。我可以在网上找到很多关于过滤输入或限制程序名称的信息。但是,我很想知道是否还有使用Process.Start的其他选择?
编辑: 感谢您的评论,以下是其中一个示例,是的,它是从用户那里得到的输入:
public static void Run(string fileName, string arguments, bool waitForExit)
{
Process p = Process.Start(fileName, arguments);
if (waitForExit)
p.WaitForExit();
}
谢谢!
答案 0 :(得分:1)
Process类只是一个Managed包装类,Native Create Process及其变体,如Create Process As User 。
我认为没有其他方法可以启动进程,因为其他每个解决方案都会调用WinAPI函数。 (因为此函数(或其重载和变体)是在Windows中启动进程的唯一方法。)
就个人而言,我没有听说过有关Process.Start
问题的任何事情,请澄清问题
问候
答案 1 :(得分:1)
我也遇到了这个问题。您需要将 UseShellExecute 属性设置为false。然后,Veracode不会将其视为漏洞。
using (WinProcess myProcess = new WinProcess())
{
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.StartInfo.Arguments = Path.GetFileName(fullPath);
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(fullPath);
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();
}
答案 2 :(得分:1)
这是一个命令注入漏洞,因为你没有从函数中过滤掉用户输入并直接附加到process.start() 因此,该工具已将其标记为漏洞。
为了避免这个问题,您应该使用正则表达式方法来过滤掉坏字符,并取决于该函数在运行时将执行的操作。
例如。创建您的函数只是为了从此路径 c:/users/docs.txt 检查 那么不应为 c:/admin/docs.txt 执行该函数。
这是您在将用户数据直接发送到流程之前需要验证的方式。
有关更多信息,请参阅这个很棒的链接:https://dotnet-security-guard.github.io/SG0001.htm