【问题标题】:OS Command Injection from Process.Start来自 Process.Start 的操作系统命令注入
【发布时间】:2014-10-23 20:24:20
【问题描述】:

我的应用程序正在使用Process.Start 打开另一个应用程序以运行。 VeraCode [安全软件扫描工具]将此命令报告为OS Command Injection Vulnerable。我想得到一些评论。我在网上找到了很多关于过滤输入或限制程序名称的信息;但是,我很想知道是否还有其他使用 Process.Start 的替代方法?

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

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

    if (waitForExit)
        p.WaitForExit();
}

谢谢!

【问题讨论】:

  • 你能澄清问题是什么或者你的程序是如何调用 Process.Start 的吗?
  • 您是否将用户输入传递给 Process.Start?
  • “据报道”。什么是报告?
  • 我假设(并希望)这只是报告,因为这些参数中的任何一个都可以通过用户输入进行操作。您应该检查此方法的调用以及参数是否以及如何受到用户输入的影响。
  • 我了解该漏洞,但我想知道我应该明确过滤哪些输入以将风险降至最低?

标签: c# .net code-injection process.start veracode


【解决方案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

【讨论】:

  • 我赞成这个答案,但我也遇到了这个问题,尽管我的正则表达式最好,Veracode 仍然在抱怨。 ?
【解决方案2】:

Process 类只不过是托管包装类,即原生 Create Process 及其变体,例如 Create Process As User

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

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

问候

【讨论】:

  • The Process class is nothing else then a Managed wrapper class the the Native CreateProcess and its Variations. 我用过process 超过一百万次,但我从来不知道。 +1
  • please clarify then problem. 使用 cmets 向 OP 提问。
  • 呵呵,是的,有趣的是,.net 中的很多类只是本机 Win32 函数的包装。看看 Process 类:referencesource.microsoft.com/#System/services/monitoring/…
  • @L.B 我已经厌倦了尽我所能回答 Ops 的问题。这个“阶段”只是为了提醒操作员,如果需要其他答案,他应该“重新考虑”这个问题:-)
  • 如果 UseShellExecute 设置为 true,它会调用 ShellExecuteEx
【解决方案3】:

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

【讨论】:

  • 可能更多的是 Veracode 扫描仪的错误,而不是使代码更安全。将UseShellExecute 设置为false 只会指示代码不使用图形外壳。您仍然需要确保 FileNameArguments 不是可以由用户控制和/或使用批准列表的值。
  • 我用 Veracode 试过这个,但它没有解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多