从Process.Start注入操作系统命令



我的应用程序正在使用Process.Start打开另一个要运行的应用程序。VeraCode[一个安全软件扫描工具]报告此命令为操作系统命令注入漏洞。我想得到一些评论。我在网上找到了很多关于过滤输入或约束程序名称的信息;然而,我很好奇是否还有其他使用Process.Start的替代方案?

编辑:感谢您的评论,这是其中一个示例,是的,它正在从用户那里获得输入:

public static void Run(string fileName, string arguments, bool waitForExit)
{
    Process p = Process.Start(fileName, arguments);
    if (waitForExit)
        p.WaitForExit();
}

谢谢!

这是一个命令注入漏洞,因为您没有过滤掉函数中的用户输入并直接附加到process.start()因此,该工具已将其标记为漏洞。

为了避免这个问题,您应该使用regex方法过滤掉坏字符,这取决于该函数在运行时要做什么。

例如,创建函数只是为了从此路径c:\users/docs.txt进行检查则该函数不应该为c:\admin/docs.txt.执行

这就是在将用户数据直接发送到流程之前需要验证的方式。

有关更多信息,请参阅这个很棒的链接:https://dotnet-security-guard.github.io/SG0001.htm

或https://www.veracode.com/security/dotnet/cwe-78

Process类不过是一个托管包装类——Native Create Process及其变体,如Create Process As User。

  • 处理MSDN
  • 流程源代码

我认为没有其他方法可以启动进程,因为其他所有解决方案都会调用WinAPI函数。(因为此函数(或其重载和变体)是在Windows中启动进程的唯一方法)。

就我个人而言,我没有听说任何关于Process.Start的问题,请澄清的问题

关于

我也遇到了这个问题。您需要将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();
}

最新更新