Process.Start中的OS命令注入

时间:2014-10-23 20:24:20

标签: c# code-injection process.start

我的应用程序正在使用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();
    }

谢谢!

3 个答案:

答案 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

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