C# 从进程开始的OS命令注入

C# 从进程开始的OS命令注入,c#,code-injection,process.start,C#,Code Injection,Process.start,我的应用程序正在使用进程。开始打开其他应用程序以运行。VeraCode报告为操作系统命令注入易受攻击。我想得到一些评论。我可以在网上找到很多关于过滤输入或限制程序名的信息。然而,我很想知道是否还有其他方法可以使用Process.Start 编辑: 感谢您的评论,这里是一个示例,是的,它正在从用户那里获得输入: public static void Run(string fileName, string arguments, bool waitForExit) {

我的应用程序正在使用进程。开始打开其他应用程序以运行。VeraCode报告为操作系统命令注入易受攻击。我想得到一些评论。我可以在网上找到很多关于过滤输入或限制程序名的信息。然而,我很想知道是否还有其他方法可以使用Process.Start

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

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

        if (waitForExit)
            p.WaitForExit();
    }
谢谢

该类与本机的托管包装类及其变体类似,只是一个托管包装类

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

就我个人而言,我没有听到任何关于
流程问题的消息。启动
请澄清问题


关于

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

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

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();
}
为了避免这个问题,您应该使用regex方法来过滤掉坏字符,这取决于函数运行时要做什么

例如,创建函数只是为了检查路径c:/users/docs.txt 那么该函数不应该在c:/admin/docs.txt中执行

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

有关更多信息,请参阅此链接:


您能否澄清问题所在,或者您的程序如何调用Process.Start?您是否将用户输入传递给Process.Start?“已报告”。什么是报告?我假设(并希望)这只是报告,因为这些参数中的任何一个都可以由用户输入操纵。您应该检查此方法的调用,以及参数是否以及如何受到用户输入的影响。我了解该漏洞,但我想知道应该明确过滤哪些输入以将风险降至最低?
Process类是托管包装类,而不是本机CreateProcess及其变体我使用
过程
已经超过一百万次了,但我从来不知道这一点+1
请澄清问题。
使用注释向OP提问。呵呵,是一个有趣的事实,.net中的许多类只是本机Win32函数的包装器。只要看一看过程类:@L.B我已经尽力回答Op的问题了。这个“阶段”只是提醒op,如果需要其他答案,他应该“重新考虑”这个问题:-)如果UseShellExecute设置为true,它将调用
ShellExecuteEx
。可能是Veracode扫描仪的错误,而不是使代码更安全。将
UseShellExecute
设置为
false
仅指示代码不使用图形shell。您仍然需要确保
文件名
参数
不是可由用户控制和/或使用批准列表的值。